diff options
| author | Fuwn <[email protected]> | 2026-02-03 21:46:27 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-03 21:46:27 -0800 |
| commit | 662e59067c9500a776e3758b04892516d190feae (patch) | |
| tree | 6159d47105c7c860dfdd21ee18056854c6b7d1a6 /packages/mcp/src | |
| parent | feat(sdk): Support variable embedding dimensions (diff) | |
| download | archived-imemio-662e59067c9500a776e3758b04892516d190feae.tar.xz archived-imemio-662e59067c9500a776e3758b04892516d190feae.zip | |
feat(mcp): Add text-based semantic search tool
Diffstat (limited to 'packages/mcp/src')
| -rw-r--r-- | packages/mcp/src/index.ts | 47 |
1 files changed, 47 insertions, 0 deletions
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 @@ -568,6 +568,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", { |