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.
Files changed (134) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +568 -0
  3. package/bin/mcp-wordpress.js +12 -0
  4. package/bin/setup.js +302 -0
  5. package/bin/status.js +359 -0
  6. package/dist/client/WordPressClient.d.ts +81 -0
  7. package/dist/client/WordPressClient.d.ts.map +1 -0
  8. package/dist/client/WordPressClient.js +354 -0
  9. package/dist/client/WordPressClient.js.map +1 -0
  10. package/dist/client/api.d.ts +140 -0
  11. package/dist/client/api.d.ts.map +1 -0
  12. package/dist/client/api.js +727 -0
  13. package/dist/client/api.js.map +1 -0
  14. package/dist/client/auth.d.ts +121 -0
  15. package/dist/client/auth.d.ts.map +1 -0
  16. package/dist/client/auth.js +430 -0
  17. package/dist/client/auth.js.map +1 -0
  18. package/dist/client/managers/AuthenticationManager.d.ts +39 -0
  19. package/dist/client/managers/AuthenticationManager.d.ts.map +1 -0
  20. package/dist/client/managers/AuthenticationManager.js +159 -0
  21. package/dist/client/managers/AuthenticationManager.js.map +1 -0
  22. package/dist/client/managers/BaseManager.d.ts +22 -0
  23. package/dist/client/managers/BaseManager.d.ts.map +1 -0
  24. package/dist/client/managers/BaseManager.js +47 -0
  25. package/dist/client/managers/BaseManager.js.map +1 -0
  26. package/dist/client/managers/RequestManager.d.ts +45 -0
  27. package/dist/client/managers/RequestManager.d.ts.map +1 -0
  28. package/dist/client/managers/RequestManager.js +161 -0
  29. package/dist/client/managers/RequestManager.js.map +1 -0
  30. package/dist/client/managers/index.d.ts +8 -0
  31. package/dist/client/managers/index.d.ts.map +1 -0
  32. package/dist/client/managers/index.js +8 -0
  33. package/dist/client/managers/index.js.map +1 -0
  34. package/dist/index.d.ts +19 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +264 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/server.d.ts +7 -0
  39. package/dist/server.d.ts.map +1 -0
  40. package/dist/server.js +7 -0
  41. package/dist/server.js.map +1 -0
  42. package/dist/tools/auth.d.ts +44 -0
  43. package/dist/tools/auth.d.ts.map +1 -0
  44. package/dist/tools/auth.js +126 -0
  45. package/dist/tools/auth.js.map +1 -0
  46. package/dist/tools/base.d.ts +37 -0
  47. package/dist/tools/base.d.ts.map +1 -0
  48. package/dist/tools/base.js +60 -0
  49. package/dist/tools/base.js.map +1 -0
  50. package/dist/tools/comments.d.ts +33 -0
  51. package/dist/tools/comments.d.ts.map +1 -0
  52. package/dist/tools/comments.js +228 -0
  53. package/dist/tools/comments.js.map +1 -0
  54. package/dist/tools/index.d.ts +9 -0
  55. package/dist/tools/index.d.ts.map +1 -0
  56. package/dist/tools/index.js +9 -0
  57. package/dist/tools/index.js.map +1 -0
  58. package/dist/tools/media.d.ts +29 -0
  59. package/dist/tools/media.d.ts.map +1 -0
  60. package/dist/tools/media.js +208 -0
  61. package/dist/tools/media.js.map +1 -0
  62. package/dist/tools/pages.d.ts +30 -0
  63. package/dist/tools/pages.d.ts.map +1 -0
  64. package/dist/tools/pages.js +211 -0
  65. package/dist/tools/pages.js.map +1 -0
  66. package/dist/tools/posts.d.ts +30 -0
  67. package/dist/tools/posts.d.ts.map +1 -0
  68. package/dist/tools/posts.js +240 -0
  69. package/dist/tools/posts.js.map +1 -0
  70. package/dist/tools/site.d.ts +31 -0
  71. package/dist/tools/site.d.ts.map +1 -0
  72. package/dist/tools/site.js +192 -0
  73. package/dist/tools/site.js.map +1 -0
  74. package/dist/tools/taxonomies.d.ts +37 -0
  75. package/dist/tools/taxonomies.d.ts.map +1 -0
  76. package/dist/tools/taxonomies.js +280 -0
  77. package/dist/tools/taxonomies.js.map +1 -0
  78. package/dist/tools/users.d.ts +28 -0
  79. package/dist/tools/users.d.ts.map +1 -0
  80. package/dist/tools/users.js +201 -0
  81. package/dist/tools/users.js.map +1 -0
  82. package/dist/types/client.d.ts +215 -0
  83. package/dist/types/client.d.ts.map +1 -0
  84. package/dist/types/client.js +72 -0
  85. package/dist/types/client.js.map +1 -0
  86. package/dist/types/index.d.ts +157 -0
  87. package/dist/types/index.d.ts.map +1 -0
  88. package/dist/types/index.js +12 -0
  89. package/dist/types/index.js.map +1 -0
  90. package/dist/types/mcp.d.ts +178 -0
  91. package/dist/types/mcp.d.ts.map +1 -0
  92. package/dist/types/mcp.js +7 -0
  93. package/dist/types/mcp.js.map +1 -0
  94. package/dist/types/wordpress.d.ts +443 -0
  95. package/dist/types/wordpress.d.ts.map +1 -0
  96. package/dist/types/wordpress.js +7 -0
  97. package/dist/types/wordpress.js.map +1 -0
  98. package/dist/utils/debug.d.ts +63 -0
  99. package/dist/utils/debug.d.ts.map +1 -0
  100. package/dist/utils/debug.js +195 -0
  101. package/dist/utils/debug.js.map +1 -0
  102. package/dist/utils/error.d.ts +19 -0
  103. package/dist/utils/error.d.ts.map +1 -0
  104. package/dist/utils/error.js +71 -0
  105. package/dist/utils/error.js.map +1 -0
  106. package/dist/utils/toolWrapper.d.ts +36 -0
  107. package/dist/utils/toolWrapper.d.ts.map +1 -0
  108. package/dist/utils/toolWrapper.js +90 -0
  109. package/dist/utils/toolWrapper.js.map +1 -0
  110. package/package.json +115 -0
  111. package/src/client/api.ts +1043 -0
  112. package/src/client/auth.ts +527 -0
  113. package/src/client/managers/AuthenticationManager.ts +190 -0
  114. package/src/client/managers/BaseManager.ts +73 -0
  115. package/src/client/managers/RequestManager.ts +214 -0
  116. package/src/client/managers/index.ts +8 -0
  117. package/src/index.ts +337 -0
  118. package/src/server.ts +7 -0
  119. package/src/tools/auth.ts +153 -0
  120. package/src/tools/comments.ts +263 -0
  121. package/src/tools/index.ts +8 -0
  122. package/src/tools/media.ts +240 -0
  123. package/src/tools/pages.ts +246 -0
  124. package/src/tools/posts.ts +277 -0
  125. package/src/tools/site.ts +227 -0
  126. package/src/tools/taxonomies.ts +322 -0
  127. package/src/tools/users.ts +233 -0
  128. package/src/types/client.ts +304 -0
  129. package/src/types/index.ts +207 -0
  130. package/src/types/mcp.ts +247 -0
  131. package/src/types/wordpress.ts +491 -0
  132. package/src/utils/debug.ts +258 -0
  133. package/src/utils/error.ts +88 -0
  134. 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
+ }