- Initialize Cargo project with dependencies
- CLI argument parsing with clap derive
- Configuration loading (directories + toml)
- Error types with thiserror
- Logging with tracing
- Create PLANNING_AND_PROGRESS.md
- OAuth PKCE flow implementation
- Local callback HTTP server (axum)
- Keyring token storage with file fallback
- Token refresh logic
-
smcp auth login/logout/statuscommands
- HTTP client wrapper with reqwest
- JSON-RPC 2.0 request/response handling
- Session CRUD operations
- Token injection middleware
-
smcp session createwith options -
smcp session listwith table/json output -
smcp session delete -
smcp session status -
smcp session metrics - Progress indicators (indicatif)
-
smcp exec <code>command -
smcp previewfor type definitions - Streaming output support
- File input option (
--file)
- MCP client wrapper using rmcp crate
- Transport factory (stdio via TokioChildProcess, HTTP via StreamableHttpClientTransport)
-
smcp mcp tools <server>- List tools -
smcp mcp call <server> <tool> --args '{}'- Call tool -
smcp mcp resources <server>- List resources -
smcp mcp read <server> <uri>- Read resource -
smcp mcp prompts <server>- List prompts -
smcp mcp prompt <server> <name>- Get prompt -
smcp mcp info <server>- Get server info - Server spec parsing (URL, command string, config ID, session ID)
- WebSocket client (tokio-tungstenite)
- Protocol message handling (hello/welcome/register/tool_call)
- MCP server process management (spawn stdio servers)
- Signal handling (SIGINT, SIGTERM, SIGHUP)
- PID file management
- Heartbeat ping/pong (30 second interval)
- Reconnection with exponential backoff
-
smcp bridge start/stop/statuscommands
-
smcp server add/remove/enable/disable/list - Config file manipulation
- Server validation (check command exists)
- Shell completions generation (bash/zsh/fish)
- Comprehensive integration tests
- Protocol compatibility tests (verify JSON matches TypeScript)
- Cross-platform builds (GitHub Actions)
- README documentation
- crates.io publish preparation
- Fixed OAuth
public-clientscope - server required it to be registered - Fixed PKCE code_challenge_method typo in request
- Fixed token persistence - keyring was silently failing, now saves to
~/.smcp/tokens.jsonfirst with keyring as fallback - Fixed Bearer token authentication - rmcp's
auth_header()internally usesbearer_auth()which adds "Bearer " prefix, so we pass raw token only
- Fixed
StreamableHttpClientTransportConfigimport path tormcp::transport::streamable_http_client::StreamableHttpClientTransportConfig
smcp auth login- OAuth PKCE flow with Better Authsmcp auth status- Shows authenticated with token expirysmcp mcp tools- Lists tools from https://smcp.apothic.ai/mcp with Bearer auth