Flutter MCP Server

#!/usr/bin/env node import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from "@modelcontextprotocol/sdk/types.js"; import axios from "axios"; class FlutterDocsServer { private server: Server; private axiosInstance; constructor() { this.server = new Server( { name: "flutter-docs-server", version: "0.1.0", }, { capabilities: { tools: {}, }, } ); this.axiosInstance = axios.create({ baseURL: "https://docs.flutter.dev", }); this.setupToolHandlers(); this.server.onerror = (error) => console.error("[MCP Error]", error); process.on("SIGINT", async () => { await this.server.close(); process.exit(0); }); } private setupToolHandlers() { this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [ { name: "search_flutter_docs", description: "Search Flutter documentation for a given query", inputSchema: { type: "object", properties: { query: { type: "string", description: "Search query for Flutter documentation", }, }, required: ["query"], }, }, ], })); this.server.setRequestHandler(CallToolRequestSchema, async (request) => { if (request.params.name !== "search_flutter_docs") { throw new McpError( ErrorCode.MethodNotFound, `Unknown tool: ${request.params.name}` ); } const { query } = request.params.arguments as { query: string }; if (!query) { throw new McpError( ErrorCode.InvalidParams, "Query parameter is required" ); } try { const response = await this.axiosInstance.get("/search-all", { params: { q: query }, }); return { content: [ { type: "text", text: JSON.stringify(response.data, null, 2), }, ], }; } catch (error) { if (axios.isAxiosError(error)) { return { content: [ { type: "text", text: `Error searching Flutter docs: ${ error.response?.data || error.message }`, }, ], isError: true, }; } throw error; } }); } async run() { const transport = new StdioServerTransport(); await this.server.connect(transport); console.error("Flutter Docs MCP server running on stdio"); } } const server = new FlutterDocsServer(); server.run().catch(console.error);