ylicai
v1.0.0
Published
AI对话助手终端程序
Readme
AI对话助手 - 支持MCP协议的智能终端程序
基于DeepSeek API的命令行AI对话助手,支持与AI进行自然语言对话,并集成了MCP (Model Context Protocol) 功能来扩展AI的能力。
🚀 功能特性
- 🤖 智能对话: 基于DeepSeek API的高质量AI对话
- 🔌 MCP协议支持: 连接外部工具和服务,大幅扩展AI能力
- 💬 交互式界面: 友好的命令行交互体验
- 📝 对话历史: 完整的对话记录和管理
- 🎨 彩色输出: 丰富的终端视觉效果
- ⚙️ 命令系统: 丰富的控制命令
- 🛠️ 自动工具调用: AI可以智能调用MCP工具完成复杂任务
- 🔄 热重载: 支持运行时重新加载MCP配置
- 📦 结果折叠: 智能折叠长内容,优化终端显示效果
📋 目录
🛠️ 安装与运行
前置要求
- Node.js 18+
- npm
安装依赖
npm install运行程序
npm start
# 或
node index.js📖 使用方法
启动程序后,您可以:
1. 直接对话
输入任何文字与AI进行自然语言对话
2. 使用命令
/help- 显示帮助信息/clear- 清空对话历史/history- 显示对话历史/mcp- 显示MCP服务器和工具信息/reload-mcp- 重新加载MCP配置/toggle-collapse- 切换工具结果折叠显示/exit或/quit- 退出程序
示例对话
💬 请输入您的问题: 你好,请介绍一下自己
🤖 AI助手:
你好!我是一个基于DeepSeek的AI助手。我可以帮助你解答各种问题,包括:
- 回答知识性问题
- 协助解决问题
- 提供建议和分析
- 进行创意讨论
- 编程相关帮助
有什么我可以帮助你的吗?
💬 请输入您的问题: 帮我搜索最新的AI技术发展
▼ 折叠内容 (还有 1240 个字符)
使用 /toggle-collapse 命令可以关闭折叠显示🔌 MCP功能详解
什么是MCP?
MCP (Model Context Protocol) 是一个标准协议,允许AI助手连接到外部工具和服务,大大扩展AI的能力。通过MCP,AI可以:
- 搜索互联网信息
- 生成图像
- 访问数据库
- 调用API服务
- 处理文件系统
- 更多扩展功能...
配置MCP服务器
编辑 mcpserver.json 文件来配置MCP服务器:
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem@latest", "${CWD}"],
"disabled": false,
"timeout": 30,
"description": "文件系统访问工具"
}
}
}
### MCP工具调用示例
AI可以自动调用MCP工具。例如:
**用户**: "请帮我搜索Python机器学习的最新教程"
**AI会自动调用搜索工具**:
```xml
<use_mcp_tool>
<server_name>tavily-mcp</server_name>
<tool_name>tavily-search</tool_name>
<arguments>{"query": "Python machine learning tutorial 2024", "search_depth": "advanced"}</arguments>
</use_mcp_tool>用户: "请帮我生成一张猫咪的图片"
AI会自动调用图像生成工具:
<use_mcp_tool>
<server_name>modelscope-image-server</server_name>
<tool_name>generate_image</tool_name>
<arguments>{"prompt": "cute cat, high quality, detailed"}</arguments>
</use_mcp_tool>查看MCP状态
使用 /mcp 命令查看:
- 连接的MCP服务器状态
- 可用的工具列表及描述
- 可用的资源列表
- 连接状态和错误信息
📦 结果折叠功能
功能说明
为了优化终端显示效果,程序提供了智能的结果折叠功能:
- 自动折叠: 当MCP工具返回的内容超过150个字符时自动折叠显示
- 预览显示: 显示前150个字符作为预览,并提示剩余字符数
- 一键切换: 使用
/toggle-collapse命令可以开启/关闭折叠功能 - 智能提示: 在折叠状态下会显示切换提示
▼ 折叠内容 (还有 856 个字符) 使用 /toggle-collapse 命令可以关闭折叠显示
#### 切换折叠设置
输入 `/toggle-collapse` 可以切换折叠显示:
- **开启折叠**: 长内容会被折叠,只显示预览
- **关闭折叠**: 完整显示所有内容
### 配置选项
程序内置了以下折叠配置:
- **折叠阈值**: 150个字符(超过此长度会被折叠)
- **默认状态**: 折叠功能默认开启
- **自动展开**: 短内容会自动完整显示
## 🏗️ 技术架构
### 核心技术栈
- **OpenAI SDK**: 与DeepSeek API通信
- **MCP SDK**: Model Context Protocol实现
- **Readline**: 命令行交互处理
- **Colors**: 终端彩色输出
- **ES Modules**: 现代JavaScript模块系统
### 架构组件
1. **主程序 (index.js)**
- AI对话逻辑
- 命令处理
- MCP工具调用协调
2. **MCP客户端管理器 (mcpClient.js)**
- 多服务器连接管理
- 工具和资源访问接口
- 传输协议支持(stdio, sse, streamableHttp)
3. **配置管理**
- 动态配置加载
- 热重载支持
- 错误恢复机制
## 🔧 MCP工具调用处理改进
### 改进背景
项目参考了Cline项目的MCP工具调用处理流程,解决了原始实现中的关键问题,实现了最佳实践。
### 解决的问题
1. **完全替换AI响应**: 原实现直接替换XML标签为工具结果,覆盖了AI的思考过程
2. **用户体验不佳**: 用户无法看到AI的完整思考流程
3. **对话上下文缺失**: 工具结果未正确添加到对话历史中
### 改进后的处理流程
#### 1. 保留AI思考过程
```javascript
// 显示AI的原始响应(保留思考过程)
console.log('🤖 AI助手:');
console.log(originalAiResponse);
// 然后执行工具调用
let finalAiResponse = originalAiResponse;
if (mcpManager) {
finalAiResponse = await executeMcpCalls(originalAiResponse);
}▼ 折叠内容 (还有 XXX 个字符) 使用 /toggle-collapse 命令可以关闭折叠显示
#### 3. 正确的对话上下文管理
```javascript
// 将工具结果添加到对话历史中
conversationHistory.push({
role: "user",
content: `工具调用结果 (${call.serverName}.${call.toolName}): ${resultText}`
});4. 错误处理和恢复
- 工具执行失败时,错误信息也会添加到对话历史
- 保持对话的连续性,即使工具调用失败
- 清晰的错误提示和格式化显示
- 错误信息同样支持折叠显示,避免终端被长错误信息淹没
5. 智能结果折叠
- 长内容自动折叠,显示预览和剩余字符数
- 用户可以通过命令切换折叠模式
- 保持终端整洁,提升用户体验
技术实现细节
响应处理流程
- 获取AI原始响应
- 显示AI原始响应(保留思考过程)
- 解析MCP工具调用XML标签
- 执行工具调用并显示状态
- 单独显示工具执行结果
- 将工具结果添加到对话历史
- 返回清理后的AI响应(移除XML标签)
工具调用解析
function parseMcpToolCall(response) {
const mcpToolRegex = /<use_mcp_tool>\s*<server_name>(.*?)<\/server_name>\s*<tool_name>(.*?)<\/tool_name>\s*<arguments>(.*?)<\/arguments>\s*<\/use_mcp_tool>/gs;
// 解析工具调用和资源访问
// 返回结构化的调用信息
}📁 项目结构
ai-chat-assistant/
├── package.json # 项目配置和依赖
├── package-lock.json # 锁定的依赖版本
├── index.js # 主程序文件
├── mcpClient.js # MCP客户端管理器
├── mcpserver.json # MCP服务器配置
├── README.md # 项目说明文档
├── MCP_IMPROVEMENT.md # MCP改进说明(已合并到此文档)
└── node_modules/ # 依赖包目录文件说明
- index.js: 主程序入口,包含AI对话逻辑、命令处理、MCP工具调用协调
- mcpClient.js: MCP客户端管理器,负责服务器连接、工具调用、资源访问
- mcpserver.json: MCP服务器配置文件,定义要连接的服务器和工具
- package.json: 项目元数据和依赖定义
⚙️ 配置说明
API配置
- 基础URL: https://api.deepseek.com
- 模型: deepseek-chat
- API密钥: 在index.js中配置
MCP服务器配置参数
{
"mcpServers": {
"server-name": {
"type": "stdio|sse|streamableHttp", // 传输类型
"command": "command", // 启动命令
"args": ["arg1", "arg2"], // 命令参数
"cwd": "/working/directory", // 工作目录
"env": { // 环境变量
"API_KEY": "your-key"
},
"disabled": false, // 是否禁用
"timeout": 30, // 超时时间(秒)
"url": "http://example.com", // SSE/HTTP URL
"headers": { // HTTP请求头
"Authorization": "Bearer token"
}
}
}
}支持的传输类型
- stdio: 标准输入输出(推荐用于本地工具)
- sse: Server-Sent Events(用于远程服务)
- streamableHttp: 流式HTTP(用于特殊场景)
🎯 使用场景
1. 信息搜索
- 实时网络搜索
- 新闻查询
- 技术文档查找
2. 内容创作
- 图像生成
- 文本处理
- 创意写作辅助
3. 开发辅助
- 代码搜索和分析
- API调用测试
- 技术问题解答
4. 数据处理
- 文件操作
- 数据转换
- 批量处理任务
🔍 故障排除
常见问题
MCP服务器连接失败
- 检查服务器配置是否正确
- 确认API密钥有效
- 查看网络连接状态
工具调用超时
- 增加timeout配置值
- 检查服务器响应状态
- 重新加载MCP配置
程序启动失败
- 确认Node.js版本>=18
- 重新安装依赖包
- 检查配置文件格式
调试技巧
- 使用
/mcp命令查看连接状态 - 使用
/reload-mcp重新加载配置 - 查看终端错误输出信息
📝 注意事项
- 程序需要网络连接以访问DeepSeek API和MCP服务
- 对话历史在程序重启后会清空
- 可以使用 Ctrl+C 或
/exit安全退出程序 - MCP服务器配置修改后需要重新加载或重启程序
🤝 开发贡献
欢迎提交Issue和Pull Request来改进这个项目。主要改进方向:
- 添加更多MCP服务器支持
- 改进用户界面体验
- 增加配置管理功能
- 优化错误处理机制
📄 许可证
MIT License - 详见LICENSE文件
🔗 相关资源
- DeepSeek API文档
- MCP协议规范
- Cline项目 - MCP最佳实践参考
