/**
* Creates an MCP Server instance that delegates all request handlers
* to the Aggregator, acting as the upstream-facing proxy server.
*/
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import {
ListToolsRequestSchema,
CallToolRequestSchema,
ListResourcesRequestSchema,
ReadResourceRequestSchema,
ListResourceTemplatesRequestSchema,
ListPromptsRequestSchema,
GetPromptRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import type { ServerResult } from "@modelcontextprotocol/sdk/types.js";
import { Aggregator } from "./aggregator.js";
import logger from "../utils/logger.js";
export function createProxyServer(
aggregator: Aggregator,
name: string,
): Server {
const server = new Server(
{ name, version: "1.0.0" },
{
capabilities: {
tools: {},
resources: {},
prompts: {},
},
},
);
server.setRequestHandler(ListToolsRequestSchema, async () => {
const tools = await aggregator.listTools();
return { tools };
});
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name: toolName, arguments: args } = request.params;
return aggregator.callTool(toolName, args) as Promise<ServerResult>;
});
server.setRequestHandler(ListResourcesRequestSchema, async () => {
const resources = await aggregator.listResources();
return { resources };
});
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
const { uri } = request.params;
return aggregator.readResource(uri) as Promise<ServerResult>;
});
server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => {
const resourceTemplates = await aggregator.listResourceTemplates();
return { resourceTemplates };
});
server.setRequestHandler(ListPromptsRequestSchema, async () => {
const prompts = await aggregator.listPrompts();
return { prompts };
});
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
const { name: promptName, arguments: args } = request.params;
return aggregator.getPrompt(promptName, args) as Promise<ServerResult>;
});
logger.debug(`Proxy server "${name}" created with all handlers registered`);
return server;
}