今天用 Claude Code 的 MCP(Model Context Protocol)功能为 emlog 博客制作了一个工具,可以直接通过 AI 对话发布文章和微语。整个过程不到一天就完成了,这里记录一下流程。

一、MCP 简介

MCP 是一种让 AI 助手调用外部工具的标准协议。通过 MCP,AI 可以使用你开发的工具来完成任务,比如操作博客、查询数据库、调用 API 等。

二、技术选型

  • Python:作为主力语言,生态丰富
  • FastMCP:一款轻量级的 MCP 框架,简化了服务开发
  • httpx:异步 HTTP 客户端,用来请求 emlog 的 REST API
  • pydantic:数据验证和模型定义

三、项目结构

emlog_mcp.py    # 主程序,定义所有工具
.mcp.json      # MCP 配置文件

四、核心实现

1. 安装依赖

pip install mcp httpx pydantic

2. 定义数据模型

使用 pydantic 定义工具输入参数:

class CreateArticleInput(BaseModel):
    title: str = Field(..., description="文章标题")
    content: str = Field(..., description="文章内容")
    sort_id: Optional[int] = Field(default=None, description="分类ID")
    tags: Optional[str] = Field(default="", description="标签")
    draft: Optional[str] = Field(default="n", description="草稿: y/n")

3. API 请求封装

async def _make_request(endpoint, method="GET", data=None):
    url_params = {"rest-api": endpoint, "api_key": API_KEY}
    # POST 请求时 api_key 放在 body 中
    response = await client.post(BASE_URL, params=url_params, data=data)
    return response.json()

4. 工具定义

使用装饰器声明工具:

@mcp.tool(name="emlog_create_article")
async def emlog_create_article(params: CreateArticleInput) -> str:
    # 业务逻辑
    result = await _make_request("article_post", method="POST", data=post_data)
    return json.dumps(result)

5. 启动服务

if __name__ == "__main__":
    mcp.run()

五、MCP 配置

.mcp.json 中配置服务:

{
  "mcpServers": {
    "emlog": {
      "command": "python",
      "args": ["C:/md_all/md_write/emlog_mcp.py"],
      "env": {
        "EMLOG_API_KEY": "your-api-key",
        "EMLOG_BASE_URL": "https://your-blog.com/emlog/"
      }
    }
  }
}

六、功能列表

目前实现了以下工具:

工具名 功能
emlog_fetch_articles 获取文章列表
emlog_get_article 获取文章详情
emlog_create_article 创建并发布文章
emlog_update_article 更新已有文章
emlog_create_note 发布微语
emlog_upload_file 上传文件/图片
emlog_get_sorts 获取分类列表
emlog_fetch_and_publish 抓取网页并发布

七、使用示例

现在可以直接用自然语言操作博客了:

用户:把今天的天气发布到博客
助手:调用 emlog_create_article 工具
结果:文章发布成功!

八、踩坑记录

  1. 变量未定义:调试时发现 _make_request 中使用了未定义的 url 变量,应改为 EMLOG_BASE_URL
  2. 中文标签 Bug:emlog API 对中文标签有字符集问题,暂时绕过了这个功能
  3. api_key 传递方式:emlog 的 REST API 要求 api_key 作为 URL 参数传递,而不是放在 header 中

九、总结

用 MCP 开发工具非常高效,一次开发就能让 AI 助手具备操作博客的能力。后续可以继续扩展更多工具,比如评论管理、主题切换、数据统计等。

如果你也有博客或其他支持 API 的服务,不妨试试 MCP,工作效率会提升不少!