mcp-repl 0.3.0

Interactive MCP client REPL: connects to any MCP server and turns its tools, prompts, and resources into the command set
Documentation
[package]
name = "mcp-repl"
version = "0.3.0"
edition = "2024"
rust-version = "1.90"
license = "MIT OR Apache-2.0"
repository = "https://github.com/joshrotenberg/mcp-repl"
readme = "README.md"
description = "Interactive MCP client REPL: connects to any MCP server and turns its tools, prompts, and resources into the command set"
keywords = ["mcp", "repl", "cli", "client", "protocol"]
categories = ["command-line-utilities", "development-tools"]
# The black-box fixture server in examples/ is a test asset, and docs/ holds
# the prose and the recordings behind the README's images. Neither belongs in
# the published package: the recordings alone are most of a megabyte.
# `deny.toml` configures a CI check and means nothing to a consumer of the
# published crate.
exclude = ["/examples", "/.github", "/docs", "/deny.toml"]

# Applies to what people download, and to `cargo install`. Symbols are 4 MB
# of a 20 MB binary and are no use without the matching source. `"debuginfo"`
# was the first choice, for backtraces that still name functions, but it
# saves nothing on macOS, where that information lives in a separate .dSYM
# rather than in the binary.
[profile.release]
strip = true

[lib]
name = "mcp_repl"
path = "src/lib.rs"

[[bin]]
name = "mcp-repl"
path = "src/main.rs"

[dependencies]
tower-mcp = { version = "0.20.1", features = ["http-client", "oauth-client", "protocol-2026-07-28"] }
async-trait = "0.1"
tokio = { version = "1", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
base64 = "0.23.0"
getrandom = "0.4"
toml = "1"
toml_edit = "0.25"
clap = { version = "4", features = ["derive"] }
# `regex` rather than `regex-lite` for `find -E`. The intuition is backwards
# here: the engine is already linked, since tracing-subscriber's env-filter
# reaches regex-automata through matchers, and tower-mcp depends on regex
# itself. Measured against the same release binary, the full crate adds
# 100 KiB and no new crates, while regex-lite adds 182 KiB and one more
# supply-chain entry.
regex = "1"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
reedline = { version = "0.49", features = ["external_printer"] }
nu-ansi-term = "0.50"
keyring = "4.1"
webbrowser = { version = "1.2", features = ["hardened"] }
tempfile = "3"
unicode-width = "0.2"
schemars = "1.2"
clap_complete = "4"
clap_mangen = "0.2"
crossterm = { version = "0.29", default-features = false }
url = "2"

[target.'cfg(unix)'.dependencies]
# `--bearer-fd` has to validate that an inherited descriptor is open before
# claiming ownership with `File::from_raw_fd`. The standard library exposes
# ownership, but not the validating `fcntl(F_GETFD)` probe.
libc = "0.2"

[dev-dependencies]
# The fixture example is an MCP server, so the dev graph adds tower-mcp's
# server-side features and the fixture's own HTTP dependencies.
tower-mcp = { version = "0.20.1", features = ["http", "protocol-2026-07-28"] }
axum = { version = "0.8", features = ["json"] }
schemars = "1.2"