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
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { z } from
|
|
1
|
+
import { z } from "zod";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Zod schema for WordPress authentication methods
|
|
5
5
|
*/
|
|
6
6
|
const AuthMethodSchema = z.enum([
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
"app-password",
|
|
8
|
+
"jwt",
|
|
9
|
+
"basic",
|
|
10
|
+
"api-key",
|
|
11
|
+
"cookie",
|
|
12
12
|
] as const);
|
|
13
13
|
|
|
14
14
|
/**
|
|
@@ -16,11 +16,11 @@ const AuthMethodSchema = z.enum([
|
|
|
16
16
|
*/
|
|
17
17
|
const UrlSchema = z
|
|
18
18
|
.string()
|
|
19
|
-
.url(
|
|
19
|
+
.url("Must be a valid URL")
|
|
20
20
|
.refine((url) => {
|
|
21
21
|
const parsed = new URL(url);
|
|
22
|
-
return parsed.protocol ===
|
|
23
|
-
},
|
|
22
|
+
return parsed.protocol === "http:" || parsed.protocol === "https:";
|
|
23
|
+
}, "URL must use http or https protocol");
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
26
|
* Zod schema for WordPress site configuration
|
|
@@ -29,18 +29,18 @@ const SiteConfigSchema = z.object({
|
|
|
29
29
|
WORDPRESS_SITE_URL: UrlSchema,
|
|
30
30
|
WORDPRESS_USERNAME: z
|
|
31
31
|
.string()
|
|
32
|
-
.min(1,
|
|
33
|
-
.max(60,
|
|
34
|
-
.regex(/^[a-zA-Z0-9._@-]+$/,
|
|
32
|
+
.min(1, "Username is required")
|
|
33
|
+
.max(60, "Username must be 60 characters or less")
|
|
34
|
+
.regex(/^[a-zA-Z0-9._@-]+$/, "Username contains invalid characters"),
|
|
35
35
|
WORDPRESS_APP_PASSWORD: z
|
|
36
36
|
.string()
|
|
37
|
-
.min(1,
|
|
37
|
+
.min(1, "Password is required")
|
|
38
38
|
.refine((password) => {
|
|
39
39
|
// WordPress app passwords are typically 24 characters with spaces
|
|
40
40
|
// But we'll be flexible to support different auth methods
|
|
41
41
|
return password.length >= 8;
|
|
42
|
-
},
|
|
43
|
-
WORDPRESS_AUTH_METHOD: AuthMethodSchema.optional().default(
|
|
42
|
+
}, "Password must be at least 8 characters"),
|
|
43
|
+
WORDPRESS_AUTH_METHOD: AuthMethodSchema.optional().default("app-password"),
|
|
44
44
|
});
|
|
45
45
|
|
|
46
46
|
/**
|
|
@@ -49,17 +49,17 @@ const SiteConfigSchema = z.object({
|
|
|
49
49
|
const SiteSchema = z.object({
|
|
50
50
|
id: z
|
|
51
51
|
.string()
|
|
52
|
-
.min(1,
|
|
53
|
-
.max(50,
|
|
52
|
+
.min(1, "Site ID is required")
|
|
53
|
+
.max(50, "Site ID must be 50 characters or less")
|
|
54
54
|
.regex(
|
|
55
55
|
/^[a-zA-Z0-9_-]+$/,
|
|
56
|
-
|
|
56
|
+
"Site ID can only contain letters, numbers, underscores, and hyphens",
|
|
57
57
|
),
|
|
58
58
|
name: z
|
|
59
59
|
.string()
|
|
60
|
-
.min(1,
|
|
61
|
-
.max(100,
|
|
62
|
-
config: SiteConfigSchema
|
|
60
|
+
.min(1, "Site name is required")
|
|
61
|
+
.max(100, "Site name must be 100 characters or less"),
|
|
62
|
+
config: SiteConfigSchema,
|
|
63
63
|
});
|
|
64
64
|
|
|
65
65
|
/**
|
|
@@ -68,23 +68,23 @@ const SiteSchema = z.object({
|
|
|
68
68
|
const MultiSiteConfigSchema = z.object({
|
|
69
69
|
sites: z
|
|
70
70
|
.array(SiteSchema)
|
|
71
|
-
.min(1,
|
|
72
|
-
.max(50,
|
|
71
|
+
.min(1, "At least one site must be configured")
|
|
72
|
+
.max(50, "Maximum of 50 sites supported")
|
|
73
73
|
.refine((sites) => {
|
|
74
74
|
const ids = sites.map((site) => site.id);
|
|
75
75
|
const uniqueIds = new Set(ids);
|
|
76
76
|
return ids.length === uniqueIds.size;
|
|
77
|
-
},
|
|
77
|
+
}, "Site IDs must be unique")
|
|
78
78
|
.refine((sites) => {
|
|
79
79
|
const names = sites.map((site) => site.name);
|
|
80
80
|
const uniqueNames = new Set(names);
|
|
81
81
|
return names.length === uniqueNames.size;
|
|
82
|
-
},
|
|
82
|
+
}, "Site names must be unique")
|
|
83
83
|
.refine((sites) => {
|
|
84
84
|
const urls = sites.map((site) => site.config.WORDPRESS_SITE_URL);
|
|
85
85
|
const uniqueUrls = new Set(urls);
|
|
86
86
|
return urls.length === uniqueUrls.size;
|
|
87
|
-
},
|
|
87
|
+
}, "Site URLs must be unique"),
|
|
88
88
|
});
|
|
89
89
|
|
|
90
90
|
/**
|
|
@@ -94,12 +94,12 @@ const EnvironmentConfigSchema = z.object({
|
|
|
94
94
|
WORDPRESS_SITE_URL: UrlSchema,
|
|
95
95
|
WORDPRESS_USERNAME: SiteConfigSchema.shape.WORDPRESS_USERNAME,
|
|
96
96
|
WORDPRESS_APP_PASSWORD: SiteConfigSchema.shape.WORDPRESS_APP_PASSWORD,
|
|
97
|
-
WORDPRESS_AUTH_METHOD: AuthMethodSchema.optional().default(
|
|
97
|
+
WORDPRESS_AUTH_METHOD: AuthMethodSchema.optional().default("app-password"),
|
|
98
98
|
// Optional environment variables
|
|
99
|
-
NODE_ENV: z.enum([
|
|
99
|
+
NODE_ENV: z.enum(["development", "production", "test"]).optional(),
|
|
100
100
|
DEBUG: z.string().optional(),
|
|
101
101
|
DISABLE_CACHE: z.string().optional(),
|
|
102
|
-
LOG_LEVEL: z.enum([
|
|
102
|
+
LOG_LEVEL: z.enum(["error", "warn", "info", "debug"]).optional(),
|
|
103
103
|
});
|
|
104
104
|
|
|
105
105
|
/**
|
|
@@ -111,7 +111,7 @@ const McpConfigSchema = z
|
|
|
111
111
|
wordpressUsername: SiteConfigSchema.shape.WORDPRESS_USERNAME.optional(),
|
|
112
112
|
wordpressAppPassword:
|
|
113
113
|
SiteConfigSchema.shape.WORDPRESS_APP_PASSWORD.optional(),
|
|
114
|
-
wordpressAuthMethod: AuthMethodSchema.optional()
|
|
114
|
+
wordpressAuthMethod: AuthMethodSchema.optional(),
|
|
115
115
|
})
|
|
116
116
|
.optional();
|
|
117
117
|
|
|
@@ -137,10 +137,10 @@ export class ConfigurationValidator {
|
|
|
137
137
|
} catch (error) {
|
|
138
138
|
if (error instanceof z.ZodError) {
|
|
139
139
|
const messages = error.errors
|
|
140
|
-
.map((err) => `${err.path.join(
|
|
141
|
-
.join(
|
|
140
|
+
.map((err) => `${err.path.join(".")}: ${err.message}`)
|
|
141
|
+
.join("; ");
|
|
142
142
|
throw new Error(
|
|
143
|
-
`Multi-site configuration validation failed: ${messages}
|
|
143
|
+
`Multi-site configuration validation failed: ${messages}`,
|
|
144
144
|
);
|
|
145
145
|
}
|
|
146
146
|
throw error;
|
|
@@ -151,17 +151,17 @@ export class ConfigurationValidator {
|
|
|
151
151
|
* Validate environment configuration for single-site mode
|
|
152
152
|
*/
|
|
153
153
|
static validateEnvironmentConfig(
|
|
154
|
-
env: Record<string, string | undefined
|
|
154
|
+
env: Record<string, string | undefined>,
|
|
155
155
|
): EnvironmentConfigType {
|
|
156
156
|
try {
|
|
157
157
|
return EnvironmentConfigSchema.parse(env);
|
|
158
158
|
} catch (error) {
|
|
159
159
|
if (error instanceof z.ZodError) {
|
|
160
160
|
const messages = error.errors
|
|
161
|
-
.map((err) => `${err.path.join(
|
|
162
|
-
.join(
|
|
161
|
+
.map((err) => `${err.path.join(".")}: ${err.message}`)
|
|
162
|
+
.join("; ");
|
|
163
163
|
throw new Error(
|
|
164
|
-
`Environment configuration validation failed: ${messages}
|
|
164
|
+
`Environment configuration validation failed: ${messages}`,
|
|
165
165
|
);
|
|
166
166
|
}
|
|
167
167
|
throw error;
|
|
@@ -177,8 +177,8 @@ export class ConfigurationValidator {
|
|
|
177
177
|
} catch (error) {
|
|
178
178
|
if (error instanceof z.ZodError) {
|
|
179
179
|
const messages = error.errors
|
|
180
|
-
.map((err) => `${err.path.join(
|
|
181
|
-
.join(
|
|
180
|
+
.map((err) => `${err.path.join(".")}: ${err.message}`)
|
|
181
|
+
.join("; ");
|
|
182
182
|
throw new Error(`MCP configuration validation failed: ${messages}`);
|
|
183
183
|
}
|
|
184
184
|
throw error;
|
|
@@ -194,8 +194,8 @@ export class ConfigurationValidator {
|
|
|
194
194
|
} catch (error) {
|
|
195
195
|
if (error instanceof z.ZodError) {
|
|
196
196
|
const messages = error.errors
|
|
197
|
-
.map((err) => `${err.path.join(
|
|
198
|
-
.join(
|
|
197
|
+
.map((err) => `${err.path.join(".")}: ${err.message}`)
|
|
198
|
+
.join("; ");
|
|
199
199
|
throw new Error(`Site configuration validation failed: ${messages}`);
|
|
200
200
|
}
|
|
201
201
|
throw error;
|
|
@@ -214,7 +214,7 @@ export class ConfigurationValidator {
|
|
|
214
214
|
* Check if environment configuration is valid without throwing
|
|
215
215
|
*/
|
|
216
216
|
static isValidEnvironmentConfig(
|
|
217
|
-
env: Record<string, string | undefined
|
|
217
|
+
env: Record<string, string | undefined>,
|
|
218
218
|
): boolean {
|
|
219
219
|
const result = EnvironmentConfigSchema.safeParse(env);
|
|
220
220
|
return result.success;
|
|
@@ -229,7 +229,7 @@ export class ConfigurationValidator {
|
|
|
229
229
|
return [];
|
|
230
230
|
}
|
|
231
231
|
return result.error.errors.map(
|
|
232
|
-
(err) => `${err.path.join(
|
|
232
|
+
(err) => `${err.path.join(".")}: ${err.message}`,
|
|
233
233
|
);
|
|
234
234
|
}
|
|
235
235
|
}
|
|
@@ -242,5 +242,5 @@ export {
|
|
|
242
242
|
EnvironmentConfigSchema,
|
|
243
243
|
McpConfigSchema,
|
|
244
244
|
AuthMethodSchema,
|
|
245
|
-
UrlSchema
|
|
245
|
+
UrlSchema,
|
|
246
246
|
};
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import dotenv from
|
|
2
|
-
import * as fs from
|
|
3
|
-
import * as path from
|
|
4
|
-
import { fileURLToPath } from
|
|
5
|
-
import { WordPressClient } from
|
|
6
|
-
import { CachedWordPressClient } from
|
|
7
|
-
import { WordPressClientConfig } from
|
|
8
|
-
import { getErrorMessage } from
|
|
1
|
+
import dotenv from "dotenv";
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
import { WordPressClient } from "../client/api.js";
|
|
6
|
+
import { CachedWordPressClient } from "../client/CachedWordPressClient.js";
|
|
7
|
+
import { WordPressClientConfig } from "../types/client.js";
|
|
8
|
+
import { getErrorMessage } from "../utils/error.js";
|
|
9
9
|
import {
|
|
10
10
|
ConfigurationValidator,
|
|
11
11
|
type SiteType as SiteConfig,
|
|
12
12
|
type MultiSiteConfigType as MultiSiteConfig,
|
|
13
|
-
type McpConfigType
|
|
14
|
-
} from
|
|
13
|
+
type McpConfigType,
|
|
14
|
+
} from "./ConfigurationSchema.js";
|
|
15
15
|
|
|
16
16
|
// Re-export types from schema for backward compatibility
|
|
17
17
|
export type { SiteConfig, MultiSiteConfig };
|
|
@@ -28,8 +28,8 @@ export class ServerConfiguration {
|
|
|
28
28
|
constructor() {
|
|
29
29
|
const __filename = fileURLToPath(import.meta.url);
|
|
30
30
|
const __dirname = path.dirname(__filename);
|
|
31
|
-
this.rootDir = path.resolve(__dirname,
|
|
32
|
-
this.envPath = path.resolve(this.rootDir,
|
|
31
|
+
this.rootDir = path.resolve(__dirname, "../..");
|
|
32
|
+
this.envPath = path.resolve(this.rootDir, ".env");
|
|
33
33
|
|
|
34
34
|
// Load environment variables
|
|
35
35
|
dotenv.config({ path: this.envPath });
|
|
@@ -53,19 +53,19 @@ export class ServerConfiguration {
|
|
|
53
53
|
clients: Map<string, WordPressClient>;
|
|
54
54
|
configs: SiteConfig[];
|
|
55
55
|
} {
|
|
56
|
-
const configPath = path.resolve(this.rootDir,
|
|
56
|
+
const configPath = path.resolve(this.rootDir, "mcp-wordpress.config.json");
|
|
57
57
|
|
|
58
58
|
if (fs.existsSync(configPath)) {
|
|
59
|
-
if (process.env.NODE_ENV !==
|
|
59
|
+
if (process.env.NODE_ENV !== "test") {
|
|
60
60
|
console.error(
|
|
61
|
-
|
|
61
|
+
"INFO: Found mcp-wordpress.config.json, loading multi-site configuration.",
|
|
62
62
|
);
|
|
63
63
|
}
|
|
64
64
|
return this.loadMultiSiteConfig(configPath);
|
|
65
65
|
} else {
|
|
66
|
-
if (process.env.NODE_ENV !==
|
|
66
|
+
if (process.env.NODE_ENV !== "test") {
|
|
67
67
|
console.error(
|
|
68
|
-
|
|
68
|
+
"INFO: mcp-wordpress.config.json not found, falling back to environment variables for single-site mode.",
|
|
69
69
|
);
|
|
70
70
|
}
|
|
71
71
|
return this.loadSingleSiteFromEnv(mcpConfig);
|
|
@@ -80,7 +80,7 @@ export class ServerConfiguration {
|
|
|
80
80
|
configs: SiteConfig[];
|
|
81
81
|
} {
|
|
82
82
|
try {
|
|
83
|
-
const configFile = fs.readFileSync(configPath,
|
|
83
|
+
const configFile = fs.readFileSync(configPath, "utf-8");
|
|
84
84
|
const rawConfig = JSON.parse(configFile);
|
|
85
85
|
|
|
86
86
|
// Validate configuration using Zod schema
|
|
@@ -93,23 +93,23 @@ export class ServerConfiguration {
|
|
|
93
93
|
const clientConfig: WordPressClientConfig = {
|
|
94
94
|
baseUrl: site.config.WORDPRESS_SITE_URL,
|
|
95
95
|
auth: {
|
|
96
|
-
method: site.config.WORDPRESS_AUTH_METHOD ||
|
|
96
|
+
method: site.config.WORDPRESS_AUTH_METHOD || "app-password",
|
|
97
97
|
username: site.config.WORDPRESS_USERNAME,
|
|
98
|
-
appPassword: site.config.WORDPRESS_APP_PASSWORD
|
|
99
|
-
}
|
|
98
|
+
appPassword: site.config.WORDPRESS_APP_PASSWORD,
|
|
99
|
+
},
|
|
100
100
|
};
|
|
101
101
|
|
|
102
102
|
// Use cached client for better performance
|
|
103
103
|
const client =
|
|
104
|
-
process.env.DISABLE_CACHE ===
|
|
104
|
+
process.env.DISABLE_CACHE === "true"
|
|
105
105
|
? new WordPressClient(clientConfig)
|
|
106
106
|
: new CachedWordPressClient(clientConfig, site.id);
|
|
107
107
|
clients.set(site.id, client);
|
|
108
108
|
validConfigs.push(site);
|
|
109
109
|
|
|
110
|
-
if (process.env.NODE_ENV !==
|
|
110
|
+
if (process.env.NODE_ENV !== "test") {
|
|
111
111
|
console.error(
|
|
112
|
-
`INFO: Initialized client for site: ${site.name} (ID: ${site.id})
|
|
112
|
+
`INFO: Initialized client for site: ${site.name} (ID: ${site.id})`,
|
|
113
113
|
);
|
|
114
114
|
}
|
|
115
115
|
}
|
|
@@ -117,7 +117,7 @@ export class ServerConfiguration {
|
|
|
117
117
|
return { clients, configs: validConfigs };
|
|
118
118
|
} catch (error) {
|
|
119
119
|
console.error(
|
|
120
|
-
`FATAL: Error reading or parsing mcp-wordpress.config.json: ${getErrorMessage(error)}
|
|
120
|
+
`FATAL: Error reading or parsing mcp-wordpress.config.json: ${getErrorMessage(error)}`,
|
|
121
121
|
);
|
|
122
122
|
process.exit(1);
|
|
123
123
|
}
|
|
@@ -150,11 +150,11 @@ export class ServerConfiguration {
|
|
|
150
150
|
WORDPRESS_AUTH_METHOD:
|
|
151
151
|
validatedMcpConfig?.wordpressAuthMethod ||
|
|
152
152
|
process.env.WORDPRESS_AUTH_METHOD ||
|
|
153
|
-
|
|
153
|
+
"app-password",
|
|
154
154
|
NODE_ENV: process.env.NODE_ENV,
|
|
155
155
|
DEBUG: process.env.DEBUG,
|
|
156
156
|
DISABLE_CACHE: process.env.DISABLE_CACHE,
|
|
157
|
-
LOG_LEVEL: process.env.LOG_LEVEL
|
|
157
|
+
LOG_LEVEL: process.env.LOG_LEVEL,
|
|
158
158
|
};
|
|
159
159
|
|
|
160
160
|
// Validate environment configuration using Zod schema
|
|
@@ -166,41 +166,41 @@ export class ServerConfiguration {
|
|
|
166
166
|
auth: {
|
|
167
167
|
method: validatedConfig.WORDPRESS_AUTH_METHOD,
|
|
168
168
|
username: validatedConfig.WORDPRESS_USERNAME,
|
|
169
|
-
appPassword: validatedConfig.WORDPRESS_APP_PASSWORD
|
|
170
|
-
}
|
|
169
|
+
appPassword: validatedConfig.WORDPRESS_APP_PASSWORD,
|
|
170
|
+
},
|
|
171
171
|
};
|
|
172
172
|
|
|
173
173
|
// Use cached client for better performance
|
|
174
174
|
const client =
|
|
175
|
-
process.env.DISABLE_CACHE ===
|
|
175
|
+
process.env.DISABLE_CACHE === "true"
|
|
176
176
|
? new WordPressClient(clientConfig)
|
|
177
|
-
: new CachedWordPressClient(clientConfig,
|
|
177
|
+
: new CachedWordPressClient(clientConfig, "default");
|
|
178
178
|
const clients = new Map<string, WordPressClient>();
|
|
179
|
-
clients.set(
|
|
179
|
+
clients.set("default", client);
|
|
180
180
|
|
|
181
181
|
const siteConfig: SiteConfig = {
|
|
182
|
-
id:
|
|
183
|
-
name:
|
|
182
|
+
id: "default",
|
|
183
|
+
name: "Default Site",
|
|
184
184
|
config: {
|
|
185
185
|
WORDPRESS_SITE_URL: validatedConfig.WORDPRESS_SITE_URL,
|
|
186
186
|
WORDPRESS_USERNAME: validatedConfig.WORDPRESS_USERNAME,
|
|
187
187
|
WORDPRESS_APP_PASSWORD: validatedConfig.WORDPRESS_APP_PASSWORD,
|
|
188
|
-
WORDPRESS_AUTH_METHOD: validatedConfig.WORDPRESS_AUTH_METHOD
|
|
189
|
-
}
|
|
188
|
+
WORDPRESS_AUTH_METHOD: validatedConfig.WORDPRESS_AUTH_METHOD,
|
|
189
|
+
},
|
|
190
190
|
};
|
|
191
191
|
|
|
192
192
|
console.error(
|
|
193
|
-
|
|
193
|
+
"INFO: Initialized client for default site in single-site mode.",
|
|
194
194
|
);
|
|
195
195
|
|
|
196
196
|
return { clients, configs: [siteConfig] };
|
|
197
197
|
} catch (error) {
|
|
198
198
|
console.error(
|
|
199
|
-
|
|
199
|
+
"ERROR: Configuration validation failed for single-site mode.",
|
|
200
200
|
);
|
|
201
201
|
console.error(`Details: ${getErrorMessage(error)}`);
|
|
202
202
|
console.error(
|
|
203
|
-
|
|
203
|
+
"Please check your environment variables or MCP configuration.",
|
|
204
204
|
);
|
|
205
205
|
return { clients: new Map(), configs: [] };
|
|
206
206
|
}
|