From 662e59067c9500a776e3758b04892516d190feae Mon Sep 17 00:00:00 2001 From: Fuwn Date: Tue, 3 Feb 2026 21:46:27 -0800 Subject: feat(mcp): Add text-based semantic search tool --- packages/mcp/src/index.ts | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/packages/mcp/src/index.ts b/packages/mcp/src/index.ts index 46aa487..4ab8af8 100644 --- a/packages/mcp/src/index.ts +++ b/packages/mcp/src/index.ts @@ -567,6 +567,53 @@ server.tool( }; }, ); +server.tool( + "search_memories_by_text", + "Search memories using text query with auto-generated embedding", + { + query: z.string().describe("The search query text"), + threshold: z + .number() + .optional() + .describe("Minimum similarity threshold (0-1, default 0.7)"), + limit: z + .number() + .optional() + .describe("Maximum number of results (default 10)"), + projectId: z.string().optional().describe("Filter by project ID"), + folderId: z.string().optional().describe("Filter by folder ID"), + }, + async (parameters) => { + if (!embeddingService) { + return { + content: [ + { + type: "text" as const, + text: "Embedding service not configured. Set OPENAI_API_KEY or IMEMIO_EMBEDDING_TYPE=local.", + }, + ], + isError: true, + }; + } + + const queryEmbedding = await embeddingService.generate(parameters.query); + const searchResults = await memoryStore.search(queryEmbedding, { + threshold: parameters.threshold, + limit: parameters.limit, + projectId: parameters.projectId, + folderId: parameters.folderId, + }); + + return { + content: [ + { + type: "text" as const, + text: JSON.stringify(searchResults, null, 2), + }, + ], + }; + }, +); server.tool( "generate_embedding", "Generate an embedding vector for text content", -- cgit v1.2.3