add_remote_mcp
Register a remote MCP server URL to allow obot to proxy HTTP/SSE MCPs hosted elsewhere.
Instructions
Register a remote MCP server URL so obot proxies it. Use for HTTP/SSE MCPs hosted elsewhere.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| url | Yes | Remote MCP endpoint URL. | |
| shortDescription | No | ||
| alias | No |
Implementation Reference
- src/index.ts:101-115 (schema)Schema registration for the 'add_remote_mcp' tool: defines name, description, and inputSchema with required fields name (string) and url (string), plus optional shortDescription and alias.
{ name: "add_remote_mcp", description: "Register a remote MCP server URL so obot proxies it. Use for HTTP/SSE MCPs hosted elsewhere.", inputSchema: { type: "object", properties: { name: { type: "string" }, url: { type: "string", description: "Remote MCP endpoint URL." }, shortDescription: { type: "string" }, alias: { type: "string" }, }, required: ["name", "url"], additionalProperties: false, }, }, - src/index.ts:54-136 (registration)The tool is registered in the tools array (line 101-115) which is returned via ListToolsRequestSchema handler (line 143).
const tools: Tool[] = [ { name: "list_mcp_servers", description: "List MCP servers currently registered in obot. Returns id, name, runtime, configured-state, and the connectURL you'd hand to claude.ai.", inputSchema: { type: "object", properties: {}, additionalProperties: false }, }, { name: "get_mcp_server", description: "Get full details of one MCP server by id (including manifest, env, missingRequiredEnvVars).", inputSchema: { type: "object", properties: { id: { type: "string", description: "MCP server id, e.g. ms1mwrmr" } }, required: ["id"], additionalProperties: false, }, }, { name: "add_npx_mcp", description: "Install a new MCP server in obot that runs as `npx <package>` (stdio). Use this for npm-published MCP servers.", inputSchema: { type: "object", properties: { name: { type: "string", description: "Display name shown in obot UI." }, package: { type: "string", description: "npm package name, e.g. n8n-mcp or @scope/foo." }, shortDescription: { type: "string" }, env: { type: "object", description: "Env vars passed to the MCP process. Keys go in manifest.env[]. Mark secrets via sensitiveKeys.", additionalProperties: { type: "string" }, }, sensitiveKeys: { type: "array", items: { type: "string" }, description: "Keys in `env` that should be marked sensitive (API keys, tokens).", }, alias: { type: "string", description: "Optional short alias used in URLs/logs.", }, }, required: ["name", "package"], additionalProperties: false, }, }, { name: "add_remote_mcp", description: "Register a remote MCP server URL so obot proxies it. Use for HTTP/SSE MCPs hosted elsewhere.", inputSchema: { type: "object", properties: { name: { type: "string" }, url: { type: "string", description: "Remote MCP endpoint URL." }, shortDescription: { type: "string" }, alias: { type: "string" }, }, required: ["name", "url"], additionalProperties: false, }, }, { name: "delete_mcp_server", description: "Delete an MCP server from obot by id. Irreversible.", inputSchema: { type: "object", properties: { id: { type: "string" } }, required: ["id"], additionalProperties: false, }, }, { name: "list_catalog_entries", description: "List MCP catalog entries available in obot's default catalog. Optional substring filter on name/id.", inputSchema: { type: "object", properties: { search: { type: "string" } }, additionalProperties: false, }, }, ]; - src/index.ts:205-227 (handler)Handler for 'add_remote_mcp': constructs a manifest with runtime 'remote' and remoteConfig.url, POSTs to /api/mcp-servers via obotFetch, and returns id and connectURL.
case "add_remote_mcp": { const body: Record<string, any> = { manifest: { name: args.name, shortDescription: args.shortDescription ?? "", runtime: "remote", remoteConfig: { url: args.url }, }, }; if (args.alias) body.alias = args.alias; const data = await obotFetch("/api/mcp-servers", { method: "POST", body: JSON.stringify(body), }); return { content: [ { type: "text", text: JSON.stringify({ id: data.id, connectURL: data.connectURL }, null, 2), }, ], }; } - src/index.ts:18-40 (helper)The obotFetch helper function used by the handler to make authenticated HTTP requests to the obot API.
async function obotFetch(path: string, init: RequestInit = {}): Promise<any> { const res = await fetch(`${OBOT_URL}${path}`, { ...init, headers: { Authorization: `Bearer ${OBOT_TOKEN}`, "Content-Type": "application/json", Accept: "application/json", ...(init.headers as Record<string, string> | undefined), }, }); const text = await res.text(); let body: unknown = text; try { body = text ? JSON.parse(text) : null; } catch { // keep raw text } if (!res.ok) { const detail = typeof body === "string" ? body : JSON.stringify(body); throw new Error(`obot ${res.status} ${res.statusText} on ${path}: ${detail}`); } return body; }