1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
[]
= "mcpmesh"
= true
= true
= true
= true
= true
= "../README.md"
= "Share MCP servers with people you trust — peer to peer, default-deny, no accounts"
# The spawn-backend test stub is a test-only helper the integration tests reach via
# `CARGO_BIN_EXE_echo_mcp_stub`; excluding it from the package keeps `cargo install
# mcpmesh` shipping exactly one binary. The local tree (and CI) still build it for tests.
= ["src/bin/echo_mcp_stub.rs"]
[]
= true
[[]]
= "mcpmesh"
= "src/main.rs"
[]
# TEST-ONLY (#116): forwards to mcpmesh-node so `doctor` can report whether THIS binary can
# honour `[network] relay_only`. Default off — see node/Cargo.toml for the semver rationale.
= ["mcpmesh-node/unstable-relay-only"]
[]
= true
= true
= true
= true
= true
= true
= true
# `process` is added cli-local (the workspace tokio omits it — Task 3 detaches the
# daemon via std::process): the `run` backend (Task 7) spawns a child MCP server per
# session via tokio::process::Command with async stdin/stdout handles. No new crate.
= { = true, = ["process"] }
= true
= true
= true
# `service` (implies `client`): the daemon consumes the seam's ONE hardened UDS rule
# (`ensure_private_dir`/`bind_uds` — symlink-refused 0700 owned dir, 0600 socket) for its own
# control socket, and the porcelain client wraps the seam's no-iroh ControlClient (D5) —
# adding daemon auto-start on top rather than re-implementing the wire.
= { = true, = ["service"] }
# The daemon core: the cli's daemon subcommand is the process shell (flock, env paths,
# runtime, control socket) around this crate's Node; porcelain + tests reach the moved
# modules through cli/src/lib.rs re-exports.
= true
# Our own uid for the runtime-dir ownership + peer-uid checks (spec §11.2/§13), plus the
# `fs::flock` single-daemon lock (Task 3). Already in the tree via iroh; SAFE wrappers (no
# inline unsafe → satisfies forbid(unsafe)). Peer uid itself comes from tokio's
# UnixStream::peer_cred() — no `nix` crate needed.
= { = "1", = ["process", "fs"] }
[]
= true
= true
# Log-capture for the pairing-rendezvous surface-discipline test (Task 5): assert no peer
# EndpointId leaks into a refusal's logs. Already in the lock via iroh (0.3.x) → a dev-only
# dependency edge, NO new crate version, no deny.toml change.
= "0.3"
# The `tests/*.rs` integration crate is separate from the package: it sees the `mcpmesh` lib
# + dev-deps only, so tokio (for `#[tokio::test]`) and serde_json must be listed here too.
= true
= true
# Test-side only: the integration suites assemble hermetic meshes (endpoints, address
# lookups) and forge roster signatures directly. The SHIPPED binary reaches iroh through
# mcpmesh-net's pinned re-export and dalek through mcpmesh-trust's — no runtime dep here.
# `test-utils` (dev-only) brings `iroh::test_utils::run_relay_server`, which lets the #64 path
# test drive a REAL relay in-process. Without it the suite can only ever produce a direct path —
# and it was exactly that blind spot that let a wrong direct-vs-relay derivation pass review-free.
= { = true, = ["test-utils"] }
# The in-process relay serves a self-signed cert; the #64 path test trusts it explicitly.
# Dev-only, and already in the lock via iroh.
= { = "1", = ["test-utils"] }
= true
# The distribute tests install the ring provider themselves (they build reqwest clients
# without booting a daemon). Same ring-only posture as mcpmesh-node's runtime dep.
= { = "0.23", = false, = ["ring", "std"] }
# The blob AC/gate tests hash fixture bytes and drive raw iroh-blobs requests at the gate.
= "1"
= { = true }
# Debian packaging (spec §16 M4). `cargo-deb` reads this declarative table — no debian/{control,rules}
# shell. Build with `cargo install cargo-deb && cargo deb -p mcpmesh` (a runbook step; cargo-deb is NOT a
# CI dependency, so this is validated only for TOML/parse correctness via `cargo metadata`). The
# operator runbook (docs/operator.md) is shipped separately; keep assets to the binary here to
# avoid a build-order dependency on files generated elsewhere.
[]
= "mcpmesh <knotanotsea@protonmail.com>"
= "2026, mcpmesh contributors"
= """\
Peer-to-peer MCP transport: serve local MCP servers to allowlisted peers and mount remote peers' \
services through a local stdio proxy, over an end-to-end-encrypted iroh mesh. See `mcpmesh doctor` for \
a local health check and docs/operator.md for the operator runbook."""
= "net"
= "optional"
= "$auto"
= [
["target/release/mcpmesh", "usr/bin/", "755"],
]