WordPress MCP Adapter 调试实战:从"连接失败"到完全可用

前言

使用work Buddy给WordPress 网站配置MCP(Model Context Protocol)时,踩了不少坑,最后终于搞定了。整理一下经验教训,给有同样需求的朋友参考。

问题背景

客户网站:XXXX.com(工业机械官网)

  • 托管:Hostinger
  • 主题:Astra + Elementor
  • 想通过 MCP 协议管理 WordPress 主题设置

目标:让 AI 助手能直接调用 WordPress MCP Adapter 来修改主题配置。

踩坑全过程

第一步:安装 MCP Adapter 插件

WordPress 后台直接搜索 "MCP Adapter" 就能找到并安装。启用后访问:

arduino 复制代码
https://your-site.com/wp-json/mcp/

返回 {"status":"ok"} 说明插件正常工作。

第二步:尝试使用 @automattic/mcp-wordpress-remote

这是官方提供的 MCP 客户端包,配置方式:

perl 复制代码
{
  "command": "npx",
  "args": ["-y", "@automattic/mcp-wordpress-remote@latest"],
  "env": {
    "WP_API_URL": "https://helimachinery.com/wp-json/mcp/mcp-adapter-default-server",
    "WP_API_USERNAME": "your-email@gmail.com",
    "WP_API_PASSWORD": "XXXX XXXX XXXX XXXX XXXX XXXX"
  }
}

问题:连接总是超时或认证失败

第三步:自己测试 MCP 端点

用 PowerShell 直接测试:

bash 复制代码
# 测试端点是否可访问
Invoke-WebRequest -Uri 'https://your-site.com/wp-json/mcp/' -Headers @{
    'Authorization' = 'Basic <base64编码的user:app_password>'
} -UseBasicParsing

返回正常说明端点没问题。

第四步:手动实现 MCP 协议

深入研究后发现问题所在:

核心问题:WordPress MCP Adapter 需要 Mcp-Session-Id HTTP Header

MCP 协议是 有状态 的,需要维持会话:

  1. 先发 initialize 请求
  2. 服务器返回 Mcp-Session-Id header
  3. 后续所有请求必须带上这个 header
  4. 需要发送 initialized 通知
  5. 才能调用 tools/call 等方法

第五步:写一个兼容的 Node.js 客户端

javascript 复制代码
const http = require('http');
const crypto = require('crypto');

const MCP_SERVER = 'https://helimachinery.com/wp-json/mcp/mcp-adapter-default-server';
const AUTH = Buffer.from('sanlin20201@gmail.com:XI2M 3Brf Y7nj pBuD 3ZJY u8tU').toString('base64');

let sessionId = null;

function request(body) {
    return new Promise((resolve, reject) => {
        const url = new URL(MCP_SERVER);
        const options = {
            hostname: url.hostname,
            path: url.pathname,
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': `Basic ${AUTH}`
            }
        };
        if (sessionId) {
            options.headers['Mcp-Session-Id'] = sessionId;
        }
        
        const req = http.request(options, (res) => {
            if (res.headers['mcp-session-id']) {
                sessionId = res.headers['mcp-session-id'];
            }
            let data = '';
            res.on('data', chunk => data += chunk);
            res.on('end', () => resolve(JSON.parse(data)));
        });
        req.on('error', reject);
        req.write(JSON.stringify(body));
        req.end();
    });
}

async function init() {
    const res = await request({
        jsonrpc: '2.0', id: 1, method: 'initialize',
        params: {
            protocolVersion: '2024-11-05',
            capabilities: {},
            clientInfo: { name: 'wp-client', version: '1.0' }
        }
    });
    console.log('Session initialized:', sessionId);
    
    // 必须发送 initialized 通知
    await request({ jsonrpc: '2.0', method: 'initialized', params: {} });
}

async function discover() {
    return await request({
        jsonrpc: '2.0', id: 2, method: 'tools/list'
    });
}

async function call(name, args = {}) {
    return await request({
        jsonrpc: '2.0', id: 3, method: 'tools/call',
        params: { name, arguments: args }
    });
}

第六步:调用成功!

scss 复制代码
// 发现可用工具
await init();
const tools = await discover();
console.log(tools);
// 输出:80+ Astra 主题相关 abilities

// 获取 Header 配置
await call('astra/get-header-builder', {});

// 获取侧边栏设置
await call('astra/get-sidebar-layout', {});

关键发现总结

问题 原因 解决方案
连接超时 npx 下载慢 全局安装:npm install -g @automattic/mcp-wordpress-remote
认证失败 应用密码格式错误 必须用 6段格式 :XXXX XXXX XXXX XXXX XXXX XXXX
总是报错 缺少 SessionId 必须从 initialize 响应获取并维持
协议错误 缺少 initialized 通知 initialize 后必须发送 initialized 通知

WordPress 应用程序密码注意事项

  1. 不是登录密码 - 需要单独生成
  2. 位置:WP后台 → 用户 → 个人资料 → 应用程序密码
  3. 格式:6段,每段4个字符,用空格分隔
  4. 授权:生成时分配的权限就是 MCP 能操作的权限

最终成果

现在可以通过 MCP 直接管理:

  • ✅ 字体设置(body/h1-h6/heading)
  • ✅ 全局颜色/按钮颜色/链接颜色
  • ✅ Header Builder(桌面/移动端)
  • ✅ Sidebar 配置(布局/宽度/样式)
  • ✅ Footer 设置
  • ✅ 滚动到顶部按钮
  • ✅ 性能优化(字体本地化)

结语

WordPress MCP Adapter 本身是能用的,问题在于第三方客户端对 HTTP Session 的处理不一致。自定义一个简单的客户端脚本,问题迎刃而解。


技术栈 :Node.js + WordPress REST API + MCP 协议
插件版本:MCP Adapter(WordPress 官方插件目录)

相关推荐
winfredzhang几秒前
从零手写一个毛玻璃风格的页面搭建台:单文件 HTML 实现组件放置、面板磁吸与图层管理
前端·html
limuyang27 小时前
我在 2核2G 云主机上跑 OpenViking:一次关于云主机、模型选型与长期成本的真实复盘
人工智能·开源·ai编程
葡萄城技术团队8 小时前
1000 人协同压测的环境瓶颈排查:CPU 争用与 Wi\-Fi
前端
excel9 小时前
Marked 与 Markdown 有什么区别?该怎么选?
前端
金銀銅鐵10 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
Da Da 泓10 小时前
五子棋 Web 端测试用例报告
前端·网络·websocket·网络协议·测试用例·项目
zxcvb15311 小时前
远程查看本地文档:一条轻量 Web 文件服务的工程化链路
前端·远程查看文档
niucloud-admin11 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
北岛贰12 小时前
啵啵音乐迎来全新升级!
前端
hkNaruto13 小时前
【AI】基于大模型的AI游戏地图生成、控制方案:AI Native Game Harness 迁移操作手册
前端·人工智能·游戏