mattrguerra/meridian-orders-mcpmainPrivate on GitHub, published here in full

worker.ts

Language TypeScript2.1 KB56 lines

mcp-server/src/worker.ts

  1. import { McpAgent } from "agents/mcp";
  2. import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
  3. import { registerTools, SERVER_INFO } from "./server.js";
  4. import { configFromEnv } from "./lib/config.js";
  5. import { WorkerRateLimiter } from "./rateLimiterDO.js";
  6. import type { Env } from "./env.js";
  7. // Re-export so wrangler can bind the shared rate-limiter Durable Object class.
  8. export { RateLimiterDO } from "./rateLimiterDO.js";
  9. /**
  10. * Cloudflare Workers entry point: remote MCP over HTTP, so the whole company
  11. * can connect to one hosted server instead of each person running stdio.
  12. *
  13. * Built on the Agents SDK `McpAgent`, which is a Durable Object: each client
  14. * session is an isolate-backed instance with its own `this.env`. We register the
  15. * SAME read-only tool set as the stdio entry, keeping a single source of truth.
  16. *
  17. * Live requests stay gated (PLINTH_ALLOW_LIVE_REQUESTS) until an operator
  18. * deliberately turns them on.
  19. */
  20. export class PlinthMcp extends McpAgent<Env> {
  21. server = new McpServer(SERVER_INFO);
  22. async init(): Promise<void> {
  23. registerTools(this.server, {
  24. config: configFromEnv(this.env),
  25. limiter: new WorkerRateLimiter(this.env.RATE_LIMITER),
  26. });
  27. }
  28. }
  29. export default {
  30. async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
  31. const url = new URL(request.url);
  32. // Streamable HTTP transport (current MCP standard). The Durable Object
  33. // binding is named PLINTH_MCP in wrangler.jsonc, not the SDK default MCP_OBJECT.
  34. if (url.pathname === "/mcp") {
  35. return PlinthMcp.serve("/mcp", { binding: "PLINTH_MCP" }).fetch(request, env, ctx);
  36. }
  37. // SSE transport (legacy clients).
  38. if (url.pathname === "/sse" || url.pathname === "/sse/message") {
  39. return PlinthMcp.serveSSE("/sse", { binding: "PLINTH_MCP" }).fetch(request, env, ctx);
  40. }
  41. if (url.pathname === "/health") {
  42. return Response.json({ status: "ok", server: SERVER_INFO });
  43. }
  44. return new Response("Not found", { status: 404 });
  45. },
  46. };
  47. // Unauthenticated: see "Next steps" in the server README before exposing real data.