diff --git a/.changeset/patch-consolidate-mcp-server.md b/.changeset/patch-consolidate-mcp-server.md new file mode 100644 index 00000000000..12559a7af2c --- /dev/null +++ b/.changeset/patch-consolidate-mcp-server.md @@ -0,0 +1,10 @@ +--- +"gh-aw": patch +--- + +Consolidate duplicate MCP server implementations by using a single shared core +implementation and removing the duplicate `mcp_server.cjs` code. + +This is an internal refactor that reduces duplicated code and simplifies +maintenance for MCP server transports (HTTP and stdio). + diff --git a/.github/workflows/ai-triage-campaign.lock.yml b/.github/workflows/ai-triage-campaign.lock.yml index 5a9b917a0f9..32ea2409a3e 100644 --- a/.github/workflows/ai-triage-campaign.lock.yml +++ b/.github/workflows/ai-triage-campaign.lock.yml @@ -974,6 +974,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/archie.lock.yml b/.github/workflows/archie.lock.yml index cb684fffa95..eec1303fe6d 100644 --- a/.github/workflows/archie.lock.yml +++ b/.github/workflows/archie.lock.yml @@ -2461,6 +2461,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/artifacts-summary.lock.yml b/.github/workflows/artifacts-summary.lock.yml index 7b93a9617ee..e3c8b085b07 100644 --- a/.github/workflows/artifacts-summary.lock.yml +++ b/.github/workflows/artifacts-summary.lock.yml @@ -1045,6 +1045,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/audit-workflows.lock.yml b/.github/workflows/audit-workflows.lock.yml index 5b2a9c61b57..f7fc8076679 100644 --- a/.github/workflows/audit-workflows.lock.yml +++ b/.github/workflows/audit-workflows.lock.yml @@ -1862,6 +1862,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/blog-auditor.lock.yml b/.github/workflows/blog-auditor.lock.yml index df3dd99e4f4..2d0b7abc44f 100644 --- a/.github/workflows/blog-auditor.lock.yml +++ b/.github/workflows/blog-auditor.lock.yml @@ -1360,6 +1360,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/brave.lock.yml b/.github/workflows/brave.lock.yml index 9109abe1ecf..25fd4c94677 100644 --- a/.github/workflows/brave.lock.yml +++ b/.github/workflows/brave.lock.yml @@ -2346,6 +2346,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/breaking-change-checker.lock.yml b/.github/workflows/breaking-change-checker.lock.yml index 192ae63e434..9f81bfb7a18 100644 --- a/.github/workflows/breaking-change-checker.lock.yml +++ b/.github/workflows/breaking-change-checker.lock.yml @@ -1092,6 +1092,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/changeset.lock.yml b/.github/workflows/changeset.lock.yml index edaf972fed3..88b99a88ed6 100644 --- a/.github/workflows/changeset.lock.yml +++ b/.github/workflows/changeset.lock.yml @@ -1965,6 +1965,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/ci-doctor.lock.yml b/.github/workflows/ci-doctor.lock.yml index bec6519b9b2..f0a99b1f5c3 100644 --- a/.github/workflows/ci-doctor.lock.yml +++ b/.github/workflows/ci-doctor.lock.yml @@ -1779,6 +1779,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/cli-consistency-checker.lock.yml b/.github/workflows/cli-consistency-checker.lock.yml index 70bec5537ac..222eb33a324 100644 --- a/.github/workflows/cli-consistency-checker.lock.yml +++ b/.github/workflows/cli-consistency-checker.lock.yml @@ -1093,6 +1093,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/cli-version-checker.lock.yml b/.github/workflows/cli-version-checker.lock.yml index b21995706c9..c083e432a28 100644 --- a/.github/workflows/cli-version-checker.lock.yml +++ b/.github/workflows/cli-version-checker.lock.yml @@ -1366,6 +1366,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/cloclo.lock.yml b/.github/workflows/cloclo.lock.yml index dcebc5254ce..7bca2845fe1 100644 --- a/.github/workflows/cloclo.lock.yml +++ b/.github/workflows/cloclo.lock.yml @@ -2766,6 +2766,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/close-old-discussions.lock.yml b/.github/workflows/close-old-discussions.lock.yml index e8dc6a8df5b..de9a19630c5 100644 --- a/.github/workflows/close-old-discussions.lock.yml +++ b/.github/workflows/close-old-discussions.lock.yml @@ -1260,6 +1260,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/commit-changes-analyzer.lock.yml b/.github/workflows/commit-changes-analyzer.lock.yml index 7457c3bad8c..d403a9a1e7d 100644 --- a/.github/workflows/commit-changes-analyzer.lock.yml +++ b/.github/workflows/commit-changes-analyzer.lock.yml @@ -1319,6 +1319,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/copilot-agent-analysis.lock.yml b/.github/workflows/copilot-agent-analysis.lock.yml index a9f5559a4b4..2a56e525ee9 100644 --- a/.github/workflows/copilot-agent-analysis.lock.yml +++ b/.github/workflows/copilot-agent-analysis.lock.yml @@ -1674,6 +1674,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/copilot-pr-merged-report.lock.yml b/.github/workflows/copilot-pr-merged-report.lock.yml index 017c046a3d9..396f57071be 100644 --- a/.github/workflows/copilot-pr-merged-report.lock.yml +++ b/.github/workflows/copilot-pr-merged-report.lock.yml @@ -1223,6 +1223,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); @@ -2151,6 +2241,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); @@ -2262,15 +2442,20 @@ jobs: createServer, registerTool, normalizeTool, + handleRequest, handleMessage, processReadBuffer, start, loadToolHandlers, }; EOF_MCP_CORE - cat > /tmp/gh-aw/safe-inputs/mcp_server.cjs << 'EOF_MCP_SERVER' + cat > /tmp/gh-aw/safe-inputs/mcp_http_transport.cjs << 'EOF_MCP_HTTP_TRANSPORT' + const http = require("http"); + const { randomUUID } = require("crypto"); + const { createServer, registerTool, handleRequest } = require("./mcp_server_core.cjs"); class MCPServer { constructor(serverInfo, options = {}) { + this._coreServer = createServer(serverInfo, options); this.serverInfo = serverInfo; this.capabilities = options.capabilities || { tools: {} }; this.tools = new Map(); @@ -2284,100 +2469,25 @@ jobs: inputSchema, handler, }); + registerTool(this._coreServer, { + name, + description, + inputSchema, + handler, + }); } async connect(transport) { this.transport = transport; transport.setServer(this); await transport.start(); } - handleInitialize(params) { - this.initialized = true; - return { - protocolVersion: params.protocolVersion || "2024-11-05", - serverInfo: this.serverInfo, - capabilities: this.capabilities, - }; - } - handleToolsList() { - const tools = Array.from(this.tools.values()).map(tool => ({ - name: tool.name, - description: tool.description, - inputSchema: tool.inputSchema, - })); - return { tools }; - } - async handleToolsCall(params) { - const tool = this.tools.get(params.name); - if (!tool) { - throw { - code: -32602, - message: `Tool '${params.name}' not found`, - }; - } - try { - const result = await tool.handler(params.arguments || {}); - return result; - } catch (error) { - throw { - code: -32603, - message: error instanceof Error ? error.message : String(error), - }; - } - } - handlePing() { - return {}; - } async handleRequest(request) { - const { id, method, params } = request; - try { - if (!("id" in request)) { - return null; - } - let result; - switch (method) { - case "initialize": - result = this.handleInitialize(params || {}); - break; - case "ping": - result = this.handlePing(); - break; - case "tools/list": - result = this.handleToolsList(); - break; - case "tools/call": - result = await this.handleToolsCall(params || {}); - break; - default: - throw { - code: -32601, - message: `Method '${method}' not found`, - }; - } - return { - jsonrpc: "2.0", - id, - result, - }; - } catch (error) { - return { - jsonrpc: "2.0", - id, - error: { - code: error.code || -32603, - message: error.message || "Internal error", - }, - }; + if (request.method === "initialize") { + this.initialized = true; } + return handleRequest(this._coreServer, request); } } - module.exports = { - MCPServer, - }; - EOF_MCP_SERVER - cat > /tmp/gh-aw/safe-inputs/mcp_http_transport.cjs << 'EOF_MCP_HTTP_TRANSPORT' - const http = require("http"); - const { randomUUID } = require("crypto"); - const { MCPServer } = require("./mcp_server.cjs"); class MCPHTTPTransport { constructor(options = {}) { this.sessionIdGenerator = options.sessionIdGenerator; diff --git a/.github/workflows/copilot-pr-nlp-analysis.lock.yml b/.github/workflows/copilot-pr-nlp-analysis.lock.yml index ad248b00c49..0e01e8fc81a 100644 --- a/.github/workflows/copilot-pr-nlp-analysis.lock.yml +++ b/.github/workflows/copilot-pr-nlp-analysis.lock.yml @@ -1889,6 +1889,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/copilot-pr-prompt-analysis.lock.yml b/.github/workflows/copilot-pr-prompt-analysis.lock.yml index 08ba4114f9d..79ac0a37e4c 100644 --- a/.github/workflows/copilot-pr-prompt-analysis.lock.yml +++ b/.github/workflows/copilot-pr-prompt-analysis.lock.yml @@ -1389,6 +1389,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/copilot-session-insights.lock.yml b/.github/workflows/copilot-session-insights.lock.yml index ffee03280a6..8da52394aab 100644 --- a/.github/workflows/copilot-session-insights.lock.yml +++ b/.github/workflows/copilot-session-insights.lock.yml @@ -2404,6 +2404,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/craft.lock.yml b/.github/workflows/craft.lock.yml index 2044a11a3b5..7459968c014 100644 --- a/.github/workflows/craft.lock.yml +++ b/.github/workflows/craft.lock.yml @@ -2556,6 +2556,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/daily-assign-issue-to-user.lock.yml b/.github/workflows/daily-assign-issue-to-user.lock.yml index cbdcae7d54c..6e66fd0edcc 100644 --- a/.github/workflows/daily-assign-issue-to-user.lock.yml +++ b/.github/workflows/daily-assign-issue-to-user.lock.yml @@ -1537,6 +1537,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/daily-code-metrics.lock.yml b/.github/workflows/daily-code-metrics.lock.yml index 8504371814a..74cef0b01f9 100644 --- a/.github/workflows/daily-code-metrics.lock.yml +++ b/.github/workflows/daily-code-metrics.lock.yml @@ -1906,6 +1906,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/daily-copilot-token-report.lock.yml b/.github/workflows/daily-copilot-token-report.lock.yml index 4c5d9b14910..0beeeeaa3e4 100644 --- a/.github/workflows/daily-copilot-token-report.lock.yml +++ b/.github/workflows/daily-copilot-token-report.lock.yml @@ -1957,6 +1957,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/daily-doc-updater.lock.yml b/.github/workflows/daily-doc-updater.lock.yml index cc2bd2b97fa..74cf3cb4ba4 100644 --- a/.github/workflows/daily-doc-updater.lock.yml +++ b/.github/workflows/daily-doc-updater.lock.yml @@ -1218,6 +1218,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/daily-fact.lock.yml b/.github/workflows/daily-fact.lock.yml index de18c4ff4d3..c9f10c630e6 100644 --- a/.github/workflows/daily-fact.lock.yml +++ b/.github/workflows/daily-fact.lock.yml @@ -1546,6 +1546,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/daily-file-diet.lock.yml b/.github/workflows/daily-file-diet.lock.yml index b9bab5653d5..02e5e2e473f 100644 --- a/.github/workflows/daily-file-diet.lock.yml +++ b/.github/workflows/daily-file-diet.lock.yml @@ -1243,6 +1243,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/daily-firewall-report.lock.yml b/.github/workflows/daily-firewall-report.lock.yml index 3df31de41bd..8c4867d313e 100644 --- a/.github/workflows/daily-firewall-report.lock.yml +++ b/.github/workflows/daily-firewall-report.lock.yml @@ -1658,6 +1658,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/daily-issues-report.lock.yml b/.github/workflows/daily-issues-report.lock.yml index 896b6c36ab8..918786dd611 100644 --- a/.github/workflows/daily-issues-report.lock.yml +++ b/.github/workflows/daily-issues-report.lock.yml @@ -2051,6 +2051,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/daily-malicious-code-scan.lock.yml b/.github/workflows/daily-malicious-code-scan.lock.yml index 225ba51a437..bce20ae589e 100644 --- a/.github/workflows/daily-malicious-code-scan.lock.yml +++ b/.github/workflows/daily-malicious-code-scan.lock.yml @@ -1223,6 +1223,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/daily-multi-device-docs-tester.lock.yml b/.github/workflows/daily-multi-device-docs-tester.lock.yml index d2f678ba2b0..0d971916af5 100644 --- a/.github/workflows/daily-multi-device-docs-tester.lock.yml +++ b/.github/workflows/daily-multi-device-docs-tester.lock.yml @@ -1175,6 +1175,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/daily-news.lock.yml b/.github/workflows/daily-news.lock.yml index 815a9afb9d4..6ced91ff2ee 100644 --- a/.github/workflows/daily-news.lock.yml +++ b/.github/workflows/daily-news.lock.yml @@ -1976,6 +1976,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/daily-performance-summary.lock.yml b/.github/workflows/daily-performance-summary.lock.yml index f6b7a8ce71a..d59e4d1b9e9 100644 --- a/.github/workflows/daily-performance-summary.lock.yml +++ b/.github/workflows/daily-performance-summary.lock.yml @@ -1813,6 +1813,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); @@ -2741,6 +2831,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); @@ -2852,15 +3032,20 @@ jobs: createServer, registerTool, normalizeTool, + handleRequest, handleMessage, processReadBuffer, start, loadToolHandlers, }; EOF_MCP_CORE - cat > /tmp/gh-aw/safe-inputs/mcp_server.cjs << 'EOF_MCP_SERVER' + cat > /tmp/gh-aw/safe-inputs/mcp_http_transport.cjs << 'EOF_MCP_HTTP_TRANSPORT' + const http = require("http"); + const { randomUUID } = require("crypto"); + const { createServer, registerTool, handleRequest } = require("./mcp_server_core.cjs"); class MCPServer { constructor(serverInfo, options = {}) { + this._coreServer = createServer(serverInfo, options); this.serverInfo = serverInfo; this.capabilities = options.capabilities || { tools: {} }; this.tools = new Map(); @@ -2874,100 +3059,25 @@ jobs: inputSchema, handler, }); + registerTool(this._coreServer, { + name, + description, + inputSchema, + handler, + }); } async connect(transport) { this.transport = transport; transport.setServer(this); await transport.start(); } - handleInitialize(params) { - this.initialized = true; - return { - protocolVersion: params.protocolVersion || "2024-11-05", - serverInfo: this.serverInfo, - capabilities: this.capabilities, - }; - } - handleToolsList() { - const tools = Array.from(this.tools.values()).map(tool => ({ - name: tool.name, - description: tool.description, - inputSchema: tool.inputSchema, - })); - return { tools }; - } - async handleToolsCall(params) { - const tool = this.tools.get(params.name); - if (!tool) { - throw { - code: -32602, - message: `Tool '${params.name}' not found`, - }; - } - try { - const result = await tool.handler(params.arguments || {}); - return result; - } catch (error) { - throw { - code: -32603, - message: error instanceof Error ? error.message : String(error), - }; - } - } - handlePing() { - return {}; - } async handleRequest(request) { - const { id, method, params } = request; - try { - if (!("id" in request)) { - return null; - } - let result; - switch (method) { - case "initialize": - result = this.handleInitialize(params || {}); - break; - case "ping": - result = this.handlePing(); - break; - case "tools/list": - result = this.handleToolsList(); - break; - case "tools/call": - result = await this.handleToolsCall(params || {}); - break; - default: - throw { - code: -32601, - message: `Method '${method}' not found`, - }; - } - return { - jsonrpc: "2.0", - id, - result, - }; - } catch (error) { - return { - jsonrpc: "2.0", - id, - error: { - code: error.code || -32603, - message: error.message || "Internal error", - }, - }; + if (request.method === "initialize") { + this.initialized = true; } + return handleRequest(this._coreServer, request); } } - module.exports = { - MCPServer, - }; - EOF_MCP_SERVER - cat > /tmp/gh-aw/safe-inputs/mcp_http_transport.cjs << 'EOF_MCP_HTTP_TRANSPORT' - const http = require("http"); - const { randomUUID } = require("crypto"); - const { MCPServer } = require("./mcp_server.cjs"); class MCPHTTPTransport { constructor(options = {}) { this.sessionIdGenerator = options.sessionIdGenerator; diff --git a/.github/workflows/daily-repo-chronicle.lock.yml b/.github/workflows/daily-repo-chronicle.lock.yml index 22b33130ed7..069ba5c4bbc 100644 --- a/.github/workflows/daily-repo-chronicle.lock.yml +++ b/.github/workflows/daily-repo-chronicle.lock.yml @@ -1661,6 +1661,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/daily-team-status.lock.yml b/.github/workflows/daily-team-status.lock.yml index 3b5fe54281b..c954c1ac3bc 100644 --- a/.github/workflows/daily-team-status.lock.yml +++ b/.github/workflows/daily-team-status.lock.yml @@ -1020,6 +1020,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = error; + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/daily-workflow-updater.lock.yml b/.github/workflows/daily-workflow-updater.lock.yml index ca62972b5e5..a2d826fa726 100644 --- a/.github/workflows/daily-workflow-updater.lock.yml +++ b/.github/workflows/daily-workflow-updater.lock.yml @@ -1084,6 +1084,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/deep-report.lock.yml b/.github/workflows/deep-report.lock.yml index 2fc56da2b49..3914ff29e42 100644 --- a/.github/workflows/deep-report.lock.yml +++ b/.github/workflows/deep-report.lock.yml @@ -1533,6 +1533,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/dependabot-go-checker.lock.yml b/.github/workflows/dependabot-go-checker.lock.yml index 45b396a76df..18011b35668 100644 --- a/.github/workflows/dependabot-go-checker.lock.yml +++ b/.github/workflows/dependabot-go-checker.lock.yml @@ -1396,6 +1396,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/dev-hawk.lock.yml b/.github/workflows/dev-hawk.lock.yml index a82b70b3fbf..869218239a9 100644 --- a/.github/workflows/dev-hawk.lock.yml +++ b/.github/workflows/dev-hawk.lock.yml @@ -1610,6 +1610,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/dev.lock.yml b/.github/workflows/dev.lock.yml index 32a106fa1e2..e8d7e2f5243 100644 --- a/.github/workflows/dev.lock.yml +++ b/.github/workflows/dev.lock.yml @@ -736,6 +736,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); @@ -847,15 +937,20 @@ jobs: createServer, registerTool, normalizeTool, + handleRequest, handleMessage, processReadBuffer, start, loadToolHandlers, }; EOF_MCP_CORE - cat > /tmp/gh-aw/safe-inputs/mcp_server.cjs << 'EOF_MCP_SERVER' + cat > /tmp/gh-aw/safe-inputs/mcp_http_transport.cjs << 'EOF_MCP_HTTP_TRANSPORT' + const http = require("http"); + const { randomUUID } = require("crypto"); + const { createServer, registerTool, handleRequest } = require("./mcp_server_core.cjs"); class MCPServer { constructor(serverInfo, options = {}) { + this._coreServer = createServer(serverInfo, options); this.serverInfo = serverInfo; this.capabilities = options.capabilities || { tools: {} }; this.tools = new Map(); @@ -869,100 +964,25 @@ jobs: inputSchema, handler, }); + registerTool(this._coreServer, { + name, + description, + inputSchema, + handler, + }); } async connect(transport) { this.transport = transport; transport.setServer(this); await transport.start(); } - handleInitialize(params) { - this.initialized = true; - return { - protocolVersion: params.protocolVersion || "2024-11-05", - serverInfo: this.serverInfo, - capabilities: this.capabilities, - }; - } - handleToolsList() { - const tools = Array.from(this.tools.values()).map(tool => ({ - name: tool.name, - description: tool.description, - inputSchema: tool.inputSchema, - })); - return { tools }; - } - async handleToolsCall(params) { - const tool = this.tools.get(params.name); - if (!tool) { - throw { - code: -32602, - message: `Tool '${params.name}' not found`, - }; - } - try { - const result = await tool.handler(params.arguments || {}); - return result; - } catch (error) { - throw { - code: -32603, - message: error instanceof Error ? error.message : String(error), - }; - } - } - handlePing() { - return {}; - } async handleRequest(request) { - const { id, method, params } = request; - try { - if (!("id" in request)) { - return null; - } - let result; - switch (method) { - case "initialize": - result = this.handleInitialize(params || {}); - break; - case "ping": - result = this.handlePing(); - break; - case "tools/list": - result = this.handleToolsList(); - break; - case "tools/call": - result = await this.handleToolsCall(params || {}); - break; - default: - throw { - code: -32601, - message: `Method '${method}' not found`, - }; - } - return { - jsonrpc: "2.0", - id, - result, - }; - } catch (error) { - return { - jsonrpc: "2.0", - id, - error: { - code: error.code || -32603, - message: error.message || "Internal error", - }, - }; + if (request.method === "initialize") { + this.initialized = true; } + return handleRequest(this._coreServer, request); } } - module.exports = { - MCPServer, - }; - EOF_MCP_SERVER - cat > /tmp/gh-aw/safe-inputs/mcp_http_transport.cjs << 'EOF_MCP_HTTP_TRANSPORT' - const http = require("http"); - const { randomUUID } = require("crypto"); - const { MCPServer } = require("./mcp_server.cjs"); class MCPHTTPTransport { constructor(options = {}) { this.sessionIdGenerator = options.sessionIdGenerator; diff --git a/.github/workflows/developer-docs-consolidator.lock.yml b/.github/workflows/developer-docs-consolidator.lock.yml index 612ebee3e41..d76ca5924be 100644 --- a/.github/workflows/developer-docs-consolidator.lock.yml +++ b/.github/workflows/developer-docs-consolidator.lock.yml @@ -1794,6 +1794,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/dictation-prompt.lock.yml b/.github/workflows/dictation-prompt.lock.yml index 6262a4d13f8..64a46425f3d 100644 --- a/.github/workflows/dictation-prompt.lock.yml +++ b/.github/workflows/dictation-prompt.lock.yml @@ -1070,6 +1070,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/docs-noob-tester.lock.yml b/.github/workflows/docs-noob-tester.lock.yml index e9d777da9c3..76ed9cf778c 100644 --- a/.github/workflows/docs-noob-tester.lock.yml +++ b/.github/workflows/docs-noob-tester.lock.yml @@ -1100,6 +1100,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/duplicate-code-detector.lock.yml b/.github/workflows/duplicate-code-detector.lock.yml index 7a77a989e64..0879c8ef8be 100644 --- a/.github/workflows/duplicate-code-detector.lock.yml +++ b/.github/workflows/duplicate-code-detector.lock.yml @@ -1148,6 +1148,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/example-workflow-analyzer.lock.yml b/.github/workflows/example-workflow-analyzer.lock.yml index 78ec3db1040..26c7b0e310f 100644 --- a/.github/workflows/example-workflow-analyzer.lock.yml +++ b/.github/workflows/example-workflow-analyzer.lock.yml @@ -1117,6 +1117,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/github-mcp-structural-analysis.lock.yml b/.github/workflows/github-mcp-structural-analysis.lock.yml index 0d7038df08a..f7445078e9c 100644 --- a/.github/workflows/github-mcp-structural-analysis.lock.yml +++ b/.github/workflows/github-mcp-structural-analysis.lock.yml @@ -1761,6 +1761,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/github-mcp-tools-report.lock.yml b/.github/workflows/github-mcp-tools-report.lock.yml index 5d7f50d5fb2..49984304eb4 100644 --- a/.github/workflows/github-mcp-tools-report.lock.yml +++ b/.github/workflows/github-mcp-tools-report.lock.yml @@ -1645,6 +1645,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/glossary-maintainer.lock.yml b/.github/workflows/glossary-maintainer.lock.yml index 112b7d800d0..ffde7e50d24 100644 --- a/.github/workflows/glossary-maintainer.lock.yml +++ b/.github/workflows/glossary-maintainer.lock.yml @@ -1584,6 +1584,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/go-fan.lock.yml b/.github/workflows/go-fan.lock.yml index 54741caf6d1..f058acc2b5a 100644 --- a/.github/workflows/go-fan.lock.yml +++ b/.github/workflows/go-fan.lock.yml @@ -1420,6 +1420,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/go-logger.lock.yml b/.github/workflows/go-logger.lock.yml index e5a99638823..03565b0742f 100644 --- a/.github/workflows/go-logger.lock.yml +++ b/.github/workflows/go-logger.lock.yml @@ -1346,6 +1346,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/go-pattern-detector.lock.yml b/.github/workflows/go-pattern-detector.lock.yml index 5176437b4a7..be20e2bea00 100644 --- a/.github/workflows/go-pattern-detector.lock.yml +++ b/.github/workflows/go-pattern-detector.lock.yml @@ -1205,6 +1205,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/grumpy-reviewer.lock.yml b/.github/workflows/grumpy-reviewer.lock.yml index 811f53d6431..6fa871fca91 100644 --- a/.github/workflows/grumpy-reviewer.lock.yml +++ b/.github/workflows/grumpy-reviewer.lock.yml @@ -2478,6 +2478,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/instructions-janitor.lock.yml b/.github/workflows/instructions-janitor.lock.yml index 4e997b7cb01..ef76a15d224 100644 --- a/.github/workflows/instructions-janitor.lock.yml +++ b/.github/workflows/instructions-janitor.lock.yml @@ -1215,6 +1215,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/issue-arborist.lock.yml b/.github/workflows/issue-arborist.lock.yml index 7f97004ee03..2187c028e35 100644 --- a/.github/workflows/issue-arborist.lock.yml +++ b/.github/workflows/issue-arborist.lock.yml @@ -1194,6 +1194,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/issue-classifier.lock.yml b/.github/workflows/issue-classifier.lock.yml index fcc411f31c2..cf88d420dce 100644 --- a/.github/workflows/issue-classifier.lock.yml +++ b/.github/workflows/issue-classifier.lock.yml @@ -2203,6 +2203,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/issue-monster.lock.yml b/.github/workflows/issue-monster.lock.yml index 714d85261c4..816a71f2049 100644 --- a/.github/workflows/issue-monster.lock.yml +++ b/.github/workflows/issue-monster.lock.yml @@ -1754,6 +1754,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/issue-triage-agent.lock.yml b/.github/workflows/issue-triage-agent.lock.yml index b239371f962..98b9bf72369 100644 --- a/.github/workflows/issue-triage-agent.lock.yml +++ b/.github/workflows/issue-triage-agent.lock.yml @@ -1391,6 +1391,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/lockfile-stats.lock.yml b/.github/workflows/lockfile-stats.lock.yml index 2bac64b37e0..c8debad6cf0 100644 --- a/.github/workflows/lockfile-stats.lock.yml +++ b/.github/workflows/lockfile-stats.lock.yml @@ -1440,6 +1440,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/mcp-inspector.lock.yml b/.github/workflows/mcp-inspector.lock.yml index 62402e87539..b680ff21402 100644 --- a/.github/workflows/mcp-inspector.lock.yml +++ b/.github/workflows/mcp-inspector.lock.yml @@ -1280,6 +1280,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/mergefest.lock.yml b/.github/workflows/mergefest.lock.yml index 8251f56419c..b3c100403dc 100644 --- a/.github/workflows/mergefest.lock.yml +++ b/.github/workflows/mergefest.lock.yml @@ -1623,6 +1623,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/notion-issue-summary.lock.yml b/.github/workflows/notion-issue-summary.lock.yml index 5be256c192b..f6d0e83b198 100644 --- a/.github/workflows/notion-issue-summary.lock.yml +++ b/.github/workflows/notion-issue-summary.lock.yml @@ -859,6 +859,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/org-health-report.lock.yml b/.github/workflows/org-health-report.lock.yml index 9a78fd7151d..0ace008b065 100644 --- a/.github/workflows/org-health-report.lock.yml +++ b/.github/workflows/org-health-report.lock.yml @@ -1869,6 +1869,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/pdf-summary.lock.yml b/.github/workflows/pdf-summary.lock.yml index 1680e79680a..d8354d479d4 100644 --- a/.github/workflows/pdf-summary.lock.yml +++ b/.github/workflows/pdf-summary.lock.yml @@ -2463,6 +2463,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/plan.lock.yml b/.github/workflows/plan.lock.yml index d9ce6b05a05..b9e7ba724fa 100644 --- a/.github/workflows/plan.lock.yml +++ b/.github/workflows/plan.lock.yml @@ -1865,6 +1865,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/poem-bot.lock.yml b/.github/workflows/poem-bot.lock.yml index a3247dc4f6e..586452f5a26 100644 --- a/.github/workflows/poem-bot.lock.yml +++ b/.github/workflows/poem-bot.lock.yml @@ -3593,6 +3593,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/pr-nitpick-reviewer.lock.yml b/.github/workflows/pr-nitpick-reviewer.lock.yml index 53e1b06b659..b1ffde16b9f 100644 --- a/.github/workflows/pr-nitpick-reviewer.lock.yml +++ b/.github/workflows/pr-nitpick-reviewer.lock.yml @@ -2514,6 +2514,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/prompt-clustering-analysis.lock.yml b/.github/workflows/prompt-clustering-analysis.lock.yml index 1446f514d40..eb88c0550f8 100644 --- a/.github/workflows/prompt-clustering-analysis.lock.yml +++ b/.github/workflows/prompt-clustering-analysis.lock.yml @@ -2126,6 +2126,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/python-data-charts.lock.yml b/.github/workflows/python-data-charts.lock.yml index fecf9a968f4..76097c892ca 100644 --- a/.github/workflows/python-data-charts.lock.yml +++ b/.github/workflows/python-data-charts.lock.yml @@ -1962,6 +1962,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/q.lock.yml b/.github/workflows/q.lock.yml index 3d4a421b0cc..8444f28d090 100644 --- a/.github/workflows/q.lock.yml +++ b/.github/workflows/q.lock.yml @@ -2781,6 +2781,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/release.lock.yml b/.github/workflows/release.lock.yml index 160a26701ef..f0b6c3cd006 100644 --- a/.github/workflows/release.lock.yml +++ b/.github/workflows/release.lock.yml @@ -1212,6 +1212,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); @@ -6119,19 +6209,19 @@ jobs: - name: Download Go modules run: go mod download - name: Generate SBOM (SPDX format) - uses: anchore/sbom-action@fbfd9c6c189226748411491745178e0c2017392d # v0 + uses: anchore/sbom-action@fbfd9c6c189226748411491745178e0c2017392d # v0.20.10 with: artifact-name: sbom.spdx.json format: spdx-json output-file: sbom.spdx.json - name: Generate SBOM (CycloneDX format) - uses: anchore/sbom-action@fbfd9c6c189226748411491745178e0c2017392d # v0 + uses: anchore/sbom-action@fbfd9c6c189226748411491745178e0c2017392d # v0.20.10 with: artifact-name: sbom.cdx.json format: cyclonedx-json output-file: sbom.cdx.json - name: Upload SBOM artifacts - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: sbom-artifacts path: | diff --git a/.github/workflows/repo-tree-map.lock.yml b/.github/workflows/repo-tree-map.lock.yml index c98a78e24ce..8f26a262c4f 100644 --- a/.github/workflows/repo-tree-map.lock.yml +++ b/.github/workflows/repo-tree-map.lock.yml @@ -1098,6 +1098,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/repository-quality-improver.lock.yml b/.github/workflows/repository-quality-improver.lock.yml index 1fadf001b95..5cbbe9d9741 100644 --- a/.github/workflows/repository-quality-improver.lock.yml +++ b/.github/workflows/repository-quality-improver.lock.yml @@ -1559,6 +1559,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/research.lock.yml b/.github/workflows/research.lock.yml index 7c52d468a45..75e35b55e21 100644 --- a/.github/workflows/research.lock.yml +++ b/.github/workflows/research.lock.yml @@ -1020,6 +1020,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/safe-output-health.lock.yml b/.github/workflows/safe-output-health.lock.yml index 0a52ce98586..a4bc56a9c6c 100644 --- a/.github/workflows/safe-output-health.lock.yml +++ b/.github/workflows/safe-output-health.lock.yml @@ -1565,6 +1565,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/schema-consistency-checker.lock.yml b/.github/workflows/schema-consistency-checker.lock.yml index a96b93316ad..5f5f8ff2aad 100644 --- a/.github/workflows/schema-consistency-checker.lock.yml +++ b/.github/workflows/schema-consistency-checker.lock.yml @@ -1450,6 +1450,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/scout.lock.yml b/.github/workflows/scout.lock.yml index f684ee36ca0..6c93d3b352c 100644 --- a/.github/workflows/scout.lock.yml +++ b/.github/workflows/scout.lock.yml @@ -2767,6 +2767,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/security-fix-pr.lock.yml b/.github/workflows/security-fix-pr.lock.yml index 9e82e1ffed9..2625a45edd6 100644 --- a/.github/workflows/security-fix-pr.lock.yml +++ b/.github/workflows/security-fix-pr.lock.yml @@ -1192,6 +1192,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/semantic-function-refactor.lock.yml b/.github/workflows/semantic-function-refactor.lock.yml index 5c554c8a0b3..a18145fbe99 100644 --- a/.github/workflows/semantic-function-refactor.lock.yml +++ b/.github/workflows/semantic-function-refactor.lock.yml @@ -1594,6 +1594,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/smoke-claude.lock.yml b/.github/workflows/smoke-claude.lock.yml index 4aa66de93e8..309db46b284 100644 --- a/.github/workflows/smoke-claude.lock.yml +++ b/.github/workflows/smoke-claude.lock.yml @@ -2878,6 +2878,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/smoke-codex.lock.yml b/.github/workflows/smoke-codex.lock.yml index 0a099abfa1e..fec5e11c13e 100644 --- a/.github/workflows/smoke-codex.lock.yml +++ b/.github/workflows/smoke-codex.lock.yml @@ -2648,6 +2648,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/smoke-copilot-no-firewall.lock.yml b/.github/workflows/smoke-copilot-no-firewall.lock.yml index 8bf1c549d83..fae72ff0367 100644 --- a/.github/workflows/smoke-copilot-no-firewall.lock.yml +++ b/.github/workflows/smoke-copilot-no-firewall.lock.yml @@ -2721,6 +2721,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/smoke-copilot-playwright.lock.yml b/.github/workflows/smoke-copilot-playwright.lock.yml index f26a3d18411..56433881b07 100644 --- a/.github/workflows/smoke-copilot-playwright.lock.yml +++ b/.github/workflows/smoke-copilot-playwright.lock.yml @@ -2726,6 +2726,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); @@ -3654,6 +3744,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); @@ -3765,15 +3945,20 @@ jobs: createServer, registerTool, normalizeTool, + handleRequest, handleMessage, processReadBuffer, start, loadToolHandlers, }; EOF_MCP_CORE - cat > /tmp/gh-aw/safe-inputs/mcp_server.cjs << 'EOF_MCP_SERVER' + cat > /tmp/gh-aw/safe-inputs/mcp_http_transport.cjs << 'EOF_MCP_HTTP_TRANSPORT' + const http = require("http"); + const { randomUUID } = require("crypto"); + const { createServer, registerTool, handleRequest } = require("./mcp_server_core.cjs"); class MCPServer { constructor(serverInfo, options = {}) { + this._coreServer = createServer(serverInfo, options); this.serverInfo = serverInfo; this.capabilities = options.capabilities || { tools: {} }; this.tools = new Map(); @@ -3787,100 +3972,25 @@ jobs: inputSchema, handler, }); + registerTool(this._coreServer, { + name, + description, + inputSchema, + handler, + }); } async connect(transport) { this.transport = transport; transport.setServer(this); await transport.start(); } - handleInitialize(params) { - this.initialized = true; - return { - protocolVersion: params.protocolVersion || "2024-11-05", - serverInfo: this.serverInfo, - capabilities: this.capabilities, - }; - } - handleToolsList() { - const tools = Array.from(this.tools.values()).map(tool => ({ - name: tool.name, - description: tool.description, - inputSchema: tool.inputSchema, - })); - return { tools }; - } - async handleToolsCall(params) { - const tool = this.tools.get(params.name); - if (!tool) { - throw { - code: -32602, - message: `Tool '${params.name}' not found`, - }; - } - try { - const result = await tool.handler(params.arguments || {}); - return result; - } catch (error) { - throw { - code: -32603, - message: error instanceof Error ? error.message : String(error), - }; - } - } - handlePing() { - return {}; - } async handleRequest(request) { - const { id, method, params } = request; - try { - if (!("id" in request)) { - return null; - } - let result; - switch (method) { - case "initialize": - result = this.handleInitialize(params || {}); - break; - case "ping": - result = this.handlePing(); - break; - case "tools/list": - result = this.handleToolsList(); - break; - case "tools/call": - result = await this.handleToolsCall(params || {}); - break; - default: - throw { - code: -32601, - message: `Method '${method}' not found`, - }; - } - return { - jsonrpc: "2.0", - id, - result, - }; - } catch (error) { - return { - jsonrpc: "2.0", - id, - error: { - code: error.code || -32603, - message: error.message || "Internal error", - }, - }; + if (request.method === "initialize") { + this.initialized = true; } + return handleRequest(this._coreServer, request); } } - module.exports = { - MCPServer, - }; - EOF_MCP_SERVER - cat > /tmp/gh-aw/safe-inputs/mcp_http_transport.cjs << 'EOF_MCP_HTTP_TRANSPORT' - const http = require("http"); - const { randomUUID } = require("crypto"); - const { MCPServer } = require("./mcp_server.cjs"); class MCPHTTPTransport { constructor(options = {}) { this.sessionIdGenerator = options.sessionIdGenerator; diff --git a/.github/workflows/smoke-copilot-safe-inputs.lock.yml b/.github/workflows/smoke-copilot-safe-inputs.lock.yml index dec1c7ae63e..338dd4674f1 100644 --- a/.github/workflows/smoke-copilot-safe-inputs.lock.yml +++ b/.github/workflows/smoke-copilot-safe-inputs.lock.yml @@ -2626,6 +2626,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); @@ -3554,6 +3644,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); @@ -3665,15 +3845,20 @@ jobs: createServer, registerTool, normalizeTool, + handleRequest, handleMessage, processReadBuffer, start, loadToolHandlers, }; EOF_MCP_CORE - cat > /tmp/gh-aw/safe-inputs/mcp_server.cjs << 'EOF_MCP_SERVER' + cat > /tmp/gh-aw/safe-inputs/mcp_http_transport.cjs << 'EOF_MCP_HTTP_TRANSPORT' + const http = require("http"); + const { randomUUID } = require("crypto"); + const { createServer, registerTool, handleRequest } = require("./mcp_server_core.cjs"); class MCPServer { constructor(serverInfo, options = {}) { + this._coreServer = createServer(serverInfo, options); this.serverInfo = serverInfo; this.capabilities = options.capabilities || { tools: {} }; this.tools = new Map(); @@ -3687,100 +3872,25 @@ jobs: inputSchema, handler, }); + registerTool(this._coreServer, { + name, + description, + inputSchema, + handler, + }); } async connect(transport) { this.transport = transport; transport.setServer(this); await transport.start(); } - handleInitialize(params) { - this.initialized = true; - return { - protocolVersion: params.protocolVersion || "2024-11-05", - serverInfo: this.serverInfo, - capabilities: this.capabilities, - }; - } - handleToolsList() { - const tools = Array.from(this.tools.values()).map(tool => ({ - name: tool.name, - description: tool.description, - inputSchema: tool.inputSchema, - })); - return { tools }; - } - async handleToolsCall(params) { - const tool = this.tools.get(params.name); - if (!tool) { - throw { - code: -32602, - message: `Tool '${params.name}' not found`, - }; - } - try { - const result = await tool.handler(params.arguments || {}); - return result; - } catch (error) { - throw { - code: -32603, - message: error instanceof Error ? error.message : String(error), - }; - } - } - handlePing() { - return {}; - } async handleRequest(request) { - const { id, method, params } = request; - try { - if (!("id" in request)) { - return null; - } - let result; - switch (method) { - case "initialize": - result = this.handleInitialize(params || {}); - break; - case "ping": - result = this.handlePing(); - break; - case "tools/list": - result = this.handleToolsList(); - break; - case "tools/call": - result = await this.handleToolsCall(params || {}); - break; - default: - throw { - code: -32601, - message: `Method '${method}' not found`, - }; - } - return { - jsonrpc: "2.0", - id, - result, - }; - } catch (error) { - return { - jsonrpc: "2.0", - id, - error: { - code: error.code || -32603, - message: error.message || "Internal error", - }, - }; + if (request.method === "initialize") { + this.initialized = true; } + return handleRequest(this._coreServer, request); } } - module.exports = { - MCPServer, - }; - EOF_MCP_SERVER - cat > /tmp/gh-aw/safe-inputs/mcp_http_transport.cjs << 'EOF_MCP_HTTP_TRANSPORT' - const http = require("http"); - const { randomUUID } = require("crypto"); - const { MCPServer } = require("./mcp_server.cjs"); class MCPHTTPTransport { constructor(options = {}) { this.sessionIdGenerator = options.sessionIdGenerator; diff --git a/.github/workflows/smoke-copilot.lock.yml b/.github/workflows/smoke-copilot.lock.yml index 41557ae08c1..7edd54c0116 100644 --- a/.github/workflows/smoke-copilot.lock.yml +++ b/.github/workflows/smoke-copilot.lock.yml @@ -2635,6 +2635,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/smoke-detector.lock.yml b/.github/workflows/smoke-detector.lock.yml index 197f0a8ce15..ceaaf59a246 100644 --- a/.github/workflows/smoke-detector.lock.yml +++ b/.github/workflows/smoke-detector.lock.yml @@ -2487,6 +2487,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/smoke-srt.lock.yml b/.github/workflows/smoke-srt.lock.yml index 69953d63046..68cc65a608d 100644 --- a/.github/workflows/smoke-srt.lock.yml +++ b/.github/workflows/smoke-srt.lock.yml @@ -890,6 +890,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/spec-kit-executor.lock.yml b/.github/workflows/spec-kit-executor.lock.yml index be91499c83d..2adbcc5214e 100644 --- a/.github/workflows/spec-kit-executor.lock.yml +++ b/.github/workflows/spec-kit-executor.lock.yml @@ -1212,6 +1212,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/speckit-dispatcher.lock.yml b/.github/workflows/speckit-dispatcher.lock.yml index 71d9aba9439..6032108cb41 100644 --- a/.github/workflows/speckit-dispatcher.lock.yml +++ b/.github/workflows/speckit-dispatcher.lock.yml @@ -2773,6 +2773,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/stale-repo-identifier.lock.yml b/.github/workflows/stale-repo-identifier.lock.yml index 10785842a73..62fc176073e 100644 --- a/.github/workflows/stale-repo-identifier.lock.yml +++ b/.github/workflows/stale-repo-identifier.lock.yml @@ -1959,6 +1959,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/static-analysis-report.lock.yml b/.github/workflows/static-analysis-report.lock.yml index 46b013bd82e..e90ea11700e 100644 --- a/.github/workflows/static-analysis-report.lock.yml +++ b/.github/workflows/static-analysis-report.lock.yml @@ -1474,6 +1474,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/super-linter.lock.yml b/.github/workflows/super-linter.lock.yml index 92c6604ae45..55661d972e7 100644 --- a/.github/workflows/super-linter.lock.yml +++ b/.github/workflows/super-linter.lock.yml @@ -1214,6 +1214,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/technical-doc-writer.lock.yml b/.github/workflows/technical-doc-writer.lock.yml index 2ce9cc1cf77..e2d2e2167a6 100644 --- a/.github/workflows/technical-doc-writer.lock.yml +++ b/.github/workflows/technical-doc-writer.lock.yml @@ -2072,6 +2072,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/test-discussion-expires.lock.yml b/.github/workflows/test-discussion-expires.lock.yml index e782b964d0e..ea13025d8d6 100644 --- a/.github/workflows/test-discussion-expires.lock.yml +++ b/.github/workflows/test-discussion-expires.lock.yml @@ -891,6 +891,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/test-python-safe-input.lock.yml b/.github/workflows/test-python-safe-input.lock.yml index dd13a92b0ab..0d918d384d1 100644 --- a/.github/workflows/test-python-safe-input.lock.yml +++ b/.github/workflows/test-python-safe-input.lock.yml @@ -995,6 +995,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); @@ -1923,6 +2013,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); @@ -2034,15 +2214,20 @@ jobs: createServer, registerTool, normalizeTool, + handleRequest, handleMessage, processReadBuffer, start, loadToolHandlers, }; EOF_MCP_CORE - cat > /tmp/gh-aw/safe-inputs/mcp_server.cjs << 'EOF_MCP_SERVER' + cat > /tmp/gh-aw/safe-inputs/mcp_http_transport.cjs << 'EOF_MCP_HTTP_TRANSPORT' + const http = require("http"); + const { randomUUID } = require("crypto"); + const { createServer, registerTool, handleRequest } = require("./mcp_server_core.cjs"); class MCPServer { constructor(serverInfo, options = {}) { + this._coreServer = createServer(serverInfo, options); this.serverInfo = serverInfo; this.capabilities = options.capabilities || { tools: {} }; this.tools = new Map(); @@ -2056,100 +2241,25 @@ jobs: inputSchema, handler, }); + registerTool(this._coreServer, { + name, + description, + inputSchema, + handler, + }); } async connect(transport) { this.transport = transport; transport.setServer(this); await transport.start(); } - handleInitialize(params) { - this.initialized = true; - return { - protocolVersion: params.protocolVersion || "2024-11-05", - serverInfo: this.serverInfo, - capabilities: this.capabilities, - }; - } - handleToolsList() { - const tools = Array.from(this.tools.values()).map(tool => ({ - name: tool.name, - description: tool.description, - inputSchema: tool.inputSchema, - })); - return { tools }; - } - async handleToolsCall(params) { - const tool = this.tools.get(params.name); - if (!tool) { - throw { - code: -32602, - message: `Tool '${params.name}' not found`, - }; - } - try { - const result = await tool.handler(params.arguments || {}); - return result; - } catch (error) { - throw { - code: -32603, - message: error instanceof Error ? error.message : String(error), - }; - } - } - handlePing() { - return {}; - } async handleRequest(request) { - const { id, method, params } = request; - try { - if (!("id" in request)) { - return null; - } - let result; - switch (method) { - case "initialize": - result = this.handleInitialize(params || {}); - break; - case "ping": - result = this.handlePing(); - break; - case "tools/list": - result = this.handleToolsList(); - break; - case "tools/call": - result = await this.handleToolsCall(params || {}); - break; - default: - throw { - code: -32601, - message: `Method '${method}' not found`, - }; - } - return { - jsonrpc: "2.0", - id, - result, - }; - } catch (error) { - return { - jsonrpc: "2.0", - id, - error: { - code: error.code || -32603, - message: error.message || "Internal error", - }, - }; + if (request.method === "initialize") { + this.initialized = true; } + return handleRequest(this._coreServer, request); } } - module.exports = { - MCPServer, - }; - EOF_MCP_SERVER - cat > /tmp/gh-aw/safe-inputs/mcp_http_transport.cjs << 'EOF_MCP_HTTP_TRANSPORT' - const http = require("http"); - const { randomUUID } = require("crypto"); - const { MCPServer } = require("./mcp_server.cjs"); class MCPHTTPTransport { constructor(options = {}) { this.sessionIdGenerator = options.sessionIdGenerator; diff --git a/.github/workflows/tidy.lock.yml b/.github/workflows/tidy.lock.yml index 0b08a6fa5ee..e6c750b9679 100644 --- a/.github/workflows/tidy.lock.yml +++ b/.github/workflows/tidy.lock.yml @@ -1502,6 +1502,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/typist.lock.yml b/.github/workflows/typist.lock.yml index 0876f1e719c..83f0b8a8fe3 100644 --- a/.github/workflows/typist.lock.yml +++ b/.github/workflows/typist.lock.yml @@ -1579,6 +1579,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/unbloat-docs.lock.yml b/.github/workflows/unbloat-docs.lock.yml index 1590b821686..df2269f024f 100644 --- a/.github/workflows/unbloat-docs.lock.yml +++ b/.github/workflows/unbloat-docs.lock.yml @@ -2529,6 +2529,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/video-analyzer.lock.yml b/.github/workflows/video-analyzer.lock.yml index 0db0bc467c0..6ca6918214b 100644 --- a/.github/workflows/video-analyzer.lock.yml +++ b/.github/workflows/video-analyzer.lock.yml @@ -1206,6 +1206,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/.github/workflows/weekly-issue-summary.lock.yml b/.github/workflows/weekly-issue-summary.lock.yml index 540f1eeb0ae..62d8c9e4d7f 100644 --- a/.github/workflows/weekly-issue-summary.lock.yml +++ b/.github/workflows/weekly-issue-summary.lock.yml @@ -1563,6 +1563,96 @@ jobs: function normalizeTool(name) { return name.replace(/-/g, "_").toLowerCase(); } + async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + try { + if (!("id" in request)) { + return null; + } + let result; + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } + } async function handleMessage(server, req, defaultHandler) { if (!req || typeof req !== "object") { server.debug(`Invalid message: not an object`); diff --git a/pkg/cli/mcp_inspect.go b/pkg/cli/mcp_inspect.go index b579b0bd8dd..e46426c60a3 100644 --- a/pkg/cli/mcp_inspect.go +++ b/pkg/cli/mcp_inspect.go @@ -326,7 +326,6 @@ func writeSafeInputsFiles(dir string, safeInputsConfig *workflow.SafeInputsConfi content string }{ {"read_buffer.cjs", workflow.GetReadBufferScript()}, - {"mcp_server.cjs", workflow.GetMCPServerScript()}, {"mcp_http_transport.cjs", workflow.GetMCPHTTPTransportScript()}, {"safe_inputs_config_loader.cjs", workflow.GetSafeInputsConfigLoaderScript()}, {"mcp_server_core.cjs", workflow.GetMCPServerCoreScript()}, diff --git a/pkg/workflow/js.go b/pkg/workflow/js.go index e64b5164a71..a291352a6a6 100644 --- a/pkg/workflow/js.go +++ b/pkg/workflow/js.go @@ -296,7 +296,6 @@ func GetJavaScriptSources() map[string]string { "update_pr_description_helpers.cjs": updatePRDescriptionHelpersScript, "read_buffer.cjs": readBufferScript, "mcp_server_core.cjs": mcpServerCoreScript, - "mcp_server.cjs": mcpServerScriptSource, "mcp_http_transport.cjs": mcpHTTPTransportScriptSource, "mcp_logger.cjs": mcpLoggerScriptSource, "safe_inputs_mcp_server.cjs": safeInputsMCPServerScript, @@ -777,11 +776,6 @@ func GetMCPServerCoreScript() string { return mcpServerCoreScript } -// GetMCPServerScript returns the embedded mcp_server.cjs script -func GetMCPServerScript() string { - return mcpServerScriptSource -} - // GetMCPHTTPTransportScript returns the embedded mcp_http_transport.cjs script func GetMCPHTTPTransportScript() string { return mcpHTTPTransportScriptSource diff --git a/pkg/workflow/js/mcp_http_transport.cjs b/pkg/workflow/js/mcp_http_transport.cjs index d5aeb92e040..b37a581e4da 100644 --- a/pkg/workflow/js/mcp_http_transport.cjs +++ b/pkg/workflow/js/mcp_http_transport.cjs @@ -20,7 +20,76 @@ const http = require("http"); const { randomUUID } = require("crypto"); -const { MCPServer } = require("./mcp_server.cjs"); +const { createServer, registerTool, handleRequest } = require("./mcp_server_core.cjs"); + +/** + * Simple MCP Server wrapper that provides a class-like interface + * compatible with the HTTP transport, backed by mcp_server_core functions. + */ +class MCPServer { + /** + * @param {Object} serverInfo - Server metadata + * @param {string} serverInfo.name - Server name + * @param {string} serverInfo.version - Server version + * @param {Object} [options] - Server options + * @param {Object} [options.capabilities] - Server capabilities + */ + constructor(serverInfo, options = {}) { + this._coreServer = createServer(serverInfo, options); + this.serverInfo = serverInfo; + this.capabilities = options.capabilities || { tools: {} }; + this.tools = new Map(); + this.transport = null; + this.initialized = false; + } + + /** + * Register a tool with the server + * @param {string} name - Tool name + * @param {string} description - Tool description + * @param {Object} inputSchema - JSON Schema for tool input + * @param {Function} handler - Async function that handles tool calls + */ + tool(name, description, inputSchema, handler) { + this.tools.set(name, { + name, + description, + inputSchema, + handler, + }); + // Also register with the core server + registerTool(this._coreServer, { + name, + description, + inputSchema, + handler, + }); + } + + /** + * Connect to a transport + * @param {any} transport - Transport instance (must have setServer and start methods) + */ + async connect(transport) { + this.transport = transport; + transport.setServer(this); + await transport.start(); + } + + /** + * Handle an incoming JSON-RPC request + * @param {Object} request - JSON-RPC request + * @returns {Promise} JSON-RPC response or null for notifications + */ + async handleRequest(request) { + // Track initialization state + if (request.method === "initialize") { + this.initialized = true; + } + // Delegate to core server's handleRequest function + return handleRequest(this._coreServer, request); + } +} /** * MCP HTTP Transport implementation diff --git a/pkg/workflow/js/mcp_server.cjs b/pkg/workflow/js/mcp_server.cjs deleted file mode 100644 index a6762f214ac..00000000000 --- a/pkg/workflow/js/mcp_server.cjs +++ /dev/null @@ -1,191 +0,0 @@ -// @ts-check -/// - -/** - * MCP Server Implementation - * - * This module provides the MCPServer class for handling MCP (Model Context Protocol) - * tool registration and JSON-RPC 2.0 protocol handling. - * - * Features: - * - Tool registration with schema validation - * - JSON-RPC 2.0 protocol handling (initialize, tools/list, tools/call) - * - Transport-agnostic design (works with HTTP, stdio, etc.) - * - * References: - * - MCP Specification: https://spec.modelcontextprotocol.io - * - JSON-RPC 2.0: https://www.jsonrpc.org/specification - */ - -/** - * Simple MCP Server implementation that provides tool registration and protocol handling - */ -class MCPServer { - /** - * @param {Object} serverInfo - Server metadata - * @param {string} serverInfo.name - Server name - * @param {string} serverInfo.version - Server version - * @param {Object} [options] - Server options - * @param {Object} [options.capabilities] - Server capabilities - */ - constructor(serverInfo, options = {}) { - this.serverInfo = serverInfo; - this.capabilities = options.capabilities || { tools: {} }; - this.tools = new Map(); - this.transport = null; - this.initialized = false; - } - - /** - * Register a tool with the server - * @param {string} name - Tool name - * @param {string} description - Tool description - * @param {Object} inputSchema - JSON Schema for tool input - * @param {Function} handler - Async function that handles tool calls - */ - tool(name, description, inputSchema, handler) { - this.tools.set(name, { - name, - description, - inputSchema, - handler, - }); - } - - /** - * Connect to a transport - * @param {any} transport - Transport instance (must have setServer and start methods) - */ - async connect(transport) { - this.transport = transport; - transport.setServer(this); - await transport.start(); - } - - /** - * Handle initialize request - * @param {Object} params - Initialize parameters - * @returns {Object} Initialize result - */ - handleInitialize(params) { - this.initialized = true; - return { - protocolVersion: params.protocolVersion || "2024-11-05", - serverInfo: this.serverInfo, - capabilities: this.capabilities, - }; - } - - /** - * Handle tools/list request - * @returns {Object} Tools list result - */ - handleToolsList() { - const tools = Array.from(this.tools.values()).map(tool => ({ - name: tool.name, - description: tool.description, - inputSchema: tool.inputSchema, - })); - return { tools }; - } - - /** - * Handle tools/call request - * @param {Object} params - Call parameters - * @param {string} params.name - Tool name - * @param {Object} params.arguments - Tool arguments - * @returns {Promise} Tool call result - */ - async handleToolsCall(params) { - const tool = this.tools.get(params.name); - if (!tool) { - throw { - code: -32602, - message: `Tool '${params.name}' not found`, - }; - } - - try { - const result = await tool.handler(params.arguments || {}); - return result; - } catch (error) { - throw { - code: -32603, - message: error instanceof Error ? error.message : String(error), - }; - } - } - - /** - * Handle ping request - * @returns {Object} Empty ping result - */ - handlePing() { - return {}; - } - - /** - * Handle an incoming JSON-RPC request - * @param {Object} request - JSON-RPC request - * @returns {Promise} JSON-RPC response - */ - async handleRequest(request) { - const { id, method, params } = request; - - try { - // Handle notifications per JSON-RPC 2.0 spec: - // Requests without id field are notifications (no response) - // Note: id can be null for valid requests, so we check for field presence with "in" operator - // MCP notifications (methods starting with "notifications/") also omit the id field per convention - if (!("id" in request)) { - // No id field - this is a notification (no response) - return null; - } - - let result; - - switch (method) { - case "initialize": - result = this.handleInitialize(params || {}); - break; - - case "ping": - result = this.handlePing(); - break; - - case "tools/list": - result = this.handleToolsList(); - break; - - case "tools/call": - result = await this.handleToolsCall(params || {}); - break; - - default: - throw { - code: -32601, - message: `Method '${method}' not found`, - }; - } - - return { - jsonrpc: "2.0", - id, - result, - }; - } catch (error) { - return { - jsonrpc: "2.0", - id, - error: { - code: error.code || -32603, - message: error.message || "Internal error", - }, - }; - } - } -} - -module.exports = { - MCPServer, -}; diff --git a/pkg/workflow/js/mcp_server.test.cjs b/pkg/workflow/js/mcp_server.test.cjs deleted file mode 100644 index f127a98752c..00000000000 --- a/pkg/workflow/js/mcp_server.test.cjs +++ /dev/null @@ -1,225 +0,0 @@ -import { describe, it, expect } from "vitest"; -import { MCPServer } from "./mcp_server.cjs"; - -/** - * Unit tests for mcp_server.cjs - * - * These tests validate the MCPServer class functionality independently - * of any transport implementation. - */ -describe("mcp_server.cjs", () => { - describe("MCPServer", () => { - it("should create a server with basic info", () => { - const server = new MCPServer({ name: "test-server", version: "1.0.0" }, { capabilities: { tools: {} } }); - - expect(server.serverInfo.name).toBe("test-server"); - expect(server.serverInfo.version).toBe("1.0.0"); - expect(server.capabilities.tools).toBeDefined(); - }); - - it("should create a server with default capabilities", () => { - const server = new MCPServer({ name: "test-server", version: "1.0.0" }); - - expect(server.capabilities.tools).toBeDefined(); - expect(server.initialized).toBe(false); - }); - - it("should register a tool", () => { - const server = new MCPServer({ name: "test-server", version: "1.0.0" }); - - server.tool( - "test_tool", - "A test tool", - { - type: "object", - properties: { - input: { type: "string" }, - }, - }, - async args => { - return { content: [{ type: "text", text: "result" }] }; - } - ); - - expect(server.tools.size).toBe(1); - expect(server.tools.has("test_tool")).toBe(true); - const tool = server.tools.get("test_tool"); - expect(tool.name).toBe("test_tool"); - expect(tool.description).toBe("A test tool"); - }); - - it("should handle initialize request", async () => { - const server = new MCPServer({ name: "test-server", version: "1.0.0" }); - - const response = await server.handleRequest({ - jsonrpc: "2.0", - id: 1, - method: "initialize", - params: { protocolVersion: "2024-11-05" }, - }); - - expect(response.jsonrpc).toBe("2.0"); - expect(response.id).toBe(1); - expect(response.result.protocolVersion).toBe("2024-11-05"); - expect(response.result.serverInfo.name).toBe("test-server"); - expect(server.initialized).toBe(true); - }); - - it("should handle tools/list request", async () => { - const server = new MCPServer({ name: "test-server", version: "1.0.0" }); - - server.tool("tool1", "First tool", {}, async () => ({ content: [] })); - server.tool("tool2", "Second tool", {}, async () => ({ content: [] })); - - const response = await server.handleRequest({ - jsonrpc: "2.0", - id: 2, - method: "tools/list", - }); - - expect(response.result.tools).toHaveLength(2); - expect(response.result.tools[0].name).toBe("tool1"); - expect(response.result.tools[1].name).toBe("tool2"); - }); - - it("should handle tools/call request", async () => { - const server = new MCPServer({ name: "test-server", version: "1.0.0" }); - - const mockHandler = async args => { - return { - content: [ - { - type: "text", - text: JSON.stringify({ echo: args.message }), - }, - ], - }; - }; - - server.tool("echo", "Echo tool", { type: "object" }, mockHandler); - - const response = await server.handleRequest({ - jsonrpc: "2.0", - id: 3, - method: "tools/call", - params: { - name: "echo", - arguments: { message: "hello" }, - }, - }); - - expect(response.result.content).toHaveLength(1); - expect(response.result.content[0].type).toBe("text"); - const result = JSON.parse(response.result.content[0].text); - expect(result.echo).toBe("hello"); - }); - - it("should return error for unknown tool", async () => { - const server = new MCPServer({ name: "test-server", version: "1.0.0" }); - - const response = await server.handleRequest({ - jsonrpc: "2.0", - id: 4, - method: "tools/call", - params: { - name: "unknown_tool", - arguments: {}, - }, - }); - - expect(response.error).toBeDefined(); - expect(response.error.code).toBe(-32602); - expect(response.error.message).toContain("not found"); - }); - - it("should return error for unknown method", async () => { - const server = new MCPServer({ name: "test-server", version: "1.0.0" }); - - const response = await server.handleRequest({ - jsonrpc: "2.0", - id: 5, - method: "unknown/method", - }); - - expect(response.error).toBeDefined(); - expect(response.error.code).toBe(-32601); - expect(response.error.message).toContain("not found"); - }); - - it("should handle tool handler errors", async () => { - const server = new MCPServer({ name: "test-server", version: "1.0.0" }); - - server.tool("error_tool", "Tool that throws", {}, async () => { - throw new Error("Test error"); - }); - - const response = await server.handleRequest({ - jsonrpc: "2.0", - id: 6, - method: "tools/call", - params: { - name: "error_tool", - arguments: {}, - }, - }); - - expect(response.error).toBeDefined(); - expect(response.error.code).toBe(-32603); - expect(response.error.message).toBe("Test error"); - }); - - it("should handle ping request", async () => { - const server = new MCPServer({ name: "test-server", version: "1.0.0" }); - - const response = await server.handleRequest({ - jsonrpc: "2.0", - id: 7, - method: "ping", - }); - - expect(response.jsonrpc).toBe("2.0"); - expect(response.id).toBe(7); - expect(response.result).toEqual({}); - }); - - it("should handle notifications/initialized without response", async () => { - const server = new MCPServer({ name: "test-server", version: "1.0.0" }); - - const response = await server.handleRequest({ - jsonrpc: "2.0", - method: "notifications/initialized", - // no id - this is a notification per JSON-RPC 2.0 spec - }); - - expect(response).toBeNull(); - }); - - it("should handle any notification without response (no id field)", async () => { - const server = new MCPServer({ name: "test-server", version: "1.0.0" }); - - const response = await server.handleRequest({ - jsonrpc: "2.0", - method: "some/custom/notification", - params: { data: "test" }, - // no id - this is a notification per JSON-RPC 2.0 spec - }); - - expect(response).toBeNull(); - }); - - it("should handle request with id: null as a valid request", async () => { - const server = new MCPServer({ name: "test-server", version: "1.0.0" }); - - const response = await server.handleRequest({ - jsonrpc: "2.0", - id: null, - method: "ping", - }); - - expect(response).not.toBeNull(); - expect(response.jsonrpc).toBe("2.0"); - expect(response.id).toBeNull(); - expect(response.result).toEqual({}); - }); - }); -}); diff --git a/pkg/workflow/js/mcp_server_core.cjs b/pkg/workflow/js/mcp_server_core.cjs index 1b8a3c6d524..8e8ddc22bfe 100644 --- a/pkg/workflow/js/mcp_server_core.cjs +++ b/pkg/workflow/js/mcp_server_core.cjs @@ -479,7 +479,120 @@ function normalizeTool(name) { } /** - * Handle an incoming JSON-RPC message + * Handle an incoming JSON-RPC request and return a response (for HTTP transport) + * This function is compatible with the MCPServer class's handleRequest method. + * @param {MCPServer} server - The MCP server instance + * @param {Object} request - The incoming JSON-RPC request + * @param {Function} [defaultHandler] - Default handler for tools without a handler + * @returns {Promise} JSON-RPC response object, or null for notifications + */ +async function handleRequest(server, request, defaultHandler) { + const { id, method, params } = request; + + try { + // Handle notifications per JSON-RPC 2.0 spec: + // Requests without id field are notifications (no response) + // Note: id can be null for valid requests, so we check for field presence with "in" operator + if (!("id" in request)) { + // No id field - this is a notification (no response) + return null; + } + + let result; + + if (method === "initialize") { + const protocolVersion = params?.protocolVersion || "2024-11-05"; + result = { + protocolVersion, + serverInfo: server.serverInfo, + capabilities: { + tools: {}, + }, + }; + } else if (method === "ping") { + result = {}; + } else if (method === "tools/list") { + const list = []; + Object.values(server.tools).forEach(tool => { + const toolDef = { + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + }; + list.push(toolDef); + }); + result = { tools: list }; + } else if (method === "tools/call") { + const name = params?.name; + const args = params?.arguments ?? {}; + if (!name || typeof name !== "string") { + throw { + code: -32602, + message: "Invalid params: 'name' must be a string", + }; + } + const tool = server.tools[normalizeTool(name)]; + if (!tool) { + throw { + code: -32602, + message: `Tool '${name}' not found`, + }; + } + + // Use tool handler, or default handler, or error + let handler = tool.handler; + if (!handler && defaultHandler) { + handler = defaultHandler(tool.name); + } + if (!handler) { + throw { + code: -32603, + message: `No handler for tool: ${name}`, + }; + } + + const missing = validateRequiredFields(args, tool.inputSchema); + if (missing.length) { + throw { + code: -32602, + message: `Invalid arguments: missing or empty ${missing.map(m => `'${m}'`).join(", ")}`, + }; + } + + // Call handler and await the result (supports both sync and async handlers) + const handlerResult = await Promise.resolve(handler(args)); + const content = handlerResult && handlerResult.content ? handlerResult.content : []; + result = { content, isError: false }; + } else if (/^notifications\//.test(method)) { + // Notifications don't need a response + return null; + } else { + throw { + code: -32601, + message: `Method not found: ${method}`, + }; + } + + return { + jsonrpc: "2.0", + id, + result, + }; + } catch (error) { + const err = /** @type {any} */ (error); + return { + jsonrpc: "2.0", + id, + error: { + code: err.code || -32603, + message: err.message || "Internal error", + }, + }; + } +} + +/** + * Handle an incoming JSON-RPC message (for stdio transport) * @param {MCPServer} server - The MCP server instance * @param {Object} req - The incoming request * @param {Function} [defaultHandler] - Default handler for tools without a handler @@ -628,6 +741,7 @@ module.exports = { createServer, registerTool, normalizeTool, + handleRequest, handleMessage, processReadBuffer, start, diff --git a/pkg/workflow/mcp_servers.go b/pkg/workflow/mcp_servers.go index 58de9b0c665..d6b91c6ed7a 100644 --- a/pkg/workflow/mcp_servers.go +++ b/pkg/workflow/mcp_servers.go @@ -295,12 +295,6 @@ func (c *Compiler) generateMCPSetup(yaml *strings.Builder, tools map[string]any, } yaml.WriteString(" EOF_MCP_CORE\n") - yaml.WriteString(" cat > /tmp/gh-aw/safe-inputs/mcp_server.cjs << 'EOF_MCP_SERVER'\n") - for _, line := range FormatJavaScriptForYAML(GetMCPServerScript()) { - yaml.WriteString(line) - } - yaml.WriteString(" EOF_MCP_SERVER\n") - yaml.WriteString(" cat > /tmp/gh-aw/safe-inputs/mcp_http_transport.cjs << 'EOF_MCP_HTTP_TRANSPORT'\n") for _, line := range FormatJavaScriptForYAML(GetMCPHTTPTransportScript()) { yaml.WriteString(line) diff --git a/pkg/workflow/scripts.go b/pkg/workflow/scripts.go index 6f3c4334f33..3c9b264a755 100644 --- a/pkg/workflow/scripts.go +++ b/pkg/workflow/scripts.go @@ -125,9 +125,6 @@ var parseCopilotLogScriptSource string //go:embed js/mcp_logger.cjs var mcpLoggerScriptSource string -//go:embed js/mcp_server.cjs -var mcpServerScriptSource string - //go:embed js/mcp_http_transport.cjs var mcpHTTPTransportScriptSource string @@ -177,7 +174,6 @@ func init() { // MCP server and transport scripts DefaultScriptRegistry.Register("mcp_logger", mcpLoggerScriptSource) - DefaultScriptRegistry.Register("mcp_server", mcpServerScriptSource) DefaultScriptRegistry.Register("mcp_http_transport", mcpHTTPTransportScriptSource) // Template substitution scripts