Strip embeddings from MCP tool responses
Reduces response size by omitting embedding arrays from serialized output.
This commit is contained in:
@@ -5,6 +5,10 @@ import { query, listNodes, getNode, findNodeByPrefix, addNode, addEdge } from '.
|
|||||||
import { getConnections } from '../core/graph';
|
import { getConnections } from '../core/graph';
|
||||||
import { NodeKind, EdgeType } from '../types';
|
import { NodeKind, EdgeType } from '../types';
|
||||||
|
|
||||||
|
function serialize(data: any): string {
|
||||||
|
return JSON.stringify(data, (key, val) => key === 'embedding' ? undefined : val, 2);
|
||||||
|
}
|
||||||
|
|
||||||
const server = new McpServer({
|
const server = new McpServer({
|
||||||
name: 'memory',
|
name: 'memory',
|
||||||
version: '1.0.0',
|
version: '1.0.0',
|
||||||
@@ -20,7 +24,7 @@ server.tool(
|
|||||||
},
|
},
|
||||||
async ({ text, kind, limit }) => {
|
async ({ text, kind, limit }) => {
|
||||||
const results = await query(text, { kind: kind as NodeKind, limit });
|
const results = await query(text, { kind: kind as NodeKind, limit });
|
||||||
return { content: [{ type: 'text' as const, text: JSON.stringify(results, null, 2) }] };
|
return { content: [{ type: 'text' as const, text: serialize(results) }] };
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -33,10 +37,10 @@ server.tool(
|
|||||||
async ({ id }) => {
|
async ({ id }) => {
|
||||||
const node = getNode(id) ?? findNodeByPrefix(id);
|
const node = getNode(id) ?? findNodeByPrefix(id);
|
||||||
if (!node) {
|
if (!node) {
|
||||||
return { content: [{ type: 'text' as const, text: JSON.stringify({ error: 'Node not found' }) }], isError: true };
|
return { content: [{ type: 'text' as const, text: serialize({ error: 'Node not found' }) }], isError: true };
|
||||||
}
|
}
|
||||||
const connections = getConnections(node.id);
|
const connections = getConnections(node.id);
|
||||||
return { content: [{ type: 'text' as const, text: JSON.stringify({ node, connections }, null, 2) }] };
|
return { content: [{ type: 'text' as const, text: serialize({ node, connections }) }] };
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -51,7 +55,7 @@ server.tool(
|
|||||||
},
|
},
|
||||||
async ({ kind, status, tags, limit }) => {
|
async ({ kind, status, tags, limit }) => {
|
||||||
const nodes = listNodes({ kind: kind as NodeKind, status, tags, limit });
|
const nodes = listNodes({ kind: kind as NodeKind, status, tags, limit });
|
||||||
return { content: [{ type: 'text' as const, text: JSON.stringify(nodes, null, 2) }] };
|
return { content: [{ type: 'text' as const, text: serialize(nodes) }] };
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -65,14 +69,14 @@ server.tool(
|
|||||||
async ({ id, kind }) => {
|
async ({ id, kind }) => {
|
||||||
const node = getNode(id) ?? findNodeByPrefix(id);
|
const node = getNode(id) ?? findNodeByPrefix(id);
|
||||||
if (!node) {
|
if (!node) {
|
||||||
return { content: [{ type: 'text' as const, text: JSON.stringify({ error: 'Node not found' }) }], isError: true };
|
return { content: [{ type: 'text' as const, text: serialize({ error: 'Node not found' }) }], isError: true };
|
||||||
}
|
}
|
||||||
const { outgoing } = getConnections(node.id);
|
const { outgoing } = getConnections(node.id);
|
||||||
let children = outgoing.filter(e => e.type === 'contains').map(e => (e as any).node);
|
let children = outgoing.filter(e => e.type === 'contains').map(e => (e as any).node);
|
||||||
if (kind) {
|
if (kind) {
|
||||||
children = children.filter((n: any) => n.kind === kind);
|
children = children.filter((n: any) => n.kind === kind);
|
||||||
}
|
}
|
||||||
return { content: [{ type: 'text' as const, text: JSON.stringify(children, null, 2) }] };
|
return { content: [{ type: 'text' as const, text: serialize(children) }] };
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -91,7 +95,7 @@ server.tool(
|
|||||||
const metadata: Record<string, any> = {};
|
const metadata: Record<string, any> = {};
|
||||||
if (sections) metadata.sections = sections;
|
if (sections) metadata.sections = sections;
|
||||||
const node = await addNode({ kind: kind as NodeKind, title, content, tags, status, metadata });
|
const node = await addNode({ kind: kind as NodeKind, title, content, tags, status, metadata });
|
||||||
return { content: [{ type: 'text' as const, text: JSON.stringify(node, null, 2) }] };
|
return { content: [{ type: 'text' as const, text: serialize(node) }] };
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -105,7 +109,7 @@ server.tool(
|
|||||||
},
|
},
|
||||||
async ({ fromId, toId, type }) => {
|
async ({ fromId, toId, type }) => {
|
||||||
const edge = addEdge(fromId, toId, type as EdgeType);
|
const edge = addEdge(fromId, toId, type as EdgeType);
|
||||||
return { content: [{ type: 'text' as const, text: JSON.stringify(edge, null, 2) }] };
|
return { content: [{ type: 'text' as const, text: serialize(edge) }] };
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user