mcp-wordpress 1.1.2
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/LICENSE +21 -0
- package/README.md +568 -0
- package/bin/mcp-wordpress.js +12 -0
- package/bin/setup.js +302 -0
- package/bin/status.js +359 -0
- package/dist/client/WordPressClient.d.ts +81 -0
- package/dist/client/WordPressClient.d.ts.map +1 -0
- package/dist/client/WordPressClient.js +354 -0
- package/dist/client/WordPressClient.js.map +1 -0
- package/dist/client/api.d.ts +140 -0
- package/dist/client/api.d.ts.map +1 -0
- package/dist/client/api.js +727 -0
- package/dist/client/api.js.map +1 -0
- package/dist/client/auth.d.ts +121 -0
- package/dist/client/auth.d.ts.map +1 -0
- package/dist/client/auth.js +430 -0
- package/dist/client/auth.js.map +1 -0
- package/dist/client/managers/AuthenticationManager.d.ts +39 -0
- package/dist/client/managers/AuthenticationManager.d.ts.map +1 -0
- package/dist/client/managers/AuthenticationManager.js +159 -0
- package/dist/client/managers/AuthenticationManager.js.map +1 -0
- package/dist/client/managers/BaseManager.d.ts +22 -0
- package/dist/client/managers/BaseManager.d.ts.map +1 -0
- package/dist/client/managers/BaseManager.js +47 -0
- package/dist/client/managers/BaseManager.js.map +1 -0
- package/dist/client/managers/RequestManager.d.ts +45 -0
- package/dist/client/managers/RequestManager.d.ts.map +1 -0
- package/dist/client/managers/RequestManager.js +161 -0
- package/dist/client/managers/RequestManager.js.map +1 -0
- package/dist/client/managers/index.d.ts +8 -0
- package/dist/client/managers/index.d.ts.map +1 -0
- package/dist/client/managers/index.js +8 -0
- package/dist/client/managers/index.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +264 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +7 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/auth.d.ts +44 -0
- package/dist/tools/auth.d.ts.map +1 -0
- package/dist/tools/auth.js +126 -0
- package/dist/tools/auth.js.map +1 -0
- package/dist/tools/base.d.ts +37 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +60 -0
- package/dist/tools/base.js.map +1 -0
- package/dist/tools/comments.d.ts +33 -0
- package/dist/tools/comments.d.ts.map +1 -0
- package/dist/tools/comments.js +228 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +9 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/media.d.ts +29 -0
- package/dist/tools/media.d.ts.map +1 -0
- package/dist/tools/media.js +208 -0
- package/dist/tools/media.js.map +1 -0
- package/dist/tools/pages.d.ts +30 -0
- package/dist/tools/pages.d.ts.map +1 -0
- package/dist/tools/pages.js +211 -0
- package/dist/tools/pages.js.map +1 -0
- package/dist/tools/posts.d.ts +30 -0
- package/dist/tools/posts.d.ts.map +1 -0
- package/dist/tools/posts.js +240 -0
- package/dist/tools/posts.js.map +1 -0
- package/dist/tools/site.d.ts +31 -0
- package/dist/tools/site.d.ts.map +1 -0
- package/dist/tools/site.js +192 -0
- package/dist/tools/site.js.map +1 -0
- package/dist/tools/taxonomies.d.ts +37 -0
- package/dist/tools/taxonomies.d.ts.map +1 -0
- package/dist/tools/taxonomies.js +280 -0
- package/dist/tools/taxonomies.js.map +1 -0
- package/dist/tools/users.d.ts +28 -0
- package/dist/tools/users.d.ts.map +1 -0
- package/dist/tools/users.js +201 -0
- package/dist/tools/users.js.map +1 -0
- package/dist/types/client.d.ts +215 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/client.js +72 -0
- package/dist/types/client.js.map +1 -0
- package/dist/types/index.d.ts +157 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mcp.d.ts +178 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +7 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/wordpress.d.ts +443 -0
- package/dist/types/wordpress.d.ts.map +1 -0
- package/dist/types/wordpress.js +7 -0
- package/dist/types/wordpress.js.map +1 -0
- package/dist/utils/debug.d.ts +63 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +195 -0
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/error.d.ts +19 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +71 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/toolWrapper.d.ts +36 -0
- package/dist/utils/toolWrapper.d.ts.map +1 -0
- package/dist/utils/toolWrapper.js +90 -0
- package/dist/utils/toolWrapper.js.map +1 -0
- package/package.json +115 -0
- package/src/client/api.ts +1043 -0
- package/src/client/auth.ts +527 -0
- package/src/client/managers/AuthenticationManager.ts +190 -0
- package/src/client/managers/BaseManager.ts +73 -0
- package/src/client/managers/RequestManager.ts +214 -0
- package/src/client/managers/index.ts +8 -0
- package/src/index.ts +337 -0
- package/src/server.ts +7 -0
- package/src/tools/auth.ts +153 -0
- package/src/tools/comments.ts +263 -0
- package/src/tools/index.ts +8 -0
- package/src/tools/media.ts +240 -0
- package/src/tools/pages.ts +246 -0
- package/src/tools/posts.ts +277 -0
- package/src/tools/site.ts +227 -0
- package/src/tools/taxonomies.ts +322 -0
- package/src/tools/users.ts +233 -0
- package/src/types/client.ts +304 -0
- package/src/types/index.ts +207 -0
- package/src/types/mcp.ts +247 -0
- package/src/types/wordpress.ts +491 -0
- package/src/utils/debug.ts +258 -0
- package/src/utils/error.ts +88 -0
- package/src/utils/toolWrapper.ts +105 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import dotenv from "dotenv";
|
|
4
|
+
import * as fs from "fs";
|
|
5
|
+
import * as path from "path";
|
|
6
|
+
import { fileURLToPath } from "url";
|
|
7
|
+
import { WordPressClient } from "./client/api.js";
|
|
8
|
+
import * as Tools from "./tools/index.js";
|
|
9
|
+
import { getErrorMessage } from "./utils/error.js";
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
// --- Constants ---
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
+
const __dirname = path.dirname(__filename);
|
|
14
|
+
const rootDir = path.resolve(__dirname, "..");
|
|
15
|
+
const envPath = path.resolve(rootDir, ".env");
|
|
16
|
+
dotenv.config({ path: envPath });
|
|
17
|
+
const SERVER_VERSION = "1.1.1"; // Updated version with test fixes
|
|
18
|
+
// --- Main Server Class ---
|
|
19
|
+
class MCPWordPressServer {
|
|
20
|
+
server;
|
|
21
|
+
// MODIFICATION: Manages multiple WordPress clients, keyed by site ID.
|
|
22
|
+
wordpressClients = new Map();
|
|
23
|
+
initialized = false;
|
|
24
|
+
// MODIFICATION: Stores the configurations for all loaded sites.
|
|
25
|
+
siteConfigs = [];
|
|
26
|
+
constructor(mcpConfig) {
|
|
27
|
+
this.loadConfiguration(mcpConfig);
|
|
28
|
+
if (this.wordpressClients.size === 0) {
|
|
29
|
+
console.error("No WordPress sites were configured. Please create mcp-wordpress.config.json or set environment variables.");
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
this.server = new McpServer({
|
|
33
|
+
name: "mcp-wordpress",
|
|
34
|
+
version: SERVER_VERSION,
|
|
35
|
+
});
|
|
36
|
+
this.setupTools();
|
|
37
|
+
}
|
|
38
|
+
loadConfiguration(mcpConfig) {
|
|
39
|
+
const configPath = path.resolve(rootDir, "mcp-wordpress.config.json");
|
|
40
|
+
if (fs.existsSync(configPath)) {
|
|
41
|
+
console.error("INFO: Found mcp-wordpress.config.json, loading multi-site configuration.");
|
|
42
|
+
this.loadMultiSiteConfig(configPath);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
console.error("INFO: mcp-wordpress.config.json not found, falling back to environment variables for single-site mode.");
|
|
46
|
+
this.loadSingleSiteFromEnv(mcpConfig);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
loadMultiSiteConfig(configPath) {
|
|
50
|
+
try {
|
|
51
|
+
const configFile = fs.readFileSync(configPath, "utf-8");
|
|
52
|
+
const config = JSON.parse(configFile);
|
|
53
|
+
if (!config.sites || !Array.isArray(config.sites)) {
|
|
54
|
+
throw new Error('Configuration file must have a "sites" array.');
|
|
55
|
+
}
|
|
56
|
+
this.siteConfigs = config.sites;
|
|
57
|
+
for (const site of this.siteConfigs) {
|
|
58
|
+
if (site.id && site.name && site.config) {
|
|
59
|
+
const clientConfig = {
|
|
60
|
+
baseUrl: site.config.WORDPRESS_SITE_URL,
|
|
61
|
+
auth: {
|
|
62
|
+
method: site.config.WORDPRESS_AUTH_METHOD ||
|
|
63
|
+
"app-password",
|
|
64
|
+
username: site.config.WORDPRESS_USERNAME,
|
|
65
|
+
appPassword: site.config.WORDPRESS_APP_PASSWORD,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
const client = new WordPressClient(clientConfig);
|
|
69
|
+
this.wordpressClients.set(site.id, client);
|
|
70
|
+
console.error(`INFO: Initialized client for site: ${site.name} (ID: ${site.id})`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
console.warn("WARN: Skipping invalid site entry in config. Must have id, name, and config.", site);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.error(`FATAL: Error reading or parsing mcp-wordpress.config.json: ${getErrorMessage(error)}`);
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
loadSingleSiteFromEnv(mcpConfig) {
|
|
83
|
+
const siteUrl = mcpConfig?.wordpressSiteUrl || process.env.WORDPRESS_SITE_URL;
|
|
84
|
+
const username = mcpConfig?.wordpressUsername || process.env.WORDPRESS_USERNAME;
|
|
85
|
+
const password = mcpConfig?.wordpressAppPassword || process.env.WORDPRESS_APP_PASSWORD;
|
|
86
|
+
const authMethod = (mcpConfig?.wordpressAuthMethod ||
|
|
87
|
+
process.env.WORDPRESS_AUTH_METHOD ||
|
|
88
|
+
"app-password");
|
|
89
|
+
if (!siteUrl || !username || !password) {
|
|
90
|
+
console.error("ERROR: Missing required credentials for single-site mode.");
|
|
91
|
+
console.error("Please set WORDPRESS_SITE_URL, WORDPRESS_USERNAME, and WORDPRESS_APP_PASSWORD environment variables.");
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const singleSiteConfig = {
|
|
95
|
+
baseUrl: siteUrl,
|
|
96
|
+
auth: { method: authMethod, username, appPassword: password },
|
|
97
|
+
};
|
|
98
|
+
const client = new WordPressClient(singleSiteConfig);
|
|
99
|
+
this.wordpressClients.set("default", client);
|
|
100
|
+
this.siteConfigs.push({
|
|
101
|
+
id: "default",
|
|
102
|
+
name: "Default Site",
|
|
103
|
+
config: singleSiteConfig,
|
|
104
|
+
});
|
|
105
|
+
console.error("INFO: Initialized client for default site in single-site mode.");
|
|
106
|
+
}
|
|
107
|
+
setupTools() {
|
|
108
|
+
// Register all tools from the tools directory
|
|
109
|
+
Object.values(Tools).forEach((ToolClass) => {
|
|
110
|
+
const toolInstance = new ToolClass();
|
|
111
|
+
const tools = toolInstance.getTools();
|
|
112
|
+
tools.forEach((tool) => {
|
|
113
|
+
this.registerTool(tool);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
registerTool(tool) {
|
|
118
|
+
// Create base parameter schema with site parameter
|
|
119
|
+
const baseSchema = {
|
|
120
|
+
site: z.string()
|
|
121
|
+
.optional()
|
|
122
|
+
.describe("The ID of the WordPress site to target (from mcp-wordpress.config.json). Required if multiple sites are configured."),
|
|
123
|
+
};
|
|
124
|
+
// Merge with tool-specific parameters
|
|
125
|
+
const parameterSchema = tool.parameters?.reduce((schema, param) => {
|
|
126
|
+
let zodType;
|
|
127
|
+
switch (param.type) {
|
|
128
|
+
case 'string':
|
|
129
|
+
zodType = z.string();
|
|
130
|
+
break;
|
|
131
|
+
case 'number':
|
|
132
|
+
zodType = z.number();
|
|
133
|
+
break;
|
|
134
|
+
case 'boolean':
|
|
135
|
+
zodType = z.boolean();
|
|
136
|
+
break;
|
|
137
|
+
case 'array':
|
|
138
|
+
zodType = z.array(z.string());
|
|
139
|
+
break;
|
|
140
|
+
case 'object':
|
|
141
|
+
zodType = z.record(z.any());
|
|
142
|
+
break;
|
|
143
|
+
default:
|
|
144
|
+
zodType = z.string();
|
|
145
|
+
}
|
|
146
|
+
if (param.description) {
|
|
147
|
+
zodType = zodType.describe(param.description);
|
|
148
|
+
}
|
|
149
|
+
if (!param.required) {
|
|
150
|
+
zodType = zodType.optional();
|
|
151
|
+
}
|
|
152
|
+
schema[param.name] = zodType;
|
|
153
|
+
return schema;
|
|
154
|
+
}, { ...baseSchema }) || baseSchema;
|
|
155
|
+
// Make site parameter required if multiple sites are configured
|
|
156
|
+
if (this.wordpressClients.size > 1) {
|
|
157
|
+
parameterSchema.site = parameterSchema.site.describe("The ID of the WordPress site to target (from mcp-wordpress.config.json). Required when multiple sites are configured.");
|
|
158
|
+
}
|
|
159
|
+
this.server.tool(tool.name, tool.description || `WordPress tool: ${tool.name}`, parameterSchema, async (args) => {
|
|
160
|
+
try {
|
|
161
|
+
const siteId = args.site || "default";
|
|
162
|
+
const client = this.wordpressClients.get(siteId);
|
|
163
|
+
if (!client) {
|
|
164
|
+
const availableSites = Array.from(this.wordpressClients.keys()).join(", ");
|
|
165
|
+
return {
|
|
166
|
+
content: [{
|
|
167
|
+
type: "text",
|
|
168
|
+
text: `Error: Site with ID '${siteId}' not found. Available sites: ${availableSites}`
|
|
169
|
+
}],
|
|
170
|
+
isError: true
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
// Call the tool handler with the client and parameters
|
|
174
|
+
const result = await tool.handler(client, args);
|
|
175
|
+
return {
|
|
176
|
+
content: [{
|
|
177
|
+
type: "text",
|
|
178
|
+
text: typeof result === 'string' ? result : JSON.stringify(result, null, 2)
|
|
179
|
+
}]
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
if (this.isAuthenticationError(error)) {
|
|
184
|
+
return {
|
|
185
|
+
content: [{
|
|
186
|
+
type: "text",
|
|
187
|
+
text: `Authentication failed for site '${args.site || "default"}'. Please check your credentials.`
|
|
188
|
+
}],
|
|
189
|
+
isError: true
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
content: [{
|
|
194
|
+
type: "text",
|
|
195
|
+
text: `Error: ${getErrorMessage(error)}`
|
|
196
|
+
}],
|
|
197
|
+
isError: true
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
async testClientConnections() {
|
|
203
|
+
console.error("INFO: Testing connections to all configured WordPress sites...");
|
|
204
|
+
const connectionPromises = Array.from(this.wordpressClients.entries()).map(async ([siteId, client]) => {
|
|
205
|
+
try {
|
|
206
|
+
await client.ping();
|
|
207
|
+
console.error(`SUCCESS: Connection to site '${siteId}' successful.`);
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
console.error(`ERROR: Failed to connect to site '${siteId}': ${getErrorMessage(error)}`);
|
|
211
|
+
if (this.isAuthenticationError(error)) {
|
|
212
|
+
console.error(`Authentication may have failed for site '${siteId}'. Please check credentials.`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
await Promise.all(connectionPromises);
|
|
217
|
+
this.initialized = true;
|
|
218
|
+
console.error("INFO: Connection tests complete.");
|
|
219
|
+
}
|
|
220
|
+
isAuthenticationError(error) {
|
|
221
|
+
if (error?.response?.status && [401, 403].includes(error.response.status)) {
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
return error?.code === "WORDPRESS_AUTH_ERROR";
|
|
225
|
+
}
|
|
226
|
+
async run() {
|
|
227
|
+
if (!this.initialized) {
|
|
228
|
+
await this.testClientConnections();
|
|
229
|
+
}
|
|
230
|
+
console.error("INFO: Starting MCP WordPress Server...");
|
|
231
|
+
// Connect to stdio transport
|
|
232
|
+
const transport = new StdioServerTransport();
|
|
233
|
+
await this.server.connect(transport);
|
|
234
|
+
console.error(`INFO: Server started and connected. Tools available for ${this.wordpressClients.size} site(s).`);
|
|
235
|
+
}
|
|
236
|
+
async shutdown() {
|
|
237
|
+
console.error("INFO: Shutting down MCP WordPress Server...");
|
|
238
|
+
await this.server.close();
|
|
239
|
+
console.error("INFO: Server stopped.");
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// --- Main Execution ---
|
|
243
|
+
async function main() {
|
|
244
|
+
try {
|
|
245
|
+
const mcpServer = new MCPWordPressServer();
|
|
246
|
+
await mcpServer.run();
|
|
247
|
+
const shutdown = async () => {
|
|
248
|
+
await mcpServer.shutdown();
|
|
249
|
+
process.exit(0);
|
|
250
|
+
};
|
|
251
|
+
process.on("SIGINT", shutdown);
|
|
252
|
+
process.on("SIGTERM", shutdown);
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
console.error(`FATAL: Failed to start server: ${getErrorMessage(error)}`);
|
|
256
|
+
process.exit(1);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
260
|
+
main();
|
|
261
|
+
}
|
|
262
|
+
export default MCPWordPressServer;
|
|
263
|
+
export { MCPWordPressServer };
|
|
264
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { WordPressClient } from "../client/api.js";
|
|
2
|
+
import { AuthMethod } from "../types/client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Provides authentication-related tools for WordPress sites.
|
|
5
|
+
* This class encapsulates tool definitions and their corresponding handlers.
|
|
6
|
+
*/
|
|
7
|
+
export declare class AuthTools {
|
|
8
|
+
/**
|
|
9
|
+
* Retrieves the list of authentication tools.
|
|
10
|
+
* @returns An array of MCPTool definitions.
|
|
11
|
+
*/
|
|
12
|
+
getTools(): any[];
|
|
13
|
+
/**
|
|
14
|
+
* Handles the 'wp_test_auth' tool request.
|
|
15
|
+
* It tests the connection and fetches user details upon success.
|
|
16
|
+
* @param client - The WordPressClient instance for the target site.
|
|
17
|
+
* @param params - The parameters for the tool request.
|
|
18
|
+
* @returns A promise that resolves to an MCPToolResponse.
|
|
19
|
+
*/
|
|
20
|
+
handleTestAuth(client: WordPressClient, params: any): Promise<any>;
|
|
21
|
+
/**
|
|
22
|
+
* Handles the 'wp_get_auth_status' tool request.
|
|
23
|
+
* Reports whether the client is currently authenticated.
|
|
24
|
+
* @param client - The WordPressClient instance for the target site.
|
|
25
|
+
* @param params - The parameters for the tool request.
|
|
26
|
+
* @returns A promise that resolves to an MCPToolResponse.
|
|
27
|
+
*/
|
|
28
|
+
handleGetAuthStatus(client: WordPressClient, params: any): Promise<any>;
|
|
29
|
+
/**
|
|
30
|
+
* Handles the 'wp_switch_auth_method' tool request.
|
|
31
|
+
* Updates the client's authentication configuration in memory for the session.
|
|
32
|
+
* @param client - The WordPressClient instance for the target site.
|
|
33
|
+
* @param params - The parameters for the tool request, including the new auth details.
|
|
34
|
+
* @returns A promise that resolves to an MCPToolResponse.
|
|
35
|
+
*/
|
|
36
|
+
handleSwitchAuthMethod(client: WordPressClient, params: {
|
|
37
|
+
method: AuthMethod;
|
|
38
|
+
username?: string;
|
|
39
|
+
password?: string;
|
|
40
|
+
jwt_token?: string;
|
|
41
|
+
}): Promise<any>;
|
|
42
|
+
}
|
|
43
|
+
export default AuthTools;
|
|
44
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD;;;GAGG;AACH,qBAAa,SAAS;IACpB;;;OAGG;IACI,QAAQ,IAAI,GAAG,EAAE;IAmDxB;;;;;;OAMG;IACU,cAAc,CACzB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,GAAG,GACV,OAAO,CAAC,GAAG,CAAC;IAoBf;;;;;;OAMG;IACU,mBAAmB,CAC9B,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,GAAG,GACV,OAAO,CAAC,GAAG,CAAC;IAsBf;;;;;;OAMG;IACU,sBAAsB,CACjC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE;QACN,MAAM,EAAE,UAAU,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GACA,OAAO,CAAC,GAAG,CAAC;CAShB;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { getErrorMessage } from "../utils/error.js";
|
|
2
|
+
/**
|
|
3
|
+
* Provides authentication-related tools for WordPress sites.
|
|
4
|
+
* This class encapsulates tool definitions and their corresponding handlers.
|
|
5
|
+
*/
|
|
6
|
+
export class AuthTools {
|
|
7
|
+
/**
|
|
8
|
+
* Retrieves the list of authentication tools.
|
|
9
|
+
* @returns An array of MCPTool definitions.
|
|
10
|
+
*/
|
|
11
|
+
getTools() {
|
|
12
|
+
return [
|
|
13
|
+
{
|
|
14
|
+
name: "wp_test_auth",
|
|
15
|
+
description: "Tests the authentication and connectivity for a configured WordPress site.",
|
|
16
|
+
parameters: [], // The 'site' parameter is added dynamically by the server
|
|
17
|
+
handler: this.handleTestAuth.bind(this),
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: "wp_get_auth_status",
|
|
21
|
+
description: "Gets the current authentication status for a configured WordPress site.",
|
|
22
|
+
parameters: [],
|
|
23
|
+
handler: this.handleGetAuthStatus.bind(this),
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: "wp_switch_auth_method",
|
|
27
|
+
description: "Switches the authentication method for a site for the current session.",
|
|
28
|
+
parameters: [
|
|
29
|
+
{
|
|
30
|
+
name: "method",
|
|
31
|
+
type: "string",
|
|
32
|
+
required: true,
|
|
33
|
+
description: "The new authentication method to use.",
|
|
34
|
+
enum: ["app-password", "jwt", "basic", "api-key", "cookie"],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: "username",
|
|
38
|
+
type: "string",
|
|
39
|
+
description: "The username for 'app-password' or 'basic' authentication.",
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: "password",
|
|
43
|
+
type: "string",
|
|
44
|
+
description: "The Application Password for 'app-password' or password for 'basic' auth.",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "jwt_token",
|
|
48
|
+
type: "string",
|
|
49
|
+
description: "The token for 'jwt' authentication.",
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
handler: this.handleSwitchAuthMethod.bind(this),
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Handles the 'wp_test_auth' tool request.
|
|
58
|
+
* It tests the connection and fetches user details upon success.
|
|
59
|
+
* @param client - The WordPressClient instance for the target site.
|
|
60
|
+
* @param params - The parameters for the tool request.
|
|
61
|
+
* @returns A promise that resolves to an MCPToolResponse.
|
|
62
|
+
*/
|
|
63
|
+
async handleTestAuth(client, params) {
|
|
64
|
+
try {
|
|
65
|
+
await client.ping();
|
|
66
|
+
const user = await client.getCurrentUser();
|
|
67
|
+
const siteConfig = client.config;
|
|
68
|
+
const content = `✅ **Authentication successful!**\n\n` +
|
|
69
|
+
`**Site:** ${siteConfig.baseUrl}\n` +
|
|
70
|
+
`**Method:** ${siteConfig.auth.method}\n` +
|
|
71
|
+
`**User:** ${user.name} (@${user.slug})\n` +
|
|
72
|
+
`**Roles:** ${user.roles?.join(", ") || "N/A"}\n\n` +
|
|
73
|
+
`Your WordPress connection is working properly.`;
|
|
74
|
+
return content;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
throw new Error(`Authentication test failed: ${getErrorMessage(error)}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Handles the 'wp_get_auth_status' tool request.
|
|
82
|
+
* Reports whether the client is currently authenticated.
|
|
83
|
+
* @param client - The WordPressClient instance for the target site.
|
|
84
|
+
* @param params - The parameters for the tool request.
|
|
85
|
+
* @returns A promise that resolves to an MCPToolResponse.
|
|
86
|
+
*/
|
|
87
|
+
async handleGetAuthStatus(client, params) {
|
|
88
|
+
try {
|
|
89
|
+
const isAuthenticated = client.isAuthenticated;
|
|
90
|
+
const config = client.config;
|
|
91
|
+
let content = `**Authentication Status for ${config.baseUrl}**\n\n` +
|
|
92
|
+
`**Authenticated:** ${isAuthenticated ? "✅ Yes" : "❌ No"}\n` +
|
|
93
|
+
`**Method:** ${config.auth.method}\n`;
|
|
94
|
+
if (isAuthenticated) {
|
|
95
|
+
const user = await client.getCurrentUser();
|
|
96
|
+
content += `**User:** ${user.name} (@${user.slug})\n`;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
content += `**Status:** Not connected. Use 'wp_test_auth' to connect and verify credentials.`;
|
|
100
|
+
}
|
|
101
|
+
return content;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
throw new Error(`Failed to get auth status: ${getErrorMessage(error)}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Handles the 'wp_switch_auth_method' tool request.
|
|
109
|
+
* Updates the client's authentication configuration in memory for the session.
|
|
110
|
+
* @param client - The WordPressClient instance for the target site.
|
|
111
|
+
* @param params - The parameters for the tool request, including the new auth details.
|
|
112
|
+
* @returns A promise that resolves to an MCPToolResponse.
|
|
113
|
+
*/
|
|
114
|
+
async handleSwitchAuthMethod(client, params) {
|
|
115
|
+
try {
|
|
116
|
+
// This functionality is not currently supported as the client
|
|
117
|
+
// doesn't have an updateAuthConfig method
|
|
118
|
+
throw new Error("Dynamic authentication method switching is not currently supported. Please update your configuration file and restart the server.");
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
throw new Error(`Failed to switch auth method: ${getErrorMessage(error)}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export default AuthTools;
|
|
126
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { WordPressClient } from "../client/api.js";
|
|
2
|
+
/**
|
|
3
|
+
* Base class for all WordPress tool categories.
|
|
4
|
+
* Provides common functionality and error handling for tool implementations.
|
|
5
|
+
*/
|
|
6
|
+
export declare abstract class BaseToolClass {
|
|
7
|
+
protected client: WordPressClient;
|
|
8
|
+
constructor(client: WordPressClient);
|
|
9
|
+
/**
|
|
10
|
+
* Abstract method that must be implemented by subclasses to return their tool definitions.
|
|
11
|
+
* @returns An array of MCPTool definitions.
|
|
12
|
+
*/
|
|
13
|
+
abstract getTools(): any[];
|
|
14
|
+
/**
|
|
15
|
+
* Common error handler for all tools.
|
|
16
|
+
* @param error The error to handle
|
|
17
|
+
* @param operation The operation that failed
|
|
18
|
+
* @throws Error with formatted message
|
|
19
|
+
*/
|
|
20
|
+
protected handleError(error: unknown, operation: string): never;
|
|
21
|
+
/**
|
|
22
|
+
* Validates required parameters are not undefined or null.
|
|
23
|
+
* @param params Object containing parameters to validate
|
|
24
|
+
* @param required Array of required parameter names
|
|
25
|
+
* @throws Error if any required parameter is missing
|
|
26
|
+
*/
|
|
27
|
+
protected validateRequiredParams(params: Record<string, any>, required: string[]): void;
|
|
28
|
+
/**
|
|
29
|
+
* Resolves the appropriate WordPress client for multi-site support.
|
|
30
|
+
* @param site Optional site ID for multi-site configurations
|
|
31
|
+
* @param clients Map of site IDs to WordPress clients
|
|
32
|
+
* @returns The resolved WordPress client
|
|
33
|
+
* @throws Error if site is not found or ambiguous
|
|
34
|
+
*/
|
|
35
|
+
protected resolveClient(site: string | undefined, clients: Map<string, WordPressClient>): WordPressClient;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/tools/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD;;;GAGG;AACH,8BAAsB,aAAa;IACrB,SAAS,CAAC,MAAM,EAAE,eAAe;gBAAvB,MAAM,EAAE,eAAe;IAE7C;;;OAGG;IACH,QAAQ,CAAC,QAAQ,IAAI,GAAG,EAAE;IAE1B;;;;;OAKG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK;IAI/D;;;;;OAKG;IACH,SAAS,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAQvF;;;;;;OAMG;IACH,SAAS,CAAC,aAAa,CACrB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,GACpC,eAAe;CA6BnB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { getErrorMessage } from "../utils/error.js";
|
|
2
|
+
/**
|
|
3
|
+
* Base class for all WordPress tool categories.
|
|
4
|
+
* Provides common functionality and error handling for tool implementations.
|
|
5
|
+
*/
|
|
6
|
+
export class BaseToolClass {
|
|
7
|
+
client;
|
|
8
|
+
constructor(client) {
|
|
9
|
+
this.client = client;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Common error handler for all tools.
|
|
13
|
+
* @param error The error to handle
|
|
14
|
+
* @param operation The operation that failed
|
|
15
|
+
* @throws Error with formatted message
|
|
16
|
+
*/
|
|
17
|
+
handleError(error, operation) {
|
|
18
|
+
throw new Error(`Failed to ${operation}: ${getErrorMessage(error)}`);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validates required parameters are not undefined or null.
|
|
22
|
+
* @param params Object containing parameters to validate
|
|
23
|
+
* @param required Array of required parameter names
|
|
24
|
+
* @throws Error if any required parameter is missing
|
|
25
|
+
*/
|
|
26
|
+
validateRequiredParams(params, required) {
|
|
27
|
+
for (const param of required) {
|
|
28
|
+
if (params[param] === undefined || params[param] === null) {
|
|
29
|
+
throw new Error(`Missing required parameter: ${param}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolves the appropriate WordPress client for multi-site support.
|
|
35
|
+
* @param site Optional site ID for multi-site configurations
|
|
36
|
+
* @param clients Map of site IDs to WordPress clients
|
|
37
|
+
* @returns The resolved WordPress client
|
|
38
|
+
* @throws Error if site is not found or ambiguous
|
|
39
|
+
*/
|
|
40
|
+
resolveClient(site, clients) {
|
|
41
|
+
if (clients.size === 0) {
|
|
42
|
+
throw new Error("No WordPress clients configured");
|
|
43
|
+
}
|
|
44
|
+
if (clients.size === 1 && !site) {
|
|
45
|
+
return Array.from(clients.values())[0];
|
|
46
|
+
}
|
|
47
|
+
if (!site && clients.size > 1) {
|
|
48
|
+
throw new Error(`Multiple sites configured. Please specify --site parameter with one of: ${Array.from(clients.keys()).join(", ")}`);
|
|
49
|
+
}
|
|
50
|
+
if (site) {
|
|
51
|
+
const client = clients.get(site);
|
|
52
|
+
if (!client) {
|
|
53
|
+
throw new Error(`Site "${site}" not found. Available sites: ${Array.from(clients.keys()).join(", ")}`);
|
|
54
|
+
}
|
|
55
|
+
return client;
|
|
56
|
+
}
|
|
57
|
+
return this.client;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/tools/base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;GAGG;AACH,MAAM,OAAgB,aAAa;IACX;IAAtB,YAAsB,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IAQjD;;;;;OAKG;IACO,WAAW,CAAC,KAAc,EAAE,SAAiB;QACrD,MAAM,IAAI,KAAK,CAAC,aAAa,SAAS,KAAK,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IAED;;;;;OAKG;IACO,sBAAsB,CAAC,MAA2B,EAAE,QAAkB;QAC9E,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACO,aAAa,CACrB,IAAwB,EACxB,OAAqC;QAErC,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,2EAA2E,KAAK,CAAC,IAAI,CACnF,OAAO,CAAC,IAAI,EAAE,CACf,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACf,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CACb,SAAS,IAAI,iCAAiC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtF,CAAC;YACJ,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { WordPressClient } from "../client/api.js";
|
|
2
|
+
import { CommentQueryParams, CreateCommentRequest, UpdateCommentRequest } from "../types/wordpress.js";
|
|
3
|
+
/**
|
|
4
|
+
* Provides tools for managing comments on a WordPress site.
|
|
5
|
+
* This class encapsulates tool definitions and their corresponding handlers.
|
|
6
|
+
*/
|
|
7
|
+
export declare class CommentTools {
|
|
8
|
+
/**
|
|
9
|
+
* Retrieves the list of comment management tools.
|
|
10
|
+
* @returns An array of MCPTool definitions.
|
|
11
|
+
*/
|
|
12
|
+
getTools(): any[];
|
|
13
|
+
handleListComments(client: WordPressClient, params: CommentQueryParams): Promise<any>;
|
|
14
|
+
handleGetComment(client: WordPressClient, params: {
|
|
15
|
+
id: number;
|
|
16
|
+
}): Promise<any>;
|
|
17
|
+
handleCreateComment(client: WordPressClient, params: CreateCommentRequest): Promise<any>;
|
|
18
|
+
handleUpdateComment(client: WordPressClient, params: UpdateCommentRequest & {
|
|
19
|
+
id: number;
|
|
20
|
+
}): Promise<any>;
|
|
21
|
+
handleDeleteComment(client: WordPressClient, params: {
|
|
22
|
+
id: number;
|
|
23
|
+
force?: boolean;
|
|
24
|
+
}): Promise<any>;
|
|
25
|
+
handleApproveComment(client: WordPressClient, params: {
|
|
26
|
+
id: number;
|
|
27
|
+
}): Promise<any>;
|
|
28
|
+
handleSpamComment(client: WordPressClient, params: {
|
|
29
|
+
id: number;
|
|
30
|
+
}): Promise<any>;
|
|
31
|
+
}
|
|
32
|
+
export default CommentTools;
|
|
33
|
+
//# sourceMappingURL=comments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/tools/comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAG/B;;;GAGG;AACH,qBAAa,YAAY;IACvB;;;OAGG;IACI,QAAQ,IAAI,GAAG,EAAE;IAuIX,kBAAkB,CAC7B,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,GAAG,CAAC;IAoBF,gBAAgB,CAC3B,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GACrB,OAAO,CAAC,GAAG,CAAC;IAgBF,mBAAmB,CAC9B,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,GAAG,CAAC;IASF,mBAAmB,CAC9B,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,oBAAoB,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAC5C,OAAO,CAAC,GAAG,CAAC;IASF,mBAAmB,CAC9B,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,GAAG,CAAC;IAUF,oBAAoB,CAC/B,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GACrB,OAAO,CAAC,GAAG,CAAC;IAYF,iBAAiB,CAC5B,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GACrB,OAAO,CAAC,GAAG,CAAC;CAWhB;AAED,eAAe,YAAY,CAAC"}
|