mcporter-rs is a Rust reimplementation of the
mcporter TypeScript CLI. It connects
to MCP (Model Context Protocol) servers configured in mcporter.json and lets
you list/call their tools from a single binary.
This is a working port — not a drop-in replacement yet. The pieces that are landed:
| Area | Coverage |
|---|---|
| Config loading | JSONC, snake/camelCase aliases, 7-importer merge (cursor / claude-* / codex / windsurf / opencode / vscode) |
| Lifecycle / filters | Override env vars, default keep-alive set, allowed/blocked tool guards |
| Error classifier | auth / offline / http / stdio-exit / other |
| MCP client | JSON-RPC 2.0, initialize / tools/list / tools/call / resources/list |
| STDIO transport | Tokio child process, line-delimited JSON, escalation termination |
| HTTP transport | Streamable HTTP + text/event-stream decode, bearer-token plumbing |
| OAuth persistence | DirectoryPersistence, VaultPersistence, CompositePersistence |
| Runtime | McpRuntime connection pool with per-server caching |
| CLI | list, call, auth (placeholder), daemon, config, generate-cli, inspect-cli |
| Daemon (UDS) | host + client + status/stop/listServers/listTools/callTool over UDS |
| Codegen | Minimal TS template + embedded __mcporter_metadata for inspect-cli |
| Packaging | per-arch tarballs via GitHub Actions release workflow + npm shim |
Deferred (tracked in plan.md): full OAuth callback UX (browser open + axum
server), Windows named-pipe IPC, idle-eviction in the daemon, byte-exact TS
template parity, and the JS-expression argument parser used by mcporter call.
cargo build --release
./target/release/mcporter --versioncat > /tmp/mcporter.json <<'EOF'
{
"imports": [],
"mcpServers": {
"demo": { "url": "https://demo.example.com" }
}
}
EOF
./target/release/mcporter --config /tmp/mcporter.json listSee plan.md for the per-milestone roadmap, rust-port.md for the original
design document, and docs/migration.md for behavioural differences vs the
TypeScript implementation.
MIT, matching the upstream package.