From 8c6cfc8f5fdab4bbdae41060518c08731720976a Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Sun, 13 Apr 2025 13:47:40 +0000 Subject: fix(mcp): compact the response of get bookmark lists --- apps/mcp/src/bookmarks.ts | 85 ++----------------------------------------- apps/mcp/src/lists.ts | 5 +-- apps/mcp/src/shared.ts | 15 -------- apps/mcp/src/tags.ts | 3 +- apps/mcp/src/utils.ts | 92 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 99 insertions(+), 101 deletions(-) create mode 100644 apps/mcp/src/utils.ts (limited to 'apps/mcp') diff --git a/apps/mcp/src/bookmarks.ts b/apps/mcp/src/bookmarks.ts index 04e4480d..ed2da2fd 100644 --- a/apps/mcp/src/bookmarks.ts +++ b/apps/mcp/src/bookmarks.ts @@ -1,89 +1,8 @@ import { CallToolResult } from "@modelcontextprotocol/sdk/types"; import { z } from "zod"; -import { KarakeepAPISchemas } from "@karakeep/sdk"; - -import { - karakeepClient, - mcpServer, - toMcpToolError, - turndownService, -} from "./shared"; - -interface CompactBookmark { - id: string; - createdAt: string; - title: string; - summary: string; - note: string; - content: - | { - type: "link"; - url: string; - description: string; - author: string; - publisher: string; - } - | { - type: "text"; - sourceUrl: string; - } - | { - type: "media"; - assetId: string; - assetType: string; - sourceUrl: string; - } - | { - type: "unknown"; - }; - tags: string[]; -} - -function compactBookmark( - bookmark: KarakeepAPISchemas["Bookmark"], -): CompactBookmark { - let content: CompactBookmark["content"]; - if (bookmark.content.type === "link") { - content = { - type: "link", - url: bookmark.content.url, - description: bookmark.content.description ?? "", - author: bookmark.content.author ?? "", - publisher: bookmark.content.publisher ?? "", - }; - } else if (bookmark.content.type === "text") { - content = { - type: "text", - sourceUrl: bookmark.content.sourceUrl ?? "", - }; - } else if (bookmark.content.type === "asset") { - content = { - type: "media", - assetId: bookmark.content.assetId, - assetType: bookmark.content.assetType, - sourceUrl: bookmark.content.sourceUrl ?? "", - }; - } else { - content = { - type: "unknown", - }; - } - - return { - id: bookmark.id, - createdAt: bookmark.createdAt, - title: bookmark.title - ? bookmark.title - : ((bookmark.content.type === "link" - ? bookmark.content.title - : undefined) ?? ""), - summary: bookmark.summary ?? "", - note: bookmark.note ?? "", - content, - tags: bookmark.tags.map((t) => t.name), - }; -} +import { karakeepClient, mcpServer, turndownService } from "./shared"; +import { compactBookmark, toMcpToolError } from "./utils"; // Tools mcpServer.tool( diff --git a/apps/mcp/src/lists.ts b/apps/mcp/src/lists.ts index 6cfe1d13..1e0f3a8a 100644 --- a/apps/mcp/src/lists.ts +++ b/apps/mcp/src/lists.ts @@ -1,7 +1,8 @@ import { CallToolResult } from "@modelcontextprotocol/sdk/types"; import { z } from "zod"; -import { karakeepClient, mcpServer, toMcpToolError } from "./shared"; +import { karakeepClient, mcpServer } from "./shared"; +import { compactBookmark, toMcpToolError } from "./utils"; mcpServer.tool( "get-lists", @@ -40,7 +41,7 @@ mcpServer.tool( return { content: res.data.bookmarks.map((bookmark) => ({ type: "text", - text: JSON.stringify(bookmark), + text: JSON.stringify(compactBookmark(bookmark)), })), }; }, diff --git a/apps/mcp/src/shared.ts b/apps/mcp/src/shared.ts index 2c553d17..a80c3620 100644 --- a/apps/mcp/src/shared.ts +++ b/apps/mcp/src/shared.ts @@ -1,5 +1,4 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { CallToolResult } from "@modelcontextprotocol/sdk/types"; import TurndownService from "turndown"; import { createKarakeepClient } from "@karakeep/sdk"; @@ -21,17 +20,3 @@ export const mcpServer = new McpServer({ }); export const turndownService = new TurndownService(); - -export function toMcpToolError( - error: { code: string; message: string } | undefined, -): CallToolResult { - return { - isError: true, - content: [ - { - type: "text", - text: error ? JSON.stringify(error) : `Something went wrong`, - }, - ], - }; -} diff --git a/apps/mcp/src/tags.ts b/apps/mcp/src/tags.ts index a23abea0..da651a40 100644 --- a/apps/mcp/src/tags.ts +++ b/apps/mcp/src/tags.ts @@ -1,7 +1,8 @@ import { CallToolResult } from "@modelcontextprotocol/sdk/types"; import { z } from "zod"; -import { karakeepClient, mcpServer, toMcpToolError } from "./shared"; +import { karakeepClient, mcpServer } from "./shared"; +import { toMcpToolError } from "./utils"; mcpServer.tool( "attach-tag-to-bookmark", diff --git a/apps/mcp/src/utils.ts b/apps/mcp/src/utils.ts new file mode 100644 index 00000000..26a86436 --- /dev/null +++ b/apps/mcp/src/utils.ts @@ -0,0 +1,92 @@ +import { CallToolResult } from "@modelcontextprotocol/sdk/types"; + +import { KarakeepAPISchemas } from "@karakeep/sdk"; + +export function toMcpToolError( + error: { code: string; message: string } | undefined, +): CallToolResult { + return { + isError: true, + content: [ + { + type: "text", + text: error ? JSON.stringify(error) : `Something went wrong`, + }, + ], + }; +} + +interface CompactBookmark { + id: string; + createdAt: string; + title: string; + summary: string; + note: string; + content: + | { + type: "link"; + url: string; + description: string; + author: string; + publisher: string; + } + | { + type: "text"; + sourceUrl: string; + } + | { + type: "media"; + assetId: string; + assetType: string; + sourceUrl: string; + } + | { + type: "unknown"; + }; + tags: string[]; +} + +export function compactBookmark( + bookmark: KarakeepAPISchemas["Bookmark"], +): CompactBookmark { + let content: CompactBookmark["content"]; + if (bookmark.content.type === "link") { + content = { + type: "link", + url: bookmark.content.url, + description: bookmark.content.description ?? "", + author: bookmark.content.author ?? "", + publisher: bookmark.content.publisher ?? "", + }; + } else if (bookmark.content.type === "text") { + content = { + type: "text", + sourceUrl: bookmark.content.sourceUrl ?? "", + }; + } else if (bookmark.content.type === "asset") { + content = { + type: "media", + assetId: bookmark.content.assetId, + assetType: bookmark.content.assetType, + sourceUrl: bookmark.content.sourceUrl ?? "", + }; + } else { + content = { + type: "unknown", + }; + } + + return { + id: bookmark.id, + createdAt: bookmark.createdAt, + title: bookmark.title + ? bookmark.title + : ((bookmark.content.type === "link" + ? bookmark.content.title + : undefined) ?? ""), + summary: bookmark.summary ?? "", + note: bookmark.note ?? "", + content, + tags: bookmark.tags.map((t) => t.name), + }; +} -- cgit v1.2.3-70-g09d2