microCMS MCP Server

by SpringMT
Verified
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { createClient } from "microcms-js-sdk"; import { z } from "zod"; // 環境変数の取得 const MICROCMS_API_KEY = process.env.MICROCMS_API_KEY; const MICROCMS_SERVICE_DOMAIN = process.env.MICROCMS_SERVICE_DOMAIN; const MICROCMS_ENDPOINT = process.env.MICROCMS_ENDPOINT; if (!MICROCMS_API_KEY) { console.error("Error: MICROCMS_API_KEY environment variable is not set"); process.exit(1); } if (!MICROCMS_SERVICE_DOMAIN) { console.error("Error: MICROCMS_SERVICE_DOMAIN environment variable is not set"); process.exit(1); } if (!MICROCMS_ENDPOINT) { console.error("Error: MICROCMS_ENDPOINT environment variable is not set"); process.exit(1); } // MicroCMSクライアントの作成 const client = createClient({ serviceDomain: MICROCMS_SERVICE_DOMAIN, apiKey: MICROCMS_API_KEY, }); // Create server instance const server = new McpServer({ name: "microcms", version: "1.0.0", }); // 検索ツールの実装 server.tool( "SearchMicroCMS", "Search content in MicroCMS", { q: z.string().describe("Search query"), limit: z.number().optional().describe("Maximum number of results to return"), offset: z.number().optional().describe("Number of items to skip"), fields: z.string().optional().describe("Comma-separated list of fields to return"), orders: z.string().optional().describe("Sort order (e.g., '-publishedAt')"), filters: z.string().optional().describe("Filters in the format 'field[operator]=value'"), }, async ({ q, limit, offset, fields, orders, filters }) => { try { // 検索オプションの設定 const queries: Record<string, any> = { q }; if (limit) queries.limit = limit; if (offset) queries.offset = offset; if (fields) queries.fields = fields; if (orders) queries.orders = orders; if (filters) queries.filters = filters; const response = await client.getList({ endpoint: MICROCMS_ENDPOINT, queries, }); // 結果をJSON文字列に変換 const resultJson = JSON.stringify(response, null, 2); return { content: [ { type: "text", text: resultJson } ] }; } catch (error: unknown) { console.error("Error searching MicroCMS:", error); const errorMessage = error instanceof Error ? error.message : String(error); return { content: [ { type: "text", text: `Failed to search MicroCMS: ${errorMessage}` } ] }; } } ); // コンテンツ取得ツールの実装 server.tool( "GetMicroCMSContent", "Get specific content from MicroCMS by ID", { endpoint: z.string().describe("API endpoint (e.g., 'blogs')"), contentId: z.string().describe("Content ID to retrieve"), fields: z.string().optional().describe("Comma-separated list of fields to return"), depth: z.number().optional().describe("Depth for expanding references"), }, async ({ endpoint, contentId, fields, depth }) => { try { const queries: Record<string, any> = {}; if (fields) queries.fields = fields; if (depth) queries.depth = depth; const response = await client.get({ endpoint, contentId, queries, }); // 結果をJSON文字列に変換 const resultJson = JSON.stringify(response, null, 2); return { content: [ { type: "text", text: resultJson } ] }; } catch (error: unknown) { console.error("Error getting MicroCMS content:", error); const errorMessage = error instanceof Error ? error.message : String(error); return { content: [ { type: "text", text: `Failed to get MicroCMS content: ${errorMessage}` } ] }; } } ); async function main() { const transport = new StdioServerTransport(); await server.connect(transport); console.error("MicroCMS MCP Server running on stdio"); } main().catch((error) => { console.error("Fatal error in main():", error); process.exit(1); });