UNPKG

@liangshen/dify-mcp-server

Version:

一个用于访问Dify API的Model Context Protocol (MCP)服务实现

89 lines (88 loc) 3.91 kB
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import * as https from "https"; import dotenv from "dotenv"; // 加载环境变量 dotenv.config(); // 环境变量配置 const DIFY_API_BASE = process.env.DIFY_API_BASE || "https://cloud.dify.ai"; const DIFY_API_KEY = process.env.DIFY_API_KEY; const DIFY_RESPONSE_MODE = process.env.DIFY_RESPONSE_MODE || "streaming"; const DIFY_USER_ID = process.env.DIFY_USER_ID; const DIFY_MAX_RESULT_LENGTH = process.env.DIFY_MAX_RESULT_LENGTH || 1000; const DIFY_DESC = process.env.DIFY_DESC || "执行工作流"; console.log(DIFY_API_BASE); // Create an MCP server export const server = new McpServer({ name: "dify", version: "1.3.0" }); server.tool("dify", DIFY_DESC, { message: z.string().describe("要搜索的内容") }, async (params) => { if (!DIFY_API_KEY) { throw new Error("未提供 API 密钥,请设置 DIFY_API_KEY 环境变量"); } // 构建请求数据 const postData = JSON.stringify({ inputs: { message: params.message }, response_mode: DIFY_RESPONSE_MODE, user: DIFY_USER_ID, }); // 创建请求选项 const url = new URL("/v1/workflows/run", DIFY_API_BASE); // 创建一个 Promise 来处理 HTTP 请求 return new Promise((resolve, reject) => { const req = https.request(url, { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${DIFY_API_KEY}`, "Content-Length": Buffer.byteLength(postData), }, }, (res) => { let responseData = ""; res.on("data", (chunk) => { responseData += chunk; }); res.on("end", () => { if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) { // 获取最后一个data:后面的内容 const lastData = responseData.split("data:").pop(); if (lastData) { try { const parsedData = JSON.parse(lastData.replaceAll("\n", " ")); // 增加防护检查,确保outputs和text存在 const outputText = parsedData.data?.outputs?.text || '未获取到文本数据'; const resultItems = parsedData.data?.outputs?.result || []; const resultText = resultItems.length > 0 ? " 说明:" + resultItems.map((item) => item.content || '').filter(Boolean).join(" ") : ''; if (outputText.length > DIFY_MAX_RESULT_LENGTH) { resolve({ content: [{ type: "text", text: `返回内容超出限制,请缩小查询范围或添加更多筛选条件` }] }); return; } resolve({ content: [{ type: "text", text: outputText + resultText }] }); } catch (e) { // 对于流式响应,可能不是有效的JSON resolve({ content: [{ type: "text", text: `解析响应时出错: ${e.message}` }] }); } } else { resolve({ content: [{ type: "text", text: "没有数据" }] }); } } else { resolve({ content: [{ type: "text", text: `请求失败,状态码: ${res.statusCode}` }] }); } }); }); req.on("error", (error) => { reject(error); }); // 发送请求数据 req.write(postData); req.end(); }); });