@liangshen/dify-mcp-server
Version:
一个用于访问Dify API的Model Context Protocol (MCP)服务实现
89 lines (88 loc) • 3.91 kB
JavaScript
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();
});
});