Slickflow.MCP-Server-工作流引擎接入AI编排平台实践
一、为什么需要 MCP传统的 AI 工作流集成方式通常是硬编码把流程 API 包成 Function Calling每个 LLM 平台单独适配一套。MCP 的出现改变了这一局面——只需实现一次所有支持 MCP 的 AI 客户端都能自动发现并调用你的工具。对于 Slickflow 这样的工作流引擎来说这意味着AI Agent 可以自主发起流程、推进审批、查询状态无需人工干预知识库与流程联动Agent 可以先查规则再决定流程走向平台无关同一个 MCP ServerDify / Coze / n8n / Claude 均可接入二、整体架构┌─────────────────────────────────────────────────────┐ │ AI 编排平台 │ │ Dify · Coze · n8n · Claude · 自定义 Agent │ └────────────────────┬────────────────────────────────┘ │ MCP Protocol (HTTP Streamable / SSE) ▼ ┌─────────────────────────────────────────────────────┐ │ Slickflow MCP Server (:5100) │ │ │ │ ┌─────────────────────┐ ┌──────────────────────┐ │ │ │ WorkflowTools │ │ KnowledgeBaseTools │ │ │ │ (12 个工具) │ │ (2 个工具) │ │ │ └──────────┬──────────┘ └──────────┬───────────┘ │ │ │ │ │ │ ▼ ▼ │ │ IWorkflowService KbDocumentService │ └────────────┬────────────────────────┬───────────────┘ │ │ ▼ ▼ Slickflow Engine 向量数据库 (PgVector) (PostgreSQL) text-embedding-v4 / 1536dServer 基于ModelContextProtocol.AspNetCorev0.3.0-preview.2运行在 .NET 8 之上。三、14 个工具详解3.1 WorkflowTools12 个工具名功能典型参数list_processes列出所有已发布流程—start_process启动流程实例processCode, userId, appInstanceIdrun_process推进流程提交待办taskId, userId, approvalStatusget_process_instance查询流程实例状态processInstanceIdget_running_tasks查询用户待办任务userIdget_completed_tasks查询用户已办任务userId, appInstanceIdget_next_steps查询下一步节点taskId, userIdget_process_instances_by_app按业务单据查流程实例appInstanceIdget_approval_trace查审批轨迹完成顺序taskIdwithdraw_process撤回下一步未办时taskId, userIdsendback_process退回到上一步taskId, userIdreject_process驳回到发起人taskId, userId3.2 KnowledgeBaseTools2 个工具名功能典型参数search_knowledge_base语义搜索返回相关文档片段query, count5, threshold0.7list_knowledge_documents列出知识库全部文档摘要—四、核心实现4.1 Server 注册三行代码builder.Services.AddMcpServer() .WithHttpTransport(options options.EnableLegacySse true) .WithToolsWorkflowTools() .WithToolsKnowledgeBaseTools(); // ... app.MapMcp(/mcp);EnableLegacySse true同时暴露GET /mcp/ssePOST /mcp/message兼容 n8n 等尚未实现 Streamable HTTP 的客户端。4.2 工具声明Attribute 驱动[McpServerToolType] public class WorkflowTools(IWorkflowService wfService) { [McpServerTool, Description(启动一个流程实例。返回流程实例ID(ProcessInstanceIdStarted)。)] public string start_process( [Description(流程代码从 list_processes 获取)] string processCode, [Description(发起人用户ID)] string userId, // ... ) { // 先查流程定义再创建 WfAppRunner 启动 var process wfService.GetProcessByCode(processCode, version); var runner new WfAppRunner { /* ... */ }; var result wfService.StartProcess(runner); return JsonSerializer.Serialize(new { result.Status, result.ProcessInstanceIdStarted }); } }每个工具方法只是一个普通 C# 方法[Description]注解会被框架自动解析为 MCPinputSchema大模型据此生成正确的参数调用。4.3 API Key 鉴权鉴权逻辑通过中间件实现支持两种 Header 格式X-Api-Key: your-key // 或 Authorization: Bearer your-key/health端点跳过鉴权供 Docker/K8s 健康探针使用。空 Key 时自动进入开发模式免鉴权方便本地调试。4.4 速率限制// 每 IP 每分钟最多 100 次请求可通过配置调整 RateLimitPartition.GetFixedWindowLimiter( ctx.Connection.RemoteIpAddress?.ToString(), _ new FixedWindowRateLimiterOptions { PermitLimit 100, Window TimeSpan.FromMinutes(1) } );超限返回HTTP 429响应头包含Retry-After。五、与 AI 平台集成5.1 Dify在 Dify 工作流中添加工具节点选择MCP Server填入TransportStreamable HTTP URLhttp://your-host:5100/mcp HeadersX-Api-Key: your-api-key5.2 CozeCoze 要求额外发送协议版本 HeaderTransportStreamable HTTP URLhttp://your-host:5100/mcp Headers X-Api-Key: your-api-key MCP-Protocol-Version: 2025-03-265.3 n8nn8n 当前版本已知 bug不支持 Streamable HTTP需走 SSE TransportTransportSSE SSE URLhttp://your-host:5100/mcp/sse Message URLhttp://your-host:5100/mcp/messageServer 端EnableLegacySse true已自动开启此端点。六、内置 MCP ClientAgent 侧Slickflow.AI 内置了McpServerClientAI Agent 节点可在运行时自动发现并调用MCP Server 上的所有工具无需手动注册// 自动发现远程 MCP Server 上的全部工具 var client new McpServerClient(http://your-host:5100); var tools await client.DiscoverToolsAsync(); // 注册到 ReAct Agent AgentToolRegistry.Global.Register(MY_ACTIVITY_ID, tools);McpClientTool内部通过 JSON-RPC 2.0 调用远端工具对 ReAct Agent 来说与本地 Function 完全透明。七、生产部署docker-compose.yml核心片段services: sfmcp: build: . ports: - 5100:5100 environment: - ConnectionStrings__WfDBConnectionString${DB_CONNECTION} - McpAuth__ApiKey${MCP_API_KEY} - RateLimit__PermitLimit100 healthcheck: test: [CMD, curl, -f, http://localhost:5100/health] interval: 30s timeout: 5s retries: 3敏感配置数据库连接串、API Key通过.env文件注入不进入镜像。环境变量一览.env.exampleDB_CONNECTIONHostxxx;Databasewfdb;Usernamexxx;Passwordxxx MCP_API_KEYyour-strong-api-key-here RATELIMIT_PERMITLIMIT100 RATELIMIT_WINDOWMINUTES1八、测试验证结果全部 14 个工具在测试环境PostgreSQL42 个已发布流程402 条知识库文档验证通过类别工具数验证状态流程查询只读5✅ 全部通过流程操作写入7✅ 全部通过含错误处理知识库2✅ 全部通过threshold≥0.5 可匹配踩坑记录PowerShell curl.exe 双引号问题PowerShell inline JSON 传curl.exe时双引号被剥离改用-d file.json方式解决。start_process 引擎参数问题引擎需要ProcessId Version工具层先调用GetProcessByCode查出实体再填入不能只传ProcessCode。n8n SSE 兼容n8n SDK 升级至 1.4.0 后需EnableLegacySsetrue走旧 SSE 通道。