WordPress本地开发MCP服务

为Local by Flywheel提供的WordPress站点管理协议服务,支持WP-CLI执行、MySQL查询和文件系统操作。

  • by teamchrisfromthelc
  • TypeScript
  • 本地部署
  • 8 星标
  • 更新于
在 GitHub 查看 chrisfromthelc/local-wp-mcp

使用说明

本地wp-mcp

MCP服务器提供WP-CLI、MySQL和文件系统访问 当地飞轮 WordPress网站。

与基于REST API的WordPress MCP服务器不同,它直接通过本地的本地文件系统和进程架构进行连接,不需要应用程序密码、HTTP端点或网络请求。

特性

  • WP-CLI执行 通过本地捆绑的PHP二进制文件和命令allowling
  • 直接MySQL查询 通过Unix套接字连接池
  • 文件系统操作 具有路径验证和WordPress核心保护
  • 多站点支持 具有自动位置检测功能 sites.json
  • 安全第一: spawn() 仅(否 exec()),符号链接安全路径验证,分层命令权限

工具

工具 说明
wp_cli_run 执行任何WP-CLI命令
wp_site_info 获取WordPress版本、URL、主题、插件
wp_list_sites 按飞轮列出所有本地站点
mysql_query 运行SQL查询(默认情况下为只读)
mysql_schema 检查数据库表和列
wp_active_plugins 通过直接数据库查询获取活动插件
read_site_file 从站点目录读取文件
write_site_file 写入文件(仅限wp内容,核心保护)
list_site_directory 列出目录内容
search_site_files 按名称模式搜索文件

设置

有两种方法可以运行此MCP服务器: 来自npm (建议一般使用)或 从本地克隆 (用于开发或定制)。

重要:全部 env 值必须是字符串(例如。, "true" 不 true).


选项A:从npm安装(推荐)

这是最简单的方法。npm会自动下载并缓存包,无需克隆或构建。

自动设置(克劳德代码)

从本地站点的项目目录中:

cd ~/Local\ Sites/mysite/app/public
npx -y @chrisfromthelc/local-wp-mcp --setup

这将自动检测本地站点,创建 .mcp.json (或合并到现有的),并预填充 SITE_NAME 写入权限设置为 false.重新启动Claude Code以进行连接。

手动设置

请在下面选择您的代理。每个示例都使用 npx 运行服务器--替换 "My Site Name" 名称显示在Local中。

Claude Code

添加一个 .mcp.json 到您的项目根(例如。, ~/Local Sites/mysite/app/public/.mcp.json):

{
  "mcpServers": {
    "local-wp": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@chrisfromthelc/local-wp-mcp"],
      "env": {
        "SITE_NAME": "My Site Name",
        "WPCLI_ALLOW_WRITES": "false",
        "MYSQL_ALLOW_WRITES": "false",
        "FS_ALLOW_WRITES": "false"
      }
    }
  }
}

或者通过CLI添加:

claude mcp add -s project local-wp -- npx -y @chrisfromthelc/local-wp-mcp

然后设置环境变量 claude mcp add-json 或通过编辑 .mcp.json 直接。

Claude Desktop

编辑配置文件:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • 窗户: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "local-wp": {
      "command": "npx",
      "args": ["-y", "@chrisfromthelc/local-wp-mcp"],
      "env": {
        "SITE_NAME": "My Site Name",
        "WPCLI_ALLOW_WRITES": "false",
        "MYSQL_ALLOW_WRITES": "false",
        "FS_ALLOW_WRITES": "false"
      }
    }
  }
}

重新启动Claude Desktop以进行连接。

Cursor

添加一个 .cursor/mcp.json 到项目根目录,或编辑 ~/.cursor/mcp.json 对于全局配置:

{
  "mcpServers": {
    "local-wp": {
      "command": "npx",
      "args": ["-y", "@chrisfromthelc/local-wp-mcp"],
      "env": {
        "SITE_NAME": "My Site Name",
        "WPCLI_ALLOW_WRITES": "false",
        "MYSQL_ALLOW_WRITES": "false",
        "FS_ALLOW_WRITES": "false"
      }
    }
  }
}

或者从光标设置>工具和MCP>新MCP服务器添加。

VS Code (GitHub Copilot)

添加一个 .vscode/mcp.json 到您的工作区根目录:

{
  "servers": {
    "local-wp": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@chrisfromthelc/local-wp-mcp"],
      "env": {
        "SITE_NAME": "My Site Name",
        "WPCLI_ALLOW_WRITES": "false",
        "MYSQL_ALLOW_WRITES": "false",
        "FS_ALLOW_WRITES": "false"
      }
    }
  }
}

备注:VS代码使用 "servers" (不是 "mcpServers")并要求 "type": "stdio".

或者使用命令选项板: MCP:添加服务器.

Windsurf

编辑配置文件:

  • macOS: ~/.codeium/windsurf/mcp_config.json
  • 窗户: %USERPROFILE%\.codeium\windsurf\mcp_config.json
{
  "mcpServers": {
    "local-wp": {
      "command": "npx",
      "args": ["-y", "@chrisfromthelc/local-wp-mcp"],
      "env": {
        "SITE_NAME": "My Site Name",
        "WPCLI_ALLOW_WRITES": "false",
        "MYSQL_ALLOW_WRITES": "false",
        "FS_ALLOW_WRITES": "false"
      }
    }
  }
}

或者使用命令选项板: MCP:添加服务器.


选项B:从源代码安装(开发)

如果要修改服务器、运行测试或贡献更改,请使用此选项。您克隆仓库,构建一次,然后指向 .mcp.json 在您的本地构建输出中。

1.克隆和构建

git clone https://github.com/chrisfromthelc/local-wp-mcp.git
cd local-wp-mcp
npm install
npm run build

2.配置您的代理

将代理的配置指向本地 dist/index.js 而不是使用npx。使用与中所示相同的配置格式 手动设置 部分为您的代理,但替换 command 和 args:

"command": "node",
"args": ["/absolute/path/to/local-wp-mcp/dist/index.js"]

备注:路径必须是绝对的(例如。, /Users/you/Projects/local-wp-mcp/dist/index.js).代理生成进程时,相对路径将无法正确解析。

3.更改后重建

编辑源文件后,在重新启动代理之前重新生成:

npm run build

您还可以使用 npm run dev 在开发过程中观察变化并自动重建。

开发命令

npm run lint            # ESLint
npm run build           # TypeScript compile
npm test                # unit tests (single run)
npm run test:watch      # unit tests (watch mode)
npm run test:coverage   # unit tests with coverage report

在npm和local之间切换

要从npm切换到local(反之亦然),请更新 command 和 args 在代理的配置中:

方法 command args
npm(npx) "npx" ["-y", "@chrisfromthelc/local-wp-mcp"]
本地克隆 "node" ["/absolute/path/to/dist/index.js"]

其他一切(env,服务器名称)保持不变。切换后重新启动代理。


环境变量

变量 描述 默认值
SITE_NAME 站点名称如Local中所示(例如。, "My Site") 如果只有一个站点存在,则自动检测
SITE_ID 本地站点ID(优先于 SITE_NAME) —
WPCLI_ALLOW_WRITES 启用写入WP-CLI命令(plugin install, post create等等) "false"
MYSQL_ALLOW_WRITES 启用 INSERT/UPDATE/DELETE/ALTER 查询 "false"
FS_ALLOW_WRITES 通过以下方式启用写入文件 write_site_file (WordPress核心目录始终是只读的) "false"
WPCLI_SAFE_COMMANDS 以逗号分隔的附加只读命令列表(请参见 插件CLI命令) —

如果本地中只存在一个站点, SITE_NAME 和 SITE_ID 两者都可以省略——服务器将自动连接到它。

插件CLI命令

此MCP服务器不仅限于核心WP-CLI命令,它还自动支持插件(WooCommerce、ACF、Yoast、Elementor等)注册的命令。

运作原理

WP-CLI命令使用三层系统进行分类:

层级 行为 示例
已屏蔽 始终被拒绝(任意代码执行) eval, eval-file, shell
只读 始终允许 核心安全命令+任何具有只读动作动词的命令
写 需要 WPCLI_ALLOW_WRITES=true 其他一切

只读动作动词 --任何子命令为以下命令之一的命令都会自动被允许,无论它是核心命令还是插件命令:

list, get, search, check, status, path, info, version, is-installed, check-update, pluck, has

这意味着命令如下 wc product list, acf field get my-group,或 yoast index status 开箱即用——无需配置。

带有写动作动词的命令,如 wc product create, acf field delete,或 yoast index run 除非被阻止 WPCLI_ALLOW_WRITES=true 已设置。

自定义安全命令

如果插件具有与内置动词模式不匹配的只读命令(例如。, wc report sales),您可以使用将其列入白名单 WPCLI_SAFE_COMMANDS 环境变量:

{
  "mcpServers": {
    "local-wp": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@chrisfromthelc/local-wp-mcp"],
      "env": {
        "SITE_NAME": "My Site Name",
        "WPCLI_ALLOW_WRITES": "false",
        "MYSQL_ALLOW_WRITES": "false",
        "WPCLI_SAFE_COMMANDS": "wc report sales,wc report customers,my-plugin dump-config"
      }
    }
  }
}

命令在 WPCLI_SAFE_COMMANDS 始终允许在不启用写入的情况下进行。使用逗号分隔的值,匹配命令的前2-3个单词。

安全

  • 所有命令都使用 spawn() 带参数数组--无shell解释
  • 命令和参数中都拒绝了Shell元字符作为深度防御
  • WP-CLI eval, eval-file,以及 shell 总是被封锁
  • 危险旗帜(--exec, --require, --ssh等)在所有命令中都被阻止
  • 写操作需要通过env-vars显式选择加入
  • 带有只读动词的插件命令会被自动检测和允许
  • 文件路径已通过验证 realpath() 防止符号链接遍历
  • 文件读写使用开放句柄来缓解TOCTU竞争情况
  • WordPress核心目录(wp-admin/, wp-includes/)是只读的
  • 子进程仅继承必要的环境变量
  • 目录搜索限制为10000个文件,以防止资源耗尽
  • 输出被截断为25000个字符,以保留上下文窗口

需求

  • 当地飞轮 安装
  • Node.js 18+
  • 站点必须在本地运行(服务已启动)

许可证

麻省理工学院