diff --git a/lib/mcp/getCallToolResult.ts b/lib/mcp/getCallToolResult.ts new file mode 100644 index 000000000..1da12049c --- /dev/null +++ b/lib/mcp/getCallToolResult.ts @@ -0,0 +1,22 @@ +import { TextContent } from "@modelcontextprotocol/sdk/types.js"; + +export type CallToolResult = { + content: TextContent[]; +}; + +/** + * Creates the base structure for an MCP tool result. + * + * @param text - The text content to include in the response + * @returns An MCP tool response structure + */ +export function getCallToolResult(text: string): CallToolResult { + return { + content: [ + { + type: "text" as const, + text, + }, + ], + }; +} diff --git a/lib/mcp/getToolResultError.ts b/lib/mcp/getToolResultError.ts new file mode 100644 index 000000000..a3240dda6 --- /dev/null +++ b/lib/mcp/getToolResultError.ts @@ -0,0 +1,16 @@ +import { CallToolResult, getCallToolResult } from "./getCallToolResult"; + +/** + * Creates a standardized error response for MCP tools. + * + * @param message - The error message to return + * @returns An MCP tool response with error content + */ +export function getToolResultError(message: string): CallToolResult { + return getCallToolResult( + JSON.stringify({ + success: false, + message, + }), + ); +} diff --git a/lib/mcp/getToolResultSuccess.ts b/lib/mcp/getToolResultSuccess.ts new file mode 100644 index 000000000..961df744a --- /dev/null +++ b/lib/mcp/getToolResultSuccess.ts @@ -0,0 +1,11 @@ +import { CallToolResult, getCallToolResult } from "./getCallToolResult"; + +/** + * Creates a standardized success response for MCP tools. + * + * @param data - The data to return + * @returns An MCP tool response with success content + */ +export function getToolResultSuccess(data: unknown): CallToolResult { + return getCallToolResult(JSON.stringify(data)); +} diff --git a/lib/mcp/tools/catalogs/registerGetCatalogSongsTool.ts b/lib/mcp/tools/catalogs/registerGetCatalogSongsTool.ts index 64e9d1a28..4af5a91ac 100644 --- a/lib/mcp/tools/catalogs/registerGetCatalogSongsTool.ts +++ b/lib/mcp/tools/catalogs/registerGetCatalogSongsTool.ts @@ -4,6 +4,7 @@ import { getCatalogSongsQuerySchema, type GetCatalogSongsQuery, } from "@/lib/catalog/validateGetCatalogSongsQuery"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; /** * Registers the "select_catalog_songs" tool on the MCP server. @@ -41,14 +42,7 @@ export function registerGetCatalogSongsTool(server: McpServer): void { criteria: args.criteria, }); - return { - content: [ - { - type: "text", - text: JSON.stringify(response), - }, - ], - }; + return getToolResultSuccess(response); }, ); } diff --git a/lib/mcp/tools/catalogs/registerGetCatalogsTool.ts b/lib/mcp/tools/catalogs/registerGetCatalogsTool.ts index 2ee114a26..fdea636b8 100644 --- a/lib/mcp/tools/catalogs/registerGetCatalogsTool.ts +++ b/lib/mcp/tools/catalogs/registerGetCatalogsTool.ts @@ -4,6 +4,7 @@ import { type GetCatalogsQuery, } from "@/lib/catalog/validateGetCatalogsQuery"; import { selectAccountCatalogs } from "@/lib/supabase/account_catalogs/selectAccountCatalogs"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; /** * Registers the "select_catalogs" tool on the MCP server. * Retrieves catalogs associated with the current account for ANY music recommendation request. @@ -28,15 +29,7 @@ export function registerGetCatalogsTool(server: McpServer): void { }, async (args: GetCatalogsQuery) => { const data = await selectAccountCatalogs({ accountIds: [args.account_id] }); - - return { - content: [ - { - type: "text", - text: JSON.stringify(data), - }, - ], - }; + return getToolResultSuccess(data); }, ); } diff --git a/lib/mcp/tools/catalogs/registerInsertCatalogSongsTool.ts b/lib/mcp/tools/catalogs/registerInsertCatalogSongsTool.ts index 15d66436b..1518f0b8e 100644 --- a/lib/mcp/tools/catalogs/registerInsertCatalogSongsTool.ts +++ b/lib/mcp/tools/catalogs/registerInsertCatalogSongsTool.ts @@ -4,6 +4,7 @@ import { insertCatalogSongsQuerySchema, type InsertCatalogSongsQuery, } from "@/lib/catalog/validateInsertCatalogSongsQuery"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; /** * Registers the "insert_catalog_songs" tool on the MCP server. @@ -33,15 +34,7 @@ export function registerInsertCatalogSongsTool(server: McpServer): void { }, async (args: InsertCatalogSongsQuery) => { const response = await insertCatalogSongsFunction(args.songs); - - return { - content: [ - { - type: "text", - text: JSON.stringify(response), - }, - ], - }; + return getToolResultSuccess(response); }, ); } diff --git a/lib/mcp/tools/images/registerEditImageTool.ts b/lib/mcp/tools/images/registerEditImageTool.ts index e7a00cfd2..f0e0a0511 100644 --- a/lib/mcp/tools/images/registerEditImageTool.ts +++ b/lib/mcp/tools/images/registerEditImageTool.ts @@ -4,6 +4,8 @@ import { type GenerateAndProcessImageResult, } from "@/lib/image/generateAndProcessImage"; import { editImageQuerySchema, type EditImageQuery } from "@/lib/image/validateEditImageQuery"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; +import { CallToolResult } from "@/lib/mcp/getCallToolResult"; /** * Registers the "edit_image" tool on the MCP server. @@ -18,7 +20,7 @@ export function registerEditImageTool(server: McpServer): void { inputSchema: editImageQuerySchema, description: "Edit existing images.", }, - async (args: EditImageQuery): Promise<{ content: Array<{ type: "text"; text: string }> }> => { + async (args: EditImageQuery): Promise => { const result: GenerateAndProcessImageResult = await generateAndProcessImage( args.prompt, args.account_id, @@ -30,14 +32,7 @@ export function registerEditImageTool(server: McpServer): void { ], ); - return { - content: [ - { - type: "text", - text: JSON.stringify(result), - }, - ], - }; + return getToolResultSuccess(result); }, ); } diff --git a/lib/mcp/tools/images/registerGenerateImageTool.ts b/lib/mcp/tools/images/registerGenerateImageTool.ts index 363874f5c..0f150c08d 100644 --- a/lib/mcp/tools/images/registerGenerateImageTool.ts +++ b/lib/mcp/tools/images/registerGenerateImageTool.ts @@ -7,6 +7,7 @@ import { generateImageQuerySchema, type GenerateImageQuery, } from "@/lib/image/validateGenerateImageQuery"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; /** * Registers the "generate_image" tool on the MCP server. @@ -27,14 +28,7 @@ export function registerGenerateImageTool(server: McpServer): void { args.account_id, ); - return { - content: [ - { - type: "text", - text: JSON.stringify(result), - }, - ], - }; + return getToolResultSuccess(result); }, ); } diff --git a/lib/mcp/tools/registerContactTeamTool.ts b/lib/mcp/tools/registerContactTeamTool.ts index 2e81369b2..a5f6bd2f4 100644 --- a/lib/mcp/tools/registerContactTeamTool.ts +++ b/lib/mcp/tools/registerContactTeamTool.ts @@ -4,6 +4,7 @@ import { contactTeamQuerySchema, type ContactTeamQuery, } from "@/lib/contact/validateContactTeamQuery"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; /** * Registers the "contact_team" tool on the MCP server. @@ -21,16 +22,7 @@ export function registerContactTeamTool(server: McpServer): void { }, async (args: ContactTeamQuery) => { const result = await contactTeam(args); - - return { - content: [ - { - type: "text", - text: JSON.stringify(result), - }, - ], - }; + return getToolResultSuccess(result); }, ); } - diff --git a/lib/mcp/tools/registerGetArtistSocialsTool.ts b/lib/mcp/tools/registerGetArtistSocialsTool.ts index 804d007d9..4fe6b10c1 100644 --- a/lib/mcp/tools/registerGetArtistSocialsTool.ts +++ b/lib/mcp/tools/registerGetArtistSocialsTool.ts @@ -4,6 +4,7 @@ import { ArtistSocialsQuery, artistSocialsQuerySchema, } from "@/lib/artist/validateArtistSocialsQuery"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; /** * Registers the "get_artist_socials" tool on the MCP server. @@ -21,7 +22,7 @@ export function registerGetArtistSocialsTool(server: McpServer): void { }, async (args: ArtistSocialsQuery) => { const result = await getArtistSocials(args); - return { content: [{ type: "text", text: JSON.stringify(result) }] }; + return getToolResultSuccess(result); }, ); } diff --git a/lib/mcp/tools/registerGetLocalTimeTool.ts b/lib/mcp/tools/registerGetLocalTimeTool.ts index 2be82876c..8d5db480d 100644 --- a/lib/mcp/tools/registerGetLocalTimeTool.ts +++ b/lib/mcp/tools/registerGetLocalTimeTool.ts @@ -1,6 +1,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { getLocalTime } from "@/lib/time/getLocalTime"; import { GetLocalTimeQuery, getLocalTimeQuerySchema } from "@/lib/time/validateGetLocalTimeQuery"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; /** * Registers the "get_local_time" tool on the MCP server. @@ -18,7 +19,7 @@ export function registerGetLocalTimeTool(server: McpServer): void { }, async (args: GetLocalTimeQuery) => { const result = await getLocalTime(args); - return { content: [{ type: "text", text: JSON.stringify(result) }] }; + return getToolResultSuccess(result); }, ); } diff --git a/lib/mcp/tools/sora2/registerGenerateVideoTool.ts b/lib/mcp/tools/sora2/registerGenerateVideoTool.ts index 62e3213d3..d4e5c0b24 100644 --- a/lib/mcp/tools/sora2/registerGenerateVideoTool.ts +++ b/lib/mcp/tools/sora2/registerGenerateVideoTool.ts @@ -4,6 +4,7 @@ import { generateVideoQuerySchema, type GenerateVideoQuery, } from "@/lib/video/validateGenerateVideoQuery"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; /** * Registers the "generate_sora_2_video" tool on the MCP server. @@ -28,15 +29,7 @@ export function registerGenerateVideoTool(server: McpServer): void { }, async (args: GenerateVideoQuery) => { const result = await generateVideoFunction(args); - - return { - content: [ - { - type: "text", - text: JSON.stringify(result), - }, - ], - }; + return getToolResultSuccess(result); }, ); } diff --git a/lib/mcp/tools/sora2/registerRetrieveVideoContentTool.ts b/lib/mcp/tools/sora2/registerRetrieveVideoContentTool.ts index 84d997d40..7328f0136 100644 --- a/lib/mcp/tools/sora2/registerRetrieveVideoContentTool.ts +++ b/lib/mcp/tools/sora2/registerRetrieveVideoContentTool.ts @@ -4,6 +4,7 @@ import { retrieveVideoQuerySchema, type RetrieveVideoQuery, } from "@/lib/video/validateRetrieveVideoQuery"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; /** * Registers the "retrieve_sora_2_video_content" tool on the MCP server. @@ -31,15 +32,7 @@ export function registerRetrieveVideoContentTool(server: McpServer): void { }, async (args: RetrieveVideoQuery) => { const result = await retrieveVideoContentFunction(args); - - return { - content: [ - { - type: "text", - text: JSON.stringify(result), - }, - ], - }; + return getToolResultSuccess(result); }, ); } diff --git a/lib/mcp/tools/sora2/registerRetrieveVideoTool.ts b/lib/mcp/tools/sora2/registerRetrieveVideoTool.ts index d1391e4b3..e59bb2005 100644 --- a/lib/mcp/tools/sora2/registerRetrieveVideoTool.ts +++ b/lib/mcp/tools/sora2/registerRetrieveVideoTool.ts @@ -4,6 +4,7 @@ import { retrieveVideoQuerySchema, type RetrieveVideoQuery, } from "@/lib/video/validateRetrieveVideoQuery"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; /** * Registers the "retrieve_sora_2_video" tool on the MCP server. @@ -30,15 +31,7 @@ export function registerRetrieveVideoTool(server: McpServer): void { }, async (args: RetrieveVideoQuery) => { const result = await retrieveVideoFunction(args); - - return { - content: [ - { - type: "text", - text: JSON.stringify(result), - }, - ], - }; + return getToolResultSuccess(result); }, ); } diff --git a/lib/mcp/tools/spotify/index.ts b/lib/mcp/tools/spotify/index.ts index 1bfab1dea..dabfe128e 100644 --- a/lib/mcp/tools/spotify/index.ts +++ b/lib/mcp/tools/spotify/index.ts @@ -2,6 +2,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { registerGetSpotifySearchTool } from "./registerGetSpotifySearchTool"; import { registerGetSpotifyArtistTopTracksTool } from "./registerGetSpotifyArtistTopTracksTool"; import { registerGetSpotifyArtistAlbumsTool } from "./registerGetSpotifyArtistAlbumsTool"; +import { registerGetSpotifyAlbumTool } from "./registerGetSpotifyAlbumTool"; /** * Registers all Spotify-related MCP tools on the server. @@ -12,4 +13,5 @@ export const registerAllSpotifyTools = (server: McpServer): void => { registerGetSpotifySearchTool(server); registerGetSpotifyArtistTopTracksTool(server); registerGetSpotifyArtistAlbumsTool(server); + registerGetSpotifyAlbumTool(server); }; diff --git a/lib/mcp/tools/spotify/registerGetSpotifyAlbumTool.ts b/lib/mcp/tools/spotify/registerGetSpotifyAlbumTool.ts new file mode 100644 index 000000000..75ab2701b --- /dev/null +++ b/lib/mcp/tools/spotify/registerGetSpotifyAlbumTool.ts @@ -0,0 +1,61 @@ +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { z } from "zod"; +import generateAccessToken from "@/lib/spotify/generateAccessToken"; +import getAlbum from "@/lib/spotify/getAlbum"; +import { getToolResultError } from "@/lib/mcp/getToolResultError"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; + +// Zod schema for the MCP tool - matches the original tool interface +const getSpotifyAlbumSchema = z.object({ + id: z.string().min(1, "Album ID is required"), + market: z.string().length(2).optional().describe("ISO 3166-1 alpha-2 country code"), +}); + +type GetSpotifyAlbumArgs = z.infer; + +/** + * Registers the "get_spotify_album" tool on the MCP server. + * Retrieve Spotify catalog information for a single album. + * You should call get_spotify_artist_albums or get_spotify_search first in order to get an album ID to use in the tool call. + * + * @param server - The MCP server instance to register the tool on. + */ +export function registerGetSpotifyAlbumTool(server: McpServer): void { + server.registerTool( + "get_spotify_album", + { + description: + "Retrieve Spotify catalog information for a single album. You should call get_spotify_artist_albums or get_spotify_search first in order to get an album ID to use in the tool call.", + inputSchema: getSpotifyAlbumSchema, + }, + async (args: GetSpotifyAlbumArgs) => { + try { + // Generate Spotify access token + const tokenResult = await generateAccessToken(); + + if (!tokenResult || tokenResult.error || !tokenResult.access_token) { + return getToolResultError("Failed to generate Spotify access token"); + } + + // Call Spotify API to get album + const { album, error } = await getAlbum({ + id: args.id, + market: args.market, + accessToken: tokenResult.access_token, + }); + + if (error || !album) { + return getToolResultError(error?.message || "Failed to fetch Spotify album"); + } + + // Return the album data directly + return getToolResultSuccess(album); + } catch (error) { + console.error("Error fetching Spotify album:", error); + return getToolResultError( + error instanceof Error ? error.message : "Failed to fetch Spotify album", + ); + } + }, + ); +} diff --git a/lib/mcp/tools/spotify/registerGetSpotifyArtistAlbumsTool.ts b/lib/mcp/tools/spotify/registerGetSpotifyArtistAlbumsTool.ts index 294d243c8..ff4b06b29 100644 --- a/lib/mcp/tools/spotify/registerGetSpotifyArtistAlbumsTool.ts +++ b/lib/mcp/tools/spotify/registerGetSpotifyArtistAlbumsTool.ts @@ -2,6 +2,8 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import generateAccessToken from "@/lib/spotify/generateAccessToken"; import getArtistAlbums from "@/lib/spotify/getArtistAlbums"; +import { getToolResultError } from "@/lib/mcp/getToolResultError"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; // Zod schema for the MCP tool - matches the original tool interface const getSpotifyArtistAlbumsSchema = z.object({ @@ -38,17 +40,7 @@ export function registerGetSpotifyArtistAlbumsTool(server: McpServer): void { const tokenResult = await generateAccessToken(); if (!tokenResult || tokenResult.error || !tokenResult.access_token) { - return { - content: [ - { - type: "text", - text: JSON.stringify({ - success: false, - message: "Failed to generate Spotify access token", - }), - }, - ], - }; + return getToolResultError("Failed to generate Spotify access token"); } // Call Spotify API to get artist albums @@ -62,42 +54,16 @@ export function registerGetSpotifyArtistAlbumsTool(server: McpServer): void { }); if (error || !data) { - return { - content: [ - { - type: "text", - text: JSON.stringify({ - success: false, - message: error?.message || "Failed to fetch Spotify artist albums", - }), - }, - ], - }; + return getToolResultError(error?.message || "Failed to fetch Spotify artist albums"); } // Return the data directly (Spotify API returns paginated album list) - return { - content: [ - { - type: "text", - text: JSON.stringify(data), - }, - ], - }; + return getToolResultSuccess(data); } catch (error) { console.error("Error fetching Spotify artist albums:", error); - return { - content: [ - { - type: "text", - text: JSON.stringify({ - success: false, - message: - error instanceof Error ? error.message : "Failed to fetch Spotify artist albums", - }), - }, - ], - }; + return getToolResultError( + error instanceof Error ? error.message : "Failed to fetch Spotify artist albums", + ); } }, ); diff --git a/lib/mcp/tools/spotify/registerGetSpotifyArtistTopTracksTool.ts b/lib/mcp/tools/spotify/registerGetSpotifyArtistTopTracksTool.ts index 45ed54ba7..0d89e0293 100644 --- a/lib/mcp/tools/spotify/registerGetSpotifyArtistTopTracksTool.ts +++ b/lib/mcp/tools/spotify/registerGetSpotifyArtistTopTracksTool.ts @@ -2,6 +2,8 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import generateAccessToken from "@/lib/spotify/generateAccessToken"; import getArtistTopTracks from "@/lib/spotify/getArtistTopTracks"; +import { getToolResultError } from "@/lib/mcp/getToolResultError"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; // Zod schema for the MCP tool - matches the original tool interface const getSpotifyArtistTopTracksSchema = z.object({ @@ -32,17 +34,7 @@ export function registerGetSpotifyArtistTopTracksTool(server: McpServer): void { const tokenResult = await generateAccessToken(); if (!tokenResult || tokenResult.error || !tokenResult.access_token) { - return { - content: [ - { - type: "text", - text: JSON.stringify({ - success: false, - message: "Failed to generate Spotify access token", - }), - }, - ], - }; + return getToolResultError("Failed to generate Spotify access token"); } // Call Spotify API to get artist top tracks @@ -53,42 +45,16 @@ export function registerGetSpotifyArtistTopTracksTool(server: McpServer): void { }); if (error || !data) { - return { - content: [ - { - type: "text", - text: JSON.stringify({ - success: false, - message: error?.message || "Failed to fetch artist top tracks", - }), - }, - ], - }; + return getToolResultError(error?.message || "Failed to fetch artist top tracks"); } // Return the data directly (Spotify API returns { tracks: [...] }) - return { - content: [ - { - type: "text", - text: JSON.stringify(data), - }, - ], - }; + return getToolResultSuccess(data); } catch (error) { console.error("Error fetching artist top tracks:", error); - return { - content: [ - { - type: "text", - text: JSON.stringify({ - success: false, - message: - error instanceof Error ? error.message : "Failed to fetch artist top tracks", - }), - }, - ], - }; + return getToolResultError( + error instanceof Error ? error.message : "Failed to fetch artist top tracks", + ); } }, ); diff --git a/lib/mcp/tools/spotify/registerGetSpotifySearchTool.ts b/lib/mcp/tools/spotify/registerGetSpotifySearchTool.ts index d664e6d12..512d42472 100644 --- a/lib/mcp/tools/spotify/registerGetSpotifySearchTool.ts +++ b/lib/mcp/tools/spotify/registerGetSpotifySearchTool.ts @@ -2,6 +2,8 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import generateAccessToken from "@/lib/spotify/generateAccessToken"; import getSearch from "@/lib/spotify/getSearch"; +import { getToolResultError } from "@/lib/mcp/getToolResultError"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; // Supported Spotify search types const SPOTIFY_TYPES = [ @@ -44,17 +46,7 @@ export function registerGetSpotifySearchTool(server: McpServer): void { const tokenResult = await generateAccessToken(); if (!tokenResult || tokenResult.error || !tokenResult.access_token) { - return { - content: [ - { - type: "text", - text: JSON.stringify({ - success: false, - message: "Failed to generate Spotify access token", - }), - }, - ], - }; + return getToolResultError("Failed to generate Spotify access token"); } // Convert type array to comma-separated string for API @@ -69,17 +61,7 @@ export function registerGetSpotifySearchTool(server: McpServer): void { }); if (error || !data) { - return { - content: [ - { - type: "text", - text: JSON.stringify({ - success: false, - message: error?.message || "Failed to search Spotify", - }), - }, - ], - }; + return getToolResultError(error?.message || "Failed to search Spotify"); } // Filter results to only include requested types (matching original tool behavior) @@ -91,27 +73,12 @@ export function registerGetSpotifySearchTool(server: McpServer): void { } } - return { - content: [ - { - type: "text", - text: JSON.stringify(result), - }, - ], - }; + return getToolResultSuccess(result); } catch (error) { console.error("Error searching Spotify:", error); - return { - content: [ - { - type: "text", - text: JSON.stringify({ - success: false, - message: error instanceof Error ? error.message : "Failed to search Spotify", - }), - }, - ], - }; + return getToolResultError( + error instanceof Error ? error.message : "Failed to search Spotify", + ); } }, ); diff --git a/lib/mcp/tools/tasks/registerCreateTaskTool.ts b/lib/mcp/tools/tasks/registerCreateTaskTool.ts index 0e19e2914..1c88e3718 100644 --- a/lib/mcp/tools/tasks/registerCreateTaskTool.ts +++ b/lib/mcp/tools/tasks/registerCreateTaskTool.ts @@ -1,6 +1,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { createTask } from "@/lib/tasks/createTask"; import { createTaskBodySchema, type CreateTaskBody } from "@/lib/tasks/validateCreateTaskBody"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; /** * Registers the "create_task" tool on the MCP server. @@ -17,14 +18,7 @@ export function registerCreateTaskTool(server: McpServer): void { }, async (args: CreateTaskBody) => { const result = await createTask(args); - return { - content: [ - { - type: "text", - text: JSON.stringify(result), - }, - ], - }; + return getToolResultSuccess(result); }, ); } diff --git a/lib/mcp/tools/tasks/registerDeleteTaskTool.ts b/lib/mcp/tools/tasks/registerDeleteTaskTool.ts index 0a764eba0..5e036c964 100644 --- a/lib/mcp/tools/tasks/registerDeleteTaskTool.ts +++ b/lib/mcp/tools/tasks/registerDeleteTaskTool.ts @@ -2,6 +2,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { deleteTask } from "@/lib/tasks/deleteTask"; import { selectScheduledActions } from "@/lib/supabase/scheduled_actions/selectScheduledActions"; import { deleteTaskBodySchema, type DeleteTaskBody } from "@/lib/tasks/validateDeleteTaskBody"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; /** * Registers the "delete_task" tool on the MCP server. @@ -24,14 +25,7 @@ export function registerDeleteTaskTool(server: McpServer): void { // Delete the task await deleteTask(args); - return { - content: [ - { - type: "text", - text: JSON.stringify(taskToDelete), - }, - ], - }; + return getToolResultSuccess(taskToDelete); }, ); } diff --git a/lib/mcp/tools/tasks/registerGetTasksTool.ts b/lib/mcp/tools/tasks/registerGetTasksTool.ts index 58005582d..e69caf447 100644 --- a/lib/mcp/tools/tasks/registerGetTasksTool.ts +++ b/lib/mcp/tools/tasks/registerGetTasksTool.ts @@ -1,6 +1,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { selectScheduledActions } from "@/lib/supabase/scheduled_actions/selectScheduledActions"; import { GetTasksQuery, getTasksQuerySchema } from "@/lib/tasks/validateGetTasksQuery"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; /** * Registers the "get_tasks" tool on the MCP server. @@ -17,15 +18,7 @@ export function registerGetTasksTool(server: McpServer): void { }, async (args: GetTasksQuery) => { const tasks = await selectScheduledActions(args); - - return { - content: [ - { - type: "text", - text: JSON.stringify(tasks), - }, - ], - }; + return getToolResultSuccess(tasks); }, ); } diff --git a/lib/mcp/tools/tasks/registerUpdateTaskTool.ts b/lib/mcp/tools/tasks/registerUpdateTaskTool.ts index 9e29132a7..1cf2deaf5 100644 --- a/lib/mcp/tools/tasks/registerUpdateTaskTool.ts +++ b/lib/mcp/tools/tasks/registerUpdateTaskTool.ts @@ -1,6 +1,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { updateTask } from "@/lib/tasks/updateTask"; import { updateTaskBodySchema, type UpdateTaskBody } from "@/lib/tasks/validateUpdateTaskBody"; +import { getToolResultSuccess } from "@/lib/mcp/getToolResultSuccess"; /** * Registers the "update_task" tool on the MCP server. @@ -19,14 +20,7 @@ Omitting a field leaves the existing value unchanged.`, }, async (args: UpdateTaskBody) => { const result = await updateTask(args); - return { - content: [ - { - type: "text", - text: JSON.stringify(result), - }, - ], - }; + return getToolResultSuccess(result); }, ); }