接入 blog-mcp 之后,实测踩了两个真坑,整理成发布前检查清单,以后每次发文章前过一遍。
坑 1:tags 字段存的是 tid 数字串,不是 tagname
现象
blog_get_post返回的tags字段,名字叫 tagname,实际值是tid,tid,tid数字逗号串(例如4,54,55)。- 前台文章详情页正确(把 tid 拆开查表渲染成
?tag=emlog、?tag=MCP链接)。 - 但
blog_create_post的tags参数如果传了纯数字串(比如49,53,51),emlog 会把每个数字当作 tid,匹配到 tid=49/53/51 这些垃圾 tag(名字就叫 "1"、"39"、"38"),前台就显示[1][39][38]这种数字链接。
根因
emlog 数据库 blog_tag 表存 tid + tagname,blog_tag_relation 表用 gid + tid 关联。文章表的 tags 字段存的是 tid,tid,tid 字符串。blog_create_post 的 tags 参数如果传入:
- 全数字逗号串 → 被解析为已有 tid(匹配不到会自动新建名为该数字的新 tag)
- 包含字母的 tagname → 走 tagname 查表/新建流程
预防
- 每个 tag 至少含一个字母 —— 不会被误识别为 tid
- ✓
MCP,blog-mcp,emlog - ✗
49,53,51(纯数字 → 被当 tid)
- ✓
- 发文章前先
blog_list_tags确认每个 tag 是否已存在,优先复用现有 tagname - 发完后立刻
blog_get_post验证:返回的 tags 是数字串属正常,把每个 tid 对照blog_list_tags查 tagname 确认名字符合预期
坑 2:MCP blog_update_post 报 Undefined constant "ROLE"
现象
- 调用
blog_update_post任何参数组合都返回:{"ok": false, "error": "Undefined constant "ROLE""} - 同 token 下
blog_create_post正常,只有blog_update_post失败
根因
blog-mcp 插件远程版的 blog_update_post handler 在处理更新前,引用了 emlog 全局常量 ROLE(用户角色常量,登录 session 里注入),但远程版没有预初始化身份上下文就直接访问了这个常量,PHP 8.4 报 Undefined constant。create handler 走了另一条路径,没碰到这个常量,所以正常。
这是 PHP 代码 bug,参数绕不过去
尝试过的参数都无效:{"gid":39,"tags":"..."} / {"gid":39,"tags":"...","uid":1} / {"gid":39,"tags":"...","author":1} 全部报 ROLE 错误。
规避(更新已发文章时)
不要用 MCP blog_update_post,改走后台编辑页:
// 1. 导航到编辑页
await browser_navigate({url:'.../admin/article.php?action=edit&gid=<gid>'});
// 2. 设置 tag + 同步 CodeMirror + 提交表单
await browser_evaluate({script:`
var f = document.querySelector('form[action*=article_save]');
var cm = document.querySelector('.CodeMirror');
if (cm) { try { cm.CodeMirror.save(); } catch(e) {} } // 关键:同步 CM 内容到隐藏 textarea
document.querySelector('input[name=tag]').value = '<新 tagname 逗号串>';
f.submit();
`});
关键点:cm.CodeMirror.save() 必须执行,否则 form.submit 会用隐藏 textarea 的旧值覆盖。
发新文章前自动检查清单
- [ ] tag 检查:每个 tag 至少含一个字母
- [ ] tag 复用:
blog_list_tags看现有 tag,优先复用已有 tagname - [ ] content 编码:走 JSON-RPC 天然 UTF-8 安全
- [ ] sortid 确认:
blog_list_sorts查 sid 映射(1 工作总结 / 2 插件开发 / 3 随笔感悟 / 4 建站运维) - [ ] 发后验证:
blog_get_post取 tags(tid 数字串),对照blog_list_tags反查 tagname - [ ] 前台验证:curl
https://blog.1dao.cc/?post=<gid>抓 HTML,检查<a class='tags'>锚点
发后异常处理
如果 blog_get_post 反查发现 tagname 是纯数字 → 踩坑 1 了。不要用 MCP update 修(会踩坑 2)→ 走后台编辑页流程修复。
—— 2026.08.18 于 島上隨筆
本文由 Trae CN AI 编程助手通过 blog-mcp 接口发布。
文章导出
生成预览中...