Turn Robyn endpoints into governed MCP tools, resources, and prompts with risk metadata, auth-aware HTTP transport, and production-friendly packaging.
Project description
robyn-mcp
The Robyn reference adapter for turning existing APIs into governed MCP tools, resources, and prompts.
Why robyn-mcp
You already have a Robyn backend.
You should not need to duplicate handlers, rewrite schemas, or rebuild authentication just to make it usable by AI agents.
robyn-mcp is a production-minded bridge from existing APIs to governed MCP surfaces.
- Convert existing Robyn routes into MCP tools
- Add resources and prompts without redesign
- Classify risky tools and surface approval metadata
- Keep your architecture intact
- Trace, audit, cache, and validate the endpoint before release
15-second demo
Demo GIF placeholder: record the launch flow and add docs/assets/robyn_mcp_demo.gif here.
Existing Robyn API
-> RobynMCP(app).mount_http("/mcp")
-> Tools, resources, prompts, policies, traces
-> Claude, ChatGPT, Cursor, VS Code, and MCP Inspector workflows
from robyn import Robyn
from robyn_mcp import RobynMCP, RobynMCPConfig, expose_tool
app = Robyn(__file__)
@app.get("/customers/:customer_id")
@expose_tool(
summary="Get customer profile",
description="Read the customer profile for support workflows.",
tags=["customer-support"],
requires_auth=True,
auth_scopes=["customer.read"],
)
def get_customer(customer_id: str):
return {"customer_id": customer_id, "status": "active"}
mcp = RobynMCP(app, config=RobynMCPConfig(require_session=False))
mcp.mount_http("/mcp")
app.start(port=8080)
Highlights
- Auto-expose Robyn routes as MCP tools
- JSON Schema generation from Python types
- OpenAPI enrichment and
$refresolution - Framework-neutral OpenAPI operation inspection
- OpenAPI gateway invocation for safe upstream proxy experiments
- FastAPI OpenAPI adapter for evaluating non-Robyn APIs
- Auth-aware context with explicit header allowlists
- Risk classification and approval-required annotations
- Observability: metrics, traces, audit logs, recent events
- Response caching with tag invalidation
- CLI validation plus
robyn-mcp doctor - Built-in playground UI
Installation
python -m pip install --upgrade pip
pip install robyn robyn-mcp
Optional local banner:
robyn-mcp install-note
Validate a live endpoint:
robyn-mcp doctor http://localhost:8080/mcp --json
Inspect an OpenAPI document before exposing it to agents:
robyn-mcp inspect-openapi ./openapi.json --json
The report includes recommended read tools, approval-required operations, hidden/internal operations, risk categories, and contract-quality warnings.
Invoke one OpenAPI operation against an upstream service:
robyn-mcp invoke-openapi ./openapi.json \
--upstream http://localhost:8000 \
--operation get_customer \
--args '{"customer_id":"cus_123","expand":"orders"}' \
--header 'Authorization: Bearer dev-token' \
--json
Benchmark OpenAPI inspection and contract scoring:
robyn-mcp benchmark-openapi ./openapi.json --iterations 50 --json
Run the richer customer-support demo:
python examples/customer_support_app.py
robyn-mcp doctor http://localhost:8080/mcp --json
open http://localhost:8080/mcp/playground
Quick Start
from robyn import Robyn
from robyn_mcp import RobynMCP, RobynMCPConfig, expose_tool
app = Robyn(__file__)
@app.get("/health")
@expose_tool(summary="Return service health")
def health():
return {"ok": True}
mcp = RobynMCP(app, config=RobynMCPConfig(require_session=False))
mcp.mount_http("/mcp")
app.start(port=8080)
Compatibility and Protocol Status
robyn-mcp supports Streamable-HTTP style JSON-RPC dispatch, initialization, sessions, tools, optional resources, optional prompts, JSON-RPC error mapping, origin validation, content negotiation, and session deletion.
| Client | stdio | Streamable HTTP | Auth | Tools | Resources | Prompts |
|---|---|---|---|---|---|---|
| Claude Desktop | Planned | N/A | Configurable | Contract | Contract | Contract |
| Claude Code | Planned | Contract | Configurable | Contract | Contract | Contract |
| ChatGPT | N/A | Contract | Configurable | Contract | Contract | Needs repeatable test |
| Cursor | Planned | Contract | Configurable | Contract | Contract | Needs repeatable test |
| VS Code | Planned | Contract | Configurable | Contract | Contract | Needs repeatable test |
| MCP Inspector | Planned | Contract | Configurable | Contract | Contract | Contract |
Only promote a cell to "verified" after a repeatable test or CI fixture proves it. See docs/compatibility_matrix.md and robyn-mcp runtime --json.
Governance Layer
robyn-mcp keeps generated MCP surfaces reviewable before agents use them:
- Framework-neutral
Operationmodel and adapter contracts - OpenAPI
OperationSourcefor framework-neutral inspection OpenAPIGatewayInvokerfor path/query/body splitting and allowlist-based upstream headersFastAPIOperationSourcefor consuming FastAPIapp.openapi()output- Risk categories for deletion, financial, credential, admin, sensitive-data, and external-communication tools
- Approval-required metadata for dangerous operations
- Tool contract scoring for names, descriptions, schemas, output schemas, and safety configuration
- Compatibility and protocol reports for release review
Security Defaults
- Header forwarding is allowlist-based by default.
- Cookies are not forwarded unless explicitly configured.
- Response redaction can remove sensitive fields from returned payloads.
- Origin validation can be enforced with
allowed_origins. - Rate limiting is available through the built-in token bucket policy engine.
- Destructive and sensitive tools now carry risk metadata in tool annotations.
Production checklist: docs/security.md
🗂️ Response Caching With Invalidation Tags
from robyn_mcp import RobynMCPConfig, expose_tool
@expose_tool(operation_id="list_products", side_effect=False, cache_tags=["products"])
def list_products():
return {"items": [...]}
@expose_tool(operation_id="create_product", side_effect=True, invalidate_tags=["products"])
def create_product(id: str, name: str, price: int):
...
config = RobynMCPConfig(
require_session=False,
enable_response_cache=True,
response_cache_ttl_seconds=120,
)
Cache behavior:
- Read tools can be cached with TTL.
- Mutation tools can invalidate matching cache tags.
- If no invalidation tags are provided on a mutation, cache is safely cleared by default.
Curl flow:
# 1) Read (cached after first call)
curl -X POST http://localhost:8080/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_products","arguments":{}}}'
# 2) Mutation (invalidates products cache tag)
curl -X POST http://localhost:8080/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"create_product","arguments":{"id":"sku-2","name":"sock","price":15}}}'
# 3) Read again (fresh result after invalidation)
curl -X POST http://localhost:8080/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"list_products","arguments":{}}}'
See complete runnable example: examples/cache_invalidation_example.py.
🧪 Test
curl -X POST http://localhost:8080/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
🛠 CLI
robyn-mcp runtime --json
robyn-mcp validate-endpoint http://localhost:8080/mcp
robyn-mcp doctor http://localhost:8080/mcp --json
robyn-mcp inspect-openapi ./openapi.json --json
robyn-mcp invoke-openapi ./openapi.json --upstream http://localhost:8000 --operation get_customer --args '{}'
robyn-mcp benchmark-openapi ./openapi.json --iterations 25 --json
robyn-mcp compare-benchmarks benchmarks/robyn_sample.json benchmarks/fastapi_sample.json --json
robyn-mcp publish-benchmarks benchmarks/robyn_sample.json benchmarks/fastapi_sample.json --out benchmark_report.md
robyn-mcp release-audit --json
robyn-mcp release-bundle --json
🖥 Playground
Enable:
RobynMCPConfig(enable_playground=True)
Open:
/mcp/playground
📊 Observability
- Tool call metrics
- Error tracking
- Latency stats
- Audit logs
- Recent traces
📁 Structure
robyn_mcp/
├── src/
├── tests/
├── examples/
└── scripts/
🧠 Core Concepts
| Concept | Description |
|---|---|
| Tools | Callable MCP endpoints |
| Resources | Structured data sources |
| Prompts | Reusable prompt templates |
Current capabilities
- Route to MCP tool harvesting
- Explicit decorators for tools, resources, and prompts
- JSON Schema generation from Python annotations
- OpenAPI-aware enrichment when route metadata exists
- OpenAPI spec inspection, benchmark reporting, and upstream operation invocation
- FastAPI OpenAPI document adapter for framework-neutral operation discovery
- Streamable-HTTP style single-endpoint dispatch foundation
- Session lifecycle support with TTL
- Request context, principal, tenant, and header forwarding hooks
- Per-tool policy hooks and built-in token-bucket rate limiting
- Response caching for read tools with tag-based invalidation on mutations
- Metrics and recent audit event capture
- Docs, CI, release workflow, smoke tests, and benchmark scaffolding
Final Note
Adopting MCP shouldn’t require rebuilding your backend.
With robyn-mcp, your existing Robyn routes become a discoverable, inspectable, policy-aware MCP surface.
Contributions are welcome. Start with CONTRIBUTING.md and the client verification issue template.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file robyn_mcp-1.0.4.tar.gz.
File metadata
- Download URL: robyn_mcp-1.0.4.tar.gz
- Upload date:
- Size: 71.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f1a9cc7957dc8a205c9ac4c4cfffd586ecaf7c77f9aaf7b4ff1fd5b979c24749
|
|
| MD5 |
cfa82e690ec7237092d413f4525f26f8
|
|
| BLAKE2b-256 |
48d925f3b42a408f1b71a18f8820a95196d7aa952a7d3826fab40a995df97f29
|
File details
Details for the file robyn_mcp-1.0.4-py3-none-any.whl.
File metadata
- Download URL: robyn_mcp-1.0.4-py3-none-any.whl
- Upload date:
- Size: 67.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6a7e3444ff4759dbd6a19cfee2d4914e183ce5a174dde3a768657bb93e557429
|
|
| MD5 |
c26b11f85d79d87d3e343f1dd52e09f2
|
|
| BLAKE2b-256 |
340d37193d5136d1d30d352e7fa05f5667eb489c4b30e4fefb2a342a0da4206c
|