01它是什么
本插件把 B2 主题的专属配置能力暴露为标准 MCP 服务端(Streamable HTTP / JSON-RPC 2.0)。AI 客户端连上后,就能直接读取和修改主题设置、搭建首页模块、配置文章的付费阅读与下载资源、发布圈子话题、配置商品、读写用户与分类字段、改 SEO 与页脚。
与另两个插件的关系
同一套工作里共有三个插件,定位不同、可共存:
| 插件 | 传输层 | 依赖 | 定位 |
|---|---|---|---|
b2-mcp |
由 Easy MCP AI 提供 | WP 6.9+ / Easy MCP AI | Abilities API 版,适合已经在用 Easy MCP AI 的站点 |
workbuddy-mcp-for-7b2 |
自带 | 无 | 通用内容 / 评论 / 媒体 / 7B2 社区(圈子、积分、私信) |
b2-mcp-standalone |
自带 | 无 | B2 专属能力:设置、首页模块、内容字段、商城、用户与分类、SEO |
三者类名前缀不同(B2S_ / B2MCP_ / WBMCP_),不会冲突。本插件可与 workbuddy-mcp-for-7b2 同时启用,分工是「B2 专属字段」与「通用内容管理」。
核心设计:字段自动发现
插件不硬编码任何字段名。每次请求时从主题的 CMB2 注册信息实时读取字段定义,因此主题升级新增的设置项会自动跟上,不需要等插件更新。
CMB2 按对象类型把字段分到四类存储,一套读写层即可覆盖全部能力域:
| 对象类型 | 存储位置 | 对应能力 |
|---|---|---|
options-page | wp_options 数组 | 主题设置、SEO 与页脚、首页配置 |
post / 自定义类型 | post meta | 付费阅读、积分阅读、用户组可见、视频、多链接下载 |
user | user meta | VIP 等级、有效期、积分余额 |
term | term meta | 圈子收费规则、加入条件 |
02环境要求
| 项目 | 要求 | 说明 |
|---|---|---|
| WordPress | 5.6 及以上 | 需要应用密码功能(5.6 引入);低于 6.9 也可正常运行 |
| PHP | 7.4 及以上 | 代码使用类型声明与空合并,7.4 为下限 |
| 主题 | B2 / B2 PRO 已启用 | CMB2 由主题打包提供,字段发现依赖它 |
| Easy MCP AI | 不需要 | 本插件自带传输层 |
| Abilities API | 不需要 | 仅在另一版 b2-mcp 中需要 |
用应用密码认证时,WordPress 默认只在 HTTPS 站点允许。若站点是 http(如内网测试环境),后台已提供开关可放开限制。
03安装与启用
-
上传并启用插件
后台 → 插件 → 安装插件 → 上传插件 → 选择
b2-mcp-standalone.zip→ 立即安装 → 启用。
启用时会自动生成一个 API Key,并写入默认设置。 -
打开「B2 MCP」菜单做一次环境自检
左侧菜单出现 B2 MCP。检查三项:
· B2 主题识别 显示为绿色「已识别」;
· CMB2 字段注册库 显示「可用」;
· 字段总数 不为 0(B2 主题通常在数百量级)。 - 复制端点地址与 API Key 同一个页面的「客户端连接」卡片里,能看到完整端点 URL 与当前 API Key。Key 可在需要时点「重新生成」(旧 Key 立即失效)。
- 确认「启用 MCP 服务」已勾选 设置卡片里的第一个开关。关闭后端点直接返回 404,不影响站点其他功能。
-
连接后调一次
get_status这是唯一能一次性确认「连通性 + 环境 + 字段是否真的被发现到」的调用。详见下一节。
04连接 AI 客户端
端点地址
| 用途 | URL |
|---|---|
| MCP 主端点(填入客户端配置) | https://你的域名/wp-json/b2-mcp/v1/mcp |
| 自描述端点(浏览器可直接打开,用于排查连通性) | https://你的域名/wp-json/b2-mcp/v1/info |
/info 返回服务名、版本、支持的协议列表、B2 主题是否识别、是否只读、工具总数与可用认证方式,不含任何敏感数据,可安全用于连通性测试。
认证方式(任选其一)
| 方式 | 请求头 | 权限 |
|---|---|---|
| 插件 API Key (推荐) |
X-B2S-Key: b2s_xxxxxxxx或 Authorization: Bearer b2s_xxxxxxxx |
以「API Key 执行身份」设置的用户权限运行。该用户 ID 为 0 时自动选第一个管理员。 |
| WordPress 应用密码 | Authorization: Basic base64(用户名:应用密码) |
权限与应用密码所属用户完全一致,适合给不同人分配不同能力范围。 |
| URL 参数 | ?b2s_key=b2s_xxxxxxxx |
权限同 API Key。用于不支持自定义请求头的客户端。 |
| 登录 Cookie | 无 | 仅适合浏览器内人工调试,不建议客户端长期使用。 |
客户端配置示例
{
"mcpServers": {
"b2-theme": {
"url": "https://你的域名/wp-json/b2-mcp/v1/mcp",
"headers": {
"X-B2S-Key": "b2s_你的key"
}
}
}
}
协议支持情况
| 方法 | 支持 | 说明 |
|---|---|---|
initialize | 是 | 按客户端请求回显协议版本,不认识时回落到最新版 |
tools/list | 是 | 返回全部 26 个工具定义(含 JSON Schema) |
tools/call | 是 | 含权限校验、只读模式拦截、错误包装 |
ping / logging/setLevel | 是 | 按规范返回 |
resources/list / prompts/list | 是 | 返回空列表(本服务不提供资源与提示模板) |
通知类(notifications/*) | 是 | 返回 202,无响应体 |
GET /mcp | 405 | 不提供 SSE 订阅流,按规范返回 405 并带 Allow 头 |
DELETE /mcp | 204 | 无状态服务,直接确认 |
首次连通性验证
- 浏览器打开
/wp-json/b2-mcp/v1/info,确认ok为true、tool_count为 26。 - 在 AI 客户端里让它调用
get_status。 - 返回中确认
theme.active为真、字段统计不为 0。
05工具总览
共 26 个工具,按 7 个能力域分组。只读 表示不会改动任何数据;可写 表示会落库。
输入关键词可实时过滤下表。
| 工具 | 类型 | 用途 |
|---|---|---|
| 概览与字段发现 · 4 | ||
get_status | 只读 | 环境就绪状态、主题识别依据、CMB2 字段发现统计、受保护字段清单、三处启发式探测的对接概况。建议每次会话先调 |
list_settings_groups | 只读 | 列出全部设置分组,支持关键词搜索与按能力域筛选 |
search_settings_fields | 只读 | 在数百个设置项里跨分组定位字段(按字段名与中文标签匹配) |
get_settings_schema | 只读 | 返回某分组的完整字段定义:类型、枚举可选值、默认值、是否可写 |
| 主题设置 · 2 | ||
get_settings | 只读 | 读取某设置分组的值,枚举字段附带中文标签 |
update_settings | 可写 | 写入设置值,逐字段强制校验,支持预演 |
| 模块化首页 · 7 | ||
list_home_modules | 只读 | 按顺序列出首页模块及其类型与关键配置 |
get_home_module | 只读 | 读取单个模块的完整配置 |
create_home_module | 可写 | 新增模块:幻灯、文章列表、圈子、网址导航、商城等 |
update_home_module | 可写 | 增量更新模块,保留主题写入的未知配置项 |
delete_home_module | 可写 | 删除模块,必须显式传 confirm=true |
reorder_home_modules | 可写 | 用完整排列或 from/to 位移两种方式重排模块顺序 |
sync_module_sidebars | 可写 | 核对模块与模块化侧边栏记录是否一致。默认只预演,确认后才落库 |
| 内容专属字段 · 3 | ||
get_content_fields | 只读 | 读某篇文章的付费阅读、积分阅读、用户组可见、视频、多链接下载资源 |
update_content_fields | 可写 | 写入内容专属字段,支持 box_id.字段名 精确定位 |
describe_content_fields | 只读 | 列出某内容类型上全部 B2 字段定义,写入前先查它 |
| 社区与商城 · 4 | ||
list_topic_types | 只读 | 列出话题类型(说说 / 提问 / 投票 / 你猜)及其配套字段的真实字段名与就绪状态 |
create_circle_topic | 可写 | 发布圈子话题,配套字段缺失直接拒绝写入 |
get_shop_fields | 只读 | 读价格、原价、库存、发货方式、自动发卡内容 + 只读账目数据(销量、已购数) |
update_shop_fields | 可写 | 配置价格、库存、自动发卡,业务校验 + 写保护 |
| 用户与分类 · 4 | ||
get_user_fields | 只读 | 读 VIP 等级、有效期、积分余额等用户专属字段 |
update_user_fields | 可写 | 写 VIP 等级等字段;账目类字段会被拦截 |
get_term_fields | 只读 | 读圈子收费规则、加入条件等分类字段 |
update_term_fields | 可写 | 写分类专属字段 |
| SEO 与页脚 · 2 | ||
get_seo_fields | 只读 | 读首页及各栏目 TDK、页脚与备案信息 |
update_seo_fields | 可写 | 写 TDK、页脚菜单与备案信息 |
06工具参数详解
下表为每个工具的完整入参。必填参数缺失时会被拒绝;可选参数留空即可。
概览与字段发现
| 工具 | 参数 |
|---|---|
get_status | 无 |
list_settings_groups | query 关键词(选填)domain 能力域(选填,枚举):seo / footer / home / shop / community / user / general |
search_settings_fields | query 关键词(必填)limit 返回条数上限(选填) |
get_settings_schema | group 分组 ID(必填) |
主题设置
| 工具 | 参数 |
|---|---|
get_settings | group 分组 ID(必填)fields 只读指定字段名数组(选填) |
update_settings | group 分组 ID(必填)values 字段名 → 新值的映射(必填)dry_run 为 true 时只校验并返回将要发生的改动(选填,建议开启) |
模块化首页
| 工具 | 参数 |
|---|---|
list_home_modules | 无 |
get_home_module | index 模块序号(必填,从 0 开始) |
create_home_module | module_type 模块类型(必填,可传中文名或英文 slug)settings 模块配置对象(选填)enabled 是否启用(选填,默认启用) |
update_home_module | index 模块序号(必填)settings 要更新的配置项(必填,增量合并) |
delete_home_module | index 模块序号(必填)confirm 必须为 true(必填,防止误删) |
reorder_home_modules | order 完整的新排列(序号数组)moves 位移对 {from, to} 数组二者提供一个即可 |
sync_module_sidebars | dry_run 默认 true(只报告差异不落库);确认后传 false 应用 |
内容专属字段
| 工具 | 参数 |
|---|---|
get_content_fields | post_id 内容 ID(必填)box_id 只看某个 box(选填)only_writable 只返回可写字段(选填) |
update_content_fields | post_id(必填)values 字段名 或 box_id.字段名 → 新值(必填)box_id 限定写入的 box(选填)dry_run(选填,建议开启) |
describe_content_fields | post_type 内容类型(选填,留空汇总全部) |
社区与商城
| 工具 | 参数 |
|---|---|
list_topic_types | 无 |
create_circle_topic | topic_type 话题类型(必填):说说 / 提问 / 投票 / 你猜,或英文 slugtitle 标题(选填,留空取正文首行)content 正文(选填,支持 HTML 与短代码)excerpt 摘要(选填)status 状态(选填,枚举 publish/draft/pending/private,默认 draft;无发布权限时自动降级为 pending)poll_options 投票选项数组,至少 2 个guess_answer 你猜话题的答案(你猜类型必填)guess_tip 你猜话题的提示reward 悬赏积分(选填,≥0)images 配图附件 ID 数组(选填)author 作者用户 ID(选填,默认当前账号) |
get_shop_fields | product_id 商品内容 ID(必填) |
update_shop_fields | product_id(必填)values(必填)键可用业务名或真实字段名:price 价格 / original_price 原价 / stock 库存 / auto_deliver 自动发卡 / delivery_type 发货方式dry_run(选填,建议开启) |
用户与分类
| 工具 | 参数 |
|---|---|
get_user_fields | user_id 用户 ID(选填,默认当前账号) |
update_user_fields | user_id(必填)values 字段名 → 新值(必填)dry_run(选填) |
get_term_fields | term_id 分类项 ID(必填)taxonomy 分类法(选填,不传时自动推断) |
update_term_fields | term_id(必填)values(必填)dry_run(选填) |
SEO 与页脚
| 工具 | 参数 |
|---|---|
get_seo_fields | scope 范围(选填:首页 / 栏目 / 页脚) |
update_seo_fields | values 字段名 或 box_id.字段名 → 新值(必填)dry_run(选填,建议开启) |
07权限模型
每次调用都经过两道关卡:站点级只读模式(如果有,先拦截写入)→ 能力级权限(按工具逐条判定)。权限以「API Key 执行身份」或「应用密码所属用户」的身份计算。
| 适用工具 | 所需权限 |
|---|---|
get_status、list_settings_groups、search_settings_fields、get_settings_schema、get_settings、describe_content_fields、list_topic_types、get_seo_fields、get_term_fields | edit_posts 或 manage_options |
update_settings、全部 7 个首页模块工具、update_seo_fields | manage_options(管理员) |
get_content_fields、update_content_fields、create_circle_topic、get_shop_fields、update_shop_fields | 按具体内容判定:传了 post_id/product_id 时校验 edit_post,否则退回 edit_posts |
get_user_fields | list_users 或 manage_options |
update_user_fields | edit_users 或 manage_options |
update_term_fields | manage_categories |
API Key 是以某个人身份执行的:给它绑定什么角色,AI 就拥有该角色的全部能力。若只想让它改内容而不要动站点设置,就不要把 Key 绑到管理员——但当前版本所有 B2 设置写入都要求 manage_options,因此「改设置」与「管理员身份」是绑定的。需要更细粒度的授权时,请用应用密码 + 自定义角色,或配合站点级「只读模式」使用。
08预演与写保护
三道防线
- 写入前强制校验 —— 枚举值(取自 CMB2 的
options)、附件存在性(数字按附件 ID 校验,字符串按 http/https 校验)、数值上下限、邮箱 / URL / 日期格式、必填项。字段不存在时直接报错并列出可用字段名,插件从不猜字段名。 - 话题配套字段校验 —— 投票至少 2 个选项、你猜必须有答案、说说与提问必须有正文。缺字段时直接拒绝写入,不会生成让前台报错的脏数据。
- 账目字段写保护 —— 销量、已购用户、悬赏结算状态、分成收益、财富流水等属于「账目」的字段只读不可写。积分余额同样不走直接改 user meta 的路径,以免造成「余额数字正确、财富流水里没有这笔账」的不一致。
预演(dry_run)支持情况
下面标为「无预演」的工具会直接落库。调用它们之前,先用对应的读取工具确认当前状态。
| 工具 | 预演支持 |
|---|---|
update_settings | 支持 传 dry_run: true 只校验并返回改动 |
update_content_fields | 支持 |
update_shop_fields | 支持 |
update_user_fields | 支持 |
update_term_fields | 支持 |
update_seo_fields | 支持 |
sync_module_sidebars | 默认预演 不传参数即只报告差异,需显式传 dry_run: false 才落库 |
create_home_module | 无预演 直接新增 |
update_home_module | 无预演 直接更新 |
delete_home_module | 无预演 但必须传 confirm: true 才能执行 |
reorder_home_modules | 无预演 直接重排 |
create_circle_topic | 无预演 直接发布(建议先用 status: "draft") |
安全使用建议
- 改动站点设置前,先
get_settings_schema看清字段类型与枚举,再get_settings看当前值,最后dry_run预演。 - 调整首页模块时,先
list_home_modules拿到准确的序号(index),序号在增删后会变化。 - 发布话题先用
status: "draft"落草稿,后台确认无误再发布。 - 首次接入或怀疑 AI 行为越界时,直接在后台打开只读模式——所有写入类工具立即停用,读取不受影响。
09后台设置项
位置:后台左侧菜单 B2 MCP。
| 设置项 | 默认 | 说明 |
|---|---|---|
| 启用 MCP 服务 | 开 | 关闭后端点返回 404,不影响站点其他功能。适合临时停用而不卸载插件。 |
| 只读模式 | 关 | 开启后拦截所有写入类工具,读取类工具正常。是应对「AI 乱改」的总闸。 |
| 允许在 HTTPS 不可用时使用应用密码认证 | 开 | 站点为 http 时(内网 / 测试环境)需要它,否则应用密码认证会被 WordPress 拒绝。 |
| 记录调用日志 / 保留条数 | 开 / 100 | 日志写入 b2s_log 选项,记录时间、方法、工具名、用户、成功与否、消息、IP。条数范围 10–1000。 |
| API Key 执行身份 | 0(自动选管理员) | API Key 以哪个用户身份与权限执行。填 0 时自动选第一个管理员。 |
页面上的其他信息
- 客户端连接
- 完整端点 URL、当前 API Key、Key 绑定的执行用户 ID,以及「重新生成 API Key」按钮(旧 Key 立即失效)。
- B2 引擎状态
- 主题识别结果与判定依据(用于排查「为什么没识别到主题」)、CMB2 是否可用、设置分组数 / Box 总数 / 字段总数。
- 已注册工具
- 按 7 个能力域列出的全部 26 个工具,含类型(只读 / 可写)与说明,方便核对当前版本能力。
10使用示例
不需要记工具名,直接用中文描述目标即可。下面是按能力域整理的示例,可以直接照抄。
环境确认
- 「先调 get_status,告诉我主题识别结果和发现了多少个设置字段。」
- 「帮我找出所有跟『备案』有关的设置项在哪个分组。」
主题设置
- 「把首页的标题分隔符改成
丨。」 - 「看一下现在全站字体相关的设置有哪些可选值,先别改。」
模块化首页
- 「列出首页现在的模块顺序。」
- 「给首页加一个文章列表模块,三列 6 篇,排在幻灯后面。」
- 「把第二个模块的标题改成『精选推荐』,其他配置别动。」
内容专属字段
- 「给文章 123 设成 20 积分付费可见,再挂两个下载链接。」
- 「文章 456 的付费阅读配置先给我看现状,再预演一下改成 VIP 可见的改动。」
社区与商城
- 「在问答圈发个提问,带 50 积分悬赏,先存草稿。」
- 「发个投票:标题『你更喜欢哪种风格』,选项 A / B / C。」
- 「把商品 456 改成 99 元、库存 200、开自动发卡。」
用户与分类
- 「看下用户 7 现在的 VIP 等级和有效期。」
- 「把用户 7 的 VIP 等级设为年费会员。」
- 「把圈子『资源分享』的加入门槛设成 30 积分的收费规则。」
SEO 与页脚
- 「把首页 description 补上,页脚备案号改成…,先 dry_run 给我看。」
说一句「先别动手,给我看改动」就能让它走预演。开发文档已通过 instructions 告知客户端这件事,多数情况下它会自觉先预演。
11故障排查
| 现象 | 排查方向 |
|---|---|
| 客户端连不上 / 404 | ① 后台「启用 MCP 服务」是否勾选;② 端点 URL 是否为 /wp-json/b2-mcp/v1/mcp;③ 固定链接是否已设置为非「朴素」模式;④ 直接打开 /wp-json/b2-mcp/v1/info 看是否返回 JSON。 |
| 401 未认证 | 核对 X-B2S-Key 的值(后台可直接复制);若用 Bearer,注意不要漏掉 Authorization: 前缀;Key 被重新生成过的话旧值已失效。 |
| 用应用密码仍失败 | http 站点需在后台勾选「允许在 HTTPS 不可用时使用应用密码认证」;确认该用户已在其个人资料页生成过应用密码。 |
| 提示「当前账号没有执行该工具所需的权限」 | 权限按具体能力判定。设置与首页类工具需要 manage_options;检查 API Key 执行身份是否指向了有权限的用户。 |
| 写入被拒「站点已开启只读模式」 | 后台取消「只读模式」勾选。这是设计行为,不是故障。 |
get_status 显示主题未识别 | 确认 B2 / B2 PRO 已启用。若是衍生主题导致识别失败,可用过滤器 b2s_theme_detection 手动指定。 |
| 字段发现数量为 0 | CMB2 不可用,或主题不是 B2 系。看后台「B2 引擎状态」的判定依据一行。 |
| 写入报「字段不存在」 | 先用 search_settings_fields 或 get_settings_schema 查真实字段名。插件不会猜字段名,这是有意的。 |
| 首页模块报「未定位到模块存储位置」 | 主题的模块存储结构与本插件启发式探测不一致。用过滤器 b2s_module_store 手动指定 option_key 与字段 id。 |
| 话题发布报配套字段缺失 | 先用 list_topic_types 看该类型需要哪些字段:投票需 poll_options(≥2)、你猜需 guess_answer、说说与提问需 content。 |
| 商城字段映射不对 | get_shop_fields 会返回字段对接映射,据此确认真实字段名;也可用过滤器调整保护规则而不是绕过校验。 |
| 修改设置成功但前台没变化 | 主题可能有缓存(对象缓存 / CDN / 缓存插件)。清一次缓存再验证。 |
12开发者钩子
当启发式探测在你的站点上不适用时,用这些过滤器手动指定,而不是去改插件源码。
| 过滤器 | 用途 |
|---|---|
b2s_theme_detection | 覆盖 B2 主题识别结果 |
b2s_boxes | 过滤参与字段发现的 CMB2 box 集合 |
b2s_classify_group | 自定义设置分组到能力域的归类 |
b2s_module_store | 手动指定首页模块的 option_key 与字段 id |
b2s_module_option_candidates | 调整模块存储位置的候选列表 |
b2s_module_types | 调整可创建的首页模块类型注册表 |
b2s_new_module | 过滤新建模块的最终数据结构 |
b2s_topic_types / b2s_topic_post_type | 调整话题类型注册表与话题内容类型 |
b2s_probe_post_type / b2s_probe_taxonomy | 指定圈子内容类型与分类法的探测目标 |
b2s_is_protected | 覆盖单个字段是否受写保护 |
b2s_protected_ids / b2s_protected_patterns | 追加受保护字段的精确清单与正则模式 |
b2s_pre_write_value | 写入前对单个字段值做最后变换 |
b2s_tools | 过滤最终暴露给客户端的工具列表 |
b2s_ability_specs | 过滤能力规格表(增删工具、改权限回调) |
// 示例:衍生主题识别失败时手动指定
add_filter( 'b2s_theme_detection', function ( $detected ) {
$detected['active'] = true;
$detected['name'] = '我的 B2 衍生主题';
$detected['evidence'] = array( '由主题作者在 functions.php 中手动指定' );
return $detected;
} );
13卸载
后台停用并删除即可。卸载脚本只清理插件自己的三个选项:
b2s_settings— 插件设置b2s_api_key— API Keyb2s_log— 调用日志
主题设置、文章字段、用户字段、分类字段、首页模块配置全部保留。卸载插件不会影响站点前台显示。
14验证边界
本插件的代码经过静态验证,但未在真实的 WordPress + B2 主题站点上运行过。下面的边界在首次部署时请逐项确认。
已完成
- 18 个 PHP 文件语法校验全部通过,0 失败。
- 跨文件类与方法引用一致性检查,0 问题。
- Server 骨架沿用已在同架构插件中验证过的 JSON-RPC 实现;工具层契约(定义格式、调用链、错误包装)与 Server 逐条核对。
需要你在真实站点确认
以下三处采用启发式探测,因为不同 B2 版本与衍生主题的实现可能有差异。探测失败时会明确报错,不会写坏数据;确认真实结构后可用第 12 节的过滤器手动指定。
| 探测项 | 确认方法 |
|---|---|
| 首页模块的存储结构 | 调 get_status 看模块引擎对接结果;调 list_home_modules 看能否正确列出模块 |
| 话题类型的配套字段名 | 调 list_topic_types,核对返回的字段名与主题后台一致 |
| 商城字段与账目字段映射 | 调 get_shop_fields,核对价格 / 库存 / 销量字段是否指向正确的 meta key |
建议的首次实测顺序
- 启用插件并打开后台页确认主题识别、CMB2、字段统计三项正常。
- 验证连通性浏览器打开
/wp-json/b2-mcp/v1/info,确认ok: true、tool_count: 26。 - 调用
get_status确认 AI 客户端能看到工具并成功调用。 - 只读链路验证用
get_settings读一个设置分组,用list_home_modules看模块列表。 - 低风险写入验证用
update_settings+dry_run: true预演一次,确认返回的改动符合预期再去掉预演。 - 逐步开放先测内容字段,再测首页模块;商城与用户字段最后测。
已知限制
- 首页模块的增删改排不支持预演,会直接落库。
- 发布话题不支持预演,建议用草稿状态分两步走。
- 不提供 resources 与 prompts,只提供 tools。
- 不提供 SSE 订阅流,GET
/mcp按规范返回 405。 - 积分余额不通过直接改 user meta 实现(会造成账目不一致),只写受保护的账目字段会被拒绝。