{"_id":"@thenavidm/wordpress-mcp-cli","_rev":"6-2aecafb48ea39d2d2f2b884a60a5f380","name":"@thenavidm/wordpress-mcp-cli","dist-tags":{"latest":"2.0.1"},"versions":{"1.1.0":{"name":"@thenavidm/wordpress-mcp-cli","version":"1.1.0","keywords":["mcp","mcp-server","model-context-protocol","wordpress","wordpress-rest-api","wp-json","elementor","rankmath","seo","cms","headless-wordpress","claude","claude-code","claude-desktop","cursor","windsurf","anthropic","ai-agents","llm-tools","typescript"],"author":{"url":"https://navid.me","name":"Navid Moazzez"},"license":"MIT","_id":"@thenavidm/wordpress-mcp-cli@1.1.0","maintainers":[{"name":"thenavidm","email":"n@navid.me"}],"contributors":[{"url":"https://navid.me","name":"Navid Moazzez"}],"homepage":"https://github.com/thenavidm/wordpress-mcp-cli#readme","bugs":{"url":"https://github.com/thenavidm/wordpress-mcp-cli/issues"},"bin":{"wordpress-cli":"dist/index.js","wordpress-mcp":"dist/index.js"},"dist":{"shasum":"57bb28dfd349588e91e7fba4b8e9ee8922f09415","tarball":"https://registry.npmjs.org/@thenavidm/wordpress-mcp-cli/-/wordpress-mcp-cli-1.1.0.tgz","fileCount":76,"integrity":"sha512-RD+lgn3/0HGQ5070Yb0bPScUMDh9X8TXRtq1xtKV18JJBlLfNfc4l4w8or+7xYSOkdYSruTtSKw6hlBKA5nw/w==","signatures":[{"sig":"MEUCIQDccrFo9+nE3aW2IbqX1sABlxKo2OvSRB75N5ON9Zd0VwIgf0TU+pbd5v9Ah6F0WpOk2SgGRTgdNmPXa8KqH+Bq2Rs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@thenavidm%2fwordpress-mcp-cli@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":429185},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"5f6d263d5b4d33adc004faded29013285144928e","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","start":"node dist/index.js","verify":"npm run typecheck && npm run build && npm test","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"thenavidm","email":"n@navid.me"},"repository":{"url":"git+https://github.com/thenavidm/wordpress-mcp-cli.git","type":"git"},"_npmVersion":"10.9.8","description":"WordPress MCP server and CLI for Claude Code and AI agents. 42 tools for posts, pages, custom post types, media, taxonomies, users and comments over the WordPress REST API, plus Elementor page data, Rank Math SEO, redirects and bulk edits through an optio","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.25.76","zod-to-json-schema":"^3.24.1","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0"},"_npmOperationalInternal":{"tmp":"tmp/wordpress-mcp-cli_1.1.0_1788478276874_0.009665566051624053","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@thenavidm/wordpress-mcp-cli","version":"1.1.1","keywords":["mcp","mcp-server","model-context-protocol","wordpress","wordpress-rest-api","wp-json","elementor","rankmath","seo","cms","headless-wordpress","claude","claude-code","claude-desktop","cursor","windsurf","anthropic","ai-agents","llm-tools","typescript"],"author":{"url":"https://navid.me","name":"Navid Moazzez"},"license":"MIT","_id":"@thenavidm/wordpress-mcp-cli@1.1.1","maintainers":[{"name":"thenavidm","email":"n@navid.me"}],"contributors":[{"url":"https://navid.me","name":"Navid Moazzez"}],"homepage":"https://github.com/thenavidm/wordpress-mcp-cli#readme","bugs":{"url":"https://github.com/thenavidm/wordpress-mcp-cli/issues"},"bin":{"wordpress-cli":"dist/index.js","wordpress-mcp":"dist/index.js"},"dist":{"shasum":"0e55a028a4c1132736b5de237c479d1103999150","tarball":"https://registry.npmjs.org/@thenavidm/wordpress-mcp-cli/-/wordpress-mcp-cli-1.1.1.tgz","fileCount":76,"integrity":"sha512-po/54EFEv+U7G8UL9ngbrJFaXN8yHug1WD27l+qHOEvlbhgrJROAbI81EILKb4WqPWvdlD1uExsMG+aFB5zNww==","signatures":[{"sig":"MEUCIQCnHvoehaKo21UCfVO4UhkpUFciJLJywXwVjhIu8I7vJgIgXEPKLqyW+l10TJt31CTgrliEfTww0qMFPp7i5luSNso=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@thenavidm%2fwordpress-mcp-cli@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":429388},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"212bc84d9228ba140e9a901085826e26a69e1608","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","start":"node dist/index.js","verify":"npm run typecheck && npm run build && npm test","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"thenavidm","email":"n@navid.me"},"repository":{"url":"git+https://github.com/thenavidm/wordpress-mcp-cli.git","type":"git"},"_npmVersion":"10.9.8","description":"WordPress MCP server and CLI for Claude Code and AI agents. 42 tools for posts, pages, custom post types, media, taxonomies, users and comments over the WordPress REST API, plus Elementor page data, Rank Math SEO, redirects and bulk edits through an optio","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.25.76","zod-to-json-schema":"^3.24.1","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0"},"_npmOperationalInternal":{"tmp":"tmp/wordpress-mcp-cli_1.1.1_1788478539857_0.7370416634019705","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@thenavidm/wordpress-mcp-cli","version":"1.1.2","keywords":["mcp","mcp-server","model-context-protocol","wordpress","wordpress-rest-api","wp-json","elementor","rankmath","seo","cms","headless-wordpress","claude","claude-code","claude-desktop","cursor","windsurf","anthropic","ai-agents","llm-tools","typescript"],"author":{"url":"https://navid.me","name":"Navid Moazzez"},"license":"MIT","_id":"@thenavidm/wordpress-mcp-cli@1.1.2","maintainers":[{"name":"thenavidm","email":"n@navid.me"}],"contributors":[{"url":"https://navid.me","name":"Navid Moazzez"}],"homepage":"https://github.com/thenavidm/wordpress-mcp-cli#readme","bugs":{"url":"https://github.com/thenavidm/wordpress-mcp-cli/issues"},"bin":{"wordpress-cli":"dist/index.js","wordpress-mcp":"dist/index.js"},"dist":{"shasum":"da57ff55f001e8a7a48d56ddc47dcb95fdf0f069","tarball":"https://registry.npmjs.org/@thenavidm/wordpress-mcp-cli/-/wordpress-mcp-cli-1.1.2.tgz","fileCount":76,"integrity":"sha512-jCs8NJ4yawnQWmZhixpGUrxsHoFDAemdKF5Jy1ZahOx772EIbFNKfLDcr5xfcZxaiNLhwH13WxEb2wrWoRJHlg==","signatures":[{"sig":"MEUCIQCN4MzRktXu55p/X8nuUCnT86+TT2Id618MKoYQSUn66gIgL1TTdxsXI0hzWDeBVZ5Ohvfa7aWS484A3FhGW0UJg8c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDh/Mdb8JjJhl5IiLdtny4UubUr/Y+vGQ293EkK4obxVAiBNXqmC9XU+aDKJqUy88INvlqQH4r50XZGUUylZCCwklA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@thenavidm%2fwordpress-mcp-cli@1.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":431213},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"1c1e97a0a8d8bee909d107f7d92636c859ef1d7a","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","start":"node dist/index.js","verify":"npm run typecheck && npm run build && npm test","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"thenavidm","email":"n@navid.me"},"repository":{"url":"git+https://github.com/thenavidm/wordpress-mcp-cli.git","type":"git"},"_npmVersion":"10.9.8","description":"WordPress MCP server and CLI for Claude Code and AI agents. 42 tools for posts, pages, custom post types, media, taxonomies, users and comments over the WordPress REST API, plus Elementor page data, Rank Math SEO, redirects and bulk edits through an optio","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.25.76","zod-to-json-schema":"^3.24.1","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0"},"_npmOperationalInternal":{"tmp":"tmp/wordpress-mcp-cli_1.1.2_1790491310057_0.03886312189044827","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@thenavidm/wordpress-mcp-cli","version":"1.1.3","keywords":["mcp","mcp-server","model-context-protocol","wordpress","wordpress-rest-api","wp-json","elementor","rankmath","seo","cms","headless-wordpress","claude","claude-code","claude-desktop","cursor","windsurf","anthropic","ai-agents","llm-tools","typescript"],"author":{"url":"https://navid.me","name":"Navid Moazzez"},"license":"MIT","_id":"@thenavidm/wordpress-mcp-cli@1.1.3","maintainers":[{"name":"thenavidm","email":"n@navid.me"}],"contributors":[{"url":"https://navid.me","name":"Navid Moazzez"}],"homepage":"https://github.com/thenavidm/wordpress-mcp-cli#readme","bugs":{"url":"https://github.com/thenavidm/wordpress-mcp-cli/issues"},"bin":{"wordpress-cli":"dist/index.js","wordpress-mcp":"dist/index.js","wordpress-mcp-cli":"dist/npx.js"},"dist":{"shasum":"32af052907e633813e4bbc227b652b581ed2b947","tarball":"https://registry.npmjs.org/@thenavidm/wordpress-mcp-cli/-/wordpress-mcp-cli-1.1.3.tgz","fileCount":79,"integrity":"sha512-vtqQiWT3aKOBPQxlZ/vGuV+dQVdz4MX7rEfkO7uJpEIUbrSrHsQaXGgFzYJX4MSpLMQKNFcuF/qbTOtVHnxFaQ==","signatures":[{"sig":"MEYCIQCLDIzftfNS0DCvL+z/D47gRrGe4z9zHZN0Ue8eXYc6eQIhAKAB+NHjdeAXGic1B3cX7Nx6nn8Vt05dySUYAto1YjEc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAZG3y+sAx1lAfw4dQOWrycaKhWy/PAWV0eVMJqhJO87AiBzz3KBJoArfhhVVgfpYMul8LouDN5JZ38I1cNkOEN+6g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@thenavidm%2fwordpress-mcp-cli@1.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":432426},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"22f8a66c3c2f7333a57b85bf2d827cd1f75b7746","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","start":"node dist/index.js","verify":"npm run typecheck && npm run build && npm test","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"thenavidm","email":"n@navid.me"},"repository":{"url":"git+https://github.com/thenavidm/wordpress-mcp-cli.git","type":"git"},"_npmVersion":"10.9.9","description":"WordPress MCP server and CLI for Claude Code and AI agents. 42 tools for posts, pages, custom post types, media, taxonomies, users and comments over the WordPress REST API, plus Elementor page data, Rank Math SEO, redirects and bulk edits through an optio","directories":{},"_nodeVersion":"22.23.3","dependencies":{"zod":"^3.25.76","zod-to-json-schema":"^3.24.1","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0"},"_npmOperationalInternal":{"tmp":"tmp/wordpress-mcp-cli_1.1.3_1791141318408_0.9439834377592322","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@thenavidm/wordpress-mcp-cli","version":"2.0.0","keywords":["mcp","mcp-server","model-context-protocol","wordpress","wordpress-rest-api","wp-json","elementor","rankmath","seo","cms","headless-wordpress","claude","claude-code","claude-desktop","cursor","windsurf","anthropic","ai-agents","llm-tools","typescript","cli","mcp-cli","wordpress-cli","slipway"],"author":{"url":"https://navid.me","name":"Navid Moazzez"},"license":"MIT","_id":"@thenavidm/wordpress-mcp-cli@2.0.0","maintainers":[{"name":"thenavidm","email":"n@navid.me"}],"contributors":[{"url":"https://navid.me","name":"Navid Moazzez"}],"homepage":"https://github.com/thenavidm/wordpress-mcp-cli#readme","bugs":{"url":"https://github.com/thenavidm/wordpress-mcp-cli/issues"},"bin":{"wordpress-cli":"dist/index.js","wordpress-mcp":"dist/index.js","wordpress-mcp-cli":"dist/npx.js"},"dist":{"shasum":"aee153353db3d1e8c2fc646eae13acc6b69d9b9f","tarball":"https://registry.npmjs.org/@thenavidm/wordpress-mcp-cli/-/wordpress-mcp-cli-2.0.0.tgz","fileCount":76,"integrity":"sha512-4PsFBZWLLYMNuln6c9fviWJoH5uNz1Pj7EnY3KcdQchrgL0748YeB8zpD/QDvL4nfRy9tgR15/3Zxz11TCi+Yg==","signatures":[{"sig":"MEQCIBuJupqwemrA1UVXPqgiYxwYf9cbOGGqWK0IHQyi03eQAiBbdUHOPDrUHeK5KQs/f63164T2DAbw8tN8F7jri7t9OA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFSQ+QyOJKrJHpkzNJekT2cTvIDjBSIkoA80SrLq3E7dAiEA1CDbVxDOE1u9TYiVDQCPucmgsArUDvFcBseUml2IaEc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@thenavidm%2fwordpress-mcp-cli@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":342618},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"9526ac5c3639bc06a5b800ac62c021ea9e09a86e","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","start":"node dist/index.js","verify":"npm run typecheck && npm run build && npm test","typecheck":"tsc --noEmit","build:mcpb":"bash desktop-extension/build.sh","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"thenavidm","email":"n@navid.me"},"repository":{"url":"git+https://github.com/thenavidm/wordpress-mcp-cli.git","type":"git"},"_npmVersion":"10.9.9","description":"WordPress MCP server and CLI for Claude Code and AI agents. 42 tools for posts, pages, custom post types, media, taxonomies, users and comments over the WordPress REST API, plus Elementor page data, Rank Math SEO, redirects and bulk edits through an optio","directories":{},"_nodeVersion":"22.23.3","dependencies":{"zod":"^4.2.0","@thenavidm/slipway":"^0.1.11"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0"},"_npmOperationalInternal":{"tmp":"tmp/wordpress-mcp-cli_2.0.0_1791170846839_0.17265861097076307","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"_id":"@thenavidm/wordpress-mcp-cli@2.0.1","bin":{"wordpress-cli":"dist/index.js","wordpress-mcp":"dist/index.js","wordpress-mcp-cli":"dist/npx.js"},"bugs":{"url":"https://github.com/thenavidm/wordpress-mcp-cli/issues"},"dist":{"shasum":"827b3195fa33061a3265a6036cecc0acadd41bba","tarball":"https://registry.npmjs.org/@thenavidm/wordpress-mcp-cli/-/wordpress-mcp-cli-2.0.1.tgz","fileCount":76,"integrity":"sha512-XBpsYx0Gqncl2+BJxHezaCP6HSJtc6WW+oKZEf4GXo9RjdEquS7HsgJ8ntbJFVarp3Uvb4j5981fCmrowtYE4g==","signatures":[{"sig":"MEYCIQCoLAR7kj2T6SzeSxLzfiviczyNVSme7Nu2dsP4rwW56QIhAPsI/qgovh7pakbqlCV4r/7PkxerlsBrvUcI7gTMHDgM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBSYgND/U0+geutT5LKp7xwfiisWJVz1QqCZwXbYVoEKAiAEOScGzuRKrX9Ev9Hi8p8wY+hLNAXwG6eM1UgtlRa1wg=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@thenavidm%2fwordpress-mcp-cli@2.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":342645},"main":"./dist/index.js","name":"@thenavidm/wordpress-mcp-cli","type":"module","types":"./dist/index.d.ts","author":{"url":"https://navid.me","name":"Navid Moazzez"},"engines":{"node":">=22"},"gitHead":"0bcd17b2aca7dc3fe7dcc0ada3d01be49cf65e21","license":"MIT","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","start":"node dist/index.js","verify":"npm run typecheck && npm run build && npm test","typecheck":"tsc --noEmit","build:mcpb":"bash desktop-extension/build.sh","test:watch":"vitest","prepublishOnly":"npm run build"},"version":"2.0.1","_npmUser":{"name":"thenavidm","email":"n@navid.me"},"homepage":"https://github.com/thenavidm/wordpress-mcp-cli#readme","keywords":["mcp","mcp-server","model-context-protocol","wordpress","wordpress-rest-api","wp-json","elementor","rankmath","seo","cms","headless-wordpress","claude","claude-code","claude-desktop","cursor","windsurf","anthropic","ai-agents","llm-tools","typescript","cli","mcp-cli","wordpress-cli","slipway"],"repository":{"url":"git+https://github.com/thenavidm/wordpress-mcp-cli.git","type":"git"},"_npmVersion":"10.9.9","description":"WordPress MCP server and CLI for Claude Code and AI agents. 42 tools for posts, pages, custom post types, media, taxonomies, users and comments over the WordPress REST API, plus Elementor page data, Rank Math SEO, redirects and bulk edits through an optio","directories":{},"maintainers":[{"name":"thenavidm","email":"n@navid.me"}],"_nodeVersion":"22.23.3","contributors":[{"url":"https://navid.me","name":"Navid Moazzez"}],"dependencies":{"zod":"^4.2.0","@thenavidm/slipway":"^0.1.17"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/wordpress-mcp-cli_2.0.1_1791188782142_0.38291369405954323"}}},"time":{"created":"2026-09-03T23:31:16.700Z","modified":"2026-10-05T08:26:22.579Z","1.1.0":"2026-09-03T23:31:17.038Z","1.1.1":"2026-09-03T23:35:40.012Z","1.1.2":"2026-09-27T06:41:50.158Z","1.1.3":"2026-10-04T19:15:18.551Z","2.0.0":"2026-10-05T03:27:26.917Z","2.0.1":"2026-10-05T08:26:22.256Z"},"bugs":{"url":"https://github.com/thenavidm/wordpress-mcp-cli/issues"},"author":{"url":"https://navid.me","name":"Navid Moazzez"},"license":"MIT","homepage":"https://github.com/thenavidm/wordpress-mcp-cli#readme","keywords":["mcp","mcp-server","model-context-protocol","wordpress","wordpress-rest-api","wp-json","elementor","rankmath","seo","cms","headless-wordpress","claude","claude-code","claude-desktop","cursor","windsurf","anthropic","ai-agents","llm-tools","typescript","cli","mcp-cli","wordpress-cli","slipway"],"repository":{"url":"git+https://github.com/thenavidm/wordpress-mcp-cli.git","type":"git"},"description":"WordPress MCP server and CLI for Claude Code and AI agents. 42 tools for posts, pages, custom post types, media, taxonomies, users and comments over the WordPress REST API, plus Elementor page data, Rank Math SEO, redirects and bulk edits through an optio","contributors":[{"url":"https://navid.me","name":"Navid Moazzez"}],"maintainers":[{"name":"thenavidm","email":"n@navid.me"}],"readme":"<div align=\"center\">\n  <img src=\"https://cdn.navid.me/connectors/wordpress-icon.png\" alt=\"WordPress\" width=\"88\">\n</div>\n\n# WordPress MCP Server & CLI\n\n[![npm](https://img.shields.io/npm/v/@thenavidm/wordpress-mcp-cli?color=orange&label=npm)](https://www.npmjs.com/package/@thenavidm/wordpress-mcp-cli)\n[![License](https://img.shields.io/badge/license-MIT-green)](./LICENSE)\n[![YouTube](https://img.shields.io/badge/YouTube-@thenavidm-red?logo=youtube&logoColor=white)](https://youtube.com/@thenavidm?sub_confirmation=1)\n[![X](https://img.shields.io/badge/X-@thenavidm-black?logo=x)](https://x.com/thenavidm)\n[![LinkedIn](https://img.shields.io/badge/LinkedIn-thenavidm-0A66C2?logo=linkedin&logoColor=white)](https://linkedin.com/in/thenavidm)\n\nWordPress MCP server and CLI for Claude Code, Codex and AI agents. 42 tools for posts, pages, custom post types, media, taxonomies, Elementor, Rank Math SEO, redirects, bulk edits, multi-site.\n\nOne install gives you both surfaces, the same 42 tools under the same names.\n\nThere is no OAuth app to register and no plugin required: an application password from your own profile screen is the whole setup.\n\nIt defaults to drafts. Publishing is the one thing here that cannot be taken back, so it takes a deliberate confirmation.\n\nIt also reads the meta fields WordPress hides from its own REST API, which is where Elementor layouts and ACF values actually live.\n\nBuilt and maintained by [Navid Moazzez](https://navid.me?utm_source=github&utm_medium=referral&utm_campaign=wordpress-mcp-cli&utm_content=readme). Built on [Slipway](https://github.com/thenavidm/slipway), which turns one definition of each tool into the MCP server and the CLI.\n\n```\nYou: Which posts on my blog are missing a meta description?\n\nClaude: Checked the 40 published posts. Eleven have no meta description,\n        and these four get the most traffic:\n\n        • \"How I plan a launch\"        /how-i-plan-a-launch\n        • \"The tools I actually use\"   /tools-i-actually-use\n        • \"Pricing, honestly\"          /pricing-honestly\n        • \"What I got wrong in 2025\"   /what-i-got-wrong-in-2025\n\n        Three more are set to noindex, which looks unintentional:\n        two are 2,000-word guides and one is your services page.\n\n        Want me to draft descriptions for the four, or start with the\n        noindex on the services page?\n```\n\n## Two ways to use it\n\n### Command line\n\n`wordpress-cli` in your terminal, for scripting, cron, pipes, or just asking a\nquick question without opening anything:\n\n```bash\nwordpress-cli                                   # every command, one line each\nwordpress-cli wp-list-posts --status draft --per-page 5\nwordpress-cli wp-search \"pricing\"\nwordpress-cli wp-get-post --post-id 42 --select id,title.rendered\nwordpress-cli wp-create-post --title \"Launch notes\" --content \"Draft body.\"\nwordpress-cli wp-list-sites --json | jq -r '.sites[].name'\nwordpress-cli wp-create-post --title \"Live now\" --content \"…\" --status publish --confirm\nwordpress-cli <command> --help                  # what any command takes\n```\n\n`--confirm` is the shell spelling of the confirmation that publishing, permanent\ndeletion, replacing an Elementor layout and bulk edits require. `--json` gives\nJSON, `--compact` puts it on one line, `--select` keeps only the fields you name,\nand errors are JSON on stderr whichever you pick.\n\n`--agent` is compact JSON with no prompts, and it never confirms a write.\n\nExit codes, so a script can branch without reading prose: `0` ok, `1` an\nunexpected error, `2` bad arguments or a hidden or refused write, `3` not found,\n`4` auth, `5` the site failed, `7` rate limited, `10` nothing configured, or the\nhelper plugin or Rank Math missing.\n\n### MCP server, for your AI app\n\n`wordpress-mcp` is what Claude Code, Claude Desktop, Cursor and the rest launch.\nYou never run it by hand:\n\n```bash\nclaude mcp add wordpress \\\n  -e WORDPRESS_SITE_URL=https://example.com \\\n  -e WORDPRESS_USERNAME=your-wp-username \\\n  -e \"WORDPRESS_APP_PASSWORD=xxxx xxxx xxxx xxxx xxxx xxxx\" \\\n  -- npx -y @thenavidm/wordpress-mcp-cli@latest\n```\n\nThen just ask: _\"which of my published posts have no meta description?\"_\n\nEach publish waits for your approval in the client, as\n[section 8](#8-writing-safely-) explains.\n\nEvery other client is in [section 4](#4-connect-your-client-).\n\n### Which one\n\n| Where you are | What you can reach |\n|---|---|\n| An agent that can run shell commands, like Claude Code or Cursor | Both. The CLI is the cheaper one: it costs nothing until you type it |\n| claude.ai, the Claude Desktop chat tab, or a phone | The server only. There is no shell to run a command in |\n| A terminal, a script, cron or CI | The CLI only. There is no MCP client in a shell |\n\nThey are the same program reading the same tool definitions, so anything one can\ndo, the other can.\n\n## Features\n\nEvery tool is both a command and an MCP tool, with the same name. The command\nis the tool name with dashes.\n\n| Capability | CLI command | MCP tool |\n|---|---|---|\n| See which sites and which user | `wordpress-cli wp-list-sites` / `wp-get-me` / `wp-get-settings` | `wp_list_sites` / `wp_get_me` / `wp_get_settings` |\n| Find anything | `wordpress-cli wp-search` | `wp_search` |\n| Posts and pages | `wordpress-cli wp-list-posts` / `wp-create-post` / `wp-update-post` / `wp-list-pages` | `wp_list_posts` / `wp_create_post` / `wp_update_post` / `wp_list_pages` |\n| Custom post types | `wordpress-cli wp-list-post-types` / `wp-list-custom` / `wp-create-custom` | `wp_list_post_types` / `wp_list_custom` / `wp_create_custom` |\n| Media | `wordpress-cli wp-list-media` / `wp-upload-media` | `wp_list_media` / `wp_upload_media` |\n| Categories, tags and taxonomies | `wordpress-cli wp-list-categories` / `wp-create-category` / `wp-list-taxonomy-terms` | `wp_list_categories` / `wp_create_category` / `wp_list_taxonomy_terms` |\n| Users and comments | `wordpress-cli wp-list-users` / `wp-list-comments` | `wp_list_users` / `wp_list_comments` |\n| Hidden meta and Elementor, with the helper plugin | `wordpress-cli wp-get-all-meta` / `wp-get-elementor` / `wp-update-elementor` | `wp_get_all_meta` / `wp_get_elementor` / `wp_update_elementor` |\n| Rank Math SEO and redirects, with the helper plugin | `wordpress-cli wp-get-rankmath` / `wp-update-rankmath` / `wp-list-redirects` | `wp_get_rankmath` / `wp_update_rankmath` / `wp_list_redirects` |\n| Bulk edits, with the helper plugin | `wordpress-cli wp-bulk-update` / `wp-bulk-delete` | `wp_bulk_update` / `wp_bulk_delete` |\n| Check your setup | `wordpress-cli doctor` | not a tool |\n\nAll 42 are in [section 7](#7-tools-%EF%B8%8F).\n\n## Contents\n\n| # | Section | What is in it |\n|---|---|---|\n| 1 | [What you can ask it](#1-what-you-can-ask-it-) | Real prompts, not features |\n| 2 | [Quick install](#2-quick-install-) | The package, no account needed |\n| 3 | [Set up your account](#3-set-up-your-account-) | Every click |\n| 4 | [Connect your client](#4-connect-your-client-) | Claude Code, Desktop, Cursor |\n| 5 | [Check it worked](#5-check-it-worked-) | `doctor` |\n| 6 | [Which surface, and what each costs](#6-which-surface-and-what-each-costs-) | Measured in Claude Code, and how to spend less |\n| 7 | [Tools](#7-tools-%EF%B8%8F) | All 42, by what they reach |\n| 8 | [Writing safely](#8-writing-safely-) | What is guarded and what is not |\n| 9 | [Notes and gotchas](#9-notes-and-gotchas-%EF%B8%8F) | WordPress's real behavior |\n| 10 | [Troubleshooting](#10-troubleshooting-) | Symptom to cause |\n| 11 | [FAQ](#11-faq-) | Including what an MCP server is |\n\n---\n\n## 1. What you can ask it 💬\n\n- \"Draft a post about the launch, file it under Marketing, and leave it as a draft.\"\n- \"Which posts are missing a meta description?\"\n- \"Find every page that mentions the old pricing and show me where.\"\n- \"Duplicate the services page so I can rewrite it without touching the live one.\"\n- \"What custom post types does this site have, and how many items are in each?\"\n- \"Redirect the old blog URL to the new one, permanently.\"\n- \"Upload this image, set the alt text, and make it the featured image on post 412.\"\n- \"List everything sitting in the moderation queue.\"\n- \"Which of my pages are set to noindex?\"\n- \"Move all twelve of last year's event posts to draft.\"\n\nThe thing that is genuinely impossible without this: **reading and writing the meta fields WordPress hides.** Core refuses to expose any meta key beginning with an underscore, at any privilege level. That is where Elementor stores an entire page layout, where ACF stores its field values, and where Rank Math stores its SEO settings. Without the helper plugin included here, none of it is reachable over the API, so an agent looking at an Elementor page sees an empty post and concludes the page is blank.\n\n---\n\n## 2. Quick install ⚡\n\nNode 22 or newer. Nothing else.\n\n    npx -y @thenavidm/wordpress-mcp-cli --version\n\nThat is the whole install. `npx` fetches it on demand, so there is nothing to update later.\n\n---\n\n## 3. Set up your account 🔑\n\nThe long version, every step with what to do when one fails, is in [INSTALL.md](INSTALL.md).\n\nYou need an **application password**. It is not your login password. WordPress has generated these since version 5.6, they are revocable one at a time, and they carry the role of the user they belong to.\n\nYour site has to be served over HTTPS. WordPress disables application passwords over plain HTTP.\n\n### Have an agent do it\n\nThe agent cannot sign in to WordPress for you. Only you can create the credential. What it can do is walk you through it, wire up the config, and verify the connection.\n\nPaste this into Claude Code, Cursor, or any agent with terminal access:\n\n    Help me connect my WordPress site to the wordpress-mcp server.\n\n    1. Tell me to open my site's wp-admin and go to Users, then Profile.\n    2. Tell me to scroll to the \"Application Passwords\" section, enter a\n       descriptive name such as \"Claude MCP\", and create one.\n    3. Stop and wait. I will paste the generated password back to you.\n       Do not continue until I do.\n    4. Ask me for my site URL and my WordPress username.\n    5. Add the server to my MCP client config with those three values.\n    6. Run `npx -y @thenavidm/wordpress-mcp-cli doctor` and tell me what it says.\n\n### Or do it yourself\n\n1. Sign in to your site's `wp-admin` as the user you want the agent to act as.\n2. Go to **Users**, then **Profile**. To set one up for a different user, go to **Users**, then **All Users**, and edit that user instead.\n3. Scroll to the **Application Passwords** section.\n4. Enter a descriptive name, something like `Claude MCP`, and create the password.\n5. Copy what WordPress shows you. It is displayed once and never again.\n\nWordPress shows the password in space-separated groups. It works with the spaces or without them, so paste whichever you have.\n\n### Which user to use\n\nThe application password carries that user's role exactly. An Author account can only reach its own posts, however the request is phrased.\n\n| Role | What the agent can do |\n|---|---|\n| Administrator | Everything, including site settings and permanent deletion |\n| Editor | Everything to content: publish, edit anyone's posts, upload media |\n| Author | Its own posts only |\n\nEditor is enough for almost all of this. Give the agent its own WordPress user rather than reusing your login, and you can revoke it without disturbing anything else.\n\n### The helper plugin\n\nThirty of the 42 tools work with nothing installed. The other twelve, covering Elementor, Rank Math, redirects, protected meta and bulk edits, need the small plugin in [`plugin/`](./plugin).\n\nCopy `plugin/mcp-wordpress-helper.php` into `wp-content/mu-plugins/` on your site. Files there load automatically, so there is nothing to activate. It registers routes under `wordpress-mcp/v1`, and every route checks the same capabilities WordPress would check itself.\n\n### Revoking\n\nGo back to **Users**, then **Profile**, and revoke the password in the **Application Passwords** section. It stops working immediately, and your login password and every other integration are unaffected.\n\n---\n\n## 4. Connect your client 🔌\n\n### Claude Code\n\n```bash\nclaude mcp add wordpress \\\n  -e WORDPRESS_SITE_URL=https://example.com \\\n  -e WORDPRESS_USERNAME=your-wp-username \\\n  -e \"WORDPRESS_APP_PASSWORD=xxxx xxxx xxxx xxxx xxxx xxxx\" \\\n  -- npx -y @thenavidm/wordpress-mcp-cli@latest\n```\n\n`--scope user` makes it available in every project rather than just the current one.\n\n### Claude Desktop\n\n| Platform | Path |\n|---|---|\n| macOS | `~/Library/Application Support/Claude/claude_desktop_config.json` |\n| Windows | `%APPDATA%\\Claude\\claude_desktop_config.json` |\n\n```json\n{\n  \"mcpServers\": {\n    \"wordpress\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@thenavidm/wordpress-mcp-cli@latest\"],\n      \"env\": {\n        \"WORDPRESS_SITE_URL\": \"https://example.com\",\n        \"WORDPRESS_USERNAME\": \"your-wp-username\",\n        \"WORDPRESS_APP_PASSWORD\": \"xxxx xxxx xxxx xxxx xxxx xxxx\"\n      }\n    }\n  }\n}\n```\n\nQuit Claude Desktop completely and reopen it.\n\nOr skip the JSON: download `wordpress-<version>.mcpb` from the\n[latest release](https://github.com/thenavidm/wordpress-mcp-cli/releases/latest)\nand open it. Claude Desktop asks for the site address, the username and the\napplication password, and carries its own copy of everything it needs.\n\n> [!TIP]\n> Claude Desktop does not inherit your shell PATH, so a bare command name fails\n> silently. Use the absolute path from `which npx`, and fully quit the app\n> rather than closing the window.\n\n### claude.ai on the web\n\nclaude.ai runs connectors from Anthropic's cloud, so it cannot launch a local command. It needs a public HTTPS URL.\n\n```bash\nnpx -y @thenavidm/wordpress-mcp-cli@latest --http --port=8790\n```\n\nEither spelling works: `--port=8790` or `--port 8790`. `WORDPRESS_HTTP_PORT`\nworks too, and the flag wins over the variable.\n\nHost it somewhere with a public HTTPS URL, then in claude.ai: **Customize**, then **Connectors**, then **+**, then **Add custom connector**. Paste the URL and click **Add**.\n\n> [!WARNING]\n> Anything that can reach that port can publish to and permanently delete from\n> your site without ever seeing the password. Set `WORDPRESS_HTTP_TOKEN` to a\n> long random string; the server refuses to bind anything but loopback without\n> one. A page from another site is refused unless `WORDPRESS_HTTP_ALLOWED_ORIGINS`\n> lists it.\n\n### Cursor\n\n`.cursor/mcp.json`, same JSON shape as Claude Desktop, key `mcpServers`.\n\n### Windsurf\n\n`~/.codeium/windsurf/mcp_config.json`, key `mcpServers`.\n\n### VS Code\n\n`.vscode/mcp.json`. The key is **`servers`**, not `mcpServers`, and each entry takes `\"type\": \"stdio\"`.\n\n### Codex CLI\n\n`~/.codex/config.toml`:\n\n```toml\n[mcp_servers.wordpress]\ncommand = \"npx\"\nargs = [\"-y\", \"@thenavidm/wordpress-mcp-cli@latest\"]\n\n[mcp_servers.wordpress.env]\nWORDPRESS_SITE_URL = \"https://example.com\"\nWORDPRESS_USERNAME = \"your-wp-username\"\nWORDPRESS_APP_PASSWORD = \"xxxx xxxx xxxx xxxx xxxx xxxx\"\n```\n\n### Gemini CLI\n\n`~/.gemini/settings.json`, key `mcpServers`.\n\n### Everything else\n\nAny stdio MCP client takes the same three things: the command `npx`, the args, and the env block.\n\nOr let the CLI write the entry, in each client's own format:\n\n```bash\nnpx -y -p @thenavidm/wordpress-mcp-cli wordpress-cli install claude-code\n```\n\nIt takes `claude-code`, `codex`, `claude-desktop`, `cursor`, `vscode` or `gemini`, and `--dry-run` shows the change first.\n\n### More than one site\n\nSet `WORDPRESS_SITES` to a JSON array instead of the single-site variables, and every tool takes an optional `site`:\n\n```json\n{\n  \"env\": {\n    \"WORDPRESS_SITES\": \"[{\\\"name\\\":\\\"blog\\\",\\\"url\\\":\\\"https://example.com\\\",\\\"username\\\":\\\"you\\\",\\\"app_password\\\":\\\"xxxx xxxx xxxx xxxx xxxx xxxx\\\"},{\\\"name\\\":\\\"shop\\\",\\\"url\\\":\\\"https://shop.example.com\\\",\\\"username\\\":\\\"you\\\",\\\"app_password\\\":\\\"yyyy yyyy yyyy yyyy yyyy yyyy\\\"}]\",\n    \"WORDPRESS_DEFAULT_SITE\": \"blog\"\n  }\n}\n```\n\nWithout `WORDPRESS_DEFAULT_SITE`, a call that does not name a site is refused rather than guessed at.\n\n---\n\n## 5. Check it worked 🩺\n\n    npx -y @thenavidm/wordpress-mcp-cli doctor\n\nIt walks the chain in order and stops at the first thing actually broken: HTTPS, then the shape of the password, then authentication, then the user's role, then whether the helper plugin is installed.\n\nThe two that come up most:\n\n- **\"12 characters ignoring spaces, where WordPress generates 24.\"** That is a login password. Application passwords are 24 characters and are generated in the **Application Passwords** section of the profile screen.\n- **\"this user cannot publish posts.\"** The credential is fine and the role is too low. Use an Editor or Administrator account.\n\n---\n\n## 6. Which surface, and what each costs 💸\n\nBoth surfaces are the same program with the same 42 tools. The\ndifference is when the model pays for them. Measured in Claude Code:\n\n| Cost | MCP server | CLI |\n|---|---|---|\n| Every message, with every tool loaded | 21,400 tokens | nothing |\n| Every message, Claude Code's default | 1,300 tokens | nothing |\n| When WordPress comes up | nothing more, or the tools it picks | 4,000 tokens for `SKILL.md`, once |\n| 20 messages with WordPress in 1, every tool loaded | 428,000 tokens | 4,000 tokens |\n\nClaude Code's [tool search](https://code.claude.com/docs/en/mcp#scale-with-mcp-tool-search)\nis on by default: it sends only the tool names and the server instructions,\nand loads a tool's full definition when the model reaches for it. An app that\nloads every tool up front pays the first line on every message, whether\nWordPress comes up or not. With the skill added, Claude Code also lists its\none-line description, about 150 tokens.\n\nWhere the tokens go, with every tool loaded:\n\n| Part of the tool list | Share |\n|---|---|\n| Structure: names, types, required lists, nesting, annotations | 49% |\n| Argument descriptions | 32% |\n| Tool descriptions | 19% |\n\nTo spend less, turn the server off when you are not using it, which in Claude\nCode is the `/mcp` panel. `WORDPRESS_READ_ONLY=1` takes the 20 write tools off the list, leaving 22,\nand on a site without the helper plugin `WORDPRESS_TOOLSETS=core` leaves out the twelve that need it.\nOr install the CLI and add the server on the days it earns its place.\n\nMeasured on 2026-10-05 with Claude Code 2.1.286 on Claude Opus 5.5: one\nshort prompt with and without the server connected, once with\n`ENABLE_TOOL_SEARCH=false` and once with the default, the difference read\nfrom the API's own usage figures. `SKILL.md` was measured the same way. Other\napps and models count tokens a little differently.\n\nAgainst 1.1.3, measured the same day: every tool loaded costs 21,418 tokens\ninstead of 23,263, tool search the same within 2 tokens (1,330 against 1,328,\none of them for American spelling in the server instructions), and `SKILL.md`\n82 more, because it now says how approval works over MCP and lists every exit\ncode. In Codex 0.159.3 on gpt-6.1-sol, the same task, \"find the command that\nsets a post's Rank Math SEO title and meta description, and the flags it\nrequires\", read a median of 83,568 input tokens on 2.0.0 against 84,368 on\n1.1.3 over the CLI, five runs each: Codex now asks `which` instead of reading\nthe full command list. Over MCP, Codex prints the tool list with a script and\ncuts the printout to about 10,000 tokens, so it read about 9,600 on both\nversions, out of a full listing of 40,174 tokens on 2.0.0 against 40,531. The\ninput totals, a median of 48,498 against 48,386, also carry the model's\nreasoning into its second request, which three of the five 2.0.0 runs did and\nnone of the 1.1.3 runs; the two 2.0.0 runs that did not read 48,419 and 48,392.\n\n## 7. Tools 🛠️\n\nThirty need nothing installed. The twelve marked 🔌 need the [helper plugin](./plugin), and `wordpress-cli` lists them under their own heading. On a site without it, `WORDPRESS_TOOLSETS=core` leaves them off the list.\n\n**Sites and identity**\n\n| Tool | What it does |\n|---|---|\n| `wp_list_sites` | Every configured site, its short name, and whether the plugin is there |\n| `wp_get_me` | The user the password belongs to, and its capabilities |\n| `wp_get_settings` | Title, tagline, timezone, date formats, default category |\n\n**Finding things**\n\n| Tool | What it does |\n|---|---|\n| `wp_search` | One search across every searchable post type and term |\n\n**Posts**\n\n| Tool | What it does |\n|---|---|\n| `wp_list_posts` | Filter by status, search, category, tag, author, date range |\n| `wp_get_post` | One post, raw rather than rendered |\n| `wp_create_post` | Create, draft by default |\n| `wp_update_post` | Change only the fields passed |\n| `wp_delete_post` | Trash, or permanently delete with `force` |\n| 🔌 `wp_duplicate_post` | Copy a post with all its meta, as a draft |\n\n**Pages**\n\n| Tool | What it does |\n|---|---|\n| `wp_list_pages` | Filter by status, search, parent, slug |\n| `wp_create_page` | Create, with optional parent for nesting |\n| `wp_update_page` | Change only the fields passed |\n\n**Custom post types**\n\n| Tool | What it does |\n|---|---|\n| `wp_list_post_types` | Every registered type and its REST base |\n| `wp_list_custom` | List items of any type |\n| `wp_get_custom` | One item |\n| `wp_create_custom` | Create an item |\n| `wp_update_custom` | Update an item |\n| `wp_delete_custom` | Trash or delete an item |\n\n**Media**\n\n| Tool | What it does |\n|---|---|\n| `wp_list_media` | Filter by search, MIME type, or attached post |\n| `wp_get_media` | One attachment, with every generated size |\n| `wp_upload_media` | Upload from a URL, then set title, alt text and caption |\n| `wp_delete_media` | Delete an attachment and its generated sizes |\n\n**Categories, tags and taxonomies**\n\n| Tool | What it does |\n|---|---|\n| `wp_list_categories` | With IDs and post counts |\n| `wp_create_category` | Create one and return its ID |\n| `wp_list_tags` | With IDs and post counts |\n| `wp_create_tag` | Create one and return its ID |\n| `wp_list_taxonomies` | Every taxonomy and its REST base |\n| `wp_list_taxonomy_terms` | Terms in any taxonomy |\n\n**People**\n\n| Tool | What it does |\n|---|---|\n| `wp_list_users` | Users, with roles where visible |\n| `wp_list_comments` | Comments, including the moderation queue |\n\n**The fields core hides**\n\n| Tool | What it does |\n|---|---|\n| 🔌 `wp_get_all_meta` | Every meta field, including underscore-prefixed |\n| 🔌 `wp_update_meta` | Write meta fields, including protected keys |\n| 🔌 `wp_get_elementor` | The Elementor widget tree for a page |\n| 🔌 `wp_update_elementor` | Replace the Elementor widget tree |\n\n**SEO**\n\n| Tool | What it does |\n|---|---|\n| 🔌 `wp_get_rankmath` | Every Rank Math field set on a post |\n| 🔌 `wp_update_rankmath` | Titles, descriptions, robots, canonical, OG, Twitter |\n| 🔌 `wp_list_redirects` | Redirects with sources, destinations and codes |\n| 🔌 `wp_create_redirect` | 301, 302, 307, 410 or 451 |\n| 🔌 `wp_delete_redirect` | Remove a redirect |\n\n**Bulk**\n\n| Tool | What it does |\n|---|---|\n| 🔌 `wp_bulk_update` | Same change across a list of posts |\n| 🔌 `wp_bulk_delete` | Trash or delete a list of posts |\n\n---\n\n## 8. Writing safely 🛟\n\nWrites work by default. Publishing is the point of the tool.\n\nFour things wait for your approval, because they are the ones WordPress cannot undo: **publishing or scheduling**, which reaches feeds and mailing lists within minutes; **permanent deletion**, meaning `force: true`; **replacing an Elementor layout**, which overwrites the whole page in one field; and **anything bulk**, where a wrong list is a wrong set of pages.\n\nOver MCP a person approves each of them where the client can ask: Claude Code (2.1.246 and later) shows its own prompt, and a client that can show forms asks with an approval form whose one box starts unticked. Each approval is signed, bound to that exact call and works once. Where a client can do neither, the model's `confirm: true` counts, and it should pass it only when you asked for that exact action. `WORDPRESS_CONFIRM=model` makes `confirm: true` enough everywhere, for an agent with no person to ask. In a terminal it is `--confirm`, which `--agent` never adds.\n\nTrashing, drafting and ordinary edits are not guarded. Each is one click to undo in wp-admin, and approving everything would train the reflex the approval exists to prevent.\n\n`WORDPRESS_READ_ONLY=1` removes all 20 write tools from the list. `WORDPRESS_ALLOW_DESTRUCTIVE=0` keeps ordinary writes and refuses publishing and permanent deletion. `WORDPRESS_AUDIT_LOG=<path>` records every attempted write, allowed and blocked alike, and who approved it.\n\n### Every environment variable\n\n**Credentials.** Both surfaces read the same ones, so a shell that can run\n`wordpress-cli` needs nothing beyond what the MCP server already has.\n\n| Variable | Default | What it does |\n|---|---|---|\n| `WORDPRESS_SITES` | none | JSON array of sites, for several at once. Takes priority over the single-site variables below. |\n| `WORDPRESS_SITE_URL` | none | The site, for the single-site case, e.g. `https://example.com`. |\n| `WORDPRESS_USERNAME` | none | The WordPress login name the application password belongs to. |\n| `WORDPRESS_APP_PASSWORD` | none | From Users > Profile > Application Passwords. Not the login password. |\n| `WORDPRESS_SITE_NAME` | the hostname | The short label for that single site. |\n| `WORDPRESS_DEFAULT_SITE` | none | Which site acts when a call names none. Without it, a call that names none is refused rather than guessed at. |\n\n**Safety.** They apply identically to both surfaces, because both go through\nSlipway's one guard.\n\n| Variable | Default | What it does |\n|---|---|---|\n| `WORDPRESS_READ_ONLY` | off | `1` removes all 20 write tools from the list, rather than refusing them at call time. |\n| `WORDPRESS_ALLOW_DESTRUCTIVE` | on | `0` keeps ordinary writes and blocks publishing and permanent deletion. |\n| `WORDPRESS_AUDIT_LOG` | none | Path to an append-only log of every attempted write, allowed and blocked alike, and who approved it. |\n| `WORDPRESS_CONFIRM` | `human` | `model` lets `confirm: true` alone approve over MCP, for an agent with no person to ask. |\n| `WORDPRESS_TOOLSETS` | `all` | `core` leaves out the twelve tools that need the helper plugin. |\n\n**Tuning.**\n\n| Variable | Default | What it does |\n|---|---|---|\n| `WORDPRESS_REQUEST_TIMEOUT_MS` | `30000` | Per-request deadline. |\n| `WORDPRESS_MAX_RETRIES` | `2` | Retries on rate limits and 5xx. Reads only, never writes: a retried POST on a flaky connection is how a post gets published twice. |\n| `WORDPRESS_USER_AGENT` | `wordpress-mcp` | Override the User-Agent sent to the site. Some hosts filter on it. |\n| `WORDPRESS_HTTP_PORT` | `8790` | Port for `--http`. |\n| `WORDPRESS_HTTP_HOST` | `127.0.0.1` | Interface for `--http`. |\n| `WORDPRESS_HTTP_TOKEN` | none | Bearer token required by the HTTP transport. Without it, `--http` refuses to bind anything but loopback. |\n| `WORDPRESS_HTTP_ALLOWED_ORIGINS` | none | Comma-separated browser origins allowed to connect; a page from any other site is refused. |\n| `WORDPRESS_SURFACE` | `full` | `search` lists three tools that find, describe and run the rest. |\n| `WORDPRESS_TOOL_TIMEOUT_MS` | none | Give up on any tool after this long. |\n| `WORDPRESS_DEBUG` | `0` | `1` prints debug lines on stderr. |\n\n---\n\n## 9. Notes and gotchas ⚠️\n\n- **Publishing is the only irreversible act on a WordPress site.** Feeds, mailing list plugins and social auto-posters read a published post within minutes. Setting the status back to draft removes the page and recalls nothing.\n- **An Elementor page ignores its own post content.** The layout is a single serialized JSON tree in `_elementor_data`. Editing such a page with `wp_update_page` writes a field nothing renders, and creating one leaves a page that opens blank in the builder. Duplicate an existing page instead.\n- **WordPress hides most meta from its own REST API.** Any key beginning with an underscore is refused outright, and any key not registered with `show_in_rest` is ignored. The `meta` argument on the post tools reaches a small subset; `wp_get_all_meta` reaches the rest.\n- **Posts take IDs, never names.** There is no endpoint that accepts a category called \"Marketing\". Look it up first.\n- **Custom post types are addressed by REST base**, which often differs from the label in wp-admin and sometimes from the slug. A type registered without `show_in_rest` cannot be reached over the API at all, however it is addressed.\n- **List endpoints return counts in headers, not the body.** These tools fold `X-WP-Total` and `X-WP-TotalPages` in, so ten results out of four hundred say so instead of reading as the whole set.\n- **Dates are interpreted in the site's timezone**, not yours. `wp_get_settings` reports it. Getting this wrong schedules a post hours from where it was meant.\n- **Application passwords need HTTPS.** WordPress disables them over plain HTTP, and the resulting 401 says nothing about why.\n- **A security plugin in front of the REST API answers with HTML.** The error will say so rather than reporting a JSON parse failure, but the fix is in that plugin's settings, not here.\n- **Redirects are not meta.** Rank Math keeps them in its own database table, which is why listing them needs the helper plugin rather than a clever query.\n\n---\n\n## 10. Troubleshooting 🔧\n\nRun `npx -y @thenavidm/wordpress-mcp-cli doctor` first. It names the first broken thing rather than the last.\n\n| Symptom | Cause |\n|---|---|\n| `incorrect_password` on every call | A login password was used instead of an application password, or the site is on plain HTTP |\n| `rest_cannot_edit` on some posts, not others | The user is an Author, which reaches only its own posts. Use Editor or Administrator |\n| `rest_no_route` | The REST API is disabled or restricted by a security plugin, or the post type lacks `show_in_rest` |\n| \"needs the WordPress MCP Helper plugin\" | One of the twelve 🔌 tools was called on a site without the plugin in `mu-plugins/`. It exits 10 |\n| \"returned HTML rather than a REST response\" | A firewall, security plugin or maintenance page answered instead of WordPress |\n| \"will not run without --confirm\" | Working as intended. The call publishes, deletes permanently, replaces a layout, or is bulk. See [section 8](#8-writing-safely-) |\n| `claude -p` will not publish | Headless Claude Code refuses tools that need a person. Give that agent `WORDPRESS_CONFIRM=model` |\n| No approval form appears | The client cannot show forms, so the model's `confirm: true` counts, and only for an action you asked for |\n| A piped request gets no answer | Stdin closed before the answer. The MCP stdio binding stops a server when its input ends; keep stdin open until you read the answer, or use the CLI |\n| Edits to an Elementor page do nothing | The layout is in meta, not post content. Use `wp_get_elementor` and `wp_update_elementor` |\n| \"did not say which one to use\" | Several sites are configured. Pass `site`, or set `WORDPRESS_DEFAULT_SITE` |\n| A post scheduled at the wrong hour | Dates use the site's timezone. Check `wp_get_settings` |\n\n---\n\n## 11. FAQ ❓\n\n<details>\n<summary><b>What is an MCP server?</b></summary>\n\nAn MCP server is a standard way to give an AI assistant real access to a tool,\nso it can act rather than guess. You install it once, your assistant gains the\ntools, and it works in Claude, Cursor, ChatGPT and anything else speaking MCP.\n\n</details>\n\n<details>\n<summary><b>What is the CLI?</b></summary>\n\n`wordpress-cli` is the same program as the MCP server, run as commands. AI agents that run commands, like Claude Code, Codex and OpenCode, use it on their own, and you can type the same commands in a terminal, a script or a cron job. Every tool is a command with dashes, so `wp_list_sites` runs as `wordpress-cli wp-list-sites`.\n\n</details>\n\n<details>\n<summary><b>Should I use the MCP server or the CLI?</b></summary>\n\nUse the MCP server in an app with no terminal, like Claude Desktop's chat. Use the CLI anywhere commands run: an agent like Claude Code, Codex or OpenCode, a script or a cron job. The MCP server's tools take up context on every message, and the CLI costs nothing until it runs.\n\n</details>\n\n<details>\n<summary><b>What is WordPress?</b></summary>\n\nWordPress is the content management system behind a large share of the web. It\nruns on your own server, stores your content in your own database, and exposes\na REST API at `/wp-json/` that this server talks to.\n\n</details>\n\n<details>\n<summary><b>Do I need to be technical?</b></summary>\n\nYou need to be able to open your site's admin screen and copy a password. The\nagent prompt in section 3 handles the rest, including editing the config file.\nInstalling the optional helper plugin means copying one file into a folder on\nyour site, which is a file manager or FTP job rather than a coding one.\n\n</details>\n\n<details>\n<summary><b>Is my data sent anywhere?</b></summary>\n\nYour credentials go to your own WordPress site and nowhere else. The server runs\non your machine, talks directly to your site's REST API, and has no backend of\nits own. Content you ask about reaches whichever AI assistant you are using,\nexactly as if you had pasted it into the chat.\n\n</details>\n\n<details>\n<summary><b>What can it do that wp-admin cannot?</b></summary>\n\nIt can read and write the meta fields WordPress hides from its own REST API,\nwhich is where Elementor layouts and ACF values live, and it can work across\nseveral sites in one conversation. Everything else it does, you could do by\nhand. The difference is that it does it in one sentence rather than forty\nclicks.\n\n</details>\n\n<details>\n<summary><b>Can it publish something by accident?</b></summary>\n\nIt cannot publish without being told to twice. Creating a post defaults to\ndraft, and setting the status to publish or future waits for your approval:\nClaude Code shows its own prompt, a client that can show forms asks with one,\nand elsewhere the model has to pass `confirm: true` deliberately after reading a\ndescription explaining why. Setting `WORDPRESS_ALLOW_DESTRUCTIVE=0` removes the\npossibility entirely while leaving drafts working.\n\n</details>\n\n<details>\n<summary><b>Can it delete something by accident?</b></summary>\n\nIt can trash a post without confirmation, and trash restores in one click from\nwp-admin. Permanent deletion, meaning `force: true`, waits for your approval. Media is the exception worth knowing: WordPress does not trash\nattachments, so deleting one is immediate and permanent, and that tool always\nconfirms.\n\n</details>\n\n<details>\n<summary><b>Does it cost anything?</b></summary>\n\nIt costs nothing. It is MIT licensed, it uses the REST API already built into\nyour WordPress site, and there is no account, no API key and no service in the\nmiddle.\n\n</details>\n\n<details>\n<summary><b>Does it work with ChatGPT and Cursor?</b></summary>\n\nIt works with any client that speaks MCP, which includes Cursor, Windsurf,\nVS Code, Codex CLI and Gemini CLI. Section 4 has the config for each. For\nclaude.ai on the web you need the HTTP transport and somewhere to host it,\nbecause the web app cannot launch a program on your machine.\n\n</details>\n\n<details>\n<summary><b>Can I connect more than one site?</b></summary>\n\nYou can connect as many as you like through `WORDPRESS_SITES`, and every tool\ntakes an optional `site` naming which one to act on. When several are configured\nand no default is set, a call that does not name one is refused rather than\nguessed at, because publishing to a client's site instead of your own is not a\nmistake worth risking to save a word.\n\n</details>\n\n<details>\n<summary><b>What happens when the password expires?</b></summary>\n\nApplication passwords do not expire. They last until you revoke them, which you\ndo individually in the **Application Passwords** section of your profile screen.\nRevoking one stops that integration and leaves your login password and every\nother integration untouched.\n\n</details>\n\n<details>\n<summary><b>How do I disconnect it?</b></summary>\n\nRevoke the application password in wp-admin, and remove the server from your\nclient's config. Nothing is left behind on your site except the helper plugin,\nif you installed it, which you can delete from `mu-plugins/` at any time. The\ntools that depend on it stop working; the other thirty carry on.\n\n</details>\n\n---\n\n## Questions\n\nRun into a problem or have a question? [Open an issue](https://github.com/thenavidm/wordpress-mcp-cli/issues) and I will help.\n\n## About the author\n\nNavid Moazzez is a leading AI business strategist, and the host of the AI Creator Summit, watched by 100,000+ creators. He helps creators and founders master AI and build their own AI Operating System (AI OS) to automate their business and life. He creates useful free tools, MCP servers and CLIs that creators and founders can use in their own workflows.\n\n**Links**\n\n- Personal website: [navid.me](https://navid.me)\n- Link in bio: [navid.bio](https://navid.bio)\n- Navid Media: [navid.media](https://navid.media)\n- YouTube: [@thenavidm](https://youtube.com/@thenavidm?sub_confirmation=1) and [@thenavidai](https://youtube.com/@thenavidai?sub_confirmation=1)\n- X: [@thenavidm](https://x.com/thenavidm)\n- Instagram: [@thenavidm](https://instagram.com/thenavidm)\n- LinkedIn: [thenavidm](https://linkedin.com/in/thenavidm)\n\nIf this is useful, star the repo and come say hi on [X](https://x.com/thenavidm).\n\n## Dependencies\n\n| Library | License | What it does |\n|---|---|---|\n| [Slipway](https://github.com/thenavidm/slipway) | Apache-2.0 | The MCP server and the CLI from one definition of each tool, with the write guard |\n| [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk) | Apache-2.0 | The MCP protocol, stdio and streamable HTTP transports, through Slipway |\n| [zod](https://github.com/colinhacks/zod) | MIT | Validates every tool argument before it reaches WordPress |\n\n## License\n\n[MIT](./LICENSE). Free to use, modify, and share.\n\nThe helper plugin in [`plugin/`](./plugin) is [GPL-2.0-or-later](./plugin/LICENSE), as WordPress plugins are.\n\nNot affiliated with, endorsed by, or sponsored by the WordPress Foundation, Elementor Ltd, or Rank Math. WordPress, Elementor and Rank Math are trademarks of their respective owners.\n\n---\n\n© 2026 [Navid Media](https://navid.media?utm_source=github&utm_medium=referral&utm_campaign=wordpress-mcp-cli&utm_content=readme). Made with ❤️ by [Navid Moazzez](https://navid.me?utm_source=github&utm_medium=referral&utm_campaign=wordpress-mcp-cli&utm_content=readme).\n","readmeFilename":"README.md"}