mcp-wordpress 1.2.2 → 1.3.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.
- package/README.md +210 -182
- package/dist/cache/CacheInvalidation.d.ts +3 -3
- package/dist/cache/CacheInvalidation.d.ts.map +1 -1
- package/dist/cache/CacheInvalidation.js +119 -119
- package/dist/cache/CacheInvalidation.js.map +1 -1
- package/dist/cache/CacheManager.d.ts +5 -0
- package/dist/cache/CacheManager.d.ts.map +1 -1
- package/dist/cache/CacheManager.js +26 -16
- package/dist/cache/CacheManager.js.map +1 -1
- package/dist/cache/HttpCacheWrapper.d.ts +1 -1
- package/dist/cache/HttpCacheWrapper.d.ts.map +1 -1
- package/dist/cache/HttpCacheWrapper.js +29 -29
- package/dist/cache/HttpCacheWrapper.js.map +1 -1
- package/dist/cache/__tests__/CacheInvalidation.test.js +96 -94
- package/dist/cache/__tests__/CacheInvalidation.test.js.map +1 -1
- package/dist/cache/__tests__/CacheManager.test.js +113 -113
- package/dist/cache/__tests__/CacheManager.test.js.map +1 -1
- package/dist/cache/__tests__/CachedWordPressClient.test.js +102 -99
- package/dist/cache/__tests__/CachedWordPressClient.test.js.map +1 -1
- package/dist/cache/__tests__/HttpCacheWrapper.test.js +98 -95
- package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +1 -1
- package/dist/cache/index.d.ts +7 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +4 -4
- package/dist/cache/index.js.map +1 -1
- package/dist/client/CachedWordPressClient.d.ts +4 -4
- package/dist/client/CachedWordPressClient.d.ts.map +1 -1
- package/dist/client/CachedWordPressClient.js +55 -51
- package/dist/client/CachedWordPressClient.js.map +1 -1
- package/dist/client/api.d.ts +10 -10
- package/dist/client/api.js +158 -158
- package/dist/client/api.js.map +1 -1
- package/dist/client/auth.d.ts +2 -2
- package/dist/client/auth.js +72 -72
- package/dist/client/managers/AuthenticationManager.d.ts +2 -2
- package/dist/client/managers/AuthenticationManager.js +46 -46
- package/dist/client/managers/BaseManager.d.ts +1 -1
- package/dist/client/managers/BaseManager.js +9 -9
- package/dist/client/managers/RequestManager.d.ts +5 -3
- package/dist/client/managers/RequestManager.d.ts.map +1 -1
- package/dist/client/managers/RequestManager.js +39 -19
- package/dist/client/managers/RequestManager.js.map +1 -1
- package/dist/client/managers/index.d.ts +3 -3
- package/dist/client/managers/index.js +3 -3
- package/dist/config/ConfigurationSchema.d.ts +2 -2
- package/dist/config/ConfigurationSchema.d.ts.map +1 -1
- package/dist/config/ConfigurationSchema.js +40 -40
- package/dist/config/ConfigurationSchema.js.map +1 -1
- package/dist/config/ServerConfiguration.d.ts +2 -2
- package/dist/config/ServerConfiguration.js +35 -35
- package/dist/config/ServerConfiguration.js.map +1 -1
- package/dist/docs/DocumentationGenerator.d.ts.map +1 -1
- package/dist/docs/DocumentationGenerator.js +296 -255
- package/dist/docs/DocumentationGenerator.js.map +1 -1
- package/dist/docs/MarkdownFormatter.d.ts +1 -1
- package/dist/docs/MarkdownFormatter.d.ts.map +1 -1
- package/dist/docs/MarkdownFormatter.js +60 -51
- package/dist/docs/MarkdownFormatter.js.map +1 -1
- package/dist/docs/index.d.ts +3 -3
- package/dist/docs/index.d.ts.map +1 -1
- package/dist/docs/index.js +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -16
- package/dist/index.js.map +1 -1
- package/dist/mcp-wordpress-1.3.0.tgz +0 -0
- package/dist/performance/MetricsCollector.d.ts +3 -3
- package/dist/performance/MetricsCollector.d.ts.map +1 -1
- package/dist/performance/MetricsCollector.js +33 -27
- package/dist/performance/MetricsCollector.js.map +1 -1
- package/dist/performance/PerformanceAnalytics.d.ts +12 -12
- package/dist/performance/PerformanceAnalytics.d.ts.map +1 -1
- package/dist/performance/PerformanceAnalytics.js +200 -154
- package/dist/performance/PerformanceAnalytics.js.map +1 -1
- package/dist/performance/PerformanceMonitor.d.ts +5 -5
- package/dist/performance/PerformanceMonitor.d.ts.map +1 -1
- package/dist/performance/PerformanceMonitor.js +53 -52
- package/dist/performance/PerformanceMonitor.js.map +1 -1
- package/dist/performance/index.d.ts +6 -6
- package/dist/performance/index.d.ts.map +1 -1
- package/dist/performance/index.js +3 -3
- package/dist/security/InputValidator.d.ts +1 -1
- package/dist/security/InputValidator.d.ts.map +1 -1
- package/dist/security/InputValidator.js +111 -88
- package/dist/security/InputValidator.js.map +1 -1
- package/dist/security/SecurityConfig.d.ts +5 -5
- package/dist/security/SecurityConfig.js +92 -92
- package/dist/security/SecurityConfig.js.map +1 -1
- package/dist/server/ConnectionTester.d.ts +1 -1
- package/dist/server/ConnectionTester.d.ts.map +1 -1
- package/dist/server/ConnectionTester.js +4 -4
- package/dist/server/ConnectionTester.js.map +1 -1
- package/dist/server/ToolRegistry.d.ts +2 -2
- package/dist/server/ToolRegistry.d.ts.map +1 -1
- package/dist/server/ToolRegistry.js +35 -32
- package/dist/server/ToolRegistry.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.js +2 -2
- package/dist/tools/BaseToolManager.js +5 -5
- package/dist/tools/auth.d.ts +2 -2
- package/dist/tools/auth.d.ts.map +1 -1
- package/dist/tools/auth.js +32 -31
- package/dist/tools/auth.js.map +1 -1
- package/dist/tools/cache.d.ts +1 -1
- package/dist/tools/cache.d.ts.map +1 -1
- package/dist/tools/cache.js +71 -71
- package/dist/tools/cache.js.map +1 -1
- package/dist/tools/comments.d.ts +2 -2
- package/dist/tools/comments.d.ts.map +1 -1
- package/dist/tools/comments.js +79 -79
- package/dist/tools/comments.js.map +1 -1
- package/dist/tools/index.d.ts +10 -10
- package/dist/tools/index.js +10 -10
- package/dist/tools/media.d.ts +2 -2
- package/dist/tools/media.js +80 -80
- package/dist/tools/pages.d.ts +2 -2
- package/dist/tools/pages.d.ts.map +1 -1
- package/dist/tools/pages.js +75 -75
- package/dist/tools/pages.js.map +1 -1
- package/dist/tools/performance.d.ts +1 -1
- package/dist/tools/performance.d.ts.map +1 -1
- package/dist/tools/performance.js +311 -287
- package/dist/tools/performance.js.map +1 -1
- package/dist/tools/posts.d.ts +2 -2
- package/dist/tools/posts.d.ts.map +1 -1
- package/dist/tools/posts.js +94 -94
- package/dist/tools/posts.js.map +1 -1
- package/dist/tools/site.d.ts +2 -2
- package/dist/tools/site.d.ts.map +1 -1
- package/dist/tools/site.js +60 -60
- package/dist/tools/site.js.map +1 -1
- package/dist/tools/taxonomies.d.ts +2 -2
- package/dist/tools/taxonomies.js +89 -89
- package/dist/tools/users.d.ts +2 -2
- package/dist/tools/users.js +68 -68
- package/dist/tools/users.js.map +1 -1
- package/dist/types/client.d.ts +13 -13
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/client.js +12 -12
- package/dist/types/client.js.map +1 -1
- package/dist/types/index.d.ts +19 -19
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -3
- package/dist/types/mcp.d.ts +7 -7
- package/dist/types/wordpress.d.ts +21 -21
- package/dist/types/wordpress.d.ts.map +1 -1
- package/dist/utils/debug.d.ts +2 -2
- package/dist/utils/debug.js +28 -28
- package/dist/utils/error.d.ts.map +1 -1
- package/dist/utils/error.js +13 -13
- package/dist/utils/error.js.map +1 -1
- package/dist/utils/toolWrapper.d.ts.map +1 -1
- package/dist/utils/toolWrapper.js +5 -5
- package/dist/utils/toolWrapper.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +41 -31
- package/dist/utils/validation.js.map +1 -1
- package/docs/CACHING.md +36 -2
- package/docs/DOCKER.md +24 -18
- package/docs/PERFORMANCE_MONITORING.md +49 -1
- package/docs/SECURITY_TESTING.md +30 -1
- package/docs/api/README.md +9 -1
- package/docs/api/summary.json +1 -1
- package/docs/contract-testing.md +24 -3
- package/docs/developer/GITHUB_ACTIONS_SETUP.md +8 -2
- package/docs/developer/MAINTENANCE.md +29 -3
- package/docs/developer/MIGRATION_GUIDE.md +13 -1
- package/docs/developer/NPM_AUTH_SETUP.md +13 -2
- package/docs/developer/REFACTORING.md +31 -1
- package/docs/releases/COMMUNITY_ANNOUNCEMENT_v1.1.2.md +18 -7
- package/docs/releases/RELEASE_NOTES_v1.1.2.md +31 -5
- package/docs/user-guides/DOCKER_SETUP.md +264 -0
- package/docs/user-guides/DTX_SETUP.md +327 -0
- package/docs/user-guides/NPM_SETUP.md +109 -0
- package/docs/user-guides/NPX_SETUP.md +281 -0
- package/docs/wordpress-rest-api-authentication-troubleshooting.md +13 -2
- package/package.json +27 -8
- package/src/cache/CacheInvalidation.ts +140 -132
- package/src/cache/CacheManager.ts +40 -29
- package/src/cache/HttpCacheWrapper.ts +105 -68
- package/src/cache/__tests__/CacheInvalidation.test.ts +123 -118
- package/src/cache/__tests__/CacheManager.test.ts +156 -152
- package/src/cache/__tests__/CachedWordPressClient.test.ts +131 -116
- package/src/cache/__tests__/HttpCacheWrapper.test.ts +118 -115
- package/src/cache/index.ts +13 -13
- package/src/client/CachedWordPressClient.ts +90 -80
- package/src/client/api.ts +205 -205
- package/src/client/auth.ts +80 -80
- package/src/client/managers/AuthenticationManager.ts +61 -61
- package/src/client/managers/BaseManager.ts +11 -11
- package/src/client/managers/RequestManager.ts +79 -47
- package/src/client/managers/index.ts +3 -3
- package/src/config/ConfigurationSchema.ts +44 -44
- package/src/config/ServerConfiguration.ts +39 -39
- package/src/docs/DocumentationGenerator.ts +402 -295
- package/src/docs/MarkdownFormatter.ts +94 -69
- package/src/docs/index.ts +4 -4
- package/src/index.ts +24 -21
- package/src/performance/MetricsCollector.ts +90 -58
- package/src/performance/PerformanceAnalytics.ts +386 -262
- package/src/performance/PerformanceMonitor.ts +152 -118
- package/src/performance/index.ts +9 -9
- package/src/security/InputValidator.ts +148 -91
- package/src/security/SecurityConfig.ts +94 -94
- package/src/server/ConnectionTester.ts +21 -15
- package/src/server/ToolRegistry.ts +64 -51
- package/src/server.ts +2 -2
- package/src/tools/BaseToolManager.ts +6 -6
- package/src/tools/auth.ts +42 -37
- package/src/tools/cache.ts +85 -81
- package/src/tools/comments.ts +93 -91
- package/src/tools/index.ts +10 -10
- package/src/tools/media.ts +89 -89
- package/src/tools/pages.ts +89 -87
- package/src/tools/performance.ts +443 -352
- package/src/tools/posts.ts +109 -107
- package/src/tools/site.ts +86 -77
- package/src/tools/taxonomies.ts +102 -102
- package/src/tools/users.ts +77 -77
- package/src/types/client.ts +157 -60
- package/src/types/index.ts +49 -27
- package/src/types/mcp.ts +15 -15
- package/src/types/wordpress.ts +57 -29
- package/src/utils/debug.ts +37 -37
- package/src/utils/error.ts +47 -25
- package/src/utils/toolWrapper.ts +12 -8
- package/src/utils/validation.ts +116 -65
- package/dist/client/WordPressClient.d.ts +0 -81
- package/dist/client/WordPressClient.d.ts.map +0 -1
- package/dist/client/WordPressClient.js +0 -354
- package/dist/client/WordPressClient.js.map +0 -1
- package/dist/performance/AnomalyDetector.d.ts +0 -63
- package/dist/performance/AnomalyDetector.d.ts.map +0 -1
- package/dist/performance/AnomalyDetector.js +0 -222
- package/dist/performance/AnomalyDetector.js.map +0 -1
- package/dist/performance/BenchmarkAnalyzer.d.ts +0 -67
- package/dist/performance/BenchmarkAnalyzer.d.ts.map +0 -1
- package/dist/performance/BenchmarkAnalyzer.js +0 -301
- package/dist/performance/BenchmarkAnalyzer.js.map +0 -1
- package/dist/performance/TrendAnalyzer.d.ts +0 -69
- package/dist/performance/TrendAnalyzer.d.ts.map +0 -1
- package/dist/performance/TrendAnalyzer.js +0 -203
- package/dist/performance/TrendAnalyzer.js.map +0 -1
- package/dist/tools/BaseToolClass.d.ts +0 -76
- package/dist/tools/BaseToolClass.d.ts.map +0 -1
- package/dist/tools/BaseToolClass.js +0 -104
- package/dist/tools/BaseToolClass.js.map +0 -1
- package/dist/tools/base.d.ts +0 -37
- package/dist/tools/base.d.ts.map +0 -1
- package/dist/tools/base.js +0 -60
- package/dist/tools/base.js.map +0 -1
- package/docs/user-guides/CLAUDE_DESKTOP_SETUP.md +0 -187
package/dist/utils/validation.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import * as path from
|
|
2
|
-
import { WordPressAPIError } from
|
|
1
|
+
import * as path from "path";
|
|
2
|
+
import { WordPressAPIError } from "../types/client.js";
|
|
3
3
|
/**
|
|
4
4
|
* Security-focused validation utilities for MCP WordPress
|
|
5
5
|
*/
|
|
6
6
|
/**
|
|
7
7
|
* Validates and sanitizes numeric IDs
|
|
8
8
|
*/
|
|
9
|
-
export function validateId(id, fieldName =
|
|
9
|
+
export function validateId(id, fieldName = "id") {
|
|
10
10
|
const numId = parseInt(String(id), 10);
|
|
11
11
|
if (isNaN(numId) || numId <= 0) {
|
|
12
|
-
throw new WordPressAPIError(`Invalid ${fieldName}: must be a positive number`, 400,
|
|
12
|
+
throw new WordPressAPIError(`Invalid ${fieldName}: must be a positive number`, 400, "INVALID_PARAMETER");
|
|
13
13
|
}
|
|
14
14
|
return numId;
|
|
15
15
|
}
|
|
@@ -17,12 +17,12 @@ export function validateId(id, fieldName = 'id') {
|
|
|
17
17
|
* Validates string length within bounds
|
|
18
18
|
*/
|
|
19
19
|
export function validateString(value, fieldName, minLength = 1, maxLength = 1000) {
|
|
20
|
-
if (typeof value !==
|
|
21
|
-
throw new WordPressAPIError(`Invalid ${fieldName}: must be a string`, 400,
|
|
20
|
+
if (typeof value !== "string") {
|
|
21
|
+
throw new WordPressAPIError(`Invalid ${fieldName}: must be a string`, 400, "INVALID_PARAMETER");
|
|
22
22
|
}
|
|
23
23
|
const trimmed = value.trim();
|
|
24
24
|
if (trimmed.length < minLength || trimmed.length > maxLength) {
|
|
25
|
-
throw new WordPressAPIError(`Invalid ${fieldName}: length must be between ${minLength} and ${maxLength} characters`, 400,
|
|
25
|
+
throw new WordPressAPIError(`Invalid ${fieldName}: length must be between ${minLength} and ${maxLength} characters`, 400, "INVALID_PARAMETER");
|
|
26
26
|
}
|
|
27
27
|
return trimmed;
|
|
28
28
|
}
|
|
@@ -35,7 +35,7 @@ export function validateFilePath(userPath, allowedBasePath) {
|
|
|
35
35
|
const resolvedPath = path.resolve(allowedBasePath, normalizedPath);
|
|
36
36
|
// Ensure the resolved path is within the allowed directory
|
|
37
37
|
if (!resolvedPath.startsWith(path.resolve(allowedBasePath))) {
|
|
38
|
-
throw new WordPressAPIError(
|
|
38
|
+
throw new WordPressAPIError("Invalid file path: access denied", 403, "PATH_TRAVERSAL_ATTEMPT");
|
|
39
39
|
}
|
|
40
40
|
return resolvedPath;
|
|
41
41
|
}
|
|
@@ -43,26 +43,34 @@ export function validateFilePath(userPath, allowedBasePath) {
|
|
|
43
43
|
* Validates WordPress post status values
|
|
44
44
|
*/
|
|
45
45
|
export function validatePostStatus(status) {
|
|
46
|
-
const validStatuses = [
|
|
46
|
+
const validStatuses = [
|
|
47
|
+
"publish",
|
|
48
|
+
"draft",
|
|
49
|
+
"pending",
|
|
50
|
+
"private",
|
|
51
|
+
"future",
|
|
52
|
+
"auto-draft",
|
|
53
|
+
"trash",
|
|
54
|
+
];
|
|
47
55
|
if (!validStatuses.includes(status)) {
|
|
48
|
-
throw new WordPressAPIError(`Invalid status: must be one of ${validStatuses.join(
|
|
56
|
+
throw new WordPressAPIError(`Invalid status: must be one of ${validStatuses.join(", ")}`, 400, "INVALID_PARAMETER");
|
|
49
57
|
}
|
|
50
58
|
return status;
|
|
51
59
|
}
|
|
52
60
|
/**
|
|
53
61
|
* Validates and sanitizes URLs
|
|
54
62
|
*/
|
|
55
|
-
export function validateUrl(url, fieldName =
|
|
63
|
+
export function validateUrl(url, fieldName = "url") {
|
|
56
64
|
try {
|
|
57
65
|
const urlObj = new URL(url);
|
|
58
66
|
// Only allow http and https protocols
|
|
59
|
-
if (![
|
|
60
|
-
throw new Error(
|
|
67
|
+
if (!["http:", "https:"].includes(urlObj.protocol)) {
|
|
68
|
+
throw new Error("Invalid protocol");
|
|
61
69
|
}
|
|
62
70
|
return urlObj.toString();
|
|
63
71
|
}
|
|
64
72
|
catch {
|
|
65
|
-
throw new WordPressAPIError(`Invalid ${fieldName}: must be a valid URL`, 400,
|
|
73
|
+
throw new WordPressAPIError(`Invalid ${fieldName}: must be a valid URL`, 400, "INVALID_PARAMETER");
|
|
66
74
|
}
|
|
67
75
|
}
|
|
68
76
|
/**
|
|
@@ -71,7 +79,7 @@ export function validateUrl(url, fieldName = 'url') {
|
|
|
71
79
|
export function validateFileSize(sizeInBytes, maxSizeInMB = 10) {
|
|
72
80
|
const maxSizeInBytes = maxSizeInMB * 1024 * 1024;
|
|
73
81
|
if (sizeInBytes > maxSizeInBytes) {
|
|
74
|
-
throw new WordPressAPIError(`File size exceeds maximum allowed size of ${maxSizeInMB}MB`, 413,
|
|
82
|
+
throw new WordPressAPIError(`File size exceeds maximum allowed size of ${maxSizeInMB}MB`, 413, "FILE_TOO_LARGE");
|
|
75
83
|
}
|
|
76
84
|
}
|
|
77
85
|
/**
|
|
@@ -79,7 +87,7 @@ export function validateFileSize(sizeInBytes, maxSizeInMB = 10) {
|
|
|
79
87
|
*/
|
|
80
88
|
export function validateMimeType(mimeType, allowedTypes) {
|
|
81
89
|
if (!allowedTypes.includes(mimeType)) {
|
|
82
|
-
throw new WordPressAPIError(`Invalid file type: ${mimeType}. Allowed types: ${allowedTypes.join(
|
|
90
|
+
throw new WordPressAPIError(`Invalid file type: ${mimeType}. Allowed types: ${allowedTypes.join(", ")}`, 415, "UNSUPPORTED_MEDIA_TYPE");
|
|
83
91
|
}
|
|
84
92
|
}
|
|
85
93
|
/**
|
|
@@ -89,13 +97,13 @@ export function validateMimeType(mimeType, allowedTypes) {
|
|
|
89
97
|
*/
|
|
90
98
|
export function sanitizeHtml(html) {
|
|
91
99
|
// Remove script tags and their content
|
|
92
|
-
let sanitized = html.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
|
|
100
|
+
let sanitized = html.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, "");
|
|
93
101
|
// Remove event handlers
|
|
94
|
-
sanitized = sanitized.replace(/\s*on\w+\s*=\s*["'][^"']*["']/gi,
|
|
102
|
+
sanitized = sanitized.replace(/\s*on\w+\s*=\s*["'][^"']*["']/gi, "");
|
|
95
103
|
// Remove javascript: protocol
|
|
96
|
-
sanitized = sanitized.replace(/javascript:/gi,
|
|
104
|
+
sanitized = sanitized.replace(/javascript:/gi, "");
|
|
97
105
|
// Remove data: protocol (can be used for XSS)
|
|
98
|
-
sanitized = sanitized.replace(/data:text\/html/gi,
|
|
106
|
+
sanitized = sanitized.replace(/data:text\/html/gi, "");
|
|
99
107
|
return sanitized;
|
|
100
108
|
}
|
|
101
109
|
/**
|
|
@@ -103,10 +111,10 @@ export function sanitizeHtml(html) {
|
|
|
103
111
|
*/
|
|
104
112
|
export function validateArray(value, fieldName, minItems = 0, maxItems = 100) {
|
|
105
113
|
if (!Array.isArray(value)) {
|
|
106
|
-
throw new WordPressAPIError(`Invalid ${fieldName}: must be an array`, 400,
|
|
114
|
+
throw new WordPressAPIError(`Invalid ${fieldName}: must be an array`, 400, "INVALID_PARAMETER");
|
|
107
115
|
}
|
|
108
116
|
if (value.length < minItems || value.length > maxItems) {
|
|
109
|
-
throw new WordPressAPIError(`Invalid ${fieldName}: array must contain between ${minItems} and ${maxItems} items`, 400,
|
|
117
|
+
throw new WordPressAPIError(`Invalid ${fieldName}: array must contain between ${minItems} and ${maxItems} items`, 400, "INVALID_PARAMETER");
|
|
110
118
|
}
|
|
111
119
|
return value;
|
|
112
120
|
}
|
|
@@ -116,7 +124,7 @@ export function validateArray(value, fieldName, minItems = 0, maxItems = 100) {
|
|
|
116
124
|
export function validateEmail(email) {
|
|
117
125
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
118
126
|
if (!emailRegex.test(email)) {
|
|
119
|
-
throw new WordPressAPIError(
|
|
127
|
+
throw new WordPressAPIError("Invalid email address format", 400, "INVALID_PARAMETER");
|
|
120
128
|
}
|
|
121
129
|
return email.toLowerCase();
|
|
122
130
|
}
|
|
@@ -127,10 +135,10 @@ export function validateUsername(username) {
|
|
|
127
135
|
// WordPress username rules: alphanumeric, space, underscore, hyphen, period, @ symbol
|
|
128
136
|
const usernameRegex = /^[a-zA-Z0-9 _.\-@]+$/;
|
|
129
137
|
if (!usernameRegex.test(username)) {
|
|
130
|
-
throw new WordPressAPIError(
|
|
138
|
+
throw new WordPressAPIError("Invalid username: can only contain letters, numbers, spaces, and _.-@ symbols", 400, "INVALID_PARAMETER");
|
|
131
139
|
}
|
|
132
140
|
if (username.length < 3 || username.length > 60) {
|
|
133
|
-
throw new WordPressAPIError(
|
|
141
|
+
throw new WordPressAPIError("Invalid username: must be between 3 and 60 characters", 400, "INVALID_PARAMETER");
|
|
134
142
|
}
|
|
135
143
|
return username;
|
|
136
144
|
}
|
|
@@ -142,8 +150,7 @@ class RateLimiter {
|
|
|
142
150
|
maxAttempts;
|
|
143
151
|
windowMs;
|
|
144
152
|
attempts = new Map();
|
|
145
|
-
constructor(maxAttempts = 5, windowMs = 60000
|
|
146
|
-
) {
|
|
153
|
+
constructor(maxAttempts = 5, windowMs = 60000) {
|
|
147
154
|
this.maxAttempts = maxAttempts;
|
|
148
155
|
this.windowMs = windowMs;
|
|
149
156
|
}
|
|
@@ -151,12 +158,15 @@ class RateLimiter {
|
|
|
151
158
|
const now = Date.now();
|
|
152
159
|
const record = this.attempts.get(identifier);
|
|
153
160
|
if (!record || record.resetTime < now) {
|
|
154
|
-
this.attempts.set(identifier, {
|
|
161
|
+
this.attempts.set(identifier, {
|
|
162
|
+
count: 1,
|
|
163
|
+
resetTime: now + this.windowMs,
|
|
164
|
+
});
|
|
155
165
|
return;
|
|
156
166
|
}
|
|
157
167
|
if (record.count >= this.maxAttempts) {
|
|
158
168
|
const waitTime = Math.ceil((record.resetTime - now) / 1000);
|
|
159
|
-
throw new WordPressAPIError(`Rate limit exceeded. Please wait ${waitTime} seconds before trying again.`, 429,
|
|
169
|
+
throw new WordPressAPIError(`Rate limit exceeded. Please wait ${waitTime} seconds before trying again.`, 429, "RATE_LIMIT_EXCEEDED");
|
|
160
170
|
}
|
|
161
171
|
record.count++;
|
|
162
172
|
}
|
|
@@ -177,9 +187,9 @@ export function validateSearchQuery(query) {
|
|
|
177
187
|
sanitized = sanitized.substring(0, 200);
|
|
178
188
|
}
|
|
179
189
|
// Remove SQL-like patterns (basic protection)
|
|
180
|
-
sanitized = sanitized.replace(/(\b(union|select|insert|update|delete|drop|create)\b)/gi,
|
|
190
|
+
sanitized = sanitized.replace(/(\b(union|select|insert|update|delete|drop|create)\b)/gi, "");
|
|
181
191
|
// Remove special characters that might be used for injection
|
|
182
|
-
sanitized = sanitized.replace(/[<>'"`;\\]/g,
|
|
192
|
+
sanitized = sanitized.replace(/[<>'"`;\\]/g, "");
|
|
183
193
|
return sanitized;
|
|
184
194
|
}
|
|
185
195
|
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,EAAO,EAAE,YAAoB,IAAI;IAC1D,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,iBAAiB,
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|
package/docs/CACHING.md
CHANGED
|
@@ -21,16 +21,19 @@ Request → Cache Check → API Call (if miss) → Cache Store → Response
|
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
**Layer 1: HTTP Response Cache**
|
|
24
|
+
|
|
24
25
|
- ETags support for efficient revalidation
|
|
25
26
|
- Cache-Control headers based on data volatility
|
|
26
27
|
- Conditional requests (If-None-Match)
|
|
27
28
|
|
|
28
29
|
**Layer 2: In-Memory Application Cache**
|
|
30
|
+
|
|
29
31
|
- TTL-based expiration by data type
|
|
30
32
|
- LRU eviction for memory management
|
|
31
33
|
- Site-specific cache keys for multi-site support
|
|
32
34
|
|
|
33
35
|
**Layer 3: Intelligent Invalidation**
|
|
36
|
+
|
|
34
37
|
- Event-based cache clearing on content changes
|
|
35
38
|
- Pattern-based invalidation of related data
|
|
36
39
|
- Cascading invalidation (e.g., post changes clear category counts)
|
|
@@ -38,21 +41,25 @@ Request → Cache Check → API Call (if miss) → Cache Store → Response
|
|
|
38
41
|
## 📊 **Cache Strategies by Data Type**
|
|
39
42
|
|
|
40
43
|
### **Static Data (4 hour TTL)**
|
|
44
|
+
|
|
41
45
|
- Site settings, user roles, capabilities
|
|
42
46
|
- Cache-Control: `public, max-age=14400`
|
|
43
47
|
- **Why**: Changes very rarely, safe to cache long-term
|
|
44
48
|
|
|
45
49
|
### **Semi-Static Data (2 hour TTL)**
|
|
50
|
+
|
|
46
51
|
- Categories, tags, user profiles
|
|
47
52
|
- Cache-Control: `public, max-age=7200`
|
|
48
53
|
- **Why**: Changes occasionally but stable for hours
|
|
49
54
|
|
|
50
55
|
### **Dynamic Data (15 minute TTL)**
|
|
56
|
+
|
|
51
57
|
- Posts, pages, comments
|
|
52
58
|
- Cache-Control: `public, max-age=900`
|
|
53
59
|
- **Why**: Content changes frequently, shorter cache needed
|
|
54
60
|
|
|
55
61
|
### **Session Data (30 minute TTL)**
|
|
62
|
+
|
|
56
63
|
- Authentication status, current user info
|
|
57
64
|
- Cache-Control: `private, max-age=1800`
|
|
58
65
|
- **Why**: User-specific data, moderate stability
|
|
@@ -62,6 +69,7 @@ Request → Cache Check → API Call (if miss) → Cache Store → Response
|
|
|
62
69
|
The system includes dedicated cache management tools:
|
|
63
70
|
|
|
64
71
|
### **wp_cache_stats**
|
|
72
|
+
|
|
65
73
|
Get detailed cache statistics for performance monitoring.
|
|
66
74
|
|
|
67
75
|
```bash
|
|
@@ -69,12 +77,14 @@ wp_cache_stats --site="site1"
|
|
|
69
77
|
```
|
|
70
78
|
|
|
71
79
|
**Returns:**
|
|
80
|
+
|
|
72
81
|
- Hit/miss rates
|
|
73
82
|
- Total cache entries
|
|
74
83
|
- Eviction statistics
|
|
75
84
|
- Invalidation queue status
|
|
76
85
|
|
|
77
86
|
### **wp_cache_clear**
|
|
87
|
+
|
|
78
88
|
Clear cache entries with optional pattern matching.
|
|
79
89
|
|
|
80
90
|
```bash
|
|
@@ -87,6 +97,7 @@ wp_cache_clear --site="site1" --pattern="categories"
|
|
|
87
97
|
```
|
|
88
98
|
|
|
89
99
|
### **wp_cache_warm**
|
|
100
|
+
|
|
90
101
|
Pre-populate cache with essential WordPress data.
|
|
91
102
|
|
|
92
103
|
```bash
|
|
@@ -94,11 +105,13 @@ wp_cache_warm --site="site1"
|
|
|
94
105
|
```
|
|
95
106
|
|
|
96
107
|
Warms cache with:
|
|
108
|
+
|
|
97
109
|
- Current user information
|
|
98
110
|
- Categories and tags
|
|
99
111
|
- Site settings
|
|
100
112
|
|
|
101
113
|
### **wp_cache_info**
|
|
114
|
+
|
|
102
115
|
Get detailed cache configuration and status.
|
|
103
116
|
|
|
104
117
|
```bash
|
|
@@ -115,7 +128,7 @@ Caching is **enabled by default**. To disable:
|
|
|
115
128
|
export DISABLE_CACHE=true
|
|
116
129
|
```
|
|
117
130
|
|
|
118
|
-
### **Cache Settings**
|
|
131
|
+
### **Cache Settings**
|
|
119
132
|
|
|
120
133
|
Configure via `SecurityConfig.cache` in `src/security/SecurityConfig.ts`:
|
|
121
134
|
|
|
@@ -145,15 +158,18 @@ cache: {
|
|
|
145
158
|
The system automatically invalidates related cache entries when content changes:
|
|
146
159
|
|
|
147
160
|
**Post Operations:**
|
|
161
|
+
|
|
148
162
|
- **Create Post** → Clears posts listings, categories, tags, search
|
|
149
163
|
- **Update Post** → Clears specific post, posts listings, search
|
|
150
164
|
- **Delete Post** → Clears posts listings, categories, tags, search
|
|
151
165
|
|
|
152
166
|
**Category/Tag Operations:**
|
|
167
|
+
|
|
153
168
|
- **Create/Update/Delete** → Clears taxonomies AND related posts
|
|
154
169
|
- **Cascading Effect** → Post cache cleared when categories change
|
|
155
170
|
|
|
156
171
|
**User Operations:**
|
|
172
|
+
|
|
157
173
|
- **Update User** → Clears user cache, current user cache
|
|
158
174
|
- **User Role Changes** → Clears capability-dependent caches
|
|
159
175
|
|
|
@@ -179,6 +195,7 @@ node scripts/test-caching.js
|
|
|
179
195
|
```
|
|
180
196
|
|
|
181
197
|
**Tests Include:**
|
|
198
|
+
|
|
182
199
|
- Cache infrastructure performance
|
|
183
200
|
- Memory usage analysis
|
|
184
201
|
- Hit/miss rate calculations
|
|
@@ -203,11 +220,13 @@ done
|
|
|
203
220
|
### **Expected Performance Gains**
|
|
204
221
|
|
|
205
222
|
**Before Caching:**
|
|
223
|
+
|
|
206
224
|
- Categories API call: ~200-500ms
|
|
207
225
|
- Repeated user lookups: ~150-300ms each
|
|
208
226
|
- Site settings: ~100-200ms each call
|
|
209
227
|
|
|
210
228
|
**After Caching:**
|
|
229
|
+
|
|
211
230
|
- Categories (cached): ~1-5ms
|
|
212
231
|
- User lookups (cached): ~1-3ms
|
|
213
232
|
- Site settings (cached): ~1-2ms
|
|
@@ -217,11 +236,13 @@ done
|
|
|
217
236
|
Each WordPress site gets isolated cache:
|
|
218
237
|
|
|
219
238
|
**Cache Key Format:**
|
|
239
|
+
|
|
220
240
|
```
|
|
221
241
|
{siteId}:{endpoint}:{params_hash}
|
|
222
242
|
```
|
|
223
243
|
|
|
224
244
|
**Examples:**
|
|
245
|
+
|
|
225
246
|
```
|
|
226
247
|
site1:posts:abc123 # Site 1 posts listing
|
|
227
248
|
site2:posts:abc123 # Site 2 posts listing (separate)
|
|
@@ -229,6 +250,7 @@ site1:categories:def456 # Site 1 categories
|
|
|
229
250
|
```
|
|
230
251
|
|
|
231
252
|
**Site-Specific Operations:**
|
|
253
|
+
|
|
232
254
|
```bash
|
|
233
255
|
wp_cache_clear --site="site1" # Clear only site1 cache
|
|
234
256
|
wp_cache_clear --site="site2" --pattern="posts" # Clear site2 posts only
|
|
@@ -239,19 +261,23 @@ wp_cache_clear --site="site2" --pattern="posts" # Clear site2 posts only
|
|
|
239
261
|
### **Cache Not Working**
|
|
240
262
|
|
|
241
263
|
1. **Check if caching is enabled:**
|
|
264
|
+
|
|
242
265
|
```bash
|
|
243
266
|
wp_cache_info --site="your-site"
|
|
244
267
|
```
|
|
245
268
|
|
|
246
269
|
2. **Verify no DISABLE_CACHE environment variable:**
|
|
270
|
+
|
|
247
271
|
```bash
|
|
248
272
|
echo $DISABLE_CACHE # Should be empty or 'false'
|
|
249
273
|
```
|
|
250
274
|
|
|
251
275
|
3. **Check cache statistics:**
|
|
276
|
+
|
|
252
277
|
```bash
|
|
253
278
|
wp_cache_stats --site="your-site"
|
|
254
279
|
```
|
|
280
|
+
|
|
255
281
|
- Hit rate should increase over time
|
|
256
282
|
- Total entries should grow with usage
|
|
257
283
|
|
|
@@ -272,13 +298,16 @@ wp_cache_clear --site="site2" --pattern="posts" # Clear site2 posts only
|
|
|
272
298
|
### **Stale Data Issues**
|
|
273
299
|
|
|
274
300
|
1. **Check invalidation:**
|
|
301
|
+
|
|
275
302
|
```bash
|
|
276
303
|
wp_cache_info --site="your-site"
|
|
277
304
|
```
|
|
305
|
+
|
|
278
306
|
- Verify invalidation rules are active
|
|
279
307
|
- Check queue processing status
|
|
280
308
|
|
|
281
309
|
2. **Manual cache clear:**
|
|
310
|
+
|
|
282
311
|
```bash
|
|
283
312
|
wp_cache_clear --site="your-site" --pattern="problematic_endpoint"
|
|
284
313
|
```
|
|
@@ -292,11 +321,13 @@ wp_cache_clear --site="site2" --pattern="posts" # Clear site2 posts only
|
|
|
292
321
|
### **For High-Traffic Sites**
|
|
293
322
|
|
|
294
323
|
1. **Increase cache size:**
|
|
324
|
+
|
|
295
325
|
```typescript
|
|
296
326
|
maxSize: 2000 // From default 1000
|
|
297
327
|
```
|
|
298
328
|
|
|
299
329
|
2. **Tune TTL values:**
|
|
330
|
+
|
|
300
331
|
```typescript
|
|
301
332
|
ttlPresets: {
|
|
302
333
|
static: 8 * 60 * 60 * 1000, // 8 hours for very stable data
|
|
@@ -306,6 +337,7 @@ wp_cache_clear --site="site2" --pattern="posts" # Clear site2 posts only
|
|
|
306
337
|
```
|
|
307
338
|
|
|
308
339
|
3. **Pre-warm cache on deployment:**
|
|
340
|
+
|
|
309
341
|
```bash
|
|
310
342
|
wp_cache_warm --site="production-site"
|
|
311
343
|
```
|
|
@@ -313,6 +345,7 @@ wp_cache_clear --site="site2" --pattern="posts" # Clear site2 posts only
|
|
|
313
345
|
### **For Development**
|
|
314
346
|
|
|
315
347
|
1. **Shorter TTL for faster iteration:**
|
|
348
|
+
|
|
316
349
|
```typescript
|
|
317
350
|
ttlPresets: {
|
|
318
351
|
dynamic: 30 * 1000, // 30 seconds for development
|
|
@@ -320,6 +353,7 @@ wp_cache_clear --site="site2" --pattern="posts" # Clear site2 posts only
|
|
|
320
353
|
```
|
|
321
354
|
|
|
322
355
|
2. **Easy cache clearing:**
|
|
356
|
+
|
|
323
357
|
```bash
|
|
324
358
|
# Add to development scripts
|
|
325
359
|
wp_cache_clear # Clear all during development
|
|
@@ -337,4 +371,4 @@ Planned improvements:
|
|
|
337
371
|
|
|
338
372
|
---
|
|
339
373
|
|
|
340
|
-
The intelligent caching system provides significant performance improvements while maintaining data freshness appropriate for each content type. It's designed to work transparently with existing WordPress operations while providing tools for monitoring and management.
|
|
374
|
+
The intelligent caching system provides significant performance improvements while maintaining data freshness appropriate for each content type. It's designed to work transparently with existing WordPress operations while providing tools for monitoring and management.
|
package/docs/DOCKER.md
CHANGED
|
@@ -1,31 +1,35 @@
|
|
|
1
|
-
# Docker Deployment Guide
|
|
1
|
+
# Docker Deployment Guide (Legacy)
|
|
2
2
|
|
|
3
3
|

|
|
4
4
|

|
|
5
5
|

|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
> **📖 New Users**: For Claude Desktop MCP integration, see the **[Docker Setup Guide](user-guides/DOCKER_SETUP.md)** instead.
|
|
8
|
+
|
|
9
|
+
This guide covers advanced Docker deployment scenarios for production and development environments.
|
|
8
10
|
|
|
9
11
|
## 🚀 Quick Start
|
|
10
12
|
|
|
11
13
|
### Option 1: Docker Hub (Recommended)
|
|
12
14
|
|
|
13
15
|
```bash
|
|
14
|
-
#
|
|
16
|
+
# Production deployment (NOT for Claude Desktop MCP)
|
|
15
17
|
docker run -d \
|
|
16
18
|
--name mcp-wordpress \
|
|
17
19
|
--restart unless-stopped \
|
|
18
20
|
-e WORDPRESS_SITE_URL=https://your-site.com \
|
|
19
21
|
-e WORDPRESS_USERNAME=your-username \
|
|
20
22
|
-e WORDPRESS_APP_PASSWORD=your-app-password \
|
|
21
|
-
|
|
23
|
+
docdyhr/mcp-wordpress:latest
|
|
22
24
|
```
|
|
23
25
|
|
|
26
|
+
**⚠️ Claude Desktop Users**: Do NOT use `-d` flag with Claude Desktop. See [Docker Setup Guide](user-guides/DOCKER_SETUP.md) for MCP integration.
|
|
27
|
+
|
|
24
28
|
### Option 2: Docker Compose
|
|
25
29
|
|
|
26
30
|
```bash
|
|
27
31
|
# Download the compose file
|
|
28
|
-
curl -O https://raw.githubusercontent.com/
|
|
32
|
+
curl -O https://raw.githubusercontent.com/docdyhr/mcp-wordpress/main/docker-compose.yml
|
|
29
33
|
|
|
30
34
|
# Configure environment variables (see below)
|
|
31
35
|
# Start the service
|
|
@@ -36,7 +40,7 @@ docker-compose up -d
|
|
|
36
40
|
|
|
37
41
|
```bash
|
|
38
42
|
# Clone the repository
|
|
39
|
-
git clone https://github.com/
|
|
43
|
+
git clone https://github.com/docdyhr/mcp-wordpress.git
|
|
40
44
|
cd mcp-wordpress
|
|
41
45
|
|
|
42
46
|
# Build the image
|
|
@@ -67,10 +71,12 @@ For multi-site setups, mount a configuration file:
|
|
|
67
71
|
```bash
|
|
68
72
|
docker run -d \
|
|
69
73
|
--name mcp-wordpress \
|
|
70
|
-
-v ./mcp-wordpress.config.json:/app/
|
|
71
|
-
|
|
74
|
+
-v ./mcp-wordpress.config.json:/app/mcp-wordpress.config.json:ro \
|
|
75
|
+
docdyhr/mcp-wordpress:latest
|
|
72
76
|
```
|
|
73
77
|
|
|
78
|
+
**⚠️ Mount Path**: Use `/app/mcp-wordpress.config.json` (not `/app/config/`).
|
|
79
|
+
|
|
74
80
|
**Example `mcp-wordpress.config.json`:**
|
|
75
81
|
```json
|
|
76
82
|
{
|
|
@@ -107,7 +113,7 @@ version: '3.8'
|
|
|
107
113
|
|
|
108
114
|
services:
|
|
109
115
|
mcp-wordpress:
|
|
110
|
-
image:
|
|
116
|
+
image: docdyhr/mcp-wordpress:latest
|
|
111
117
|
container_name: mcp-wordpress
|
|
112
118
|
restart: unless-stopped
|
|
113
119
|
environment:
|
|
@@ -117,7 +123,7 @@ services:
|
|
|
117
123
|
- NODE_ENV=production
|
|
118
124
|
volumes:
|
|
119
125
|
# Optional: Mount config for multi-site
|
|
120
|
-
- ./mcp-wordpress.config.json:/app/
|
|
126
|
+
- ./mcp-wordpress.config.json:/app/mcp-wordpress.config.json:ro
|
|
121
127
|
# Optional: Persist logs
|
|
122
128
|
- ./logs:/app/logs
|
|
123
129
|
# Optional: Persist cache
|
|
@@ -153,7 +159,7 @@ version: '3.8'
|
|
|
153
159
|
|
|
154
160
|
services:
|
|
155
161
|
mcp-wordpress:
|
|
156
|
-
image:
|
|
162
|
+
image: docdyhr/mcp-wordpress:latest
|
|
157
163
|
deploy:
|
|
158
164
|
replicas: 2
|
|
159
165
|
restart_policy:
|
|
@@ -201,7 +207,7 @@ spec:
|
|
|
201
207
|
spec:
|
|
202
208
|
containers:
|
|
203
209
|
- name: mcp-wordpress
|
|
204
|
-
image:
|
|
210
|
+
image: docdyhr/mcp-wordpress:latest
|
|
205
211
|
ports:
|
|
206
212
|
- containerPort: 3000
|
|
207
213
|
env:
|
|
@@ -262,7 +268,7 @@ docker inspect --format='{{.State.Health.Status}}' mcp-wordpress
|
|
|
262
268
|
docker exec -it mcp-wordpress /bin/sh
|
|
263
269
|
|
|
264
270
|
# Update to latest version
|
|
265
|
-
docker pull
|
|
271
|
+
docker pull docdyhr/mcp-wordpress:latest
|
|
266
272
|
docker stop mcp-wordpress
|
|
267
273
|
docker rm mcp-wordpress
|
|
268
274
|
# Run with new image...
|
|
@@ -354,7 +360,7 @@ echo \"your-app-password\" | docker secret create wordpress_password -
|
|
|
354
360
|
version: '3.8'
|
|
355
361
|
services:
|
|
356
362
|
mcp-wordpress:
|
|
357
|
-
image:
|
|
363
|
+
image: docdyhr/mcp-wordpress:latest
|
|
358
364
|
secrets:
|
|
359
365
|
- wordpress_url
|
|
360
366
|
- wordpress_user
|
|
@@ -424,7 +430,7 @@ docker exec mcp-wordpress node -e \"
|
|
|
424
430
|
|
|
425
431
|
```bash
|
|
426
432
|
# Run with debug logging
|
|
427
|
-
docker run -e DEBUG=true
|
|
433
|
+
docker run -e DEBUG=true docdyhr/mcp-wordpress:latest
|
|
428
434
|
|
|
429
435
|
# Or with compose
|
|
430
436
|
environment:
|
|
@@ -442,9 +448,9 @@ environment:
|
|
|
442
448
|
|
|
443
449
|
## 🤝 Support
|
|
444
450
|
|
|
445
|
-
- **GitHub Issues**: [Report problems](https://github.com/
|
|
446
|
-
- **Discussions**: [Ask questions](https://github.com/
|
|
447
|
-
- **Documentation**: [Browse guides](https://github.com/
|
|
451
|
+
- **GitHub Issues**: [Report problems](https://github.com/docdyhr/mcp-wordpress/issues)
|
|
452
|
+
- **Discussions**: [Ask questions](https://github.com/docdyhr/mcp-wordpress/discussions)
|
|
453
|
+
- **Documentation**: [Browse guides](https://github.com/docdyhr/mcp-wordpress/tree/main/docs)
|
|
448
454
|
|
|
449
455
|
---
|
|
450
456
|
|