@adsim/wordpress-mcp-server 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -e
3
+ cd "$(dirname "$0")/.."
4
+ npm install --omit=dev --ignore-scripts
5
+ cd dxt
6
+ npx @anthropic-ai/mcpb pack . --output ../wordpress-mcp-server.mcpb
7
+ echo "Bundle created: wordpress-mcp-server.mcpb"
@@ -0,0 +1,112 @@
1
+ {
2
+ "manifest_version": "0.3",
3
+ "name": "wordpress-mcp-server",
4
+ "display_name": "WordPress MCP Server",
5
+ "version": "3.0.0",
6
+ "description": "Manage your WordPress site from Claude Desktop — posts, pages, media, SEO, plugins, themes, revisions, and more. No WordPress plugin required.",
7
+ "long_description": "A full-featured MCP server for WordPress REST API integration. Manage posts, pages, media, categories, tags, comments, users, SEO metadata, plugins, themes, and revisions through 35 tools — all from Claude Desktop.\n\nNo WordPress plugin required. Uses the built-in WordPress REST API with Application Passwords for secure authentication.\n\nFeatures:\n- Content management: create, read, update, delete posts and pages\n- Media library: list, get details, upload from URL\n- Taxonomy: categories, tags, custom post types\n- SEO: auto-detects Yoast, RankMath, SEOPress, or All in One SEO\n- Plugins & themes: list, activate, deactivate\n- Revisions: list, view, restore, delete\n- Enterprise controls: read-only mode, draft-only, disable-delete\n- Multi-site: target multiple WordPress installations",
8
+ "author": {
9
+ "name": "AdSim",
10
+ "email": "georges@adsim.be",
11
+ "url": "https://adsim.be"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/adsimbe/wordpress-mcp-server.git"
16
+ },
17
+ "homepage": "https://github.com/adsimbe/wordpress-mcp-server#readme",
18
+ "support": "https://github.com/adsimbe/wordpress-mcp-server/issues",
19
+ "server": {
20
+ "type": "node",
21
+ "entry_point": "server/index.js",
22
+ "mcp_config": {
23
+ "command": "node",
24
+ "args": [
25
+ "${__dirname}/server/index.js"
26
+ ],
27
+ "env": {
28
+ "WP_API_URL": "${user_config.wp_api_url}",
29
+ "WP_API_USERNAME": "${user_config.wp_api_username}",
30
+ "WP_API_PASSWORD": "${user_config.wp_api_password}"
31
+ }
32
+ }
33
+ },
34
+ "tools": [
35
+ { "name": "wp_list_posts", "description": "List posts with filtering and search" },
36
+ { "name": "wp_get_post", "description": "Get post by ID with full content and meta" },
37
+ { "name": "wp_create_post", "description": "Create a post (default: draft)" },
38
+ { "name": "wp_update_post", "description": "Update a post" },
39
+ { "name": "wp_delete_post", "description": "Delete a post (trash or permanent)" },
40
+ { "name": "wp_search", "description": "Full-text search across all content" },
41
+ { "name": "wp_list_pages", "description": "List pages with hierarchy" },
42
+ { "name": "wp_get_page", "description": "Get page by ID with content and template" },
43
+ { "name": "wp_create_page", "description": "Create a page (default: draft)" },
44
+ { "name": "wp_update_page", "description": "Update a page" },
45
+ { "name": "wp_list_media", "description": "List media files" },
46
+ { "name": "wp_get_media", "description": "Get media details with all sizes" },
47
+ { "name": "wp_upload_media", "description": "Upload media from URL" },
48
+ { "name": "wp_list_categories", "description": "List categories with hierarchy and post count" },
49
+ { "name": "wp_list_tags", "description": "List tags with post count" },
50
+ { "name": "wp_create_taxonomy_term", "description": "Create a category or tag" },
51
+ { "name": "wp_list_comments", "description": "List comments with filters" },
52
+ { "name": "wp_create_comment", "description": "Create a comment or reply" },
53
+ { "name": "wp_list_post_types", "description": "Discover all registered post types (CPT)" },
54
+ { "name": "wp_list_custom_posts", "description": "List posts from any custom post type" },
55
+ { "name": "wp_list_users", "description": "List users with roles" },
56
+ { "name": "wp_set_target", "description": "Switch active WordPress site (multi-target mode)" },
57
+ { "name": "wp_site_info", "description": "Get site info, current user, post types, and enterprise controls" },
58
+ { "name": "wp_get_seo_meta", "description": "Get SEO metadata for a post or page" },
59
+ { "name": "wp_update_seo_meta", "description": "Update SEO metadata for a post or page" },
60
+ { "name": "wp_audit_seo", "description": "Audit SEO metadata across multiple posts/pages" },
61
+ { "name": "wp_list_plugins", "description": "List WordPress plugins with status filtering" },
62
+ { "name": "wp_activate_plugin", "description": "Activate a WordPress plugin" },
63
+ { "name": "wp_deactivate_plugin", "description": "Deactivate a WordPress plugin" },
64
+ { "name": "wp_list_themes", "description": "List installed WordPress themes" },
65
+ { "name": "wp_get_theme", "description": "Get details of a specific WordPress theme" },
66
+ { "name": "wp_list_revisions", "description": "List revisions of a post or page" },
67
+ { "name": "wp_get_revision", "description": "Get a specific revision with full content" },
68
+ { "name": "wp_restore_revision", "description": "Restore a post or page to a previous revision" },
69
+ { "name": "wp_delete_revision", "description": "Permanently delete a revision" }
70
+ ],
71
+ "keywords": [
72
+ "wordpress",
73
+ "cms",
74
+ "blog",
75
+ "posts",
76
+ "pages",
77
+ "media",
78
+ "seo",
79
+ "plugins",
80
+ "themes",
81
+ "rest-api"
82
+ ],
83
+ "license": "MIT",
84
+ "user_config": {
85
+ "wp_api_url": {
86
+ "type": "string",
87
+ "title": "WordPress Site URL",
88
+ "description": "Your WordPress site URL (e.g. https://yoursite.com)",
89
+ "required": true
90
+ },
91
+ "wp_api_username": {
92
+ "type": "string",
93
+ "title": "WordPress Username",
94
+ "description": "Your WordPress username",
95
+ "required": true
96
+ },
97
+ "wp_api_password": {
98
+ "type": "string",
99
+ "title": "WordPress Application Password",
100
+ "description": "Generate at WordPress Admin → Users → Profile → Application Passwords",
101
+ "sensitive": true,
102
+ "required": true
103
+ }
104
+ },
105
+ "compatibility": {
106
+ "claude_desktop": ">=0.10.0",
107
+ "platforms": ["darwin", "win32", "linux"],
108
+ "runtimes": {
109
+ "node": ">=18.0.0"
110
+ }
111
+ }
112
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adsim/wordpress-mcp-server",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "A Model Context Protocol (MCP) server for WordPress REST API integration. Manage posts, search content, and interact with your WordPress site through any MCP-compatible client.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -12,7 +12,8 @@
12
12
  "start": "node index.js",
13
13
  "test": "vitest run",
14
14
  "test:watch": "vitest",
15
- "test:coverage": "vitest run --coverage"
15
+ "test:coverage": "vitest run --coverage",
16
+ "build:mcpb": "bash dxt/build-mcpb.sh"
16
17
  },
17
18
  "keywords": [
18
19
  "mcp",
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Tests for DXT manifest.json validation.
3
+ *
4
+ * Ensures the manifest conforms to MCPB specification v0.3.
5
+ */
6
+
7
+ import { describe, it, expect } from 'vitest';
8
+ import { readFileSync } from 'node:fs';
9
+ import { resolve, dirname } from 'node:path';
10
+ import { fileURLToPath } from 'node:url';
11
+
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+ const manifestPath = resolve(__dirname, '../../../dxt/manifest.json');
14
+
15
+ let manifest;
16
+
17
+ describe('DXT manifest.json', () => {
18
+ it('is valid JSON', () => {
19
+ const raw = readFileSync(manifestPath, 'utf-8');
20
+ manifest = JSON.parse(raw);
21
+ expect(manifest).toBeDefined();
22
+ });
23
+
24
+ it('has required top-level fields', () => {
25
+ expect(manifest.manifest_version).toBe('0.3');
26
+ expect(typeof manifest.name).toBe('string');
27
+ expect(typeof manifest.version).toBe('string');
28
+ expect(typeof manifest.description).toBe('string');
29
+ expect(manifest.author).toBeDefined();
30
+ expect(typeof manifest.author.name).toBe('string');
31
+ expect(manifest.server).toBeDefined();
32
+ });
33
+
34
+ it('server.type is "node"', () => {
35
+ expect(manifest.server.type).toBe('node');
36
+ });
37
+
38
+ it('server.entry_point is set', () => {
39
+ expect(typeof manifest.server.entry_point).toBe('string');
40
+ expect(manifest.server.entry_point.length).toBeGreaterThan(0);
41
+ });
42
+
43
+ it('server.mcp_config.env maps WordPress credentials', () => {
44
+ const env = manifest.server.mcp_config.env;
45
+ expect(env.WP_API_URL).toBe('${user_config.wp_api_url}');
46
+ expect(env.WP_API_USERNAME).toBe('${user_config.wp_api_username}');
47
+ expect(env.WP_API_PASSWORD).toBe('${user_config.wp_api_password}');
48
+ });
49
+
50
+ it('user_config has wp_api_url, wp_api_username, wp_api_password', () => {
51
+ const cfg = manifest.user_config;
52
+ expect(cfg.wp_api_url).toBeDefined();
53
+ expect(cfg.wp_api_username).toBeDefined();
54
+ expect(cfg.wp_api_password).toBeDefined();
55
+ });
56
+
57
+ it('all user_config fields are required', () => {
58
+ expect(manifest.user_config.wp_api_url.required).toBe(true);
59
+ expect(manifest.user_config.wp_api_username.required).toBe(true);
60
+ expect(manifest.user_config.wp_api_password.required).toBe(true);
61
+ });
62
+
63
+ it('wp_api_password is marked as sensitive', () => {
64
+ expect(manifest.user_config.wp_api_password.sensitive).toBe(true);
65
+ });
66
+
67
+ it('declares at least 30 tools', () => {
68
+ expect(Array.isArray(manifest.tools)).toBe(true);
69
+ expect(manifest.tools.length).toBeGreaterThanOrEqual(30);
70
+ });
71
+
72
+ it('each tool has name and description', () => {
73
+ for (const tool of manifest.tools) {
74
+ expect(typeof tool.name).toBe('string');
75
+ expect(typeof tool.description).toBe('string');
76
+ }
77
+ });
78
+ });