@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
JavaScript
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