""" RMI MCP Server - Quality Endpoints Adds the endpoints that make agents choose us over competitors: /mcp/health - Agent health check with response times /mcp/status - Live system status (uptime, cache, rate limits) /mcp/changelog - What's new in each version /mcp/sdk - Quick-start code for Python, TypeScript, curl /mcp/trials - Check remaining free trials """ import time from datetime import UTC, datetime from fastapi import APIRouter, Request router = APIRouter(tags=["mcp-quality"]) _start_time = time.time() @router.get("/mcp/health") async def mcp_health(request: Request): """Agent health check. Returns status + response time so agents can gauge latency.""" t0 = time.time() return { "status": "healthy", "uptime_seconds": int(time.time() - _start_time), "response_time_ms": round((time.time() - t0) * 1000, 1), "version": "3.3.0", "timestamp": datetime.now(UTC).isoformat(), } @router.get("/mcp/status") async def mcp_status(): """Live system status - cache stats, rate limits, provider health.""" from app.caching_shield.api_registry import get_api_manager from app.caching_shield.tool_registry import TOOL_COUNTS from app.caching_shield.unified_layer import get_data_layer layer = get_data_layer() mgr = get_api_manager() return { "uptime_seconds": int(time.time() - _start_time), "version": "3.3.0", "tools": TOOL_COUNTS, "cache": layer.stats(), "providers": {name: pool.stats() for name, pool in mgr.pools.items()}, "timestamp": datetime.now(UTC).isoformat(), } @router.get("/mcp/changelog") async def mcp_changelog(): """Version history so agents know what's new.""" return { "current": "3.3.0", "history": [ { "version": "3.3.0", "date": "2026-06-01", "changes": [ "18 agent skills with workflow guides and anti-abuse rules", "4 membership tiers with daily call limits", "4 scan packs at 50-53% off individual tools", "4 real-time streaming feeds", "4 deep research report products", "3 batch scanning products at 75-90% off", "3 AI-optimized data feeds", "85 local MCP tools (Solana RPC + EVM 86 networks)", "50 free Boar blockchain tools", "Multi-provider caching shield on every data call", "Platform manifest - single source of truth, auto-syncing", "Agent prompts for 4 agent types", "Quality endpoints: /mcp/health, /mcp/status, /mcp/sdk", ], }, { "version": "3.2.0", "date": "2026-05-15", "changes": [ "Added POST /mcp JSON-RPC handler", "Added inputSchema to every tool", "Fixed tool naming per MCP spec", "Added dynamic facilitator count", "Added CORS headers for browser clients", ], }, { "version": "3.1.0", "date": "2026-04-01", "changes": [ "Added /.well-known/mcp discovery", "Added llms.txt for AI agent discovery", "Added x402 payment protocol support", "8 payment facilitators across 13 chains", ], }, ], } @router.get("/mcp/sdk") async def mcp_sdk(): """Quick-start code examples for Python, TypeScript, and curl.""" return { "python": { "install": "pip install rmi-agent-sdk", "quick_start": """from rmi_agent import RMIAgent agent = RMIAgent() # auto-discovers via /.well-known/mcp result = agent.call("rug_pull_predictor", {"token": "So111..."}) print(f"Risk score: {result['data']['score']}")""", }, "typescript": { "install": "npm install @rugmunch/agent-sdk", "quick_start": """import { RMIAgent } from "@rugmunch/agent-sdk"; const agent = new RMIAgent(); const result = await agent.call("rug_pull_predictor", { token: "So111..." }); console.log(`Risk score: ${result.data.score}`);""", }, "curl": { "discover": "curl https://mcp.rugmunch.io/.well-known/mcp", "list_tools": "curl https://mcp.rugmunch.io/mcp/tools", "call_tool": 'curl -X POST https://mcp.rugmunch.io/mcp/call/rug_pull_predictor \\\n -H "Content-Type: application/json" \\\n -d \'{"token": "So11111111111111111111111111111111111111112"}\'', "check_trials": "curl https://mcp.rugmunch.io/mcp/trials", }, "mcp_native": { "endpoint": "https://mcp.rugmunch.io/mcp", "protocol": "MCP 2024-11-05", "transport": "Streamable HTTP", "setup_claude_desktop": """{ "mcpServers": { "rug-munch": { "url": "https://mcp.rugmunch.io/mcp", "transport": "streamable-http" } } }""", }, } @router.get("/mcp/trials") async def mcp_trials(request: Request): """Check remaining free trials for the requesting agent.""" fp = request.headers.get( "X-Agent-Fingerprint", request.headers.get("X-Forwarded-For", request.client.host if request.client else "unknown"), ) return { "agent_id": fp[:16] + "...", "free_trials": { "per_tool": "1-5 calls", "reset": "Monthly or on tool update", "anti_abuse": "Fingerprint-gated. Suspicious patterns rate-limited.", }, "upgrade": { "scan_packs": "From $0.09 (53% off)", "memberships": "From $4.99/month (60-90% discount)", "catalog": "https://mcp.rugmunch.io/mcp/membership", }, }