关键词:MCP、Model Context Protocol、交互式参数收集、askhuman、Dify、Lobe Chat、AnythingLLM
1. 背景:MCP 的“无状态”限制
MCP(Model Context Protocol)将 大模型 ↔ 工具 的通信标准化为一次性的 Request–Response 调用:
- Server 只暴露工具清单与 JSONSchema;
- Client 把 LLM 生成的参数一次性发出去;
- Server 执行后返回结果,整个回合结束。
这意味着 原生协议没有中断点 让 Server 反问“还缺什么?”。要实现类 askhuman
的体验,必须把交互逻辑上移到 Client 层。
2. 设计模式:多轮对话 + 客户端补参
2.1 数据流
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 用户 │ <───> │ MCP Client │ <───> │ MCP Server│
└──────────┘ └──────────┘ └──────────┘
- LLM 生成 tool_calls,发现缺参 →
- Client 拦截 →
- Client 弹窗/CLI 提问 →
- 用户回答 →
- Client 回填参数 →
- 再次调用 tool →
- 结果返回给用户。
2.2 关键实现点
层级 | 要点 |
---|---|
Server | 把可能缺失的字段设为 optional ,并在 description 注明“如未提供将询问用户”。 |
LLM Prompt | 加系统指令: |
“若参数缺失,不要猜测,直接告知用户并等待补充。” |
| Client | 维护对话状态;检测缺失字段;提供 UI/CLI 输入;重试调用。 |
3. 最小可行示例(Node.js CLI)
3.1 伪码:交互式搜索工具
// mcp-client.ts
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import * as readline from 'node:readline/promises';
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
const client = new Client(/* transport */);
const toolCall = /* 来自 LLM */;
const args = toolCall.arguments;
if (!args.query) {
args.query = await rl.question('请输入搜索关键词:');
}
const res = await client.callTool({
name: 'search',
arguments: args,
});
console.log(res.content);
3.2 效果
> 我想搜索一些内容
🤖 需要关键词才能搜索,请输入:
> TypeScript MCP
✅ 调用 search({ query: "TypeScript MCP" }) …
4. 开源方案盘点
项目 | 交互方式 | 部署形态 | 亮点 |
---|---|---|---|
Dify | 工作流节点「Ask Human」 | Docker / SaaS | 零代码拖拽、支持审批流 |
Lobe Chat | 前端弹窗注入变量 | Vercel / Docker | 插件市场、可嵌入网页 |
AnythingLLM | Agent「Require User Input」 | 桌面 / Docker | 私有化、知识库联动 |
Open MCP Client | CopilotKit 表单 | 纯前端 | 轻量、可二次开发 |
Dolphin-MCP | CLI 交互钩子 | Python 库 | 适合脚本自动化 |
5. 典型集成:Dify 实战
5.1 步骤
- 在 Dify 新建 Chatflow;
- 拖入 MCP Tool 节点,选择
search
; - 将
query
留空 → 拖入 Ask User 节点绑定到query
; - 发布应用,用户即可在对话中被询问关键词。
6. 最佳实践小结
- 永远让 Server 无状态,交互逻辑只在 Client。
- 参数 schema 描述清晰 → LLM 更容易判断何时缺参。
- 对话状态持久化(Session ID)→ 支持多用户并发。
- 超时与取消机制 → 避免用户长时间无响应卡死流程。
- 安全提示 → 敏感操作(删除、转账)务必二次确认。
7. 延伸阅读
- MCP 官方文档:
https://modelcontextprotocol.io/ - Dify 工作流文档:
https://docs.dify.ai/guides/workflow - Lobe Chat 插件开发:
https://github.com/lobehub/lobe-chat/wiki/Plugin-Development
🚀 欢迎在评论区分享你的 MCP 交互玩法!