From 1d98c38a661f9ae59b184cdf56648763daaaa541 Mon Sep 17 00:00:00 2001 From: cqthang Date: Tue, 21 Oct 2025 21:53:05 +0700 Subject: [PATCH] Add dfx info mcp tool --- mcp_server/src/index.ts | 2 ++ mcp_server/src/tools/dfx-info.tool.ts | 52 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 mcp_server/src/tools/dfx-info.tool.ts diff --git a/mcp_server/src/index.ts b/mcp_server/src/index.ts index 4479b3d..8727c2f 100644 --- a/mcp_server/src/index.ts +++ b/mcp_server/src/index.ts @@ -3,6 +3,7 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js' import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js' import { registerGetMotokoContext } from './tools/get-motoko-context.tool.js' import { registerGenerateMotokoCode } from './tools/generate-motoko-code.tool.js' +import { registerDfxInfo } from './tools/dfx-info.tool.js' const PACKAGE_NAME = 'icp-coder-mcp-server' const VERSION = '0.1.1' @@ -25,6 +26,7 @@ async function start(options: StartOptions = {}) { const server = new McpServer({ name: PACKAGE_NAME, version: VERSION }) registerGetMotokoContext(server, { apiKey, baseUrl: backendBaseUrl }) registerGenerateMotokoCode(server, { apiKey, baseUrl: backendBaseUrl }) + registerDfxInfo(server) const transport = new StdioServerTransport() console.error(`[${PACKAGE_NAME}] starting MCP server (v${VERSION}) on stdio...`) await server.connect(transport) diff --git a/mcp_server/src/tools/dfx-info.tool.ts b/mcp_server/src/tools/dfx-info.tool.ts new file mode 100644 index 0000000..107c6a6 --- /dev/null +++ b/mcp_server/src/tools/dfx-info.tool.ts @@ -0,0 +1,52 @@ +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { z } from 'zod'; +import { exec } from 'node:child_process'; +import { promisify } from 'node:util'; + +const execAsync = promisify(exec); + +const DfxInfoArgsSchema = z.object({}); + +type DfxInfoArgs = z.infer; + +export function registerDfxInfo(server: McpServer) { + server.registerTool( + 'dfx_info', + { + title: 'Get DFX Project Info', + description: + 'Runs "dfx info" to get information about the current dfx project', + inputSchema: DfxInfoArgsSchema.shape, + }, + async (_args: DfxInfoArgs) => { + try { + const { stdout, stderr } = await execAsync('dfx info'); + + return { + content: [ + { + type: 'text' as const, + text: 'DFX Info retrieved successfully.', + }, + { + type: 'text' as const, + text: `Output:\n${stdout}`, + }, + ...(stderr + ? [ + { + type: 'text' as const, + text: `Warnings/Errors:\n${stderr}`, + }, + ] + : []), + ], + }; + } catch (error) { + const message = + error instanceof Error ? error.message : String(error); + throw new Error(`Failed to run dfx info: ${message}`); + } + }, + ); +}