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
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { WordPressClient } from "../client/api.js";
|
|
2
|
+
import {
|
|
3
|
+
CreateUserRequest,
|
|
4
|
+
UpdateUserRequest,
|
|
5
|
+
UserQueryParams,
|
|
6
|
+
} from "../types/wordpress.js";
|
|
7
|
+
import { getErrorMessage } from "../utils/error.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Provides tools for managing users on a WordPress site.
|
|
11
|
+
* This class encapsulates tool definitions and their corresponding handlers.
|
|
12
|
+
*/
|
|
13
|
+
export class UserTools {
|
|
14
|
+
/**
|
|
15
|
+
* Retrieves the list of user management tools.
|
|
16
|
+
* @returns An array of MCPTool definitions.
|
|
17
|
+
*/
|
|
18
|
+
public getTools(): any[] {
|
|
19
|
+
return [
|
|
20
|
+
{
|
|
21
|
+
name: "wp_list_users",
|
|
22
|
+
description: "Lists users from a WordPress site, with filters.",
|
|
23
|
+
parameters: [
|
|
24
|
+
{
|
|
25
|
+
name: "search",
|
|
26
|
+
type: "string",
|
|
27
|
+
description: "Limit results to those matching a search term.",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: "roles",
|
|
31
|
+
type: "array",
|
|
32
|
+
items: { type: "string" },
|
|
33
|
+
description: "Limit results to users with specific roles.",
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
handler: this.handleListUsers.bind(this),
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: "wp_get_user",
|
|
40
|
+
description: "Retrieves a single user by their ID.",
|
|
41
|
+
parameters: [
|
|
42
|
+
{
|
|
43
|
+
name: "id",
|
|
44
|
+
type: "number",
|
|
45
|
+
required: true,
|
|
46
|
+
description: "The unique identifier for the user.",
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
handler: this.handleGetUser.bind(this),
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: "wp_get_current_user",
|
|
53
|
+
description: "Retrieves the currently authenticated user.",
|
|
54
|
+
parameters: [],
|
|
55
|
+
handler: this.handleGetCurrentUser.bind(this),
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: "wp_create_user",
|
|
59
|
+
description: "Creates a new user.",
|
|
60
|
+
parameters: [
|
|
61
|
+
{
|
|
62
|
+
name: "username",
|
|
63
|
+
type: "string",
|
|
64
|
+
required: true,
|
|
65
|
+
description: "The username for the new user.",
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: "email",
|
|
69
|
+
type: "string",
|
|
70
|
+
required: true,
|
|
71
|
+
description: "The email address for the new user.",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: "password",
|
|
75
|
+
type: "string",
|
|
76
|
+
required: true,
|
|
77
|
+
description: "The password for the new user.",
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: "roles",
|
|
81
|
+
type: "array",
|
|
82
|
+
items: { type: "string" },
|
|
83
|
+
description: "An array of roles to assign to the user.",
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
handler: this.handleCreateUser.bind(this),
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: "wp_update_user",
|
|
90
|
+
description: "Updates an existing user.",
|
|
91
|
+
parameters: [
|
|
92
|
+
{
|
|
93
|
+
name: "id",
|
|
94
|
+
type: "number",
|
|
95
|
+
required: true,
|
|
96
|
+
description: "The ID of the user to update.",
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: "email",
|
|
100
|
+
type: "string",
|
|
101
|
+
description: "The new email address for the user.",
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: "name",
|
|
105
|
+
type: "string",
|
|
106
|
+
description: "The new display name for the user.",
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
handler: this.handleUpdateUser.bind(this),
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: "wp_delete_user",
|
|
113
|
+
description: "Deletes a user.",
|
|
114
|
+
parameters: [
|
|
115
|
+
{
|
|
116
|
+
name: "id",
|
|
117
|
+
type: "number",
|
|
118
|
+
required: true,
|
|
119
|
+
description: "The ID of the user to delete.",
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: "reassign",
|
|
123
|
+
type: "number",
|
|
124
|
+
description:
|
|
125
|
+
"The ID of a user to reassign the deleted user's content to.",
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
handler: this.handleDeleteUser.bind(this),
|
|
129
|
+
},
|
|
130
|
+
];
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
public async handleListUsers(
|
|
134
|
+
client: WordPressClient,
|
|
135
|
+
params: UserQueryParams,
|
|
136
|
+
): Promise<any> {
|
|
137
|
+
try {
|
|
138
|
+
const users = await client.getUsers(params);
|
|
139
|
+
if (users.length === 0) {
|
|
140
|
+
return "No users found matching the criteria.";
|
|
141
|
+
}
|
|
142
|
+
const content =
|
|
143
|
+
`Found ${users.length} users:\n\n` +
|
|
144
|
+
users
|
|
145
|
+
.map(
|
|
146
|
+
(u) =>
|
|
147
|
+
`- ID ${u.id}: **${u.name}** (@${u.slug}) - ${u.email}\n Roles: ${u.roles?.join(", ") || "N/A"}`,
|
|
148
|
+
)
|
|
149
|
+
.join("\n");
|
|
150
|
+
return content;
|
|
151
|
+
} catch (error) {
|
|
152
|
+
throw new Error(`Failed to list users: ${getErrorMessage(error)}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
public async handleGetUser(
|
|
157
|
+
client: WordPressClient,
|
|
158
|
+
params: { id: number },
|
|
159
|
+
): Promise<any> {
|
|
160
|
+
try {
|
|
161
|
+
const user = await client.getUser(params.id);
|
|
162
|
+
const content =
|
|
163
|
+
`**User Details (ID: ${user.id})**\n\n` +
|
|
164
|
+
`- **Name:** ${user.name}\n` +
|
|
165
|
+
`- **Username:** ${user.slug}\n` +
|
|
166
|
+
`- **Email:** ${user.email}\n` +
|
|
167
|
+
`- **Roles:** ${user.roles?.join(", ") || "N/A"}`;
|
|
168
|
+
return content;
|
|
169
|
+
} catch (error) {
|
|
170
|
+
throw new Error(`Failed to get user: ${getErrorMessage(error)}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
public async handleGetCurrentUser(
|
|
175
|
+
client: WordPressClient,
|
|
176
|
+
params: any,
|
|
177
|
+
): Promise<any> {
|
|
178
|
+
try {
|
|
179
|
+
const user = await client.getCurrentUser();
|
|
180
|
+
const content =
|
|
181
|
+
`**Current User Details (ID: ${user.id})**\n\n` +
|
|
182
|
+
`- **Name:** ${user.name}\n` +
|
|
183
|
+
`- **Username:** ${user.slug}\n` +
|
|
184
|
+
`- **Email:** ${user.email}\n` +
|
|
185
|
+
`- **Roles:** ${user.roles?.join(", ") || "N/A"}`;
|
|
186
|
+
return content;
|
|
187
|
+
} catch (error) {
|
|
188
|
+
throw new Error(`Failed to get current user: ${getErrorMessage(error)}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
public async handleCreateUser(
|
|
193
|
+
client: WordPressClient,
|
|
194
|
+
params: CreateUserRequest,
|
|
195
|
+
): Promise<any> {
|
|
196
|
+
try {
|
|
197
|
+
const user = await client.createUser(params);
|
|
198
|
+
return `✅ User "${user.name}" created successfully with ID: ${user.id}.`;
|
|
199
|
+
} catch (error) {
|
|
200
|
+
throw new Error(`Failed to create user: ${getErrorMessage(error)}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
public async handleUpdateUser(
|
|
205
|
+
client: WordPressClient,
|
|
206
|
+
params: UpdateUserRequest & { id: number },
|
|
207
|
+
): Promise<any> {
|
|
208
|
+
try {
|
|
209
|
+
const user = await client.updateUser(params);
|
|
210
|
+
return `✅ User ${user.id} updated successfully.`;
|
|
211
|
+
} catch (error) {
|
|
212
|
+
throw new Error(`Failed to update user: ${getErrorMessage(error)}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
public async handleDeleteUser(
|
|
217
|
+
client: WordPressClient,
|
|
218
|
+
params: { id: number; reassign?: number },
|
|
219
|
+
): Promise<any> {
|
|
220
|
+
try {
|
|
221
|
+
await client.deleteUser(params.id, params.reassign);
|
|
222
|
+
let content = `✅ User ${params.id} has been deleted.`;
|
|
223
|
+
if (params.reassign) {
|
|
224
|
+
content += ` Their content has been reassigned to user ID ${params.reassign}.`;
|
|
225
|
+
}
|
|
226
|
+
return content;
|
|
227
|
+
} catch (error) {
|
|
228
|
+
throw new Error(`Failed to delete user: ${getErrorMessage(error)}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export default UserTools;
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress API Client Types
|
|
3
|
+
*
|
|
4
|
+
* TypeScript definitions for the WordPress REST API client
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
WordPressPost,
|
|
9
|
+
WordPressPage,
|
|
10
|
+
WordPressMedia,
|
|
11
|
+
WordPressUser,
|
|
12
|
+
WordPressComment,
|
|
13
|
+
WordPressCategory,
|
|
14
|
+
WordPressTag,
|
|
15
|
+
WordPressSiteSettings,
|
|
16
|
+
WordPressApplicationPassword,
|
|
17
|
+
PostQueryParams,
|
|
18
|
+
MediaQueryParams,
|
|
19
|
+
UserQueryParams,
|
|
20
|
+
CommentQueryParams,
|
|
21
|
+
CreatePostRequest,
|
|
22
|
+
UpdatePostRequest,
|
|
23
|
+
CreatePageRequest,
|
|
24
|
+
UpdatePageRequest,
|
|
25
|
+
CreateUserRequest,
|
|
26
|
+
UpdateUserRequest,
|
|
27
|
+
CreateCommentRequest,
|
|
28
|
+
UpdateCommentRequest,
|
|
29
|
+
CreateCategoryRequest,
|
|
30
|
+
UpdateCategoryRequest,
|
|
31
|
+
CreateTagRequest,
|
|
32
|
+
UpdateTagRequest,
|
|
33
|
+
UploadMediaRequest,
|
|
34
|
+
UpdateMediaRequest
|
|
35
|
+
} from './wordpress.js';
|
|
36
|
+
|
|
37
|
+
// Authentication Configuration
|
|
38
|
+
export type AuthMethod = 'app-password' | 'jwt' | 'basic' | 'api-key' | 'cookie';
|
|
39
|
+
|
|
40
|
+
export interface AuthConfig {
|
|
41
|
+
method: AuthMethod;
|
|
42
|
+
username?: string;
|
|
43
|
+
password?: string;
|
|
44
|
+
appPassword?: string;
|
|
45
|
+
apiKey?: string;
|
|
46
|
+
secret?: string;
|
|
47
|
+
nonce?: string;
|
|
48
|
+
token?: string;
|
|
49
|
+
clientId?: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Client Configuration
|
|
53
|
+
export interface WordPressClientConfig {
|
|
54
|
+
baseUrl: string;
|
|
55
|
+
auth: AuthConfig;
|
|
56
|
+
timeout?: number;
|
|
57
|
+
maxRetries?: number;
|
|
58
|
+
userAgent?: string;
|
|
59
|
+
headers?: Record<string, string>;
|
|
60
|
+
rateLimit?: {
|
|
61
|
+
requestsPerMinute: number;
|
|
62
|
+
burstLimit: number;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// HTTP Method Types
|
|
67
|
+
export type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
68
|
+
|
|
69
|
+
// Request Options
|
|
70
|
+
export interface RequestOptions {
|
|
71
|
+
headers?: Record<string, string>;
|
|
72
|
+
timeout?: number;
|
|
73
|
+
retries?: number;
|
|
74
|
+
signal?: AbortSignal;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// API Response Wrapper
|
|
78
|
+
export interface APIResponse<T = any> {
|
|
79
|
+
data: T;
|
|
80
|
+
status: number;
|
|
81
|
+
statusText: string;
|
|
82
|
+
headers: Record<string, string>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Rate Limiting
|
|
86
|
+
export interface RateLimit {
|
|
87
|
+
limit: number;
|
|
88
|
+
remaining: number;
|
|
89
|
+
reset: number;
|
|
90
|
+
window: number;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Client Statistics
|
|
94
|
+
export interface ClientStats {
|
|
95
|
+
totalRequests: number;
|
|
96
|
+
successfulRequests: number;
|
|
97
|
+
failedRequests: number;
|
|
98
|
+
averageResponseTime: number;
|
|
99
|
+
lastRequestTime?: number;
|
|
100
|
+
rateLimitHits: number;
|
|
101
|
+
authFailures: number;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// WordPress API Client Interface
|
|
105
|
+
export interface IWordPressClient {
|
|
106
|
+
// Configuration
|
|
107
|
+
readonly config: WordPressClientConfig;
|
|
108
|
+
readonly isAuthenticated: boolean;
|
|
109
|
+
readonly stats: ClientStats;
|
|
110
|
+
|
|
111
|
+
// Core Methods
|
|
112
|
+
initialize(): Promise<void>;
|
|
113
|
+
authenticate(): Promise<boolean>;
|
|
114
|
+
disconnect(): Promise<void>;
|
|
115
|
+
|
|
116
|
+
// Generic HTTP Methods
|
|
117
|
+
request<T = any>(method: HTTPMethod, endpoint: string, data?: any, options?: RequestOptions): Promise<T>;
|
|
118
|
+
get<T = any>(endpoint: string, options?: RequestOptions): Promise<T>;
|
|
119
|
+
post<T = any>(endpoint: string, data?: any, options?: RequestOptions): Promise<T>;
|
|
120
|
+
put<T = any>(endpoint: string, data?: any, options?: RequestOptions): Promise<T>;
|
|
121
|
+
patch<T = any>(endpoint: string, data?: any, options?: RequestOptions): Promise<T>;
|
|
122
|
+
delete<T = any>(endpoint: string, options?: RequestOptions): Promise<T>;
|
|
123
|
+
|
|
124
|
+
// Posts
|
|
125
|
+
getPosts(params?: PostQueryParams): Promise<WordPressPost[]>;
|
|
126
|
+
getPost(id: number, context?: 'view' | 'embed' | 'edit'): Promise<WordPressPost>;
|
|
127
|
+
createPost(data: CreatePostRequest): Promise<WordPressPost>;
|
|
128
|
+
updatePost(data: UpdatePostRequest): Promise<WordPressPost>;
|
|
129
|
+
deletePost(id: number, force?: boolean): Promise<{ deleted: boolean; previous?: WordPressPost }>;
|
|
130
|
+
getPostRevisions(id: number): Promise<WordPressPost[]>;
|
|
131
|
+
|
|
132
|
+
// Pages
|
|
133
|
+
getPages(params?: PostQueryParams): Promise<WordPressPage[]>;
|
|
134
|
+
getPage(id: number, context?: 'view' | 'embed' | 'edit'): Promise<WordPressPage>;
|
|
135
|
+
createPage(data: CreatePageRequest): Promise<WordPressPage>;
|
|
136
|
+
updatePage(data: UpdatePageRequest): Promise<WordPressPage>;
|
|
137
|
+
deletePage(id: number, force?: boolean): Promise<{ deleted: boolean; previous?: WordPressPage }>;
|
|
138
|
+
getPageRevisions(id: number): Promise<WordPressPage[]>;
|
|
139
|
+
|
|
140
|
+
// Media
|
|
141
|
+
getMedia(params?: MediaQueryParams): Promise<WordPressMedia[]>;
|
|
142
|
+
getMediaItem(id: number, context?: 'view' | 'embed' | 'edit'): Promise<WordPressMedia>;
|
|
143
|
+
uploadMedia(data: UploadMediaRequest): Promise<WordPressMedia>;
|
|
144
|
+
uploadFile(fileData: Buffer, filename: string, mimeType: string, meta?: Partial<UploadMediaRequest>, options?: RequestOptions): Promise<WordPressMedia>;
|
|
145
|
+
updateMedia(data: UpdateMediaRequest): Promise<WordPressMedia>;
|
|
146
|
+
deleteMedia(id: number, force?: boolean): Promise<{ deleted: boolean; previous?: WordPressMedia }>;
|
|
147
|
+
|
|
148
|
+
// Users
|
|
149
|
+
getUsers(params?: UserQueryParams): Promise<WordPressUser[]>;
|
|
150
|
+
getUser(id: number | 'me', context?: 'view' | 'embed' | 'edit'): Promise<WordPressUser>;
|
|
151
|
+
createUser(data: CreateUserRequest): Promise<WordPressUser>;
|
|
152
|
+
updateUser(data: UpdateUserRequest): Promise<WordPressUser>;
|
|
153
|
+
deleteUser(id: number, reassign?: number): Promise<{ deleted: boolean; previous?: WordPressUser }>;
|
|
154
|
+
getCurrentUser(): Promise<WordPressUser>;
|
|
155
|
+
|
|
156
|
+
// Comments
|
|
157
|
+
getComments(params?: CommentQueryParams): Promise<WordPressComment[]>;
|
|
158
|
+
getComment(id: number, context?: 'view' | 'embed' | 'edit'): Promise<WordPressComment>;
|
|
159
|
+
createComment(data: CreateCommentRequest): Promise<WordPressComment>;
|
|
160
|
+
updateComment(data: UpdateCommentRequest): Promise<WordPressComment>;
|
|
161
|
+
deleteComment(id: number, force?: boolean): Promise<{ deleted: boolean; previous?: WordPressComment }>;
|
|
162
|
+
approveComment(id: number): Promise<WordPressComment>;
|
|
163
|
+
rejectComment(id: number): Promise<WordPressComment>;
|
|
164
|
+
spamComment(id: number): Promise<WordPressComment>;
|
|
165
|
+
|
|
166
|
+
// Taxonomies
|
|
167
|
+
getCategories(params?: { search?: string; exclude?: number[]; include?: number[]; order?: 'asc' | 'desc'; orderby?: string; hide_empty?: boolean; parent?: number; post?: number; slug?: string }): Promise<WordPressCategory[]>;
|
|
168
|
+
getCategory(id: number): Promise<WordPressCategory>;
|
|
169
|
+
createCategory(data: CreateCategoryRequest): Promise<WordPressCategory>;
|
|
170
|
+
updateCategory(data: UpdateCategoryRequest): Promise<WordPressCategory>;
|
|
171
|
+
deleteCategory(id: number, force?: boolean): Promise<{ deleted: boolean; previous?: WordPressCategory }>;
|
|
172
|
+
|
|
173
|
+
getTags(params?: { search?: string; exclude?: number[]; include?: number[]; order?: 'asc' | 'desc'; orderby?: string; hide_empty?: boolean; post?: number; slug?: string }): Promise<WordPressTag[]>;
|
|
174
|
+
getTag(id: number): Promise<WordPressTag>;
|
|
175
|
+
createTag(data: CreateTagRequest): Promise<WordPressTag>;
|
|
176
|
+
updateTag(data: UpdateTagRequest): Promise<WordPressTag>;
|
|
177
|
+
deleteTag(id: number, force?: boolean): Promise<{ deleted: boolean; previous?: WordPressTag }>;
|
|
178
|
+
|
|
179
|
+
// Site Management
|
|
180
|
+
getSiteSettings(): Promise<WordPressSiteSettings>;
|
|
181
|
+
updateSiteSettings(settings: Partial<WordPressSiteSettings>): Promise<WordPressSiteSettings>;
|
|
182
|
+
getSiteInfo(): Promise<{
|
|
183
|
+
name: string;
|
|
184
|
+
description: string;
|
|
185
|
+
url: string;
|
|
186
|
+
home: string;
|
|
187
|
+
gmt_offset: number;
|
|
188
|
+
timezone_string: string;
|
|
189
|
+
namespaces: string[];
|
|
190
|
+
authentication: Record<string, any>;
|
|
191
|
+
routes: Record<string, any>;
|
|
192
|
+
}>;
|
|
193
|
+
|
|
194
|
+
// Application Passwords
|
|
195
|
+
getApplicationPasswords(userId?: number | 'me'): Promise<WordPressApplicationPassword[]>;
|
|
196
|
+
createApplicationPassword(userId: number | 'me', name: string, appId?: string): Promise<WordPressApplicationPassword>;
|
|
197
|
+
deleteApplicationPassword(userId: number | 'me', uuid: string): Promise<{ deleted: boolean }>;
|
|
198
|
+
|
|
199
|
+
// Search
|
|
200
|
+
search(query: string, types?: string[], subtype?: string): Promise<Array<{
|
|
201
|
+
id: number;
|
|
202
|
+
title: string;
|
|
203
|
+
url: string;
|
|
204
|
+
type: string;
|
|
205
|
+
subtype: string;
|
|
206
|
+
}>>;
|
|
207
|
+
|
|
208
|
+
// Utility Methods
|
|
209
|
+
ping(): Promise<boolean>;
|
|
210
|
+
getServerInfo(): Promise<Record<string, any>>;
|
|
211
|
+
validateEndpoint(endpoint: string): boolean;
|
|
212
|
+
buildUrl(endpoint: string, params?: Record<string, any>): string;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Authentication Provider Interface
|
|
216
|
+
export interface IAuthProvider {
|
|
217
|
+
readonly method: AuthMethod;
|
|
218
|
+
authenticate(client: IWordPressClient): Promise<boolean>;
|
|
219
|
+
addAuthHeaders(headers: Record<string, string>): void;
|
|
220
|
+
refreshAuth?(): Promise<boolean>;
|
|
221
|
+
validateAuth?(): Promise<boolean>;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Error Types
|
|
225
|
+
export class WordPressAPIError extends Error {
|
|
226
|
+
public readonly statusCode?: number;
|
|
227
|
+
public readonly code?: string;
|
|
228
|
+
public data?: any;
|
|
229
|
+
|
|
230
|
+
constructor(
|
|
231
|
+
message: string,
|
|
232
|
+
statusCode?: number,
|
|
233
|
+
code?: string,
|
|
234
|
+
data?: any
|
|
235
|
+
) {
|
|
236
|
+
super(message);
|
|
237
|
+
this.name = 'WordPressAPIError';
|
|
238
|
+
if (statusCode !== undefined) this.statusCode = statusCode;
|
|
239
|
+
if (code !== undefined) this.code = code;
|
|
240
|
+
if (data !== undefined) this.data = data;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export class AuthenticationError extends WordPressAPIError {
|
|
245
|
+
constructor(message: string, method: AuthMethod) {
|
|
246
|
+
super(message, 401, 'authentication_failed');
|
|
247
|
+
this.name = 'AuthenticationError';
|
|
248
|
+
this.data = { method };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export class RateLimitError extends WordPressAPIError {
|
|
253
|
+
constructor(message: string, resetTime: number) {
|
|
254
|
+
super(message, 429, 'rate_limit_exceeded');
|
|
255
|
+
this.name = 'RateLimitError';
|
|
256
|
+
this.data = { resetTime };
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
export class ValidationError extends WordPressAPIError {
|
|
261
|
+
constructor(message: string, field?: string) {
|
|
262
|
+
super(message, 400, 'validation_failed');
|
|
263
|
+
this.name = 'ValidationError';
|
|
264
|
+
this.data = { field };
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Type Guards
|
|
269
|
+
export function isWordPressAPIError(error: any): error is WordPressAPIError {
|
|
270
|
+
return error instanceof WordPressAPIError;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
export function isAuthenticationError(error: any): error is AuthenticationError {
|
|
274
|
+
return error instanceof AuthenticationError;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
export function isRateLimitError(error: any): error is RateLimitError {
|
|
278
|
+
return error instanceof RateLimitError;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
export function isValidationError(error: any): error is ValidationError {
|
|
282
|
+
return error instanceof ValidationError;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Response Type Guards
|
|
286
|
+
export function isWordPressPost(obj: any): obj is WordPressPost {
|
|
287
|
+
return obj && typeof obj.id === 'number' && obj.type === 'post';
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
export function isWordPressPage(obj: any): obj is WordPressPage {
|
|
291
|
+
return obj && typeof obj.id === 'number' && obj.type === 'page';
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
export function isWordPressMedia(obj: any): obj is WordPressMedia {
|
|
295
|
+
return obj && typeof obj.id === 'number' && obj.media_type;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
export function isWordPressUser(obj: any): obj is WordPressUser {
|
|
299
|
+
return obj && typeof obj.id === 'number' && obj.username;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
export function isWordPressComment(obj: any): obj is WordPressComment {
|
|
303
|
+
return obj && typeof obj.id === 'number' && typeof obj.post === 'number';
|
|
304
|
+
}
|