diff --git a/package.json b/package.json index 7c2cecd..ba1237a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "p0dcasters", - "version": "0.7.0", + "version": "0.7.1", "private": true, "type": "module", "scripts": { diff --git a/src/lib/mcp/tools.ts b/src/lib/mcp/tools.ts index acdfed8..45f6db1 100644 --- a/src/lib/mcp/tools.ts +++ b/src/lib/mcp/tools.ts @@ -413,5 +413,13 @@ export const TOOLS_BY_NAME = new Map(TOOLS.map((t) => [t.name, t])); /** A tool as tools/list describes it: everything but run. */ export function describe(tool: Tool) { - return { name: tool.name, title: tool.title, description: tool.description, inputSchema: tool.inputSchema, annotations: tool.annotations }; + // annotations.title too: the claude.ai directory reads the listing name from + // the annotations and flags every tool that lacks one (2026-11-11). + return { + name: tool.name, + title: tool.title, + description: tool.description, + inputSchema: tool.inputSchema, + annotations: { title: tool.title, ...tool.annotations }, + }; } diff --git a/test/review-mcp.test.mjs b/test/review-mcp.test.mjs index 1869008..177e8ff 100644 --- a/test/review-mcp.test.mjs +++ b/test/review-mcp.test.mjs @@ -13,3 +13,12 @@ test('the review tools are listed and refuse a caller without a submissions:revi } assert.equal(TOOLS_BY_NAME.get('accept_submissions').annotations.readOnlyHint, false); }); + +test('every listed tool carries its title in annotations too', async () => { + const { TOOLS, describe } = await import('../src/lib/mcp/tools.ts'); + for (const t of TOOLS) { + const d = describe(t); + assert.ok(d.annotations.title, `${t.name} has annotations.title`); + assert.equal(d.annotations.title, d.title); + } +});