带有引出功能的MCP文件系统服务器
模型上下文协议(MCP)的参考实现,包含服务器主动参数提取功能
 ](https://nodejs.org) 
______________________________________________________________________
概述
这个项目展示了 MCP参数提取/获取 - 一个强大的功能,允许MCP服务器与用户进行交互式请求,以获取缺失的信息,从而创建对话流程,而不是因错误而失败。
什么是MCP引出(或激发)?
不需要一开始就要求所有参数,启发式方法使服务器能够:
- 🎯(瞄准目标) 逐个询问参数 以自然、引导性的方式进行
- ✅ 验证输入 以及基于上下文的分支逻辑(例如,文件存在与不存在)
- 🔘(圆圈内有加号,常用于表示选项或选择项) 提供交互式按钮 用于确认(拒绝/取消/接受)
- 🔄 这个符号在中文里通常被翻译为“循环”或“旋转”。它表示一个动作或过程在不断地重复进行,就像一个不断转动的圆圈一样。 在工具和启发之间交替使用 为用户提供分步指导
关键特性
- ✨(这个表情符号通常表示闪闪发光、闪耀或兴奋的情绪,直接翻译为中文可以是“✨”或保持原样,因为表情符号在中文中也有其直观的表达意义。) 服务器发起的请求/诱引 - 用途
server.elicitInput()用于真正交互式流程的API - 📁 代表文件夹的符号,可翻译为“文件夹”。 文件操作 - 创建和删除文件,带有智能提示
- 🎨 表示“美术”或“艺术创作”的意思。 用户友好的用户体验(UX) - 清晰的信息,有用的选择,确认对话框
- 🧪 表示“试管”或“实验”,常用于描述化学实验或科学实验的场景。 可投入生产的(状态/版本) - 全面的错误处理和30秒超时设置
- 🔍 看起来像是一个放大镜的符号,常用于表示搜索或查看细节。 可完全测试 - 使用MCP Inspector进行演示,包含单元测试
______________________________________________________________________
目录
______________________________________________________________________
快速入门
# 1. Clone and install
git clone
cd mcp-elicitation-fs-example
npm install
# 2. Launch MCP Inspector for interactive testing
npm run inspector
# 3. In the Inspector UI:
# - Go to Tools → create_file
# - Call with empty params: {}
# - Watch as elicitations appear in the Elicitations tab!______________________________________________________________________
安装
先决条件
- Node.js 16及以上版本 (使用 v24.9.0 版本测试)
- npm(Node Package Manager,Node包管理器) 或者 纱线
步骤
# Install dependencies
npm install
# Make the server executable (optional)
chmod +x index.js______________________________________________________________________
演示
启动MCP检查器
这个(或“它”) MCP 检测器(或 MCP 检查器) 这是一个基于浏览器的测试工具,它允许您与服务器进行交互,并实时查看请求的触发情况。
# Option 1: Use the demo script
./demo.sh
# Option 2: Run directly
npm run inspector检查器将在您的浏览器中自动打开于 http://localhost:6274
尝试使用引出流程
- 导航至“工具” 在左侧边栏
- 选择
create_file - 无参数调用:
{} - 见证奇迹的发生 ✨
- 引出请求出现在 “Elicitations tab”可以翻译为“引出/激发(内容)标签”或“引申内容标签”,具体翻译取决于上下文和使用场景。在这里,“Elicitations”可能指的是通过提问、提示或其他方式引出或激发的思考、讨论或内容,而“tab”则指的是用于组织或展示这些内容的标签或选项卡。因此,整个短语可以理解为用于组织或展示通过某种方式引出或激发的内容的标签或选项卡 - 提供文件名 - 控制返回到Tool,然后再次请求位置信息 - 继续按照引导流程操作,直到文件创建完成
______________________________________________________________________
它是如何运作的
诱发流程架构
这个实现使用了 服务器发起的请求(或引出) 与;带着;用 server.elicitInput():
// Server requests missing parameter
const result = await server.elicitInput({
message: "Please provide a filename",
requestedSchema: {
type: "object",
properties: {
filename: { type: "string", description: "Name of the file" }
},
required: ["filename"]
}
}, { timeout: 30000 });
// Handle user response
if (result.action === "accept") {
args.filename = result.content.filename;
// Continue processing...
}流程图
┌─────────────┐
│ Tool Called │
│ (Tools) │
└──────┬──────┘
│
▼
┌─────────────────┐
│ Elicit Param │
│ (Elicitations) │
└──────┬──────────┘
│
▼
┌─────────────────┐
│ User Responds │
└──────┬──────────┘
│
▼
┌─────────────────┐
│ Process Input │
│ (Tools) │
└──────┬──────────┘
│
▼
Repeat or Complete创建文件流
- 文件名 → 2. 位置 (文档/自定义) → 3。 自定义路径 (如自定义)→ 4。 文件检查 → 5a。 确认追加 (如果存在)→ 5b。 请求内容 6. 成功
或
5b。 请求内容 (如果是新的话)→ 6。 确认创建 → 7. 成功
删除文件流程
- 文件路径 → 2. 文件检查 → 3a。 确认删除 (如果存在)→ 4。 成功
或
3b。 确认未找到 (如缺失)→ 4。 无行动
______________________________________________________________________
使用示例
创建一个新文件
User: [Calls create_file with {}]
Elicitation: Please provide a filename
User: demo.txt
Elicitation: Choose location (documents/custom)
User: documents
Elicitation: File will be created. Confirm?
User: true
Tool Response: ✅ Successfully created: /Users/you/Documents/demo.txt追加到现有文件
User: [Calls create_file with {}]
Elicitation: Please provide a filename
User: existing.txt
Elicitation: Choose location
User: documents
Elicitation: File exists. Append content?
User: true
Elicitation: Provide content to append
User: Additional text
Tool Response: ✅ Successfully appended to: /Users/you/Documents/existing.txt删除文件
User: [Calls delete_file with {}]
Elicitation: Provide file path
User: ~/Documents/demo.txt
Elicitation: File exists. Confirm deletion?
User: true
Tool Response: ✅ Successfully deleted: /Users/you/Documents/demo.txt______________________________________________________________________
工具参考
create_file
创建一个新文件或向现有文件追加内容,同时进行交互式参数收集。
引出的参数:
| 参数 | 类型 | 描述 |
|---|---|---|
filename | 字符串 | 要创建的文件的名称 |
location | 枚举 | "documents" 或者 "custom" |
custom_path | 字符串 | 目录路径(仅当位置为“自定义”时) |
confirm_append | 布尔值 | 确认追加到现有文件 |
content | 字符串 | 要写入/追加的内容 |
confirm_creation | 布尔值 | 确认创建新文件 |
流量: 文件名 → 位置 → \[自定义路径\] → \[文件检查\] → \[追加确认或内容\] → \[创建确认\] → 成功
______________________________________________________________________
delete_file
在确认后删除文件,或如果文件不存在则予以确认。
引出的参数:
| 参数 | 类型 | 描述 |
|---|---|---|
file_path | 字符串 | 文件路径(绝对或相对) |
confirm_deletion | 布尔值 | 确认删除(如果文件存在) |
acknowledge_not_found | 布尔值 | 确认缺失文件(如果文件不存在) |
流量: 文件路径 → \[文件检查\] → \[删除确认或已知悉\] → 成功/已确认
______________________________________________________________________
配置
对于Claude Desktop
将此添加到您的Claude桌面配置中:
macOS:(直接翻译为中文即为“macOS”,这是苹果公司的操作系统名称,无需额外翻译) ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"filesystem-elicitation": {
"command": "/path/to/node",
"args": ["/path/to/mcp-elicitation-fs-example/index.js"]
}
}
}注: 使用 Node.js v16+ 的完整路径。运行 which node 找到你的 Node.js 路径。服务器功能
{
capabilities: {
tools: {},
elicitation: {} // ✅ Advertises elicitation support
}
}______________________________________________________________________
测试
使用MCP Inspector进行手动测试
npm run inspector检查员提供:
- 🔍(放大镜图标,通常表示搜索、查看细节或放大查看) 实时诱发可视化 在“引出(或刺激)选项卡”中
- 🛠️ 译为中文是“扳手”或“工具”。这个表情符号通常用来表示修理、维修或使用工具的场景。 交互式工具测试 带有JSON输入
- 📊(图表) 响应检查 带有完整元数据
自动化单元测试
npm test测试覆盖率:
- ✅ 逐个参数提取(或:逐一参数启发)
- ✅ 参数顺序正确
- ✅ 文件存在性分支逻辑
- ✅ 确认流程(创建/追加/删除)
- ✅ 错误处理和边缘情况
______________________________________________________________________
项目结构
.
├── index.js # Main MCP server with elicitation
├── test.js # Unit tests
├── demo.sh # Quick demo launcher
├── package.json # Dependencies and scripts
├── README.md # This file
├── DEMO_GUIDE.md # Detailed demo walkthrough
├── CLAUDE.md # Developer guidance
└── test-inspector.md # Inspector testing guide______________________________________________________________________
重要注意事项
引出支持状态
| 客户 | 状态 | 备注 |
|---|---|---|
| MCP 检查器 | ✅ 完全支持 | “提取”选项卡显示所有请求 |
| Claude Desktop(克劳德桌面版) | ⏳ 未实现 | 功能请求已开放(截至2025年10月) |
| 这台服务器 | ✅ 准生产就绪 | 完全实现了MCP引出规范 |
分店信息
main*(当前)*使用服务器发起的引出方法server.elicitInput()
- 在检查器中显示请求提示 “Elicitations tab” 可以翻译为“引出(或激发)内容标签”或“引语/激发内容选项卡”,具体翻译取决于上下文和该标签在实际应用中的具体用途。如果是指在某个软件或系统中用于展示或管理引出内容的板块,那么“引出内容标签”或“引语内容选项卡”可能更为贴切 - 建议用于测试和演示引出流程
broken-elicitInput-flow初步实施尝试(仅供参考)
这个分支展示了服务器发起的请求获取模式,该模式在检查器的“请求获取”选项卡中显示请求。
______________________________________________________________________
做出贡献
欢迎贡献!这是一个用于学习和演示MCP(多准则决策/最小化冲突问题等,具体根据上下文确定)引出方法的参考实现。
贡献思路/建议
- 🎨 额外的文件操作(读取、移动、复制)
- 🔐 权限处理和验证
- 📝 更全面的错误信息
- 🌍 国际化(i18n)
- 📚 额外的文档和示例
______________________________________________________________________
资源
- 📖 一本书 MCP规范
- 🔧(扳手或工具的象征,具体含义根据上下文而定,可译为“扳手”、“工具”等) MCP SDK 文档
- 🔍 翻译为中文是:放大镜(表示查看细节或搜索) MCP 检查员
- 💬(这个表情符号在中文中通常被理解为“说”或“对话”的意思,但直接翻译没有对应的中文文字,所以保持原样或根据上下文解释为“对话/说”的意思) MCP社区讨论
______________________________________________________________________
许可证
MIT 许可证 - 详见 许可证 文件中有详细信息
______________________________________________________________________
以❤️倾心打造,作为MCP(可能是指某种特定协议或方法,如“模型控制协议”等,具体需根据上下文确定)阐述的参考实现
