Skip to content

Commit d26f1cb

Browse files
prihclaude
andcommitted
fix: strip empty arrays and nulls from remaining MCP tool responses
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 1566e0a commit d26f1cb

11 files changed

Lines changed: 22 additions & 11 deletions

File tree

src/api/tools/docs/explain-symbol.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ export function register(server: McpServer, mgr: DocGraphManager): void {
5454
return { content: [{ type: 'text', text: `No documentation found for symbol: ${symbol}` }] };
5555
}
5656

57-
return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
57+
const clean = (_k: string, v: any) => (v === null || (Array.isArray(v) && v.length === 0) ? undefined : v);
58+
return { content: [{ type: 'text', text: JSON.stringify(results, clean, 2) }] };
5859
},
5960
);
6061
}

src/api/tools/docs/list-snippets.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ export function register(server: McpServer, mgr: DocGraphManager): void {
5353
return { content: [{ type: 'text', text: 'No code snippets found matching the criteria.' }] };
5454
}
5555

56-
return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
56+
const clean = (_k: string, v: any) => (Array.isArray(v) && v.length === 0 ? undefined : v);
57+
return { content: [{ type: 'text', text: JSON.stringify(results, clean, 2) }] };
5758
},
5859
);
5960
}

src/api/tools/file-index/search-all-files.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ export function register(server: McpServer, mgr: FileIndexGraphManager): void {
2424
},
2525
async ({ query, limit = FILE_SEARCH_TOP_K, minScore = SEARCH_MIN_SCORE_FILES }) => {
2626
const results = await mgr.search(query, { topK: limit, minScore });
27-
return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
27+
const clean = (_k: string, v: any) => (v === null ? undefined : v);
28+
return { content: [{ type: 'text', text: JSON.stringify(results, clean, 2) }] };
2829
},
2930
);
3031
}

src/api/tools/knowledge/find-linked-notes.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ export function register(server: McpServer, mgr: KnowledgeGraphManager): void {
2525
if (results.length === 0) {
2626
return { content: [{ type: 'text', text: `No notes linked to ${targetGraph}::${targetId}` }] };
2727
}
28-
return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
28+
const clean = (_k: string, v: any) => (Array.isArray(v) && v.length === 0 ? undefined : v);
29+
return { content: [{ type: 'text', text: JSON.stringify(results, clean, 2) }] };
2930
},
3031
);
3132
}

src/api/tools/knowledge/search-notes.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ export function register(server: McpServer, mgr: KnowledgeGraphManager): void {
2626
},
2727
async ({ query, topK, bfsDepth, maxResults, minScore, bfsDecay, searchMode }) => {
2828
const results = await mgr.searchNotes(query, { topK, bfsDepth, maxResults, minScore, bfsDecay, searchMode });
29-
return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
29+
const clean = (_k: string, v: any) => (Array.isArray(v) && v.length === 0 ? undefined : v);
30+
return { content: [{ type: 'text', text: JSON.stringify(results, clean, 2) }] };
3031
},
3132
);
3233
}

src/api/tools/skills/find-linked-skills.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ export function register(server: McpServer, mgr: SkillGraphManager): void {
2525
if (results.length === 0) {
2626
return { content: [{ type: 'text', text: `No skills linked to ${targetGraph}::${targetId}` }] };
2727
}
28-
return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
28+
const clean = (_k: string, v: any) => (Array.isArray(v) && v.length === 0 ? undefined : v);
29+
return { content: [{ type: 'text', text: JSON.stringify(results, clean, 2) }] };
2930
},
3031
);
3132
}

src/api/tools/skills/recall-skills.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ export function register(server: McpServer, mgr: SkillGraphManager): void {
1919
},
2020
async ({ context, topK, minScore, searchMode }) => {
2121
const results = await mgr.searchSkills(context, { topK, minScore: minScore ?? 0.3, searchMode });
22-
return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
22+
const clean = (_k: string, v: any) => (Array.isArray(v) && v.length === 0 ? undefined : v);
23+
return { content: [{ type: 'text', text: JSON.stringify(results, clean, 2) }] };
2324
},
2425
);
2526
}

src/api/tools/skills/search-skills.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ export function register(server: McpServer, mgr: SkillGraphManager): void {
2626
},
2727
async ({ query, topK, bfsDepth, maxResults, minScore, bfsDecay, searchMode }) => {
2828
const results = await mgr.searchSkills(query, { topK, bfsDepth, maxResults, minScore, bfsDecay, searchMode });
29-
return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
29+
const clean = (_k: string, v: any) => (Array.isArray(v) && v.length === 0 ? undefined : v);
30+
return { content: [{ type: 'text', text: JSON.stringify(results, clean, 2) }] };
3031
},
3132
);
3233
}

src/api/tools/tasks/find-linked-tasks.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ export function register(server: McpServer, mgr: TaskGraphManager): void {
2525
if (results.length === 0) {
2626
return { content: [{ type: 'text', text: `No tasks linked to ${targetGraph}::${targetId}` }] };
2727
}
28-
return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
28+
const clean = (_k: string, v: any) => (Array.isArray(v) && v.length === 0 ? undefined : v);
29+
return { content: [{ type: 'text', text: JSON.stringify(results, clean, 2) }] };
2930
},
3031
);
3132
}

src/api/tools/tasks/move-task.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,12 @@ export function register(server: McpServer, mgr: TaskGraphManager): void {
2626
return { content: [{ type: 'text', text: 'Task not found' }], isError: true };
2727
}
2828
const task = mgr.getTask(taskId)!;
29+
const clean = (_k: string, v: any) => (v === null ? undefined : v);
2930
return { content: [{ type: 'text', text: JSON.stringify({
3031
taskId: task.id,
3132
status: task.status,
3233
completedAt: task.completedAt,
33-
}, null, 2) }] };
34+
}, clean, 2) }] };
3435
} catch (err) {
3536
if (err instanceof VersionConflictError) {
3637
return { content: [{ type: 'text', text: JSON.stringify({ error: 'version_conflict', current: err.current, expected: err.expected }) }], isError: true };

0 commit comments

Comments
 (0)