aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-02-03 21:46:27 -0800
committerFuwn <[email protected]>2026-02-03 21:46:27 -0800
commit662e59067c9500a776e3758b04892516d190feae (patch)
tree6159d47105c7c860dfdd21ee18056854c6b7d1a6
parentfeat(sdk): Support variable embedding dimensions (diff)
downloadarchived-imemio-662e59067c9500a776e3758b04892516d190feae.tar.xz
archived-imemio-662e59067c9500a776e3758b04892516d190feae.zip
feat(mcp): Add text-based semantic search tool
-rw-r--r--packages/mcp/src/index.ts47
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",
{