mcpmesh-node 0.7.0

Embed a full mcpmesh node in-process — the daemon core as a library
Documentation
[package]
name = "mcpmesh-node"
version.workspace = true
edition.workspace = true
license.workspace = true
rust-version.workspace = true
repository.workspace = true
description = "Embed a full mcpmesh node in-process — the daemon core as a library"

[lints]
workspace = true

[dependencies]
anyhow.workspace = true
async-trait.workspace = true
figment.workspace = true
serde.workspace = true
serde_json.workspace = true
thiserror.workspace = true
# `process`: the `run` backend spawns a child MCP server per session via
# tokio::process::Command with async stdin/stdout handles (the workspace tokio omits it).
tokio = { workspace = true, features = ["process"] }
tracing.workspace = true
mcpmesh-trust.workspace = true
mcpmesh-net.workspace = true
# `service` (implies `client`): the control server consumes the seam's hardened local
# endpoint types, and `Node::control` hands back the seam's ControlClient over an
# in-memory duplex.
mcpmesh-local-api = { workspace = true, features = ["service"] }
# Org-root VerifyingKey for roster install/load + the `org_root_pk` b64u decode. Same
# crate mcpmesh-trust already pins → a dependency edge only, no new crate version.
ed25519-dalek.workspace = true
# Runtime-dir ownership + peer-uid checks (spec §11.2/§13). Already in the tree via
# iroh; SAFE wrappers (no inline unsafe → satisfies forbid(unsafe)).
rustix = { version = "1", features = ["process", "fs"] }
# state.redb — the pure-Rust embedded KV the spec pins for the peer allowlist store
# (§15). MIT OR Apache-2.0 (already in deny.toml allow); no C deps.
redb = "2"
# Surgical config.toml writes for `serve`/RegisterService: read the doc as a
# `toml::Table`, upsert the `[services.*]` entry, atomic-write back.
toml = "0.8"
# base32 line-encoding for the `mcpmesh-invite:` artifact. Already in the tree via iroh.
data-encoding = "2"
# blake3 transcript hash for the pairing short authentication code (spec §4.2).
blake3 = "1"
# OS CSPRNG for the 32-byte pairing invite secret (spec §4.2).
rand.workspace = true
iroh.workspace = true
# Roster + presence gossip topics (spec §4.3/§10.1). iroh-gossip 0.101.0 depends on
# iroh "1" → unifies on the workspace-pinned iroh =1.0.1, NO iroh bump.
iroh-gossip = { workspace = true }
# Roster-blob fetch only (spec §4.3/§9). iroh-blobs 0.103.0 → iroh ^1.0.0, unifies on =1.0.1.
iroh-blobs = { workspace = true }
# HTTPS roster poll (spec §4.3), rustls-tls (no OpenSSL).
reqwest = { workspace = true }
# The rustls CryptoProvider install: reqwest (`rustls-no-provider`) resolves the provider
# at CLIENT-BUILD time and PANICS if none is installed; iroh installs no process-default.
# `Node::start` installs a ring process-default once (idempotent — a host app that already
# installed its own provider wins).
rustls = { version = "0.23", default-features = false, features = ["ring", "std"] }
# The gossip broadcast/receive payload type (`Bytes`) + the `StreamExt::next` the
# GossipReceiver stream yields. Not re-exported nameably by iroh-gossip, so direct deps.
bytes = { workspace = true }
n0-future = { workspace = true }
# Custom-discovery pkarr relay URLs (spec §10.3): iroh's Pkarr builders take `url::Url`.
url = { workspace = true }

[dev-dependencies]
tempfile.workspace = true
# Log-capture for the pairing-rendezvous surface-discipline test: assert no peer
# EndpointId leaks into a refusal's logs.
tracing-subscriber = "0.3"
serde_json.workspace = true