v1.0.0 WordPress 5.6+ PHP 7.4+ B2 / B2 PRO 26 个工具

B2 MCP Standalone 使用手册

为 B2 / B2 PRO 主题打造的独立 MCP Server。自带 Streamable HTTP 传输层,不需要 Easy MCP AI,也不需要 WordPress 6.9 的 Abilities API。装好后 WorkBuddy 等 AI 客户端可直接读写主题设置、模块化首页、内容专属字段、社区与商城、用户与分类、SEO 与页脚。

端点 /wp-json/b2-mcp/v1/mcp  ·  协议 2025-06-18 / 2025-03-26 / 2024-11-05

01它是什么

本插件把 B2 主题的专属配置能力暴露为标准 MCP 服务端(Streamable HTTP / JSON-RPC 2.0)。AI 客户端连上后,就能直接读取和修改主题设置、搭建首页模块、配置文章的付费阅读与下载资源、发布圈子话题、配置商品、读写用户与分类字段、改 SEO 与页脚。

传输层
插件自带
外部依赖
无(仅需 B2 主题)
字段来源
CMB2 实时发现
工具数量
26

与另两个插件的关系

同一套工作里共有三个插件,定位不同、可共存:

插件传输层依赖定位
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-pagewp_options 数组主题设置、SEO 与页脚、首页配置
post / 自定义类型post meta付费阅读、积分阅读、用户组可见、视频、多链接下载
useruser metaVIP 等级、有效期、积分余额
termterm meta圈子收费规则、加入条件

02环境要求

项目要求说明
WordPress5.6 及以上需要应用密码功能(5.6 引入);低于 6.9 也可正常运行
PHP7.4 及以上代码使用类型声明与空合并,7.4 为下限
主题B2 / B2 PRO 已启用CMB2 由主题打包提供,字段发现依赖它
Easy MCP AI不需要本插件自带传输层
Abilities API不需要仅在另一版 b2-mcp 中需要
建议启用 HTTPS

用应用密码认证时,WordPress 默认只在 HTTPS 站点允许。若站点是 http(如内网测试环境),后台已提供开关可放开限制。

03安装与启用

  1. 上传并启用插件 后台 → 插件 → 安装插件 → 上传插件 → 选择 b2-mcp-standalone.zip → 立即安装 → 启用。
    启用时会自动生成一个 API Key,并写入默认设置。
  2. 打开「B2 MCP」菜单做一次环境自检 左侧菜单出现 B2 MCP。检查三项:
    · B2 主题识别 显示为绿色「已识别」;
    · CMB2 字段注册库 显示「可用」;
    · 字段总数 不为 0(B2 主题通常在数百量级)。
  3. 复制端点地址与 API Key 同一个页面的「客户端连接」卡片里,能看到完整端点 URL 与当前 API Key。Key 可在需要时点「重新生成」(旧 Key 立即失效)。
  4. 确认「启用 MCP 服务」已勾选 设置卡片里的第一个开关。关闭后端点直接返回 404,不影响站点其他功能。
  5. 连接后调一次 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 /mcp405不提供 SSE 订阅流,按规范返回 405 并带 Allow 头
DELETE /mcp204无状态服务,直接确认

首次连通性验证

  1. 浏览器打开 /wp-json/b2-mcp/v1/info,确认 ok 为 true、tool_count 为 26。
  2. 在 AI 客户端里让它调用 get_status。
  3. 返回中确认 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_groupsquery 关键词(选填)
domain 能力域(选填,枚举):seo / footer / home / shop / community / user / general
search_settings_fieldsquery 关键词(必填)
limit 返回条数上限(选填)
get_settings_schemagroup 分组 ID(必填)

主题设置

工具参数
get_settingsgroup 分组 ID(必填)
fields 只读指定字段名数组(选填)
update_settingsgroup 分组 ID(必填)
values 字段名 → 新值的映射(必填)
dry_run 为 true 时只校验并返回将要发生的改动(选填,建议开启)

模块化首页

工具参数
list_home_modules无
get_home_moduleindex 模块序号(必填,从 0 开始)
create_home_modulemodule_type 模块类型(必填,可传中文名或英文 slug)
settings 模块配置对象(选填)
enabled 是否启用(选填,默认启用)
update_home_moduleindex 模块序号(必填)
settings 要更新的配置项(必填,增量合并)
delete_home_moduleindex 模块序号(必填)
confirm 必须为 true(必填,防止误删)
reorder_home_modulesorder 完整的新排列(序号数组)
moves 位移对 {from, to} 数组
二者提供一个即可
sync_module_sidebarsdry_run 默认 true(只报告差异不落库);确认后传 false 应用

内容专属字段

工具参数
get_content_fieldspost_id 内容 ID(必填)
box_id 只看某个 box(选填)
only_writable 只返回可写字段(选填)
update_content_fieldspost_id(必填)
values 字段名 或 box_id.字段名 → 新值(必填)
box_id 限定写入的 box(选填)
dry_run(选填,建议开启)
describe_content_fieldspost_type 内容类型(选填,留空汇总全部)

社区与商城

工具参数
list_topic_types无
create_circle_topictopic_type 话题类型(必填):说说 / 提问 / 投票 / 你猜,或英文 slug
title 标题(选填,留空取正文首行)
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_fieldsproduct_id 商品内容 ID(必填)
update_shop_fieldsproduct_id(必填)
values(必填)键可用业务名或真实字段名:price 价格 / original_price 原价 / stock 库存 / auto_deliver 自动发卡 / delivery_type 发货方式
dry_run(选填,建议开启)

用户与分类

工具参数
get_user_fieldsuser_id 用户 ID(选填,默认当前账号)
update_user_fieldsuser_id(必填)
values 字段名 → 新值(必填)
dry_run(选填)
get_term_fieldsterm_id 分类项 ID(必填)
taxonomy 分类法(选填,不传时自动推断)
update_term_fieldsterm_id(必填)
values(必填)
dry_run(选填)

SEO 与页脚

工具参数
get_seo_fieldsscope 范围(选填:首页 / 栏目 / 页脚)
update_seo_fieldsvalues 字段名 或 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_fieldsedit_posts 或 manage_options
update_settings、全部 7 个首页模块工具、update_seo_fieldsmanage_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_fieldslist_users 或 manage_options
update_user_fieldsedit_users 或 manage_options
update_term_fieldsmanage_categories
把权限交给 AI 之前

API Key 是以某个人身份执行的:给它绑定什么角色,AI 就拥有该角色的全部能力。若只想让它改内容而不要动站点设置,就不要把 Key 绑到管理员——但当前版本所有 B2 设置写入都要求 manage_options,因此「改设置」与「管理员身份」是绑定的。需要更细粒度的授权时,请用应用密码 + 自定义角色,或配合站点级「只读模式」使用。

08预演与写保护

三道防线

  1. 写入前强制校验 —— 枚举值(取自 CMB2 的 options)、附件存在性(数字按附件 ID 校验,字符串按 http/https 校验)、数值上下限、邮箱 / URL / 日期格式、必填项。字段不存在时直接报错并列出可用字段名,插件从不猜字段名。
  2. 话题配套字段校验 —— 投票至少 2 个选项、你猜必须有答案、说说与提问必须有正文。缺字段时直接拒绝写入,不会生成让前台报错的脏数据。
  3. 账目字段写保护 —— 销量、已购用户、悬赏结算状态、分成收益、财富流水等属于「账目」的字段只读不可写。积分余额同样不走直接改 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 手动指定。
字段发现数量为 0CMB2 不可用,或主题不是 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 Key
  • b2s_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

建议的首次实测顺序

  1. 启用插件并打开后台页确认主题识别、CMB2、字段统计三项正常。
  2. 验证连通性浏览器打开 /wp-json/b2-mcp/v1/info,确认 ok: true、tool_count: 26。
  3. 调用 get_status确认 AI 客户端能看到工具并成功调用。
  4. 只读链路验证用 get_settings 读一个设置分组,用 list_home_modules 看模块列表。
  5. 低风险写入验证用 update_settings + dry_run: true 预演一次,确认返回的改动符合预期再去掉预演。
  6. 逐步开放先测内容字段,再测首页模块;商城与用户字段最后测。

已知限制

  • 首页模块的增删改排不支持预演,会直接落库。
  • 发布话题不支持预演,建议用草稿状态分两步走。
  • 不提供 resources 与 prompts,只提供 tools。
  • 不提供 SSE 订阅流,GET /mcp 按规范返回 405。
  • 积分余额不通过直接改 user meta 实现(会造成账目不一致),只写受保护的账目字段会被拒绝。