在 MCP 中实现 “askhuman” 式交互:原理、实践与开源方案

关键词: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│
└──────────┘        └──────────┘        └──────────┘
  1. LLM 生成 tool_calls,发现缺参 →
  2. Client 拦截
  3. Client 弹窗/CLI 提问 →
  4. 用户回答 →
  5. Client 回填参数
  6. 再次调用 tool →
  7. 结果返回给用户。

2.2 关键实现点

层级 要点
Server 把可能缺失的字段设为 optional,并在 description 注明"如未提供将询问用户"。
LLM Prompt 加系统指令:

"若参数缺失,不要猜测,直接告知用户并等待补充。" |

| Client | 维护对话状态;检测缺失字段;提供 UI/CLI 输入;重试调用。 |


3. 最小可行示例(Node.js CLI)

3.1 伪码:交互式搜索工具

ts 复制代码
// 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 步骤

  1. 在 Dify 新建 Chatflow
  2. 拖入 MCP Tool 节点,选择 search
  3. query 留空 → 拖入 Ask User 节点绑定到 query
  4. 发布应用,用户即可在对话中被询问关键词。

6. 最佳实践小结

  1. 永远让 Server 无状态,交互逻辑只在 Client。
  2. 参数 schema 描述清晰 → LLM 更容易判断何时缺参。
  3. 对话状态持久化(Session ID)→ 支持多用户并发。
  4. 超时与取消机制 → 避免用户长时间无响应卡死流程。
  5. 安全提示 → 敏感操作(删除、转账)务必二次确认。

7. 延伸阅读


🚀 欢迎在评论区分享你的 MCP 交互玩法!

相关推荐
2501_918126911 小时前
开源祭祖网页index
前端·开源·html
程序员夏末1 小时前
【开源经历 | 第一篇】参与开源需要掌握的Git和Github指令
git·开源
@不误正业1 小时前
第13章-开源鸿蒙是否适合做端侧AI操作系统
人工智能·开源·harmonyos
冬奇Lab2 小时前
一天一个开源项目(第91篇):RuFlo - Github趋势榜第一,让 AI 像蜂群一样协同作战的多智能体编排引擎
开源·agent·ai编程
HackTwoHub3 小时前
开源AI渗透测试的终极形态,让渗透测试进入“自动驾驶“时代、让渗透测试全自动!
人工智能·web安全·网络安全·开源·系统安全·安全架构·sql注入
挖AI金矿3 小时前
(十四)安全与权限控制--把Agent关进笼子里
开源·个人开发·ai编程·hermes agent·爱马仕agent
一拳一个娘娘腔3 小时前
把 GPT-4o 按在地上摩擦?DeepSeek V4 深度测评来了
开源
薛定e的猫咪3 小时前
OOD 感知决策与可信强化学习:从置信度评估到安全回退
人工智能·安全·机器学习·开源
xmdy58663 小时前
Flutter+开源鸿蒙实战|智联邻里Day8 Lottie动画集成+url_launcher跳转拨号+个人中心完善+全局UI统一
flutter·开源·harmonyos
计算机魔术师16 小时前
【AI面试八股文 Vol.1.3:ReAct】ReAct 不是一种算法,是一种工程契约:从问题域到面试追问的完整映射
开源