AI Agent开发实战:基于MCP协议与DSH桌面端构建自定义插件

📅 发布时间:2026/8/21 1:32:31
AI Agent开发实战:基于MCP协议与DSH桌面端构建自定义插件 大家好我是专注于AI开发工具与生态的技术博主。最近AI Agent开发领域迎来了一波重要的基础设施更新特别是围绕插件、MCP协议、Skills市场以及DSH桌面端的整合让开发者构建智能体应用的门槛大大降低。如果你正在为如何让AI Agent连接外部工具、处理复杂任务而烦恼或者对Claude、Cursor等工具中提到的MCP感到好奇那么这篇文章正是为你准备的。本文将系统性地拆解这一技术组合从核心概念到实战部署手把手带你理解并上手。无论你是想为自己的项目添加AI能力还是希望深入理解下一代AI开发范式都能在这里找到清晰的路径和可运行的代码示例。1. 背景与核心概念为什么是插件、MCP与Skills市场在传统的AI应用开发中让大语言模型LLM与外部世界交互是一个复杂的过程。开发者需要为每个外部工具如数据库、API、文件系统编写特定的适配代码处理认证、数据格式转换、错误处理等一系列繁琐问题。这不仅开发效率低也使得AI Agent的能力被禁锢在预设的“围墙花园”里。插件Plugin、MCPModel Context Protocol和Skills市场这一组合正是为了解决上述痛点而生的新一代解决方案。它们共同构建了一个开放、标准化、可扩展的AI能力生态。插件Plugin可以理解为AI Agent的“手”和“眼睛”。一个插件就是一个封装好的功能模块让AI能够执行某个特定任务例如读取文件、执行SQL查询、调用天气API等。用户或开发者通过安装插件来扩展AI的能力。MCPModel Context Protocol这是一个由Anthropic提出的开放协议你可以把它想象成AI世界的“USB标准”。它定义了一套标准化的通信方式让任何符合MCP协议的服务器Server即工具提供方都能被任何支持MCP的客户端Client如Claude Desktop、Cursor、DSH等发现和使用。MCP的核心价值在于解耦和标准化工具开发者只需按照协议实现一次就能在所有兼容客户端上运行。Skills市场Skills Market这是一个集中展示和分发插件或称为Skill的平台。开发者可以将自己开发的、符合MCP协议的插件发布到市场上其他用户则可以像在手机应用商店一样轻松搜索、浏览和安装所需的技能极大地促进了生态的繁荣。DSHDeepSeek Harness桌面端这是一个集大成的AI Agent开发与运行环境。它不仅是一个支持MCP协议的强大客户端更提供了一个图形化的桌面应用界面方便开发者管理插件、编排任务流、调试AI行为。你可以把它看作是一个专为AI Agent设计的“集成开发环境IDE”或“操作系统”。它们之间的关系插件是具体的能力单元MCP协议是它们与AI客户端通信的“世界语”Skills市场是这些能力的“应用商店”而DSH桌面端则是最终运行和调度这一切的“舞台”和“控制台”。2. 环境准备与版本说明在开始实战之前我们需要准备好基础环境。本文将主要以DSH桌面端作为客户端示例因为它对MCP的支持较为完善且提供了图形化界面。核心环境要求操作系统Windows 10/11, macOS 10.15, 或主流Linux发行版如Ubuntu 20.04。本文示例将在Windows和macOS下进行。Node.js环境用于开发和运行MCP服务器建议安装Node.js 18.x LTS或更高版本。这是开发自定义MCP插件的推荐环境。Python环境可选部分插件可能需要建议安装Python 3.8。DSH桌面端我们需要下载并安装DeepSeek Harness的桌面客户端。请访问其官方GitHub仓库或发布页面获取最新版本。本文写作时版本号可能在v0.1.x左右请以实际下载为准。代码编辑器推荐使用VS Code它本身也对MCP有很好的支持通过Cursor或特定插件。版本兼容性说明MCP协议和各个客户端DSH、Claude Desktop、Cursor都处于快速迭代中。本文的示例和配置思路基于当前2024年中的通用实践核心概念不变。如果遇到接口差异请参考对应工具的最新官方文档进行调整。3. MCP协议核心原理与配置拆解理解MCP协议是玩转整个生态的关键。它主要基于JSON-RPC 2.0 over STDIO/SSE通信过程可以简化为以下几步客户端发现服务器客户端通过配置文件或环境变量知道MCP服务器的启动命令。初始化握手客户端启动服务器进程双方交换initialize和initialized消息协商能力。列出可用工具客户端请求tools/list服务器返回它提供的所有工具即插件功能列表。调用工具当用户需要时客户端发送tools/call请求附带参数服务器执行并返回结果。资源管理服务器还可以提供“资源”如文件内容、数据库表结构客户端可以读取(resources/read)或订阅(resources/subscribe)其更新。一个典型的MCP服务器配置用于DSH/Claude DesktopMCP客户端通常需要一个配置文件来声明它要连接的服务器。对于DSH桌面端配置可能集成在UI中但其底层原理一致。// 示例一个自定义的MCP服务器配置 (例如保存在 ~/.config/mcp/servers.json) { “mcpServers”: { “my-calculator”: { “command”: “node”, “args”: [“/path/to/your/mcp-server/calculator/index.js”], “env”: { “API_KEY”: “your_api_key_here” // 可传递环境变量 } }, “sqlite-db”: { “command”: “python”, “args”: [“-m”, “mcp_server_sqlite”], “env”: { “DB_PATH”: “/path/to/database.db” } } } }配置项解释command: 启动服务器所需的命令如node,python。args: 传递给命令的参数通常是服务器脚本的路径。env: 可选的环境变量用于向服务器传递配置信息如API密钥、数据库路径。关键点MCP服务器是一个独立的、常驻的进程。客户端负责管理其生命周期启动、停止、重启。这种设计使得工具开发与AI客户端完全独立。4. 完整实战案例开发一个自定义MCP插件天气查询现在我们从零开始创建一个最简单的MCP插件一个天气查询服务器。我们将使用Node.js来实现。4.1 创建项目结构首先创建一个新的项目目录并初始化。mkdir mcp-weather-server cd mcp-weather-server npm init -y安装必要的MCP开发包。这里我们使用modelcontextprotocol/sdk这是Anthropic官方提供的SDK简化了服务器开发。npm install modelcontextprotocol/sdk同时我们需要一个真实的天气API。这里用axios发起HTTP请求并用dotenv管理API密钥。npm install axios dotenv创建项目文件touch index.js .env .env.example最终目录结构如下mcp-weather-server/ ├── node_modules/ ├── index.js # MCP服务器主文件 ├── .env # 存储敏感配置如API密钥 ├── .env.example # 环境变量示例文件 ├── package.json └── package-lock.json4.2 编写核心MCP服务器代码打开index.js编写以下代码// index.js const { Server } require(‘modelcontextprotocol/sdk/server/index.js’); const { StdioServerTransport } require(‘modelcontextprotocol/sdk/server/stdio.js’); const axios require(‘axios’); require(‘dotenv’).config(); // 加载.env文件中的环境变量 // 1. 初始化MCP服务器 const server new Server( { name: “weather-mcp-server”, version: “0.1.0”, }, { capabilities: { tools: {}, // 声明本服务器提供工具 }, } ); // 2. 定义天气查询工具 // 这个工具将被AI客户端识别和调用 server.setRequestHandler(‘tools/list’, async () { return { tools: [ { name: ‘get_weather’, description: ‘Get the current weather for a given city.’, inputSchema: { type: ‘object’, properties: { city: { type: ‘string’, description: ‘The name of the city, e.g., “Beijing” or “New York”’, }, units: { type: ‘string’, enum: [‘metric’, ‘imperial’], description: ‘Temperature units. metric for Celsius, imperial for Fahrenheit.’, default: ‘metric’, }, }, required: [‘city’], }, }, ], }; }); // 3. 处理工具调用请求 server.setRequestHandler(‘tools/call’, async (request) { const { name, arguments: args } request.params; if (name ! ‘get_weather’) { throw new Error(Unknown tool: ${name}); } const { city, units ‘metric’ } args; const apiKey process.env.WEATHER_API_KEY; // 从环境变量读取密钥 if (!apiKey) { throw new Error(‘WEATHER_API_KEY is not set in environment variables.’); } try { // 调用外部天气API这里以OpenWeatherMap为例 const response await axios.get(‘https://api.openweathermap.org/data/2.5/weather’, { params: { q: city, appid: apiKey, units: units, }, }); const weather response.data; const temp weather.main.temp; const description weather.weather[0].description; const humidity weather.main.humidity; return { content: [ { type: ‘text’, text: The current weather in ${city} is ${description}. Temperature is ${temp}°${units ‘metric’ ? ‘C’ : ‘F’}, humidity is ${humidity}%., }, ], }; } catch (error) { console.error(‘Weather API error:’, error.message); return { content: [ { type: ‘text’, text: Failed to get weather for ${city}. Error: ${error.response?.data?.message || error.message}, }, ], isError: true, }; } }); // 4. 启动服务器使用标准输入输出进行通信 async function main() { const transport new StdioServerTransport(); await server.connect(transport); console.error(‘Weather MCP server running on stdio…’); } main().catch((error) { console.error(‘Server fatal error:’, error); process.exit(1); });4.3 配置环境变量在.env.example文件中说明需要的环境变量# .env.example # 请从 https://openweathermap.org/api 申请免费的API Key WEATHER_API_KEYyour_openweathermap_api_key_here然后将.env.example复制为.env并填入你真实的API密钥。cp .env.example .env # 然后用编辑器打开 .env 文件填入密钥重要安全提示.env文件包含敏感信息务必将其添加到.gitignore文件中避免提交到公开仓库。4.4 在DSH桌面端中配置并运行确保DSH桌面端已安装并运行。配置MCP服务器DSH桌面端通常会在设置或高级选项中有“MCP Servers”的配置界面。你需要添加一个新的服务器配置。名称weather(可自定义)命令node参数/绝对路径/to/your/mcp-weather-server/index.js某些版本DSH可能允许直接选择项目目录或通过图形化方式配置。保存并重启DSH为了使配置生效可能需要重启DSH客户端。验证连接重启后在DSH的聊天界面中你应该能通过提示词使用新功能。例如尝试输入“帮我看看北京的天气。”4.5 运行与验证结果当你在DSH中询问天气时后台会发生以下事件DSH客户端识别出你的意图需要调用外部工具。它查找已配置的MCP服务器发现weather服务器提供了get_weather工具。DSH通过MCP协议向你的Node.js服务器进程发送tools/call请求参数为{“city”: “Beijing”, “units”: “metric”}。你的index.js代码被触发调用OpenWeatherMap API。获取到天气数据后服务器将格式化的结果返回给DSH。DSH将结果呈现给你。预期输出“The current weather in Beijing is clear sky. Temperature is 22°C, humidity is 65%.”至此你已经成功创建并运行了一个自定义的MCP插件并通过DSH桌面端调用它。5. 常见问题与排查思路在开发和集成MCP插件的过程中你可能会遇到以下典型问题。问题现象常见原因解决思路DSH/Cursor中找不到插件工具1. MCP服务器配置错误命令或路径不对。2. 服务器进程启动失败。3. 服务器未正确声明工具tools/list响应错误。1. 检查DSH设置中的服务器配置确保命令和路径正确无误。2. 在终端手动运行服务器命令如node index.js看是否有报错。3. 检查服务器代码中tools/list处理程序是否正确返回了工具定义。调用工具时超时或无响应1. 服务器代码执行缓慢或阻塞如网络请求慢。2. 服务器进程崩溃。3. MCP协议通信错误。1. 在服务器代码中添加日志检查执行到哪一步。2. 确保异步操作如axios请求正确处理了Promise和错误。3. 查看客户端DSH的日志或错误输出。‘dsh’ 不是内部或外部命令系统环境变量PATH中未包含DSH桌面端的安装路径。1. 找到DSH可执行文件的具体位置如C:\Users\YourName\AppData\Local\Programs\dsh\。2. 将该路径添加到系统的PATH环境变量中。3. 或者始终通过桌面快捷方式或开始菜单启动DSH而不是命令行。codex桌面端闪退/DSH启动崩溃1. 软件与操作系统不兼容。2. 缺少运行时依赖如特定VC库。3. 配置文件损坏。1. 确认下载的版本与你的操作系统32/64位匹配。2. 尝试以管理员身份运行或查看应用日志通常在%APPDATA%或~/.config下。3. 尝试重置或删除配置文件先备份让软件重新生成。插件安装后Skills市场不显示1. 插件未正确打包或发布。2. 市场需要时间同步或缓存。3. 插件不符合市场发布规范。1. 参照官方文档检查插件的package.json或清单文件。2. 等待片刻或刷新市场页面。3. 确保插件遵循了正确的MCP协议版本和元数据格式。dify访问mcp返回5031. MCP服务器未启动或端口被占用。2. Dify配置中MCP服务器地址错误。3. 网络策略或防火墙阻止访问。1. 确保MCP服务器进程正在运行并监听在配置的地址和端口上。2. 检查Dify后台的MCP集成配置确保URL、端口正确。3. 使用curl或telnet工具测试是否能从Dify服务器访问到MCP服务器地址。6. 最佳实践与工程建议将MCP插件用于生产环境或团队协作时遵循以下最佳实践可以避免很多坑。1. 插件MCP服务器开发规范清晰的工具定义在tools/list中为每个工具提供准确、详细的name、description和inputSchema。好的描述能极大提升AI调用工具的准确率。健壮的错误处理在tools/call中务必用try...catch包裹核心逻辑并返回格式化的错误信息isError: true而不是让进程崩溃。资源管理与清理如果插件使用了数据库连接、文件句柄等资源要监听客户端的断开信号做好清理工作防止资源泄漏。配置外部化像API密钥、服务地址等配置必须通过环境变量或配置文件传入绝不要硬编码在代码中。添加日志在关键步骤如收到请求、调用API、返回结果添加日志输出到console.error或文件便于调试和监控。2. 安全性考量最小权限原则插件只应拥有完成其功能所需的最小权限。例如一个文件阅读插件不应拥有删除文件的权限。输入验证与消毒对客户端传入的所有参数进行严格的验证和消毒防止注入攻击如SQL注入、命令注入。敏感信息保护如前所述API密钥等必须通过安全的方式管理。考虑使用密钥管理服务KMS或容器秘钥注入。网络隔离对于生产环境的MCP服务器应考虑其网络访问边界避免其访问内部敏感网络。3. 性能与可维护性保持无状态尽可能将MCP服务器设计为无状态的这样便于水平扩展和重启。设置超时对依赖的外部服务调用如HTTP请求、数据库查询设置合理的超时时间避免长时间阻塞。版本化为你的MCP服务器定义版本号并在更新时注意向后兼容性。可以在initialize阶段声明版本。编写文档为你的插件编写清晰的README说明其功能、配置方法、工具参数和常见问题。4. 在DSH桌面端中的使用建议插件分组管理如果安装了多个插件可以在DSH中通过标签或项目进行分组管理保持工作区整洁。利用图形化优势DSH桌面端通常提供对话历史、提示词模板、变量管理等功能与MCP插件结合可以构建复杂的自动化工作流。关注更新MCP生态发展迅速定期更新DSH桌面端和你的自定义插件以获取新特性和安全修复。7. 总结与学习路线通过本文我们系统地探讨了AI Agent开发中的关键基础设施插件、MCP协议、Skills市场以及DSH桌面端。我们从为什么需要这套生态讲起深入理解了MCP作为标准化协议的核心价值并最终通过一个完整的天气查询插件开发案例将理论付诸实践。你现在应该能够清晰解释插件、MCP、Skills市场和DSH各自的作用与关系。在本地环境配置并运行DSH桌面端。使用Node.js和MCP SDK开发一个具备实际功能的自定义插件。在DSH中配置并使用自己开发的插件。排查插件集成过程中的常见问题。下一步可以探索的方向更复杂的插件尝试开发连接数据库SQLite/PostgreSQL、操作文件系统、调用企业内部API的插件。探索Skills市场去官方的Skills市场如腾讯Skills市场逛逛安装一些他人开发的优秀插件学习其设计和实现。集成其他客户端尝试将你开发的MCP插件配置到Claude Desktop、Cursor等其他支持MCP的客户端中体验“一次开发多处运行”。学习Server-Sent Events (SSE)了解MCP中用于资源订阅的SSE传输模式实现实时数据推送如监控日志、股票价格。参与社区关注MCP协议和DSH等项目的GitHub仓库了解最新动态甚至为开源项目贡献代码或插件。AI Agent的开发范式正在从封闭走向开放从定制走向标准化。掌握MCP这一核心协议意味着你掌握了连接AI与万千工具世界的钥匙。希望这篇教程能为你打开这扇门助你在构建智能应用的路上走得更远。如果在实践中遇到新的问题欢迎在社区交流探讨。