mcp-wordpress 2.2.0 → 2.4.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.
Files changed (71) hide show
  1. package/README.md +503 -0
  2. package/dist/client/api.d.ts +90 -0
  3. package/dist/client/api.d.ts.map +1 -1
  4. package/dist/client/api.js +90 -0
  5. package/dist/client/api.js.map +1 -1
  6. package/dist/security/AISecurityScanner.d.ts +175 -0
  7. package/dist/security/AISecurityScanner.d.ts.map +1 -0
  8. package/dist/security/AISecurityScanner.js +645 -0
  9. package/dist/security/AISecurityScanner.js.map +1 -0
  10. package/dist/security/AutomatedRemediation.d.ts +145 -0
  11. package/dist/security/AutomatedRemediation.d.ts.map +1 -0
  12. package/dist/security/AutomatedRemediation.js +535 -0
  13. package/dist/security/AutomatedRemediation.js.map +1 -0
  14. package/dist/security/SecurityCIPipeline.d.ts +213 -0
  15. package/dist/security/SecurityCIPipeline.d.ts.map +1 -0
  16. package/dist/security/SecurityCIPipeline.js +684 -0
  17. package/dist/security/SecurityCIPipeline.js.map +1 -0
  18. package/dist/security/SecurityConfigManager.d.ts +294 -0
  19. package/dist/security/SecurityConfigManager.d.ts.map +1 -0
  20. package/dist/security/SecurityConfigManager.js +553 -0
  21. package/dist/security/SecurityConfigManager.js.map +1 -0
  22. package/dist/security/SecurityMonitoring.d.ts +245 -0
  23. package/dist/security/SecurityMonitoring.d.ts.map +1 -0
  24. package/dist/security/SecurityMonitoring.js +596 -0
  25. package/dist/security/SecurityMonitoring.js.map +1 -0
  26. package/dist/security/SecurityReviewer.d.ts +168 -0
  27. package/dist/security/SecurityReviewer.d.ts.map +1 -0
  28. package/dist/security/SecurityReviewer.js +683 -0
  29. package/dist/security/SecurityReviewer.js.map +1 -0
  30. package/dist/security/index.d.ts +182 -0
  31. package/dist/security/index.d.ts.map +1 -0
  32. package/dist/security/index.js +189 -0
  33. package/dist/security/index.js.map +1 -0
  34. package/dist/tools/media.d.ts +43 -4
  35. package/dist/tools/media.d.ts.map +1 -1
  36. package/dist/tools/media.js +43 -4
  37. package/dist/tools/media.js.map +1 -1
  38. package/dist/tools/posts.d.ts +225 -4
  39. package/dist/tools/posts.d.ts.map +1 -1
  40. package/dist/tools/posts.js +225 -4
  41. package/dist/tools/posts.js.map +1 -1
  42. package/docs/DOCKER_PUBLISHING_TROUBLESHOOTING.md +233 -0
  43. package/docs/PUBLISHING-TROUBLESHOOTING.md +227 -0
  44. package/docs/api/README.md +53 -11
  45. package/docs/api/openapi.json +10 -10
  46. package/docs/api/summary.json +1 -1
  47. package/docs/api/tools/wp_create_post.md +9 -3
  48. package/docs/api/tools/wp_delete_post.md +2 -3
  49. package/docs/api/tools/wp_get_current_user.md +7 -1
  50. package/docs/api/tools/wp_get_post.md +2 -3
  51. package/docs/api/tools/wp_get_post_revisions.md +1 -1
  52. package/docs/api/tools/wp_list_posts.md +10 -3
  53. package/docs/api/tools/wp_list_users.md +8 -1
  54. package/docs/api/tools/wp_search_site.md +8 -1
  55. package/docs/api/tools/wp_test_auth.md +8 -1
  56. package/docs/api/tools/wp_update_post.md +2 -3
  57. package/docs/examples/docker-production.md +801 -0
  58. package/docs/examples/multi-site-setup.md +575 -0
  59. package/docs/examples/single-site-setup.md +390 -0
  60. package/docs/examples/use-case-workflows.md +469 -0
  61. package/package.json +11 -3
  62. package/src/client/api.ts +90 -0
  63. package/src/security/AISecurityScanner.ts +780 -0
  64. package/src/security/AutomatedRemediation.ts +665 -0
  65. package/src/security/SecurityCIPipeline.ts +969 -0
  66. package/src/security/SecurityConfigManager.ts +829 -0
  67. package/src/security/SecurityMonitoring.ts +841 -0
  68. package/src/security/SecurityReviewer.ts +855 -0
  69. package/src/security/index.ts +249 -0
  70. package/src/tools/media.ts +43 -4
  71. package/src/tools/posts.ts +225 -4
@@ -0,0 +1,575 @@
1
+ # Multi-Site Configuration Examples
2
+
3
+ This guide provides comprehensive examples for managing multiple WordPress sites with a single MCP WordPress server instance.
4
+
5
+ ## Basic Multi-Site Configuration
6
+
7
+ ### Configuration File Structure
8
+
9
+ Create `mcp-wordpress.config.json` in your project root:
10
+
11
+ ```json
12
+ {
13
+ "sites": [
14
+ {
15
+ "id": "main-site",
16
+ "name": "Main Company Website",
17
+ "config": {
18
+ "WORDPRESS_SITE_URL": "https://company.com",
19
+ "WORDPRESS_USERNAME": "admin",
20
+ "WORDPRESS_APP_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx",
21
+ "WORDPRESS_AUTH_METHOD": "app-password"
22
+ }
23
+ },
24
+ {
25
+ "id": "blog",
26
+ "name": "Company Blog",
27
+ "config": {
28
+ "WORDPRESS_SITE_URL": "https://blog.company.com",
29
+ "WORDPRESS_USERNAME": "editor",
30
+ "WORDPRESS_APP_PASSWORD": "yyyy yyyy yyyy yyyy yyyy yyyy",
31
+ "WORDPRESS_AUTH_METHOD": "app-password"
32
+ }
33
+ }
34
+ ]
35
+ }
36
+ ```
37
+
38
+ ### Claude Desktop Configuration
39
+
40
+ ```json
41
+ {
42
+ "mcpServers": {
43
+ "mcp-wordpress": {
44
+ "command": "npx",
45
+ "args": ["-y", "mcp-wordpress"]
46
+ }
47
+ }
48
+ }
49
+ ```
50
+
51
+ ## Agency Configuration Examples
52
+
53
+ ### Digital Marketing Agency Setup
54
+
55
+ **Scenario**: Managing 10+ client websites with different access levels
56
+
57
+ ```json
58
+ {
59
+ "sites": [
60
+ {
61
+ "id": "agency-main",
62
+ "name": "Agency Website",
63
+ "config": {
64
+ "WORDPRESS_SITE_URL": "https://digitalagency.com",
65
+ "WORDPRESS_USERNAME": "admin",
66
+ "WORDPRESS_APP_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx",
67
+ "CACHE_ENABLED": "true",
68
+ "PERFORMANCE_MONITORING": "true"
69
+ }
70
+ },
71
+ {
72
+ "id": "client-restaurant",
73
+ "name": "Restaurant Client",
74
+ "config": {
75
+ "WORDPRESS_SITE_URL": "https://bestrestaurant.com",
76
+ "WORDPRESS_USERNAME": "content-manager",
77
+ "WORDPRESS_APP_PASSWORD": "yyyy yyyy yyyy yyyy yyyy yyyy",
78
+ "CACHE_TTL": "300"
79
+ }
80
+ },
81
+ {
82
+ "id": "client-ecommerce",
83
+ "name": "E-commerce Client",
84
+ "config": {
85
+ "WORDPRESS_SITE_URL": "https://onlinestore.com",
86
+ "WORDPRESS_USERNAME": "shop-manager",
87
+ "WORDPRESS_APP_PASSWORD": "zzzz zzzz zzzz zzzz zzzz zzzz",
88
+ "RATE_LIMIT_ENABLED": "true"
89
+ }
90
+ },
91
+ {
92
+ "id": "client-law-firm",
93
+ "name": "Law Firm Client",
94
+ "config": {
95
+ "WORDPRESS_SITE_URL": "https://lawfirm.com",
96
+ "WORDPRESS_USERNAME": "legal-editor",
97
+ "WORDPRESS_APP_PASSWORD": "aaaa aaaa aaaa aaaa aaaa aaaa",
98
+ "SECURITY_MONITORING": "true"
99
+ }
100
+ },
101
+ {
102
+ "id": "client-healthcare",
103
+ "name": "Healthcare Practice",
104
+ "config": {
105
+ "WORDPRESS_SITE_URL": "https://medicalpractice.com",
106
+ "WORDPRESS_USERNAME": "medical-admin",
107
+ "WORDPRESS_APP_PASSWORD": "bbbb bbbb bbbb bbbb bbbb bbbb",
108
+ "CACHE_ENABLED": "true",
109
+ "SECURITY_MONITORING": "true"
110
+ }
111
+ }
112
+ ]
113
+ }
114
+ ```
115
+
116
+ ### Freelancer Portfolio Setup
117
+
118
+ **Scenario**: Managing personal portfolio plus client projects
119
+
120
+ ```json
121
+ {
122
+ "sites": [
123
+ {
124
+ "id": "portfolio",
125
+ "name": "Personal Portfolio",
126
+ "config": {
127
+ "WORDPRESS_SITE_URL": "https://johndeveloper.com",
128
+ "WORDPRESS_USERNAME": "john",
129
+ "WORDPRESS_APP_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx",
130
+ "DEBUG": "true",
131
+ "PERFORMANCE_MONITORING": "true"
132
+ }
133
+ },
134
+ {
135
+ "id": "client-startup",
136
+ "name": "Startup Client",
137
+ "config": {
138
+ "WORDPRESS_SITE_URL": "https://innovativestartup.com",
139
+ "WORDPRESS_USERNAME": "startup-editor",
140
+ "WORDPRESS_APP_PASSWORD": "yyyy yyyy yyyy yyyy yyyy yyyy"
141
+ }
142
+ },
143
+ {
144
+ "id": "client-nonprofit",
145
+ "name": "Non-Profit Client",
146
+ "config": {
147
+ "WORDPRESS_SITE_URL": "https://helpingothers.org",
148
+ "WORDPRESS_USERNAME": "volunteer-coordinator",
149
+ "WORDPRESS_APP_PASSWORD": "zzzz zzzz zzzz zzzz zzzz zzzz",
150
+ "CACHE_ENABLED": "true"
151
+ }
152
+ }
153
+ ]
154
+ }
155
+ ```
156
+
157
+ ## Development Environment Setup
158
+
159
+ ### Local Development with Multiple Sites
160
+
161
+ ```json
162
+ {
163
+ "sites": [
164
+ {
165
+ "id": "local-main",
166
+ "name": "Local Development Site",
167
+ "config": {
168
+ "WORDPRESS_SITE_URL": "http://localhost:8080",
169
+ "WORDPRESS_USERNAME": "admin",
170
+ "WORDPRESS_APP_PASSWORD": "local-dev-password",
171
+ "DEBUG": "true",
172
+ "NODE_ENV": "development"
173
+ }
174
+ },
175
+ {
176
+ "id": "staging",
177
+ "name": "Staging Environment",
178
+ "config": {
179
+ "WORDPRESS_SITE_URL": "https://staging.mysite.com",
180
+ "WORDPRESS_USERNAME": "staging-admin",
181
+ "WORDPRESS_APP_PASSWORD": "staging-password",
182
+ "CACHE_ENABLED": "false",
183
+ "DEBUG": "true"
184
+ }
185
+ },
186
+ {
187
+ "id": "production",
188
+ "name": "Production Site",
189
+ "config": {
190
+ "WORDPRESS_SITE_URL": "https://mysite.com",
191
+ "WORDPRESS_USERNAME": "prod-admin",
192
+ "WORDPRESS_APP_PASSWORD": "secure-prod-password",
193
+ "CACHE_ENABLED": "true",
194
+ "SECURITY_MONITORING": "true",
195
+ "DEBUG": "false"
196
+ }
197
+ }
198
+ ]
199
+ }
200
+ ```
201
+
202
+ ## Authentication Method Combinations
203
+
204
+ ### Mixed Authentication Methods
205
+
206
+ ```json
207
+ {
208
+ "sites": [
209
+ {
210
+ "id": "modern-site",
211
+ "name": "Modern WordPress Site",
212
+ "config": {
213
+ "WORDPRESS_SITE_URL": "https://modern.com",
214
+ "WORDPRESS_USERNAME": "admin",
215
+ "WORDPRESS_APP_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx",
216
+ "WORDPRESS_AUTH_METHOD": "app-password"
217
+ }
218
+ },
219
+ {
220
+ "id": "jwt-site",
221
+ "name": "JWT Enabled Site",
222
+ "config": {
223
+ "WORDPRESS_SITE_URL": "https://jwtsite.com",
224
+ "WORDPRESS_USERNAME": "api-user",
225
+ "WORDPRESS_PASSWORD": "secure-password",
226
+ "WORDPRESS_AUTH_METHOD": "jwt"
227
+ }
228
+ },
229
+ {
230
+ "id": "legacy-site",
231
+ "name": "Legacy Site (Basic Auth)",
232
+ "config": {
233
+ "WORDPRESS_SITE_URL": "https://legacy.com",
234
+ "WORDPRESS_USERNAME": "legacy-admin",
235
+ "WORDPRESS_PASSWORD": "legacy-password",
236
+ "WORDPRESS_AUTH_METHOD": "basic"
237
+ }
238
+ }
239
+ ]
240
+ }
241
+ ```
242
+
243
+ ## Performance-Optimized Multi-Site
244
+
245
+ ### High-Traffic Sites Configuration
246
+
247
+ ```json
248
+ {
249
+ "sites": [
250
+ {
251
+ "id": "high-traffic-news",
252
+ "name": "News Website",
253
+ "config": {
254
+ "WORDPRESS_SITE_URL": "https://newssite.com",
255
+ "WORDPRESS_USERNAME": "news-editor",
256
+ "WORDPRESS_APP_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx",
257
+ "CACHE_ENABLED": "true",
258
+ "CACHE_TTL": "600",
259
+ "CACHE_MAX_ITEMS": "2000",
260
+ "RATE_LIMIT_ENABLED": "true",
261
+ "PERFORMANCE_MONITORING": "true"
262
+ }
263
+ },
264
+ {
265
+ "id": "ecommerce-store",
266
+ "name": "E-commerce Store",
267
+ "config": {
268
+ "WORDPRESS_SITE_URL": "https://store.com",
269
+ "WORDPRESS_USERNAME": "store-manager",
270
+ "WORDPRESS_APP_PASSWORD": "yyyy yyyy yyyy yyyy yyyy yyyy",
271
+ "CACHE_ENABLED": "true",
272
+ "CACHE_TTL": "300",
273
+ "RATE_LIMIT_ENABLED": "true",
274
+ "API_TIMEOUT": "15000"
275
+ }
276
+ },
277
+ {
278
+ "id": "corporate-site",
279
+ "name": "Corporate Website",
280
+ "config": {
281
+ "WORDPRESS_SITE_URL": "https://corporation.com",
282
+ "WORDPRESS_USERNAME": "corporate-admin",
283
+ "WORDPRESS_APP_PASSWORD": "zzzz zzzz zzzz zzzz zzzz zzzz",
284
+ "CACHE_ENABLED": "true",
285
+ "CACHE_TTL": "900",
286
+ "SECURITY_MONITORING": "true"
287
+ }
288
+ }
289
+ ]
290
+ }
291
+ ```
292
+
293
+ ### Memory-Efficient Configuration
294
+
295
+ ```json
296
+ {
297
+ "sites": [
298
+ {
299
+ "id": "small-blog-1",
300
+ "name": "Personal Blog 1",
301
+ "config": {
302
+ "WORDPRESS_SITE_URL": "https://blog1.com",
303
+ "WORDPRESS_USERNAME": "blogger",
304
+ "WORDPRESS_APP_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx",
305
+ "CACHE_ENABLED": "true",
306
+ "CACHE_MAX_ITEMS": "100",
307
+ "CACHE_MAX_MEMORY_MB": "20"
308
+ }
309
+ },
310
+ {
311
+ "id": "small-blog-2",
312
+ "name": "Personal Blog 2",
313
+ "config": {
314
+ "WORDPRESS_SITE_URL": "https://blog2.com",
315
+ "WORDPRESS_USERNAME": "blogger",
316
+ "WORDPRESS_APP_PASSWORD": "yyyy yyyy yyyy yyyy yyyy yyyy",
317
+ "CACHE_ENABLED": "true",
318
+ "CACHE_MAX_ITEMS": "100",
319
+ "CACHE_MAX_MEMORY_MB": "20"
320
+ }
321
+ }
322
+ ]
323
+ }
324
+ ```
325
+
326
+ ## Industry-Specific Configurations
327
+
328
+ ### Healthcare Practice Management
329
+
330
+ ```json
331
+ {
332
+ "sites": [
333
+ {
334
+ "id": "main-practice",
335
+ "name": "Main Medical Practice",
336
+ "config": {
337
+ "WORDPRESS_SITE_URL": "https://medicalpractice.com",
338
+ "WORDPRESS_USERNAME": "medical-admin",
339
+ "WORDPRESS_APP_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx",
340
+ "SECURITY_MONITORING": "true",
341
+ "CACHE_ENABLED": "true",
342
+ "DEBUG": "false"
343
+ }
344
+ },
345
+ {
346
+ "id": "specialist-clinic",
347
+ "name": "Specialist Clinic",
348
+ "config": {
349
+ "WORDPRESS_SITE_URL": "https://specialistclinic.com",
350
+ "WORDPRESS_USERNAME": "clinic-manager",
351
+ "WORDPRESS_APP_PASSWORD": "yyyy yyyy yyyy yyyy yyyy yyyy",
352
+ "SECURITY_MONITORING": "true"
353
+ }
354
+ }
355
+ ]
356
+ }
357
+ ```
358
+
359
+ ### Educational Institution
360
+
361
+ ```json
362
+ {
363
+ "sites": [
364
+ {
365
+ "id": "university-main",
366
+ "name": "University Main Site",
367
+ "config": {
368
+ "WORDPRESS_SITE_URL": "https://university.edu",
369
+ "WORDPRESS_USERNAME": "web-admin",
370
+ "WORDPRESS_APP_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx",
371
+ "CACHE_ENABLED": "true",
372
+ "PERFORMANCE_MONITORING": "true"
373
+ }
374
+ },
375
+ {
376
+ "id": "student-portal",
377
+ "name": "Student Portal",
378
+ "config": {
379
+ "WORDPRESS_SITE_URL": "https://students.university.edu",
380
+ "WORDPRESS_USERNAME": "student-services",
381
+ "WORDPRESS_APP_PASSWORD": "yyyy yyyy yyyy yyyy yyyy yyyy",
382
+ "RATE_LIMIT_ENABLED": "true"
383
+ }
384
+ },
385
+ {
386
+ "id": "faculty-blog",
387
+ "name": "Faculty Blog Network",
388
+ "config": {
389
+ "WORDPRESS_SITE_URL": "https://faculty.university.edu",
390
+ "WORDPRESS_USERNAME": "faculty-coordinator",
391
+ "WORDPRESS_APP_PASSWORD": "zzzz zzzz zzzz zzzz zzzz zzzz"
392
+ }
393
+ }
394
+ ]
395
+ }
396
+ ```
397
+
398
+ ## Using Multi-Site Configuration
399
+
400
+ ### Command Examples
401
+
402
+ ```bash
403
+ # List all configured sites
404
+ npx mcp-wordpress --list-sites
405
+
406
+ # Test connection to specific site
407
+ npx mcp-wordpress --test-site="main-site"
408
+
409
+ # Use specific site in Claude
410
+ "List all posts from the blog site"
411
+ # Uses: wp_list_posts --site="blog"
412
+
413
+ "Create a new user on the main-site"
414
+ # Uses: wp_create_user --site="main-site" --username="newuser" --email="user@example.com"
415
+ ```
416
+
417
+ ### Claude Desktop Usage
418
+
419
+ ```text
420
+ 💬 "List all posts from my blog site"
421
+ 💬 "Create a new page on the main-site with title 'About Us'"
422
+ 💬 "Upload an image to the restaurant client site"
423
+ 💬 "Check performance metrics for the ecommerce site"
424
+ 💬 "Show me recent comments from all sites"
425
+ ```
426
+
427
+ ## Security Considerations
428
+
429
+ ### Site Isolation
430
+
431
+ Each site in the configuration maintains complete isolation:
432
+
433
+ - Separate authentication credentials
434
+ - Independent cache systems
435
+ - Isolated performance monitoring
436
+ - Individual security settings
437
+
438
+ ### Access Control
439
+
440
+ ```json
441
+ {
442
+ "sites": [
443
+ {
444
+ "id": "public-site",
445
+ "name": "Public Website",
446
+ "config": {
447
+ "WORDPRESS_SITE_URL": "https://public.com",
448
+ "WORDPRESS_USERNAME": "editor",
449
+ "WORDPRESS_APP_PASSWORD": "limited-permissions-password"
450
+ }
451
+ },
452
+ {
453
+ "id": "admin-site",
454
+ "name": "Administrative Site",
455
+ "config": {
456
+ "WORDPRESS_SITE_URL": "https://admin.company.com",
457
+ "WORDPRESS_USERNAME": "super-admin",
458
+ "WORDPRESS_APP_PASSWORD": "full-permissions-password",
459
+ "SECURITY_MONITORING": "true",
460
+ "RATE_LIMIT_ENABLED": "true"
461
+ }
462
+ }
463
+ ]
464
+ }
465
+ ```
466
+
467
+ ## Configuration Management
468
+
469
+ ### Environment-Based Configuration
470
+
471
+ **Development**
472
+
473
+ ```json
474
+ {
475
+ "sites": [
476
+ {
477
+ "id": "dev-site",
478
+ "name": "Development Site",
479
+ "config": {
480
+ "WORDPRESS_SITE_URL": "http://localhost:8080",
481
+ "WORDPRESS_USERNAME": "admin",
482
+ "WORDPRESS_APP_PASSWORD": "dev-password",
483
+ "DEBUG": "true",
484
+ "CACHE_ENABLED": "false"
485
+ }
486
+ }
487
+ ]
488
+ }
489
+ ```
490
+
491
+ **Production**
492
+
493
+ ```json
494
+ {
495
+ "sites": [
496
+ {
497
+ "id": "prod-site",
498
+ "name": "Production Site",
499
+ "config": {
500
+ "WORDPRESS_SITE_URL": "https://production.com",
501
+ "WORDPRESS_USERNAME": "prod-admin",
502
+ "WORDPRESS_APP_PASSWORD": "secure-prod-password",
503
+ "DEBUG": "false",
504
+ "CACHE_ENABLED": "true",
505
+ "SECURITY_MONITORING": "true"
506
+ }
507
+ }
508
+ ]
509
+ }
510
+ ```
511
+
512
+ ## Troubleshooting Multi-Site Issues
513
+
514
+ ### Common Problems
515
+
516
+ 1. **Site ID not found**
517
+ - Verify the `id` field matches exactly
518
+ - Check for typos in site parameter
519
+
520
+ 2. **Authentication fails for specific site**
521
+ - Test each site's credentials individually
522
+ - Regenerate application passwords if needed
523
+
524
+ 3. **Performance issues with many sites**
525
+ - Enable caching for frequently used sites
526
+ - Adjust cache limits based on available memory
527
+
528
+ ### Debug Commands
529
+
530
+ ```bash
531
+ # List all configured sites
532
+ npm run status
533
+
534
+ # Test specific site
535
+ npm run status -- --site="site-id"
536
+
537
+ # Validate configuration file
538
+ npm run test:config
539
+
540
+ # Test all sites
541
+ npm run test:multisite
542
+ ```
543
+
544
+ ### Validation Script
545
+
546
+ ```bash
547
+ #!/bin/bash
548
+ # validate-config.sh
549
+
550
+ echo "Validating multi-site configuration..."
551
+
552
+ # Check if config file exists
553
+ if [ ! -f "mcp-wordpress.config.json" ]; then
554
+ echo "❌ Configuration file not found"
555
+ exit 1
556
+ fi
557
+
558
+ # Validate JSON syntax
559
+ if ! cat mcp-wordpress.config.json | jq . > /dev/null 2>&1; then
560
+ echo "❌ Invalid JSON syntax"
561
+ exit 1
562
+ fi
563
+
564
+ # Test each site
565
+ sites=$(cat mcp-wordpress.config.json | jq -r '.sites[].id')
566
+ for site in $sites; do
567
+ echo "Testing site: $site"
568
+ npm run status -- --site="$site"
569
+ done
570
+
571
+ echo "✅ Multi-site configuration validated"
572
+ ```
573
+
574
+ This comprehensive multi-site setup allows you to manage unlimited WordPress sites
575
+ efficiently through a single Claude Desktop configuration.