ConcurrentMCPServer
The main entry point for the framework. ConcurrentMCPServer handles tool registration, middleware composition, transport selection, and lifecycle management.
Constructor
Section titled “Constructor”import { ConcurrentMCPServer } from "@casys/mcp-server";
const server = new ConcurrentMCPServer(options: ConcurrentServerOptions);ConcurrentServerOptions
Section titled “ConcurrentServerOptions”interface ConcurrentServerOptions { name: string; // Server name (shown to clients) version: string; // Semver version maxConcurrent?: number; // Default: 10 backpressureStrategy?: "sleep" | "queue" | "reject"; // Default: "sleep" backpressureSleepMs?: number; // Default: 10 rateLimit?: RateLimitOptions; // Optional rate limiting validateSchema?: boolean; // Default: false enableSampling?: boolean; // Enable LLM sampling bridge samplingClient?: SamplingClient; // Custom sampling client logger?: (msg: string) => void; // Default: console.error auth?: AuthOptions; // OAuth2/Bearer config}RateLimitOptions
Section titled “RateLimitOptions”interface RateLimitOptions { maxRequests: number; // Max requests per window windowMs: number; // Window size in milliseconds}AuthOptions
Section titled “AuthOptions”interface AuthOptions { provider: AuthProvider; // Use presets (createGoogleAuthProvider, etc.) or JwtAuthProvider}Registration methods
Section titled “Registration methods”All registration must happen before calling start() or startHttp().
registerTool
Section titled “registerTool”server.registerTool(tool: MCPTool, handler: ToolHandler): void;Register a single tool with its handler:
server.registerTool( { name: "greet", description: "Greet someone", inputSchema: { type: "object", properties: { name: { type: "string" } }, required: ["name"], }, requiredScopes: ["read"], // Optional — requires this scope if auth is configured }, ({ name }) => `Hello, ${name}!`,);registerTools
Section titled “registerTools”server.registerTools(tools: MCPTool[], handlers: Map<string, ToolHandler>): void;Bulk-register tools. Map keys must match tool names exactly.
registerResource
Section titled “registerResource”server.registerResource(resource: MCPResource, handler: ResourceHandler): void;Register a single resource. See MCP Apps for ui:// resources.
registerResources
Section titled “registerResources”server.registerResources( resources: MCPResource[], handlers: Map<string, ResourceHandler>,): void;Bulk-register resources.
server.use(middleware: Middleware): this;Add a custom middleware to the pipeline. Returns this for chaining:
server .use(logging) .use(metrics) .use(caching);See the Middleware Pipeline guide for patterns and recipes.
Transport methods
Section titled “Transport methods”await server.start(): Promise<void>;Start with STDIO transport. Use this for local tools (Claude Desktop, Cursor, etc.). Blocks until the server is stopped.
startHttp
Section titled “startHttp”await server.startHttp(options: HttpServerOptions): Promise<void>;Start with Streamable HTTP transport. Includes SSE streaming, session management, and RFC 9728 discovery.
interface HttpServerOptions { port: number; hostname?: string; // Default: "0.0.0.0"}await server.stop(): Promise<void>;Graceful shutdown. Waits for in-flight requests to complete before closing.
Monitoring methods
Section titled “Monitoring methods”getMetrics
Section titled “getMetrics”server.getMetrics(): QueueMetrics;// { inFlight: number, queued: number }getRateLimitMetrics
Section titled “getRateLimitMetrics”server.getRateLimitMetrics(): { keys: number, totalRequests: number } | null;Returns null if rate limiting is not configured.
getToolCount / getToolNames
Section titled “getToolCount / getToolNames”server.getToolCount(): number;server.getToolNames(): string[];getResourceCount / getResourceUris
Section titled “getResourceCount / getResourceUris”server.getResourceCount(): number;server.getResourceUris(): string[];SSE methods (HTTP transport only)
Section titled “SSE methods (HTTP transport only)”sendToSession
Section titled “sendToSession”server.sendToSession(sessionId: string, message: Record<string, unknown>): void;Push a message to a specific SSE session.
broadcastNotification
Section titled “broadcastNotification”server.broadcastNotification( method: string, params?: Record<string, unknown>,): void;Push a notification to all connected SSE clients.
getSSEClientCount
Section titled “getSSEClientCount”server.getSSEClientCount(): number;See Also
Section titled “See Also”- Quick Start — Server setup with both transports
- Middleware Pipeline —
use()guide and pipeline order - Authentication (OAuth2) —
authoption and scope enforcement - Standalone Components — Use RateLimiter, RequestQueue independently