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

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

前言

本文记录了使用WordPress网站配置Model Context Protocol (MCP)时遇到的挑战和解决方法。通过详细的步骤说明,希望为有相同需求的技术人员提供参考。

问题背景

客户网站为一个工业机械官网(托管于Hostinger),主题采用Astra + Elementor组合。目标是利用MCP协议来优化WordPress的主题配置管理过程,并使AI助手能够直接调用MCP Adapter接口修改主题设置。

安装 MCP Adapter插件

在WordPress后台搜索并安装名为"MCP Adapter"的插件,启用后通过访问以下URL验证其正常运行:

https://your-site.com/wp-json/mcp/

若返回{"status":"ok"}则说明插件配置无误。

使用官方MCP客户端

使用@automattic/mcp-wordpress-remote包尝试连接,配置如下:

{
  "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测试MCP端点:

Invoke-WebRequest -Uri 'https://your-site.com/wp-json/mcp/' -Headers @{
    'Authorization' = 'Basic <base64编码的user:app_password>'
} -UseBasicParsing

如果返回正常说明问题不在服务器端。

分析MCP原理

经过深入研究后发现,WordPress MCP Adapter需要维持会话状态。具体步骤如下:

  1. 发送initialize请求。
  2. 服务器响应中包含Mcp-Session-Id头部信息。
  3. 所有后续请求必须携带此ID。
  4. 需要发送initialized通知以完成初始化过程。

实现兼容的Node.js客户端

基于以上理解,编写了一个简单的Node.js客户端来实现会话管理:

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 => {
            let data = '';
            res.on('data', chunk => { data += chunk; });
            res.on('end', () => resolve(JSON.parse(data)));
        });

        req.on('error', error => reject(error));
        req.write(JSON.stringify(body));
        req.end();
    });
}

// 实现初始化请求
async function initialize() {
    const body = {"command": "initialize"};
    let response = await request(body);
    sessionId = response['headers']['Mcp-Session-Id'];

    // 发送initialized通知完成初始化过程
    body.command = 'notify';
    body.eventName = 'initialized';
    await request(body);

    console.log("Initialization complete.");
}

// 调用工具函数执行具体操作
async function callTool(action) {
    const body = {"command": "call", "toolName": action};
    let response = await request(body);
    return response;
}

以上代码通过HTTP请求发送JSON格式的数据来与MCP适配器进行交互,并维护了会话状态。在完成初始化后,可以调用callTool()函数执行具体的操作。

总结

本文介绍了如何调试和使用WordPress MCP Adapter插件,在实现过程中遇到了连接失败等问题并进行了深入分析和技术实现。通过编写Node.js客户端实现了与MCP适配器的正确交互,并提供了详细的代码示例供参考。

第六步:调用成功!

在初始化完成后,可以通过以下步骤发现和调用可用的工具:

  1. 初始化会话 首先执行 init() 函数来设置客户端信息并请求初始化。这一步非常重要,因为它为后续的所有操作创建了必要的上下文。

  2. 获取可用工具列表 接下来使用 discover() 功能发现当前环境下的所有可调用的工具和服务。例如,以下代码片段展示了如何输出 Astra 主题相关的能力建议:

    const tools = await discover();
    console.log(tools);
    // 输出:80+ Astra 主题相关能力
  3. 获取具体功能设置 调用特定工具以获取更详细的配置信息,例如头部构建器和侧边栏布局。这些调用需要传递正确的方法名称及其参数。

    await call('astra/get-header-builder', {});
    await call('astra/get-sidebar-layout', {});

关键发现总结

在调试过程中遇到了几个主要问题,这里列出了解决方案:

问题原因解决方案
连接超时npx 下载慢导致安装过程中时间过长全球范围内使用 npm install -g 安装插件来提高效率:npm install -g @automattic/mcp-wordpress-remote
认证失败未正确生成并使用应用密码必须使用 6段格式 的应用程序密码,每段4个字符,并以空格分隔(例如 XXXX XXXX XXXX XXXX XXXX XXXX)
响应错误初始化会话时没有获取和维持 SessionId需要从初始化响应中提取并存储 SessionId 用于后续请求
协议违规必须发送正确的通知以完成握手过程实现 initialized 通知,这是与 MCP 服务器通信的重要步骤

WordPress 应用程序密码注意事项

在使用 WP REST API 和 MCP 协议时,请务必遵循以下几点指导原则:

  1. 生成独立的密码:应用程序密码需要单独创建,并且不能用于登录WordPress网站。
  2. 访问路径:通过WP后台进入用户资料页面,查找“应用密码”选项来生成新密钥。
  3. 格式要求:确保所生成的应用密码遵循严格的六段十六字符格式。
  4. 授权范围:在生成过程中确定了此密钥的权限,这些信息决定了通过MCP可以执行哪些操作。

最终成果展示

经过调试和配置后,现在可以通过 MCP 完成以下管理任务:

  • 字体设置(包括 body, h1-h6 和 heading 样式)
  • 全局颜色及按钮与链接的颜色定制
  • Header Builder 功能的桌面端和移动端布局调整
  • 侧边栏配置选项(如布局、宽度以及样式选择)
  • Footer 设置调整
  • 滚动到顶部按钮的相关功能
  • 性能优化,例如进行字体本地化处理

这些改进大大提升了自动化管理WordPress网站的能力。

结语

此次调试证明了 WordPress MCP Adapter 的强大功能和潜力。尽管一开始遇到了一些技术挑战,但通过深入理解协议细节并解决会话管理和认证问题后,成功实现了预期目标。希望这篇博客能为其他开发者在使用该插件时提供有价值的参考信息和技术支持。

技术栈: Node.js + WordPress REST API + MCP 协议
版本说明: 使用官方发布版的 MCP Adapter 插件