You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Every REST API today requires a bespoke MCP server to be usable by AI assistants. Teams spend days writing Go/Rust/Python wrappers that do nothing more than translate HTTP calls into MCP tool definitions. This is repetitive, error-prone, and doesn't scale — a company with 20 internal APIs needs 20 MCP servers.
REST MCP eliminates this entirely. Point it at any REST API (with or without an OpenAPI spec), and it instantly becomes a set of MCP tools.
2. Product Overview
REST MCP is a single binary that acts as an MCP server (stdio transport). It reads an OpenAPI/Swagger specification (or a minimal manual config) and dynamically exposes every endpoint as an MCP tool that AI assistants can invoke.
One-liner
Turn any REST API into MCP tools — zero code.
3. Target Users
Persona
Need
AI-first developers
Connect internal/external APIs to Claude, Copilot, or custom agents without writing MCP servers
Platform teams
Expose existing microservices to AI assistants org-wide with a single config change
API providers
Ship an MCP integration alongside their REST API by publishing a config snippet
Solo hackers
Wire up a SaaS API (Stripe, GitHub, Notion) in 30 seconds
base_url = "https://api.example.com"openapi_spec = "./openapi.json"# or URLlog_level = "warn"request_timeout = "30s"max_response_size = 102400
[headers]
Authorization = "Bearer ${API_KEY}"Accept = "application/json"X-Custom = "value"
[filters]
include_tags = ["users", "billing"]
exclude_paths = ["/internal", "/admin"]
include_operations = [] # empty = allexclude_operations = ["deleteEverything"]
[auth]
type = "bearer"# bearer | apikey_header | apikey_query | basic | oauth2_cc# For apikey_query:# key = "api_key"# value = "${API_KEY}"# For oauth2_cc:# token_url = "https://auth.example.com/token"# client_id = "${CLIENT_ID}"# client_secret = "${CLIENT_SECRET}"# scopes = ["read", "write"]# Manual endpoints (used when no openapi_spec)
[[endpoints]]
name = "list_users"method = "GET"path = "/users"description = "List all users"
[endpoints.query]
page = { type = "integer", description = "Page number", default = 1 }
per_page = { type = "integer", description = "Items per page", default = 20 }
[[endpoints]]
name = "create_user"method = "POST"path = "/users"description = "Create a new user"
[endpoints.body]
name = { type = "string", required = true }
email = { type = "string", required = true }
9. CLI Interface
rest-mcp [flags]
Flags:
--config Path to config file (default: rest-mcp.toml)
--base-url Target API base URL (overrides config/env)
--spec Path or URL to OpenAPI spec
--dry-run Print generated tools as JSON and exit
--log-level Log level: debug, info, warn, error
--version Print version and exit
--help Show help
9.1 Example Commands
# Auto-discover from OpenAPI spec
rest-mcp --base-url https://api.example.com --spec ./openapi.json
# Manual config
rest-mcp --config ./my-api.toml
# Dry-run: see what tools would be generated
rest-mcp --spec ./openapi.json --dry-run
# Everything via env (typical MCP client usage)
BASE_URL=https://api.example.com OPENAPI_SPEC=./spec.json rest-mcp
Recommendation:Go — faster iteration, trivial cross-compilation (6 targets in one goreleaser config), and mcp-go + kin-openapi are both production-grade. Rust is viable but adds build complexity with no meaningful upside for a CLI tool that spends most of its time waiting on HTTP I/O.
Support raw JSON pass-through arg; flatten only top-level
Auth token expiry mid-session
Medium
OAuth2 auto-refresh; clear error message for static tokens
API responses too large for MCP context
High
Configurable truncation; JSON-path extraction
Breaking changes in MCP protocol
Low
Pin to stable MCP spec version; abstract transport layer
15. Out of Scope (v1)
GraphQL APIs
gRPC / Protobuf APIs
WebSocket / streaming endpoints
Request batching / chaining
Response caching
Rate limit handling (retry-after)
Per-tool header overrides
Custom response transformers (Lua/JS scripting)
16. Open Questions
Tool naming collisions — If two operations produce the same snake_case name (e.g., GET /users and GET /v2/users both → list_users), how should we disambiguate? Proposal: append version prefix (v2_list_users).
Pagination — Should REST MCP auto-paginate (follow next links) or expose pagination params as tool arguments? Proposal: expose params; auto-pagination is too API-specific.
Binary name — rest-mcp? restmcp? mcp-rest? Needs to be short, memorable, and npm/brew-friendly.
Monorepo or separate repo — Keep under devstroop/rest-mcp or nest under a larger MCP tools org?