diff --git a/package-lock.json b/package-lock.json index 975c64b..b3394a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@apify/log": "^2.5.16", - "@modelcontextprotocol/sdk": "github:jirispilka/mcp-typescript-sdk#fix/add-src-dir", + "@modelcontextprotocol/sdk": "^1.10.0", "ajv": "^8.17.1", "apify": "^3.4.0", "apify-client": "^2.12.1", @@ -1066,7 +1066,8 @@ }, "node_modules/@modelcontextprotocol/sdk": { "version": "1.10.0", - "resolved": "git+ssh://git@github.com/jirispilka/mcp-typescript-sdk.git#4ae4b33f263ec0ab157eb5f541c69ba01cbf2822", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.10.0.tgz", + "integrity": "sha512-wijOavYZfSOADbVM0LA7mrQ17N4IKNdFcfezknCCsZ1Y1KstVWlkDZ5ebcxuQJmqTTxsNjBHLc7it1SV0TBiPg==", "license": "MIT", "dependencies": { "content-type": "^1.0.5", diff --git a/package.json b/package.json index 3e0e8cf..54cfc31 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ ], "dependencies": { "@apify/log": "^2.5.16", - "@modelcontextprotocol/sdk": "github:jirispilka/mcp-typescript-sdk#fix/add-src-dir", + "@modelcontextprotocol/sdk": "^1.10.0", "ajv": "^8.17.1", "apify": "^3.4.0", "apify-client": "^2.12.1", diff --git a/src/actor/server.ts b/src/actor/server.ts index b71140a..aaf4cc6 100644 --- a/src/actor/server.ts +++ b/src/actor/server.ts @@ -102,6 +102,9 @@ export function createExpressApp( } }); + // express.json() middleware to parse JSON bodies. + // It must be used before the POST /mcp route but after the GET /sse route :shrug: + app.use(express.json()); app.post(Routes.MCP, async (req: Request, res: Response) => { log.info('Received MCP request:', req.body); try { diff --git a/src/mcp/server.ts b/src/mcp/server.ts index 2973402..ae2d4e1 100644 --- a/src/mcp/server.ts +++ b/src/mcp/server.ts @@ -132,11 +132,16 @@ export class ActorsMcpServer { throw new Error('APIFY_TOKEN is required but not set in the environment variables or passed as a parameter.'); } + // TODO - log errors + // TODO: handle errors better, server.sendLoggingMessage ( ) + // TODO - do not raise but return mcp errors + // TODO - if connection is /mcp client will not receive notification on tool change + // Find tool by name or actor full name const tool = Array.from(this.tools.values()) .find((t) => t.tool.name === name || (t.type === 'actor' && (t.tool as ActorTool).actorFullName === name)); if (!tool) { - // TODO: handle errors better, server.sendLoggingMessage ( ) + await this.server.sendLoggingMessage({ level: 'info', data: `Unknown tool $\{name}, available tools ${this.getToolNames()}` }); throw new Error(`Unknown tool: ${name}`); } if (!args) {