@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.
Files changed (54) hide show
  1. package/README.md +170 -0
  2. package/dist/ai/engine.d.ts +12 -0
  3. package/dist/ai/engine.d.ts.map +1 -0
  4. package/dist/ai/engine.js +397 -0
  5. package/dist/ai/engine.js.map +1 -0
  6. package/dist/ai/prompts.d.ts +30 -0
  7. package/dist/ai/prompts.d.ts.map +1 -0
  8. package/dist/ai/prompts.js +207 -0
  9. package/dist/ai/prompts.js.map +1 -0
  10. package/dist/auth/context.d.ts +81 -0
  11. package/dist/auth/context.d.ts.map +1 -0
  12. package/dist/auth/context.js +68 -0
  13. package/dist/auth/context.js.map +1 -0
  14. package/dist/auth/validate.d.ts +13 -0
  15. package/dist/auth/validate.d.ts.map +1 -0
  16. package/dist/auth/validate.js +87 -0
  17. package/dist/auth/validate.js.map +1 -0
  18. package/dist/index.d.ts +22 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +78 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/tools/csv.d.ts +18 -0
  23. package/dist/tools/csv.d.ts.map +1 -0
  24. package/dist/tools/csv.js +673 -0
  25. package/dist/tools/csv.js.map +1 -0
  26. package/dist/tools/generation.d.ts +14 -0
  27. package/dist/tools/generation.d.ts.map +1 -0
  28. package/dist/tools/generation.js +291 -0
  29. package/dist/tools/generation.js.map +1 -0
  30. package/dist/tools/indexing.d.ts +11 -0
  31. package/dist/tools/indexing.d.ts.map +1 -0
  32. package/dist/tools/indexing.js +219 -0
  33. package/dist/tools/indexing.js.map +1 -0
  34. package/dist/tools/projects.d.ts +11 -0
  35. package/dist/tools/projects.d.ts.map +1 -0
  36. package/dist/tools/projects.js +181 -0
  37. package/dist/tools/projects.js.map +1 -0
  38. package/dist/tools/research.d.ts +12 -0
  39. package/dist/tools/research.d.ts.map +1 -0
  40. package/dist/tools/research.js +88 -0
  41. package/dist/tools/research.js.map +1 -0
  42. package/dist/tools/seo.d.ts +12 -0
  43. package/dist/tools/seo.d.ts.map +1 -0
  44. package/dist/tools/seo.js +164 -0
  45. package/dist/tools/seo.js.map +1 -0
  46. package/dist/tools/wordpress.d.ts +15 -0
  47. package/dist/tools/wordpress.d.ts.map +1 -0
  48. package/dist/tools/wordpress.js +447 -0
  49. package/dist/tools/wordpress.js.map +1 -0
  50. package/dist/types.d.ts +206 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +9 -0
  53. package/dist/types.js.map +1 -0
  54. 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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"}