| from fastapi import APIRouter, Request, HTTPException, Depends |
| from sqlalchemy.orm import Session |
| from backend.database import get_db |
| from backend.composio_client import get_composio |
| import os |
|
|
| router = APIRouter() |
|
|
|
|
| @router.post("/v1/endpoint") |
| async def mcp_endpoint(request: Request): |
| composio = get_composio() |
| body = await request.json() |
| method = body.get("method") |
| params = body.get("params", {}) |
|
|
| if method == "initialize": |
| return { |
| "jsonrpc": "2.0", "id": body.get("id"), |
| "result": { |
| "protocolVersion": "2024-11-05", |
| "capabilities": {"tools": {}}, |
| "serverInfo": {"name": "Compost MCP Server", "version": "1.0.0"} |
| } |
| } |
|
|
| if method == "tools/list": |
| tools = [] |
| if composio: |
| try: |
| raw = composio.toolkits.get() |
| for tk in raw: |
| slug = tk.slug if hasattr(tk, "slug") else (tk.get("slug") if isinstance(tk, dict) else "") |
| if not slug: |
| continue |
| try: |
| tls = composio.tools.get_raw_composio_tools(toolkits=[slug], limit=100) |
| for t in tls: |
| t_d = t.model_dump(mode="json") if hasattr(t, "model_dump") else {} |
| tools.append({ |
| "name": t_d.get("slug", ""), |
| "description": t_d.get("description", ""), |
| "inputSchema": t_d.get("input_parameters", {"type": "object", "properties": {}}) |
| }) |
| except Exception: |
| pass |
| except Exception: |
| pass |
| return {"jsonrpc": "2.0", "id": body.get("id"), "result": {"tools": tools}} |
|
|
| if method == "tools/call": |
| tool_name = params.get("name") |
| arguments = params.get("arguments", {}) |
| if composio: |
| try: |
| resp = composio.tools.execute( |
| slug=tool_name, arguments=arguments, |
| dangerously_skip_version_check=True, |
| ) |
| data = resp.get("data", resp) if isinstance(resp, dict) else {} |
| return {"jsonrpc": "2.0", "id": body.get("id"), "result": {"content": [{"type": "text", "text": str(data)}]}} |
| except Exception as e: |
| return {"jsonrpc": "2.0", "id": body.get("id"), "error": {"code": -32603, "message": str(e)}} |
| return {"jsonrpc": "2.0", "id": body.get("id"), "result": {"content": [{"type": "text", "text": f"Executed {tool_name}"}]}} |
|
|
| return {"jsonrpc": "2.0", "id": body.get("id"), "error": {"code": -32601, "message": "Method not found"}} |
|
|
|
|
| @router.get("/v1/discovery") |
| async def mcp_discovery(): |
| host = os.environ.get("MCP_HOST", "localhost:7860") |
| return {"mcpServers": {"compost": {"url": f"http://{host}/mcp/v1/endpoint"}}} |
|
|