loading…
Search for a command to run...
loading…
Enables publishing Markdown blog posts to cnblogs.com via MCP protocol using natural language.
Enables publishing Markdown blog posts to cnblogs.com via MCP protocol using natural language.
通过 MCP(Model Context Protocol) 协议,将博客园 Open API 封装为 AI 可调用的工具。让你在 任何 MCP 客户端(QwenPaw、Claude Desktop、Cline 等)中直接用自然语言发布博客园文章。
create_post — 发布 Markdown 博文到博客园.env 管理,不含硬编码git clone https://github.com/你的用户名/cnblogs-mcp.git
cd cnblogs-mcp
python -m venv .venv
source .venv/bin/activate # macOS / Linux
# .venv\Scripts\activate # Windows
pip install -r requirements.txt
cp .env.example .env
编辑 .env,填入你的博客园 Personal Access Token:
CNBLOGS_TOKEN=your_token_here
# 验证 MCP 服务能正常启动
printf '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}\n{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}\n' \
| python cnblogs_mcp.py 2>/dev/null | grep '"name"'
正常输出:
{"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"create_post",...}]}}
.env 文件⚠️ Token 仅显示一次,请妥善保存。
在 QwenPaw 工作目录下找到 agent.json,添加 MCP 客户端:
{
"mcp": {
"clients": {
"cnblogs": {
"name": "cnblogs",
"description": "博客园博文发布",
"enabled": true,
"transport": "stdio",
"command": "/absolute/path/to/cnblogs-mcp/.venv/bin/python",
"args": ["/absolute/path/to/cnblogs-mcp/cnblogs_mcp.py"],
"env": {
"DOTENV_PATH": "/absolute/path/to/cnblogs-mcp/.env"
}
}
}
}
}
重启 QwenPaw:
qwenpaw daemon restart
在 ~/Library/Application Support/Claude/claude_desktop_config.json 中添加:
{
"mcpServers": {
"cnblogs": {
"command": "/absolute/path/to/cnblogs-mcp/.venv/bin/python",
"args": ["/absolute/path/to/cnblogs-mcp/cnblogs_mcp.py"],
"env": {
"DOTENV_PATH": "/absolute/path/to/cnblogs-mcp/.env"
}
}
}
}
重启 Claude Desktop。
在 VS Code 设置中搜索「MCP」,找到 MCP Servers,添加:
{
"cnblogs": {
"command": "/absolute/path/to/cnblogs-mcp/.venv/bin/python",
"args": ["/absolute/path/to/cnblogs-mcp/cnblogs_mcp.py"],
"env": {
"DOTENV_PATH": "/absolute/path/to/cnblogs-mcp/.env"
}
}
}
通用配置模板:
| 参数 | 值 |
|---|---|
command |
.venv/bin/python(项目内虚拟环境的 Python) |
args |
["./cnblogs_mcp.py"] |
env.DOTENV_PATH |
.env 文件的绝对路径 |
💡 如果 MCP 客户端不支持
DOTENV_PATH,也可以直接用env.CNBLOGS_TOKEN传入 token。
cd cnblogs-mcp
# 测试 1:初始化 + 工具列表
printf '...' | python cnblogs_mcp.py
# 测试 2:发布一篇博文
printf '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}\n{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"create_post","arguments":{"title":"测试","body":"## 你好\n\n这是一篇测试文章。"}}}\n' | python cnblogs_mcp.py 2>/dev/null
正常返回:
{"success": true, "postId": 12345678, "postUrl": "https://www.cnblogs.com/你的博客名/p/12345678"}
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
未配置 CNBLOGS_TOKEN |
.env 未配置或路径错误 |
检查 .env 文件是否存在且 DOTENV_PATH 正确 |
API 错误: 401 |
Token 无效或已过期 | 重新在博客园创建 Token |
API 错误: 403 |
Token 权限不足 | 创建 Token 时确保勾选「发表随笔」 |
API 错误: 400 |
请求格式有误 | 检查 title 和 body 是否为空 |
请求超时 |
网络问题 | 检查网络后重试 |
| MCP 连接后工具列表为空 | show_banner 问题 |
确保使用 mcp.run(show_banner=False) |
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
title |
string | ✅ | 博文标题 |
body |
string | ✅ | 博文正文(Markdown 格式) |
返回值:
{
"success": true,
"postId": 19246558,
"postUrl": "https://www.cnblogs.com/你的博客名/p/19246558"
}
或错误时:
{
"success": false,
"error": "错误描述"
}
cnblogs-mcp/
├── cnblogs_mcp.py # MCP 服务主文件
├── requirements.txt # Python 依赖
├── .env.example # 环境变量模板(不含真实 Token)
├── .env # 你的本地配置(已在 .gitignore 中)
├── .gitignore
├── README.md
└── LICENSE
fastmcp>=3.0.0
python-dotenv>=1.0.0
requests>=2.31.0
MIT — 欢迎 Star、 Fork 和 PR!
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"cnblogs-mcp": {
"command": "npx",
"args": []
}
}
}