UNPKG

@wallacewen/dify-mcp-server

Version:

Model Context Protocol server for Dify AI integration - supports server management, monitoring, and system tools

128 lines 4.7 kB
#!/usr/bin/env node import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { DifyClient } from './dify.js'; import { z } from 'zod'; if (!StdioServerTransport.prototype.connect) { StdioServerTransport.prototype.connect = async function () { // Dummy connect method for compatibility with MCP server return Promise.resolve(); }; } // Validate required environment variables const requiredEnvVars = { DIFY_API_TOKEN: process.env.DIFY_API_TOKEN, DIFY_BASE_URL: process.env.DIFY_BASE_URL, DIFY_DEFAULT_USER: process.env.DIFY_DEFAULT_USER, }; // Check for missing required environment variables const missingVars = Object.entries(requiredEnvVars) .filter(([key, value]) => !value) .map(([key]) => key); if (missingVars.length > 0) { console.error('❌ Missing required environment variables:'); missingVars.forEach((varName) => { console.error(` ${varName}`); }); console.error('\n📖 Please check the README.md for configuration instructions.'); process.exit(1); } // Initialize MCP server export const mcpServer = new McpServer({ name: 'dify-mcp-server', version: '1.0.0', }); // Initialize Dify client with validated environment variables const difyClient = new DifyClient(requiredEnvVars.DIFY_API_TOKEN, requiredEnvVars.DIFY_BASE_URL); /** * Handler for Dify chat messages * @param params Parameters for the Dify chat request * @returns Promise with the chat response containing only the answer */ export async function handleDifyChat(params) { const chatRequest = { query: params.query, inputs: params.inputs || {}, user: params.user || requiredEnvVars.DIFY_DEFAULT_USER, response_mode: params.response_mode || 'blocking', conversation_id: params.conversation_id, auto_generate_name: params.auto_generate_name ?? true, }; const answer = await difyClient.sendChatMessage(chatRequest); return { content: [ { type: 'text', text: answer, }, ], }; } // Register Dify log cleaning tool mcpServer.tool('dify_log_clean', 'Clean server logs tasks', { query: z .string() .describe('Log cleaning request (e.g., "清理服务器日志,10.0.19.41" or "清理10.0.19.41 /var/log 目录下的旧日志文件")'), }, async (params) => { const difyParams = { query: params.query, user: requiredEnvVars.DIFY_DEFAULT_USER, inputs: {}, response_mode: 'blocking', auto_generate_name: true, }; return handleDifyChat(difyParams); }); // Register server environment deployment tool mcpServer.tool('dify_server_deployment', 'Server environment deployment and management tasks', { query: z .string() .describe('Server deployment request (e.g., "服务器环境到jenkins" or "配置生产环境jenkins")'), }, async (params) => { const difyParams = { query: params.query, user: requiredEnvVars.DIFY_DEFAULT_USER, inputs: {}, response_mode: 'blocking', auto_generate_name: true, }; return handleDifyChat(difyParams); }); // Register server monitoring tool mcpServer.tool('dify_server_monitoring', 'Server monitoring and resource usage information', { query: z .string() .describe('Server monitoring request (e.g., "查看服务器10.0.19.41的CPU和内存使用情况" or "监控生产环境服务器资源状态")'), }, async (params) => { const difyParams = { query: params.query, user: requiredEnvVars.DIFY_DEFAULT_USER, inputs: {}, response_mode: 'blocking', auto_generate_name: true, }; return handleDifyChat(difyParams); }); // Register basic system tools mcpServer.tool('dify_system_tools', 'Basic system environment tools and utilities', { query: z .string() .describe('System tools request (e.g., "检查网络连通性ping baidu.com" or "查看磁盘空间df -h" or "检查端口8080占用netstat -tulpn | grep 8080")'), }, async (params) => { const difyParams = { query: params.query, user: requiredEnvVars.DIFY_DEFAULT_USER, inputs: {}, response_mode: 'blocking', auto_generate_name: true, }; return handleDifyChat(difyParams); }); // Only start the server if not in test mode /* istanbul ignore if */ if (process.env.NODE_ENV !== 'test') { const transport = new StdioServerTransport(); await transport.connect(); await mcpServer.connect(transport); } //# sourceMappingURL=index.js.map