@bulkpublishing/mcp-server 1.0.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 +170 -0
- package/dist/ai/engine.d.ts +12 -0
- package/dist/ai/engine.d.ts.map +1 -0
- package/dist/ai/engine.js +397 -0
- package/dist/ai/engine.js.map +1 -0
- package/dist/ai/prompts.d.ts +30 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +207 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/auth/context.d.ts +81 -0
- package/dist/auth/context.d.ts.map +1 -0
- package/dist/auth/context.js +68 -0
- package/dist/auth/context.js.map +1 -0
- package/dist/auth/validate.d.ts +13 -0
- package/dist/auth/validate.d.ts.map +1 -0
- package/dist/auth/validate.js +87 -0
- package/dist/auth/validate.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/csv.d.ts +18 -0
- package/dist/tools/csv.d.ts.map +1 -0
- package/dist/tools/csv.js +673 -0
- package/dist/tools/csv.js.map +1 -0
- package/dist/tools/generation.d.ts +14 -0
- package/dist/tools/generation.d.ts.map +1 -0
- package/dist/tools/generation.js +291 -0
- package/dist/tools/generation.js.map +1 -0
- package/dist/tools/indexing.d.ts +11 -0
- package/dist/tools/indexing.d.ts.map +1 -0
- package/dist/tools/indexing.js +219 -0
- package/dist/tools/indexing.js.map +1 -0
- package/dist/tools/projects.d.ts +11 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +181 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/research.d.ts +12 -0
- package/dist/tools/research.d.ts.map +1 -0
- package/dist/tools/research.js +88 -0
- package/dist/tools/research.js.map +1 -0
- package/dist/tools/seo.d.ts +12 -0
- package/dist/tools/seo.d.ts.map +1 -0
- package/dist/tools/seo.js +164 -0
- package/dist/tools/seo.js.map +1 -0
- package/dist/tools/wordpress.d.ts +15 -0
- package/dist/tools/wordpress.d.ts.map +1 -0
- package/dist/tools/wordpress.js +447 -0
- package/dist/tools/wordpress.js.map +1 -0
- package/dist/types.d.ts +206 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BPAI MCP Server — WordPress Publishing Tools
|
|
3
|
+
*
|
|
4
|
+
* MCP tool handlers for:
|
|
5
|
+
* - test_wp_connection: Test WordPress credentials and fetch site info
|
|
6
|
+
* - publish_to_wordpress: Publish a single article via REST API
|
|
7
|
+
* - publish_batch: Publish multiple articles with rate limiting
|
|
8
|
+
* - list_wp_categories: List WordPress categories
|
|
9
|
+
*
|
|
10
|
+
* WordPress credentials are loaded from the authenticated user's project settings.
|
|
11
|
+
* Users can override credentials inline if publishing to a different site.
|
|
12
|
+
*/
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import { getUserContext, getProjectSettings } from '../auth/context.js';
|
|
15
|
+
/**
|
|
16
|
+
* Resolve WordPress credentials from inline overrides or project settings.
|
|
17
|
+
*/
|
|
18
|
+
function resolveWpCredentials(args) {
|
|
19
|
+
let wpUrl = args.wp_url;
|
|
20
|
+
let wpUsername = args.wp_username;
|
|
21
|
+
let wpPassword = args.wp_app_password;
|
|
22
|
+
if (!wpUrl || !wpUsername || !wpPassword) {
|
|
23
|
+
const project = getProjectSettings(args.project_id);
|
|
24
|
+
const wpSettings = project?.settings?.wordpress;
|
|
25
|
+
if (wpSettings?.connected) {
|
|
26
|
+
wpUrl = wpUrl || wpSettings.siteUrl;
|
|
27
|
+
wpUsername = wpUsername || wpSettings.username;
|
|
28
|
+
wpPassword = wpPassword || wpSettings.appPassword;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return { wpUrl, wpUsername, wpPassword };
|
|
32
|
+
}
|
|
33
|
+
export function registerWordPressTools(server) {
|
|
34
|
+
// ============================================
|
|
35
|
+
// test_wp_connection
|
|
36
|
+
// ============================================
|
|
37
|
+
server.tool('test_wp_connection', 'Test your WordPress connection by verifying credentials and fetching site info, categories, and users. Use this before publishing to confirm everything is configured correctly.', {
|
|
38
|
+
project_id: z.string().optional().describe('Project ID (defaults to active project)'),
|
|
39
|
+
wp_url: z.string().optional().describe('Override: WordPress site URL'),
|
|
40
|
+
wp_username: z.string().optional().describe('Override: WordPress username'),
|
|
41
|
+
wp_app_password: z.string().optional().describe('Override: WordPress app password'),
|
|
42
|
+
}, async (args) => {
|
|
43
|
+
const ctx = getUserContext();
|
|
44
|
+
if (!ctx.authenticated) {
|
|
45
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: 'Not authenticated. Check your BPAI_API_KEY.' }, null, 2) }] };
|
|
46
|
+
}
|
|
47
|
+
const { wpUrl, wpUsername, wpPassword } = resolveWpCredentials(args);
|
|
48
|
+
if (!wpUrl || !wpUsername || !wpPassword) {
|
|
49
|
+
return {
|
|
50
|
+
content: [{
|
|
51
|
+
type: 'text', text: JSON.stringify({
|
|
52
|
+
error: 'WordPress connection not configured. Set up your WordPress connection in the BPAI web dashboard under Project Settings, or pass wp_url, wp_username, and wp_app_password inline.',
|
|
53
|
+
}, null, 2)
|
|
54
|
+
}],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const wpApiBase = `${wpUrl.replace(/\/$/, '')}/wp-json/wp/v2`;
|
|
58
|
+
const authToken = Buffer.from(`${wpUsername}:${wpPassword}`).toString('base64');
|
|
59
|
+
const authHeaders = {
|
|
60
|
+
'Content-Type': 'application/json',
|
|
61
|
+
'Authorization': `Basic ${authToken}`,
|
|
62
|
+
};
|
|
63
|
+
try {
|
|
64
|
+
// 1. Test auth by fetching posts with edit context
|
|
65
|
+
const authTest = await fetch(`${wpApiBase}/posts?per_page=1&context=edit`, {
|
|
66
|
+
method: 'GET',
|
|
67
|
+
headers: authHeaders,
|
|
68
|
+
});
|
|
69
|
+
if (!authTest.ok) {
|
|
70
|
+
let errorMessage;
|
|
71
|
+
if (authTest.status === 401) {
|
|
72
|
+
errorMessage = 'Invalid username or application password.';
|
|
73
|
+
}
|
|
74
|
+
else if (authTest.status === 403) {
|
|
75
|
+
errorMessage = 'Access forbidden. The WordPress user may not have publish capabilities.';
|
|
76
|
+
}
|
|
77
|
+
else if (authTest.status === 404) {
|
|
78
|
+
errorMessage = 'WordPress REST API not found. Is it enabled on this site?';
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
errorMessage = `Connection failed (${authTest.status}): ${authTest.statusText}`;
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
content: [{ type: 'text', text: JSON.stringify({ status: 'failed', error: errorMessage }, null, 2) }],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// 2. Fetch site info from /wp-json root
|
|
88
|
+
const siteInfoUrl = `${wpUrl.replace(/\/$/, '')}/wp-json`;
|
|
89
|
+
const siteResp = await fetch(siteInfoUrl).catch(() => null);
|
|
90
|
+
const siteInfo = siteResp?.ok ? await siteResp.json() : {};
|
|
91
|
+
// 3. Fetch categories
|
|
92
|
+
const catResp = await fetch(`${wpApiBase}/categories?per_page=100`, { headers: authHeaders });
|
|
93
|
+
const categories = catResp.ok ? (await catResp.json()).map((c) => ({
|
|
94
|
+
id: c.id, name: c.name, slug: c.slug, count: c.count,
|
|
95
|
+
})) : [];
|
|
96
|
+
// 4. Fetch users
|
|
97
|
+
const usersResp = await fetch(`${wpApiBase}/users?per_page=100`, { headers: authHeaders });
|
|
98
|
+
const users = usersResp.ok ? (await usersResp.json()).map((u) => ({
|
|
99
|
+
id: u.id, name: u.name, slug: u.slug,
|
|
100
|
+
})) : [];
|
|
101
|
+
return {
|
|
102
|
+
content: [{
|
|
103
|
+
type: 'text', text: JSON.stringify({
|
|
104
|
+
status: 'success',
|
|
105
|
+
site_name: siteInfo.name || wpUrl,
|
|
106
|
+
site_url: siteInfo.url || wpUrl,
|
|
107
|
+
wordpress_version: siteInfo.description ? undefined : undefined, // WP doesn't expose version in /wp-json by default
|
|
108
|
+
categories,
|
|
109
|
+
users,
|
|
110
|
+
}, null, 2)
|
|
111
|
+
}],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
return {
|
|
116
|
+
content: [{ type: 'text', text: JSON.stringify({ status: 'failed', error: `Could not connect to WordPress: ${error.message}` }, null, 2) }],
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
// ============================================
|
|
121
|
+
// publish_to_wordpress
|
|
122
|
+
// ============================================
|
|
123
|
+
server.tool('publish_to_wordpress', 'Publish a Markdown article to a WordPress site via REST API. WordPress credentials are loaded from your project settings. You can override them for one-off publishes to a different site.', {
|
|
124
|
+
title: z.string().describe('Post title'),
|
|
125
|
+
content: z.string().describe('Post content (Markdown or HTML)'),
|
|
126
|
+
status: z.enum(['publish', 'draft', 'pending']).default('draft').describe('Post status'),
|
|
127
|
+
category_ids: z.array(z.number()).optional().describe('WordPress category IDs'),
|
|
128
|
+
tag_ids: z.array(z.number()).optional().describe('WordPress tag IDs'),
|
|
129
|
+
slug: z.string().optional().describe('Custom URL slug'),
|
|
130
|
+
excerpt: z.string().optional().describe('Post excerpt / meta description'),
|
|
131
|
+
author_id: z.number().optional().describe('WordPress author ID'),
|
|
132
|
+
featured_media_id: z.number().optional().describe('Featured image media ID'),
|
|
133
|
+
project_id: z.string().optional().describe('Project ID (defaults to active project)'),
|
|
134
|
+
// Optional overrides (only needed if publishing to a site different from project settings)
|
|
135
|
+
wp_url: z.string().optional().describe('Override: WordPress site URL'),
|
|
136
|
+
wp_username: z.string().optional().describe('Override: WordPress username'),
|
|
137
|
+
wp_app_password: z.string().optional().describe('Override: WordPress app password'),
|
|
138
|
+
}, async (args) => {
|
|
139
|
+
const ctx = getUserContext();
|
|
140
|
+
if (!ctx.authenticated) {
|
|
141
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: 'Not authenticated. Check your BPAI_API_KEY.' }, null, 2) }] };
|
|
142
|
+
}
|
|
143
|
+
const { wpUrl, wpUsername, wpPassword } = resolveWpCredentials(args);
|
|
144
|
+
if (!wpUrl || !wpUsername || !wpPassword) {
|
|
145
|
+
return {
|
|
146
|
+
content: [{
|
|
147
|
+
type: 'text', text: JSON.stringify({
|
|
148
|
+
error: 'WordPress connection not configured. Set up your WordPress connection in the BPAI web dashboard under Project Settings, or pass wp_url, wp_username, and wp_app_password inline.',
|
|
149
|
+
}, null, 2)
|
|
150
|
+
}],
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const wpApiUrl = `${wpUrl.replace(/\/$/, '')}/wp-json/wp/v2/posts`;
|
|
154
|
+
const authToken = Buffer.from(`${wpUsername}:${wpPassword}`).toString('base64');
|
|
155
|
+
// Convert basic Markdown to HTML if content appears to be Markdown
|
|
156
|
+
let htmlContent = args.content;
|
|
157
|
+
if (args.content.includes('# ') || args.content.includes('## ')) {
|
|
158
|
+
htmlContent = markdownToBasicHTML(args.content);
|
|
159
|
+
}
|
|
160
|
+
const postData = {
|
|
161
|
+
title: args.title,
|
|
162
|
+
content: htmlContent,
|
|
163
|
+
status: args.status,
|
|
164
|
+
};
|
|
165
|
+
if (args.category_ids)
|
|
166
|
+
postData.categories = args.category_ids;
|
|
167
|
+
if (args.tag_ids)
|
|
168
|
+
postData.tags = args.tag_ids;
|
|
169
|
+
if (args.slug)
|
|
170
|
+
postData.slug = args.slug;
|
|
171
|
+
if (args.excerpt)
|
|
172
|
+
postData.excerpt = args.excerpt;
|
|
173
|
+
if (args.author_id)
|
|
174
|
+
postData.author = args.author_id;
|
|
175
|
+
if (args.featured_media_id)
|
|
176
|
+
postData.featured_media = args.featured_media_id;
|
|
177
|
+
try {
|
|
178
|
+
const response = await fetch(wpApiUrl, {
|
|
179
|
+
method: 'POST',
|
|
180
|
+
headers: {
|
|
181
|
+
'Content-Type': 'application/json',
|
|
182
|
+
'Authorization': `Basic ${authToken}`,
|
|
183
|
+
},
|
|
184
|
+
body: JSON.stringify(postData),
|
|
185
|
+
});
|
|
186
|
+
if (!response.ok) {
|
|
187
|
+
const errorText = await response.text();
|
|
188
|
+
let errorMessage;
|
|
189
|
+
if (response.status === 401) {
|
|
190
|
+
errorMessage = 'WordPress authentication failed. Verify your username and application password in Project Settings.';
|
|
191
|
+
}
|
|
192
|
+
else if (response.status === 403) {
|
|
193
|
+
errorMessage = 'Permission denied. The WordPress user may not have publish capabilities.';
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
errorMessage = `WordPress API error (${response.status}): ${errorText.substring(0, 500)}`;
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
content: [{
|
|
200
|
+
type: 'text', text: JSON.stringify({
|
|
201
|
+
error: errorMessage,
|
|
202
|
+
status_code: response.status,
|
|
203
|
+
}, null, 2)
|
|
204
|
+
}],
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
const data = await response.json();
|
|
208
|
+
return {
|
|
209
|
+
content: [{
|
|
210
|
+
type: 'text', text: JSON.stringify({
|
|
211
|
+
status: 'success',
|
|
212
|
+
post_id: data.id,
|
|
213
|
+
post_url: data.link,
|
|
214
|
+
post_status: data.status,
|
|
215
|
+
title: data.title?.rendered || args.title,
|
|
216
|
+
slug: data.slug,
|
|
217
|
+
}, null, 2)
|
|
218
|
+
}],
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
return {
|
|
223
|
+
content: [{
|
|
224
|
+
type: 'text', text: JSON.stringify({
|
|
225
|
+
error: `Failed to connect to WordPress: ${error.message}`,
|
|
226
|
+
}, null, 2)
|
|
227
|
+
}],
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
// ============================================
|
|
232
|
+
// publish_batch
|
|
233
|
+
// ============================================
|
|
234
|
+
server.tool('publish_batch', 'Publish multiple articles to WordPress sequentially with rate limiting. Each article needs a title and content. Returns per-article results showing success or failure.', {
|
|
235
|
+
articles: z.array(z.object({
|
|
236
|
+
title: z.string().describe('Post title'),
|
|
237
|
+
content: z.string().describe('Post content (Markdown or HTML)'),
|
|
238
|
+
status: z.enum(['publish', 'draft', 'pending']).optional().describe('Post status (defaults to draft)'),
|
|
239
|
+
slug: z.string().optional().describe('Custom URL slug'),
|
|
240
|
+
category_ids: z.array(z.number()).optional().describe('WordPress category IDs'),
|
|
241
|
+
tag_ids: z.array(z.number()).optional().describe('WordPress tag IDs'),
|
|
242
|
+
excerpt: z.string().optional().describe('Post excerpt / meta description'),
|
|
243
|
+
})).describe('Array of articles to publish'),
|
|
244
|
+
delay_seconds: z.number().default(3).describe('Delay between publishes in seconds (prevents server overload)'),
|
|
245
|
+
project_id: z.string().optional().describe('Project ID (defaults to active project)'),
|
|
246
|
+
wp_url: z.string().optional().describe('Override: WordPress site URL'),
|
|
247
|
+
wp_username: z.string().optional().describe('Override: WordPress username'),
|
|
248
|
+
wp_app_password: z.string().optional().describe('Override: WordPress app password'),
|
|
249
|
+
}, async (args) => {
|
|
250
|
+
const ctx = getUserContext();
|
|
251
|
+
if (!ctx.authenticated) {
|
|
252
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: 'Not authenticated. Check your BPAI_API_KEY.' }, null, 2) }] };
|
|
253
|
+
}
|
|
254
|
+
const { wpUrl, wpUsername, wpPassword } = resolveWpCredentials(args);
|
|
255
|
+
if (!wpUrl || !wpUsername || !wpPassword) {
|
|
256
|
+
return {
|
|
257
|
+
content: [{
|
|
258
|
+
type: 'text', text: JSON.stringify({
|
|
259
|
+
error: 'WordPress connection not configured. Set up your WordPress connection in the BPAI web dashboard under Project Settings, or pass wp_url, wp_username, and wp_app_password inline.',
|
|
260
|
+
}, null, 2)
|
|
261
|
+
}],
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
const wpApiUrl = `${wpUrl.replace(/\/$/, '')}/wp-json/wp/v2/posts`;
|
|
265
|
+
const authToken = Buffer.from(`${wpUsername}:${wpPassword}`).toString('base64');
|
|
266
|
+
const results = [];
|
|
267
|
+
let successCount = 0;
|
|
268
|
+
let failedCount = 0;
|
|
269
|
+
for (let i = 0; i < args.articles.length; i++) {
|
|
270
|
+
const article = args.articles[i];
|
|
271
|
+
// Rate limiting: wait between publishes (skip delay on first article)
|
|
272
|
+
if (i > 0 && args.delay_seconds > 0) {
|
|
273
|
+
await new Promise(resolve => setTimeout(resolve, args.delay_seconds * 1000));
|
|
274
|
+
}
|
|
275
|
+
// Convert basic Markdown to HTML if needed
|
|
276
|
+
let htmlContent = article.content;
|
|
277
|
+
if (article.content.includes('# ') || article.content.includes('## ')) {
|
|
278
|
+
htmlContent = markdownToBasicHTML(article.content);
|
|
279
|
+
}
|
|
280
|
+
const postData = {
|
|
281
|
+
title: article.title,
|
|
282
|
+
content: htmlContent,
|
|
283
|
+
status: article.status || 'draft',
|
|
284
|
+
};
|
|
285
|
+
if (article.category_ids)
|
|
286
|
+
postData.categories = article.category_ids;
|
|
287
|
+
if (article.tag_ids)
|
|
288
|
+
postData.tags = article.tag_ids;
|
|
289
|
+
if (article.slug)
|
|
290
|
+
postData.slug = article.slug;
|
|
291
|
+
if (article.excerpt)
|
|
292
|
+
postData.excerpt = article.excerpt;
|
|
293
|
+
try {
|
|
294
|
+
const response = await fetch(wpApiUrl, {
|
|
295
|
+
method: 'POST',
|
|
296
|
+
headers: {
|
|
297
|
+
'Content-Type': 'application/json',
|
|
298
|
+
'Authorization': `Basic ${authToken}`,
|
|
299
|
+
},
|
|
300
|
+
body: JSON.stringify(postData),
|
|
301
|
+
});
|
|
302
|
+
if (response.ok) {
|
|
303
|
+
const data = await response.json();
|
|
304
|
+
successCount++;
|
|
305
|
+
results.push({
|
|
306
|
+
title: article.title,
|
|
307
|
+
status: 'success',
|
|
308
|
+
post_id: data.id,
|
|
309
|
+
post_url: data.link,
|
|
310
|
+
post_status: data.status,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
const errorText = await response.text().catch(() => '');
|
|
315
|
+
failedCount++;
|
|
316
|
+
results.push({
|
|
317
|
+
title: article.title,
|
|
318
|
+
status: 'failed',
|
|
319
|
+
error: `WordPress API error (${response.status}): ${errorText.substring(0, 200)}`,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
failedCount++;
|
|
325
|
+
results.push({
|
|
326
|
+
title: article.title,
|
|
327
|
+
status: 'failed',
|
|
328
|
+
error: error.message,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
content: [{
|
|
334
|
+
type: 'text', text: JSON.stringify({
|
|
335
|
+
status: failedCount === 0 ? 'success' : (successCount === 0 ? 'failed' : 'partial'),
|
|
336
|
+
total: args.articles.length,
|
|
337
|
+
successful: successCount,
|
|
338
|
+
failed: failedCount,
|
|
339
|
+
results,
|
|
340
|
+
}, null, 2)
|
|
341
|
+
}],
|
|
342
|
+
};
|
|
343
|
+
});
|
|
344
|
+
// ============================================
|
|
345
|
+
// list_wp_categories
|
|
346
|
+
// ============================================
|
|
347
|
+
server.tool('list_wp_categories', 'List all categories from a WordPress site. WordPress credentials are loaded from your project settings.', {
|
|
348
|
+
project_id: z.string().optional().describe('Project ID (defaults to active project)'),
|
|
349
|
+
wp_url: z.string().optional().describe('Override: WordPress site URL'),
|
|
350
|
+
wp_username: z.string().optional().describe('Override: WordPress username'),
|
|
351
|
+
wp_app_password: z.string().optional().describe('Override: WordPress app password'),
|
|
352
|
+
}, async (args) => {
|
|
353
|
+
const ctx = getUserContext();
|
|
354
|
+
if (!ctx.authenticated) {
|
|
355
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: 'Not authenticated.' }, null, 2) }] };
|
|
356
|
+
}
|
|
357
|
+
const { wpUrl, wpUsername, wpPassword } = resolveWpCredentials(args);
|
|
358
|
+
if (!wpUrl) {
|
|
359
|
+
return {
|
|
360
|
+
content: [{
|
|
361
|
+
type: 'text', text: JSON.stringify({
|
|
362
|
+
error: 'WordPress connection not configured. Set up your WordPress connection in your project settings, or pass wp_url inline.',
|
|
363
|
+
}, null, 2)
|
|
364
|
+
}],
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
const url = `${wpUrl.replace(/\/$/, '')}/wp-json/wp/v2/categories?per_page=100`;
|
|
368
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
369
|
+
if (wpUsername && wpPassword) {
|
|
370
|
+
const authToken = Buffer.from(`${wpUsername}:${wpPassword}`).toString('base64');
|
|
371
|
+
headers['Authorization'] = `Basic ${authToken}`;
|
|
372
|
+
}
|
|
373
|
+
try {
|
|
374
|
+
const response = await fetch(url, { method: 'GET', headers });
|
|
375
|
+
if (!response.ok) {
|
|
376
|
+
return {
|
|
377
|
+
content: [{
|
|
378
|
+
type: 'text', text: JSON.stringify({
|
|
379
|
+
error: `WordPress API error (${response.status})`,
|
|
380
|
+
}, null, 2)
|
|
381
|
+
}],
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
const categories = await response.json();
|
|
385
|
+
return {
|
|
386
|
+
content: [{
|
|
387
|
+
type: 'text', text: JSON.stringify({
|
|
388
|
+
status: 'success',
|
|
389
|
+
count: categories.length,
|
|
390
|
+
categories: categories.map((c) => ({
|
|
391
|
+
id: c.id,
|
|
392
|
+
name: c.name,
|
|
393
|
+
slug: c.slug,
|
|
394
|
+
count: c.count,
|
|
395
|
+
parent: c.parent || null,
|
|
396
|
+
})),
|
|
397
|
+
}, null, 2)
|
|
398
|
+
}],
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
catch (error) {
|
|
402
|
+
return {
|
|
403
|
+
content: [{
|
|
404
|
+
type: 'text', text: JSON.stringify({
|
|
405
|
+
error: `Failed to connect to WordPress: ${error.message}`,
|
|
406
|
+
}, null, 2)
|
|
407
|
+
}],
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
// ============================================
|
|
413
|
+
// HELPERS
|
|
414
|
+
// ============================================
|
|
415
|
+
/**
|
|
416
|
+
* Basic Markdown-to-HTML converter for WordPress content publishing.
|
|
417
|
+
*/
|
|
418
|
+
function markdownToBasicHTML(markdown) {
|
|
419
|
+
let html = markdown;
|
|
420
|
+
html = html.replace(/^### (.+)$/gm, '<h3>$1</h3>');
|
|
421
|
+
html = html.replace(/^## (.+)$/gm, '<h2>$1</h2>');
|
|
422
|
+
html = html.replace(/^# (.+)$/gm, '<h1>$1</h1>');
|
|
423
|
+
html = html.replace(/\*\*\*(.+?)\*\*\*/g, '<strong><em>$1</em></strong>');
|
|
424
|
+
html = html.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>');
|
|
425
|
+
html = html.replace(/\*(.+?)\*/g, '<em>$1</em>');
|
|
426
|
+
html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
|
|
427
|
+
html = html.replace(/^- (.+)$/gm, '<li>$1</li>');
|
|
428
|
+
html = html.replace(/^\d+\.\s(.+)$/gm, '<li>$1</li>');
|
|
429
|
+
html = html.replace(/((?:<li>.+<\/li>\n?)+)/g, '<ul>\n$1</ul>\n');
|
|
430
|
+
html = html.replace(/^(?!<[hulo]|<li|<\/|<table|<t[hrd])(.+)$/gm, '<p>$1</p>');
|
|
431
|
+
html = html.replace(/\|(.+)\|\n\|[-| :]+\|\n((?:\|.+\|\n?)+)/g, (_, headerRow, bodyRows) => {
|
|
432
|
+
const headers = headerRow.split('|').map((h) => h.trim()).filter(Boolean);
|
|
433
|
+
const rows = bodyRows.trim().split('\n').map((row) => row.split('|').map((c) => c.trim()).filter(Boolean));
|
|
434
|
+
let table = '<table>\n<thead><tr>';
|
|
435
|
+
headers.forEach((h) => { table += `<th>${h}</th>`; });
|
|
436
|
+
table += '</tr></thead>\n<tbody>\n';
|
|
437
|
+
rows.forEach((row) => {
|
|
438
|
+
table += '<tr>';
|
|
439
|
+
row.forEach((c) => { table += `<td>${c}</td>`; });
|
|
440
|
+
table += '</tr>\n';
|
|
441
|
+
});
|
|
442
|
+
table += '</tbody></table>';
|
|
443
|
+
return table;
|
|
444
|
+
});
|
|
445
|
+
return html;
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=wordpress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wordpress.js","sourceRoot":"","sources":["../../src/tools/wordpress.ts"],"names":[],"mappings":"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"}
|