最终效果
在 AI 助手中配置好 MCP 连接后,你可以直接用自然语言操作博客:
你说的话 | AI 实际调用的工具 | 效果 |
|---|---|---|
"帮我看看最近写了哪些文章" |
| 返回文章列表,含标题、状态、浏览量 |
"把那篇 Go 并发的文章改成已发布" |
| 更新文章状态为 PUBLISHED |
"发一条动态,说今天天气不错" |
| 创建一条文本动态 |
"今天博客有多少人访问?" |
| 返回今日访客数和浏览量 |
"帮我加个友链,名字叫 XX" |
| 创建友链 |
目前支持四种工具:
工具名 | 功能 | 支持的操作 |
|---|---|---|
| 文章管理 | list / get / create / update / delete |
| 动态管理 | list / get / create / update / delete |
| 友链管理 | list / get / create / update / delete |
| 统计查询(只读) | dashboard / trend / top_pages |
第一步:在后台开启 MCP
MCP 默认是关闭的,需要配置一个 Secret 才能启用。这个 Secret 用来做 Bearer Token 鉴权,防止未授权的访问。
1 进入后台设置
打开博客后台 → 设置 → AI 配置,找到「MCP 配置」区域。
2 生成 MCP Secret
点击「重置 MCP Secret」按钮,系统会自动生成一个 64 位十六进制密钥(32 字节随机数)。这个密钥只会显示一次,记得保存好。
生成后,页面上会显示 MCP 端点地址,格式为:
PLAINTEXT
https://你的域名/mcp
Secret 至少需要 16 个字符,系统默认生成 64 位,安全性足够。如果 Secret 为空,MCP 服务不会启动。
3 保存设置
点击保存,后端日志中应该能看到:
PLAINTEXT
✅ MCP 服务已启动,端点: /mcp(已启用 Bearer Token 鉴权)
如果看到的是 📝 MCP 未启用(未配置 MCP Secret),说明 Secret 没保存成功,回去检查一下。
第二步:在 AI 客户端中配置 MCP
方案一:Claude Desktop 配置
打开 Claude Desktop 的配置文件:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
添加以下配置:
JSON
{
"mcpServers": {
"anheyu-blog": {
"url": "https://你的域名/mcp",
"headers": {
"Authorization": "Bearer 你生成的MCP_Secret"
}
}
}
}
保存后重启 Claude Desktop,在对话中就能看到 MCP 工具已经可用了。
方案二:其他支持 MCP 的客户端
任何支持 Streamable HTTP 传输方式的 MCP 客户端都可以连接。核心参数:
参数 | 值 |
|---|---|
端点地址 |
|
传输方式 | Streamable HTTP |
鉴权方式 | Bearer Token(放在 Authorization 请求头) |
Token 值 | 后台生成的 MCP Secret |
如果你用的是 Cursor、Trae 等 IDE 内置的 AI 助手,也可以在 MCP 设置中添加同样的配置。
第三步:开始使用
配置好之后,直接跟 AI 说你想做什么就行。下面是一些实际用法示例。
文章管理
列出文章:
"帮我看看最近有哪些草稿文章"
AI 会调用 article_manage 的 list 操作,返回文章列表。每篇文章包含 ID、标题、状态、浏览量、标签、分类等信息。
查看文章详情:
"看看那篇关于 Docker 的文章写了什么"
AI 会调用 get 操作,返回完整的 Markdown 内容。
创建文章:
"帮我创建一篇新文章,标题是「MCP 入门指南」,内容写个大纲先,标签加上技术、AI"
AI 会调用 create 操作,默认创建为草稿状态。标签和分类是按名称匹配的——你只需要说标签名,系统会自动解析成对应的 ID。如果标签不存在,会提示你先在后台创建。
更新文章:
"把那篇 MCP 的文章发布了吧"
AI 会调用 update 操作,将状态改为 PUBLISHED。
删除文章:
"删掉那篇测试文章"
删除是危险操作,AI 需要传 confirm=true 才能执行。大多数 AI 助手会再次向你确认。
动态管理
动态支持更丰富的内容类型——文本、图片、视频、音乐、链接卡片、位置、标签,都可以通过 MCP 操作。
发一条带图片的动态:
"发条动态,配上一张风景图,图片地址是 https://example.com/photo.jpg"
发一条带音乐的动态:
"分享一首歌,网易云音乐 ID 是 123456,歌手是周杰伦,歌名叫晴天"
发一条带链接卡片的动态:
"分享一个链接,标题是 GitHub,地址是 https://github.com"
友链管理
添加友链:
"帮我加个友链,名字叫小明的博客,地址是 https://xiaoming.dev,分类用技术博客"
创建友链时需要指定分类 ID,AI 会先查询现有分类再操作。
审核友链:
"把那个待审核的友链通过了吧"
更新友链状态为 APPROVED。
统计查询
统计工具是只读的,不会修改任何数据。
查看总览:
"今天博客访问情况怎么样?"
返回今日访客数、今日浏览量、昨日数据、本月和本年的累计数据。
查看趋势:
"最近一周的访问趋势给我看看"
返回按天/周/月的访客和浏览量趋势数据。
查看热门页面:
"哪些文章最受欢迎?"
返回热门页面排行,包含页面路径、标题、浏览量、独立访客数和跳出率。
工具参数详解
每个工具都采用统一的 action + payload 结构,方便 AI 理解和调用。
article_manage
操作 | 必填参数 | 可选参数 |
|---|---|---|
list | — | page, page_size |
get | id | — |
create | title | content, cover_url, status, tags, categories, summaries |
update | id | title, content, cover_url, status, tags, categories, summaries |
delete | id, confirm | — |
tags和categories传的是名称而非 ID,系统会自动解析。如果名称不存在会报错,需要先在后台创建。
moment_manage
操作 | 必填参数 | 可选参数 |
|---|---|---|
list | — | page, page_size |
get | id | — |
create | text 或 images(至少一项) | video, music, link, location, tags, is_publish |
update | id | text, images, video, music, link, location, tags, is_publish |
delete | id, confirm | — |
动态的富内容结构:
JSON
{
"video": { "url": "", "platform": "bilibili", "video_id": "BV1xx" },
"music": { "server": "netease", "type": "song", "id": "123456", "title": "晴天", "author": "周杰伦" },
"link": { "url": "https://github.com", "title": "GitHub", "favicon": "https://github.com/favicon.ico" }
}
friend_manage
操作 | 必填参数 | 可选参数 |
|---|---|---|
list | — | page, page_size |
get | id | — |
create | name, url, category_id | logo, description, status |
update | id | name, url, logo, description, category_id, status |
delete | id, confirm | — |
友链状态值:APPROVED(已通过)、PENDING(待审核)、REJECTED(已拒绝)、INVALID(失效)。
stats_query
操作 | 必填参数 | 可选参数 |
|---|---|---|
dashboard | — | — |
trend | — | period(daily/weekly/monthly), days |
top_pages | — | limit |
安全设计
MCP 涉及对博客数据的写操作,安全性是重点考虑的:
1 Bearer Token 鉴权
每个 MCP 请求都必须携带 Authorization: Bearer <secret> 请求头。Secret 由 crypto/rand 生成 32 字节随机数(64 位十六进制字符串),暴力破解基本不可能。
如果 Token 缺失或无效,服务端直接返回空响应,不会暴露任何信息。
2 危险操作二次确认
删除操作(文章、动态、友链)都需要 confirm=true 参数。AI 助手在执行删除前会再次向你确认,防止误操作。
3 Secret 可随时重置
在后台「AI 配置」页面可以一键重置 MCP Secret。重置后旧的 Secret 立即失效,需要同步更新 AI 客户端中的配置。
4 MCP 可随时关闭
清空 MCP Secret 并保存,MCP 服务就会停止。路由层检测到 mcpHandler 为空,不会注册 /mcp 端点。
技术实现
如果你也想给自己的项目接入 MCP,这里简单说一下实现思路。
整体架构
PLAINTEXT
AI 客户端 (Claude Desktop / Cursor / ...)
│
│ Streamable HTTP + Bearer Token
▼
/mcp 端点 (Gin 路由 → gin.WrapH)
│
▼
MCP Server (go-sdk/mcp)
│
├── article_manage → ArticleWrapper → articleSvc
├── moment_manage → MomentWrapper → momentSvc
├── friend_manage → LinkWrapper → linkSvc
└── stats_query → StatsWrapper → statsSvc
关键代码
使用的是官方 Go SDK github.com/modelcontextprotocol/go-sdk v1.5.0。
创建 MCP Server:
GO
server := sdkmcp.NewServer(&sdkmcp.Implementation{
Name: "anheyu-app",
Version: implVersion,
}, nil)
注册工具:
GO
sdkmcp.AddTool(server, &sdkmcp.Tool{
Name: "article_manage",
Description: "文章管理工具。支持 list、get、create、update、delete...",
InputSchema: tools.ArticleManageInputSchema(),
}, articleWrapper.ManageArticle)
Streamable HTTP 传输 + 鉴权:
GO
return sdkmcp.NewStreamableHTTPHandler(func(r *http.Request) *sdkmcp.Server {
if s.mcpSecret != "" {
authHeader := r.Header.Get("Authorization")
if !strings.HasPrefix(authHeader, "Bearer ") {
return nil
}
token := strings.TrimPrefix(authHeader, "Bearer ")
if token != s.mcpSecret {
return nil
}
}
return server
}, &sdkmcp.StreamableHTTPOptions{})
鉴权逻辑放在 StreamableHTTPHandler 的回调里——返回 nil 就等于拒绝连接,不返回 Server 实例,客户端什么都做不了。
工具的 Schema 定义:
每个工具的输入 Schema 使用 jsonschema 定义,采用 action + payload 的统一结构,并通过 OneOf 区分不同操作的参数:
GO
return &jsonschema.Schema{
Type: "object",
Properties: map[string]*jsonschema.Schema{
"action": { Type: "string", Enum: []any{"list", "get", "create", "update", "delete"} },
"payload": { Type: "object" },
},
Required: []string{"action", "payload"},
OneOf: []*jsonschema.Schema{
BuildActionSchema("list", "获取列表", listPayload),
BuildActionSchema("create", "创建", createPayload),
// ...
},
}
这样 AI 在调用时就知道每个操作需要什么参数,减少出错概率。
写在最后
MCP 的核心价值在于让 AI 从「只能聊天」变成了「能干活」。以前想改篇文章要打开后台、找到文章、编辑、保存;现在直接跟 AI 说一声就行。
实现上其实不复杂——官方 Go SDK 封装得很好,主要工作在于定义好每个工具的 Schema 和业务逻辑。action + payload 的统一模式让代码结构清晰,新增工具也很方便。
如果你也想给自己的博客或项目接入 MCP,欢迎参考实现。有问题可以留言交流。


