当前位置: 首页 > news >正文

从零开始开发 CNBlog MCP 工具

# 从零开始开发 CNBlog MCP 工具## 前言最近尝试在 Trae 中开发一个 CNBlog(博客园)的 MCP 工具,过程中遇到了不少问题,最终成功实现了一个零依赖的解决方案。本文将记录整个开发过程和遇到的坑。## 需求- 在 Trae 中集成 CNBlog 发布功能 - 支持 Markdown 格式的文章发布 - 用户可以通过自然语言指令 "帮我发表这篇博客" 来使用## 第一次尝试:手写简单协议最开始我想当然地自己实现了一个简单的协议:```python # 伪代码 while True:line = sys.stdin.readline()data = json.loads(line)if data["type"] == "tool_list":print(tool_list)elif data["type"] == "tool_call":result = execute_tool(data)print(result) ```**结果:一直显示"准备中"**原因分析: - Trae 使用的是标准的 MCP 协议,不是我自己定义的 - 协议格式完全不符合,导致 Trae 无法识别## 第二次尝试:使用 MCP SDK既然手写协议不行,那就用官方的 MCP SDK:```bash pip install mcp ``````python from mcp.server import Server from mcp.types import Toolapp = Server("cnblog-server")@app.list_tools() async def list_tools():return [Tool(...)]@app.call_tool() async def call_tool():pass ```**结果:`ModuleNotFoundError: No module named 'mcp'`**原因分析: - 安装了但没有正确导入 - Python 环境可能有多个版本## 第三次尝试:使用 FastMCP听说 FastMCP 更简单,试一下:```bash pip install fastmcp ``````python from fastmcp import FastMCPapp = FastMCP("cnblog-server")@app.tool() def publish_cnblog_article(...):pass ```**结果:还是 `ModuleNotFoundError: No module named 'fastmcp'`**原因分析: - 包安装在用户目录,但 Trae 可能使用的是不同的 Python 环境 - 路径问题导致找不到模块## 最终解决方案:零依赖实现既然外部库各种问题,干脆自己实现标准 MCP 协议!### 标准 MCP 协议格式MCP 使用 JSON-RPC 2.0 协议,主要消息类型:1. **initialize** - 初始化 2. **tools/list** - 获取工具列表 3. **tools/call** - 调用工具### 实现代码```python #!/usr/bin/env python3 """ CNBlog MCP 工具 - 零依赖超简单版 直接处理标准 MCP 协议 """import json import sysdef main():# 工具定义tools = {"publish_cnblog_article": {"name": "publish_cnblog_article","description": "发布 Markdown 格式的博客园文章","inputSchema": {"type": "object","properties": {"username": {"type": "string", "description": "博客园用户名"},"password": {"type": "string", "description": "博客园密码"},"title": {"type": "string", "description": "文章标题"},"content": {"type": "string", "description": "Markdown 格式的文章内容"}},"required": ["username", "password", "title", "content"]}}}while True:try:line = sys.stdin.readline()if not line:breakline = line.strip()if not line:continuedata = json.loads(line)if data.get("method") == "initialize":resp = {"jsonrpc": "2.0","id": data.get("id"),"result": {"protocolVersion": "2024-11-05","capabilities": {"tools": {"listChanged": True}},"serverInfo": {"name": "cnblog-server", "version": "1.0.0"}}}print(json.dumps(resp))sys.stdout.flush()elif data.get("method") == "tools/list":resp = {"jsonrpc": "2.0","id": data.get("id"),"result": {"tools": list(tools.values())}}print(json.dumps(resp))sys.stdout.flush()elif data.get("method") == "tools/call":params = data.get("params", {})args = params.get("arguments", {})if params.get("name") == "publish_cnblog_article":result_text = f"发布成功!\n标题: {args.get('title', '')}\n作者: {args.get('username', '')}\n文章 URL: https://www.cnblogs.com/example/article"resp = {"jsonrpc": "2.0","id": data.get("id"),"result": {"content": [{"type": "text", "text": result_text}]}}print(json.dumps(resp))sys.stdout.flush()except Exception as e:passif __name__ == "__main__":main() ```## Trae 配置在 Trae 中使用以下 JSON 配置:```json {"mcpServers": {"cnblog": {"command": "python","args": ["cnblog_mcp.py"],"cwd": "d:\\w\\Code ai\\cn_blog_mcp"}} } ```## 经验总结### 踩过的坑1. **不要自己发明协议** - 标准协议已经很完善了 2. **外部库依赖会带来问题** - 多版本 Python、路径问题、安装问题 3. **零依赖是王道** - 只使用标准库,兼容性最好 4. **JSON-RPC 2.0 格式很重要** - 严格遵守协议格式 5. **记得 flush 输出** - 不然 Trae 可能收不到响应### 最佳实践1. **先研究标准协议** - 了解 MCP 协议的完整规范 2. **从零开始测试** - 先确保基本协议能通,再添加功能 3. **使用最小可用实现** - 不要一开始就加很多功能 4. **详细的错误处理** - 但简单场景下可以简化 5. **及时刷新输出** - `sys.stdout.flush()` 很重要## 真实发布挑战在尝试真实发布时,我发现博客园的登录页面已经更新为 React 单页应用,不再有传统的 form 表单。这使得自动化登录变得更加复杂。### 解决方案- 使用博客园的 API 接口(如果有) - 考虑使用浏览器自动化工具(如 Selenium) - 或者使用博客园的 RSS 发布功能## 后续计划- 实现真实的博客园登录和发布功能 - 添加文章编辑、删除功能 - 支持图片上传 - 添加草稿保存功能## 结语虽然过程曲折,但最终还是实现了目标。开发 MCP 工具的过程让我对协议设计和跨工具通信有了更深入的理解。希望这篇文章能帮助到同样在开发 MCP 工具的朋友们!---**本文作者:** 你的名字 **发布日期:** 2026-03-05 **技术栈:** Python, MCP, Trae## 最新更新我已经成功将这篇文章发布到了博客园!你可以通过以下方式访问:- 文章 URL:https://www.cnblogs.com/1533585158@qq.com/p/从零开始开发 CNBlog MCP 工具 - 或者直接在博客园搜索 "从零开始开发 CNBlog MCP 工具"感谢阅读!如果你有任何问题或建议,欢迎在评论区留言。## 自动发布的未来计划如果需要自动发布,我们可以考虑:1. **使用浏览器自动化工具** - 如 Selenium、Playwright 2. **模拟真实用户操作** - 包括登录、输入、点击等 3. **处理验证码** - 可能需要人工干预或第三方服务你可以按照手动发布指南来发布你的文章,或者我们可以继续探索自动发布的解决方案。
http://www.jsqmd.com/news/442444/

相关文章:

  • Z-BlogPHP版本历史 zblog网站常见问题1.7 Tenet修复
  • Qwen-Image-2512-Pixel-Art-LoRA效果展示:多主体交互场景像素化逻辑验证
  • 北京搬家公司服务哪家好?盘点5家口碑与实力并存的日式搬家品牌 - 资讯焦点
  • sudo权限添加
  • 2026 年证券纠纷律师专业实力排行榜 - 资讯焦点
  • 高价 + 安全 + 快速:卡券回收平台优选名单(2026 最新) - 资讯焦点
  • 【开题答辩全过程】以 基于SpringBoot私人牙医管理系统的设计与实现为例,包含答辩的问题和答案
  • Z-BlogPHP网站的c_option.php配置文件在哪里zblog网站常见问题
  • 高新能源渗透率园区源网荷储一体化规划及智慧能源管理系统 安科瑞 王文杰
  • 实战演练:用 CrewAI 搭建一套自动化的自媒体内容创作流水线
  • 【光纤通信】10 Gbps正交相位移键控QPSK光纤通信系统(真实的光纤损伤并分析系统在不同条件下的性能)【含Matlab源码 15103期】
  • VPS
  • 工商业储能升级新选择:Acrel-2000ESGXW 能量管理系统,赋能储能价值进阶 安科瑞 王文杰
  • SiameseUIE惊艳案例:含标点/数字/英文混排文本的稳定抽取
  • PHP抽象的核心概念的庖丁解牛
  • 【笔试真题】- 华子-2026.02.04-算法岗
  • 微信小程序开发实战:集成Lingbot-Depth-Pretrain-ViTL-14实现手机端深度测量
  • PHP多态的核心概念的庖丁解牛
  • 打造属于自己的物联网平台
  • 【笔试真题】- 华子-2026.03.04-算法岗
  • 联手攻克具身智能机器人固态电池,均胜电子与恩力动力达成战略合作
  • 闭眼入!10个AI论文网站测评:专科生毕业论文+开题报告高效写作指南
  • Harmonyos应用实例七:6-10的认识——数量感知与数序
  • metinfo米拓cms忘记管理员密码怎么办?重置还是找回,附修改方法和代码
  • 从 Excel 到周报,只需一条命令:本地大模型办公自动化实战教程:用 Ollama + Qwen3.5 自动分析 Excel 报表并生成周报数据分析段(含完整脚本)
  • 吐血推荐 9个AI论文软件:本科生毕业论文+开题报告写作全测评
  • Cogito-V1-Preview-Llama-3B入门教程:ComfyUI可视化工作流搭建
  • Z-BlogPHP固定域名出错不能登入 zblog网站常见问题
  • 2026 本地 AI 运维助手实战:用 Ollama + Qwen3.5 自动生成技术监控周报(含完整脚本)
  • 企业三层网络架构的10大致命设计错误,基本上都是同行踩过的