@bulkpublishing/mcp-server 1.0.5 → 1.1.1

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.
@@ -0,0 +1,427 @@
1
+ /**
2
+ * BPAI MCP Server — Linking Tools
3
+ *
4
+ * MCP tool handlers for:
5
+ * - fetch_sitemap: Fetch and parse XML sitemaps to discover linkable URLs
6
+ * - update_linking_settings: Configure internal/cross-linking for a project
7
+ *
8
+ * These tools close the gap where MCP users previously could not populate
9
+ * sitemapUrls or configure linking settings without the web dashboard.
10
+ *
11
+ * Settings are persisted to the database via the mcp-update-settings edge
12
+ * function, so changes survive server restarts and are visible in the web UI.
13
+ */
14
+ import { z } from 'zod';
15
+ import { getUserContext, getProjectSettings } from '../auth/context.js';
16
+ // ============================================
17
+ // CONSTANTS
18
+ // ============================================
19
+ const SETTINGS_ENDPOINT = process.env.BPAI_SETTINGS_URL || 'https://bulkpublishing.ai/api/mcp-update-settings';
20
+ // ============================================
21
+ // SITEMAP FETCHER (server-side, no CORS needed)
22
+ // ============================================
23
+ /**
24
+ * Recursively fetch all URLs from a sitemap, including nested sitemap indexes.
25
+ * Mirrors the logic in netlify/edge-functions/fetch-sitemap.ts but runs
26
+ * directly in the MCP server process (Node.js) so no edge function call needed.
27
+ */
28
+ export async function fetchAllSitemapUrls(sitemapUrl, visited = new Set()) {
29
+ if (visited.has(sitemapUrl))
30
+ return [];
31
+ visited.add(sitemapUrl);
32
+ // Cap recursion at 10 layers
33
+ if (visited.size > 10)
34
+ return [];
35
+ try {
36
+ const response = await fetch(sitemapUrl, {
37
+ headers: {
38
+ 'User-Agent': 'BulkPublishing-MCP/1.0 (+https://bulkpublishing.ai)',
39
+ 'Accept': 'application/xml, text/xml, */*',
40
+ },
41
+ signal: AbortSignal.timeout(15000), // 15s timeout per request
42
+ });
43
+ if (!response.ok) {
44
+ console.error(`[Sitemap] Failed to fetch ${sitemapUrl}: ${response.status}`);
45
+ return [];
46
+ }
47
+ const xml = await response.text();
48
+ // Check if this is a sitemap index (contains <sitemap> tags)
49
+ const isSitemapIndex = xml.includes('<sitemap>') || xml.includes('<sitemapindex');
50
+ if (isSitemapIndex) {
51
+ const nestedSitemapUrls = extractLocUrls(xml).filter(url => url.endsWith('.xml') || url.includes('sitemap'));
52
+ const allUrls = [];
53
+ for (const nestedUrl of nestedSitemapUrls.slice(0, 10)) {
54
+ const nestedUrls = await fetchAllSitemapUrls(nestedUrl, visited);
55
+ allUrls.push(...nestedUrls);
56
+ }
57
+ return allUrls;
58
+ }
59
+ else {
60
+ // Regular sitemap: extract page URLs, exclude .xml files
61
+ return extractLocUrls(xml).filter(url => !url.endsWith('.xml'));
62
+ }
63
+ }
64
+ catch (error) {
65
+ console.error(`[Sitemap] Error fetching ${sitemapUrl}:`, error.message);
66
+ return [];
67
+ }
68
+ }
69
+ /**
70
+ * Extract all <loc> URLs from XML content.
71
+ */
72
+ function extractLocUrls(xml) {
73
+ const urls = [];
74
+ const locRegex = /<loc>\s*([^<]+)\s*<\/loc>/gi;
75
+ let match;
76
+ while ((match = locRegex.exec(xml)) !== null) {
77
+ const url = match[1].trim();
78
+ if (url.startsWith('http://') || url.startsWith('https://')) {
79
+ urls.push(url);
80
+ }
81
+ }
82
+ return urls;
83
+ }
84
+ /**
85
+ * Filter URLs to exclude common non-content pages.
86
+ */
87
+ function filterContentUrls(urls) {
88
+ const excludePatterns = [
89
+ '/wp-admin/', '/wp-login', '/wp-content/',
90
+ '/login/', '/logout/', '/register/', '/signup/',
91
+ '/cart/', '/checkout/', '/account/', '/my-account/',
92
+ '/tag/', '/author/', '/category/', '/page/',
93
+ '/feed/', '/rss/', '/xmlrpc', '/wp-json/',
94
+ '/cdn-cgi/', '/.well-known/',
95
+ ];
96
+ const excludeExtensions = [
97
+ '.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg',
98
+ '.pdf', '.zip', '.css', '.js', '.woff', '.woff2',
99
+ ];
100
+ return urls.filter(url => {
101
+ const lower = url.toLowerCase();
102
+ if (excludePatterns.some(p => lower.includes(p)))
103
+ return false;
104
+ if (excludeExtensions.some(ext => lower.endsWith(ext)))
105
+ return false;
106
+ return true;
107
+ });
108
+ }
109
+ // ============================================
110
+ // PERMALINK PATTERN DETECTION
111
+ // ============================================
112
+ /**
113
+ * Analyze a pool of sitemap URLs to detect the most common permalink pattern.
114
+ * Returns the detected base path prefix used for content pages.
115
+ *
116
+ * Examples:
117
+ * URLs like /blog/my-post, /blog/another → detects "/blog"
118
+ * URLs like /2026/01/my-post → detects "/" (date-based, uses root)
119
+ * URLs like /resources/guides/my-post → detects "/resources/guides"
120
+ * URLs like /my-post, /another-post → detects "/" (flat/root structure)
121
+ */
122
+ export function detectPermalinkPattern(urls) {
123
+ if (!urls || urls.length === 0) {
124
+ return { basePath: '/', pattern: 'flat', confidence: 0, example: '' };
125
+ }
126
+ // Parse all URLs into their path components
127
+ const pathInfos = [];
128
+ for (const url of urls) {
129
+ try {
130
+ const parsed = new URL(url);
131
+ const parts = parsed.pathname.split('/').filter(Boolean);
132
+ pathInfos.push({ full: parsed.pathname, parts, depth: parts.length });
133
+ }
134
+ catch { /* skip invalid URLs */ }
135
+ }
136
+ if (pathInfos.length === 0) {
137
+ return { basePath: '/', pattern: 'flat', confidence: 0, example: '' };
138
+ }
139
+ // Check for date-based patterns (e.g., /2026/01/slug)
140
+ const datePattern = /^\d{4}$/;
141
+ const dateBasedCount = pathInfos.filter(p => p.parts.length >= 3 && datePattern.test(p.parts[0])).length;
142
+ if (dateBasedCount > pathInfos.length * 0.5) {
143
+ return {
144
+ basePath: '/',
145
+ pattern: 'date-based',
146
+ confidence: Math.round((dateBasedCount / pathInfos.length) * 100),
147
+ example: pathInfos.find(p => p.parts.length >= 3 && datePattern.test(p.parts[0]))?.full || '',
148
+ };
149
+ }
150
+ // Count first-level directory frequency
151
+ const dirCounts = new Map();
152
+ for (const p of pathInfos) {
153
+ if (p.parts.length >= 2) {
154
+ const dir = `/${p.parts[0]}`;
155
+ dirCounts.set(dir, (dirCounts.get(dir) || 0) + 1);
156
+ }
157
+ }
158
+ // Find the most common subdirectory
159
+ let topDir = '';
160
+ let topCount = 0;
161
+ for (const [dir, count] of dirCounts) {
162
+ if (count > topCount) {
163
+ topDir = dir;
164
+ topCount = count;
165
+ }
166
+ }
167
+ // Check for nested subdirectories (e.g., /resources/guides/slug)
168
+ if (topDir && topCount > pathInfos.length * 0.3) {
169
+ // Check if there's a consistent second level under this dir
170
+ const nestedCounts = new Map();
171
+ for (const p of pathInfos) {
172
+ if (p.parts.length >= 3 && `/${p.parts[0]}` === topDir) {
173
+ const nestedDir = `/${p.parts[0]}/${p.parts[1]}`;
174
+ nestedCounts.set(nestedDir, (nestedCounts.get(nestedDir) || 0) + 1);
175
+ }
176
+ }
177
+ let topNested = '';
178
+ let topNestedCount = 0;
179
+ for (const [dir, count] of nestedCounts) {
180
+ if (count > topNestedCount) {
181
+ topNested = dir;
182
+ topNestedCount = count;
183
+ }
184
+ }
185
+ // If a nested path holds >50% of the top dir's content, use it
186
+ if (topNested && topNestedCount > topCount * 0.5) {
187
+ return {
188
+ basePath: topNested,
189
+ pattern: 'nested',
190
+ confidence: Math.round((topNestedCount / pathInfos.length) * 100),
191
+ example: pathInfos.find(p => p.full.startsWith(topNested + '/'))?.full || '',
192
+ };
193
+ }
194
+ // Otherwise use the single subdirectory
195
+ return {
196
+ basePath: topDir,
197
+ pattern: 'subdirectory',
198
+ confidence: Math.round((topCount / pathInfos.length) * 100),
199
+ example: pathInfos.find(p => p.parts.length >= 2 && `/${p.parts[0]}` === topDir)?.full || '',
200
+ };
201
+ }
202
+ // Flat structure (most URLs are root-level, like /my-post)
203
+ const rootCount = pathInfos.filter(p => p.parts.length === 1).length;
204
+ return {
205
+ basePath: '/',
206
+ pattern: 'flat',
207
+ confidence: Math.round((rootCount / pathInfos.length) * 100),
208
+ example: pathInfos.find(p => p.parts.length === 1)?.full || pathInfos[0]?.full || '',
209
+ };
210
+ }
211
+ // ============================================
212
+ // DATABASE PERSISTENCE
213
+ // ============================================
214
+ /**
215
+ * Persist project settings back to the database via the edge function.
216
+ * Uses the same BPAI_API_KEY that the MCP server authenticated with.
217
+ */
218
+ async function persistProjectSettings(projectId, updates) {
219
+ const apiKey = process.env.BPAI_API_KEY;
220
+ if (!apiKey) {
221
+ return { success: false, error: 'No API key available for persistence' };
222
+ }
223
+ try {
224
+ const response = await fetch(SETTINGS_ENDPOINT, {
225
+ method: 'POST',
226
+ headers: {
227
+ 'Content-Type': 'application/json',
228
+ 'Authorization': `Bearer ${apiKey}`,
229
+ },
230
+ body: JSON.stringify({
231
+ project_id: projectId,
232
+ ...updates,
233
+ }),
234
+ signal: AbortSignal.timeout(10000),
235
+ });
236
+ if (!response.ok) {
237
+ const body = await response.json().catch(() => ({}));
238
+ return { success: false, error: body.error || `HTTP ${response.status}` };
239
+ }
240
+ return { success: true };
241
+ }
242
+ catch (err) {
243
+ console.error('[Linking] Persistence failed:', err.message);
244
+ return { success: false, error: err.message };
245
+ }
246
+ }
247
+ // ============================================
248
+ // REGISTER TOOLS
249
+ // ============================================
250
+ export function registerLinkingTools(server) {
251
+ // ============================================
252
+ // fetch_sitemap
253
+ // ============================================
254
+ server.tool('fetch_sitemap', 'Fetch and parse an XML sitemap to discover all linkable URLs on a site. Supports sitemap indexes (recursively resolves nested sitemaps). Returns the URL list and optionally saves it to the project\'s internal linking settings for use in article generation. When save_to_project is true, settings are persisted to the database and visible in the web dashboard.', {
255
+ sitemap_url: z.string().describe('Full URL to the XML sitemap (e.g., https://example.com/sitemap.xml)'),
256
+ save_to_project: z.boolean().optional().default(false).describe('If true, saves the discovered URLs to the active project\'s internal linking settings (persisted to database)'),
257
+ project_id: z.string().optional().describe('Project ID to save URLs to (defaults to active project)'),
258
+ filter_content: z.boolean().optional().default(true).describe('Filter out non-content pages (admin, login, media files, etc.)'),
259
+ }, async (args) => {
260
+ const ctx = getUserContext();
261
+ if (!ctx.authenticated) {
262
+ return { content: [{ type: 'text', text: JSON.stringify({ error: 'Not authenticated. Check your BPAI_API_KEY.' }, null, 2) }] };
263
+ }
264
+ // Validate URL
265
+ try {
266
+ const parsed = new URL(args.sitemap_url);
267
+ if (!['http:', 'https:'].includes(parsed.protocol)) {
268
+ throw new Error('Invalid protocol');
269
+ }
270
+ }
271
+ catch {
272
+ return {
273
+ content: [{
274
+ type: 'text', text: JSON.stringify({
275
+ error: 'Invalid sitemap URL. Must be a full HTTP/HTTPS URL (e.g., https://example.com/sitemap.xml)',
276
+ }, null, 2)
277
+ }],
278
+ };
279
+ }
280
+ // Fetch sitemap
281
+ const rawUrls = await fetchAllSitemapUrls(args.sitemap_url);
282
+ const uniqueUrls = [...new Set(rawUrls)];
283
+ const finalUrls = args.filter_content ? filterContentUrls(uniqueUrls) : uniqueUrls;
284
+ // Detect permalink pattern for smart cross-linking
285
+ const permalinkPattern = detectPermalinkPattern(finalUrls);
286
+ // Save to project if requested
287
+ let savedToProject = false;
288
+ let persistedToDb = false;
289
+ if (args.save_to_project) {
290
+ const project = getProjectSettings(args.project_id);
291
+ if (project) {
292
+ // Update in-memory context
293
+ if (!project.settings) {
294
+ project.settings = {};
295
+ }
296
+ const newInternalLinking = {
297
+ ...(project.settings.internal_linking || {}),
298
+ enabled: true,
299
+ sitemapUrls: finalUrls,
300
+ sourceUrl: args.sitemap_url,
301
+ maxLinksPerPost: project.settings.internal_linking?.maxLinksPerPost || 5,
302
+ };
303
+ project.settings.internal_linking = newInternalLinking;
304
+ savedToProject = true;
305
+ // Auto-detect and set cross-linking base URL if not already configured
306
+ if (!project.settings.cross_linking?.baseUrl && permalinkPattern.basePath) {
307
+ try {
308
+ const origin = new URL(finalUrls[0]).origin;
309
+ const basePath = permalinkPattern.basePath === '/'
310
+ ? ''
311
+ : permalinkPattern.basePath;
312
+ const newCrossLinking = {
313
+ ...(project.settings.cross_linking || {}),
314
+ enabled: project.settings.cross_linking?.enabled ?? false,
315
+ baseUrl: `${origin}${basePath}`,
316
+ maxLinksPerPost: project.settings.cross_linking?.maxLinksPerPost || 3,
317
+ };
318
+ project.settings.cross_linking = newCrossLinking;
319
+ }
320
+ catch { /* ignore URL parse errors */ }
321
+ }
322
+ // Persist to database
323
+ const result = await persistProjectSettings(project.id, {
324
+ internal_linking: project.settings.internal_linking,
325
+ cross_linking: project.settings.cross_linking,
326
+ });
327
+ persistedToDb = result.success;
328
+ if (!result.success) {
329
+ console.error(`[Linking] DB persistence failed: ${result.error}`);
330
+ }
331
+ }
332
+ }
333
+ return {
334
+ content: [{
335
+ type: 'text', text: JSON.stringify({
336
+ status: 'success',
337
+ sitemap_url: args.sitemap_url,
338
+ total_discovered: rawUrls.length,
339
+ unique_urls: uniqueUrls.length,
340
+ after_filtering: finalUrls.length,
341
+ permalink_pattern: permalinkPattern,
342
+ saved_to_project: savedToProject,
343
+ persisted_to_database: persistedToDb,
344
+ sample_urls: finalUrls.slice(0, 20),
345
+ note: finalUrls.length > 20 ? `Showing first 20 of ${finalUrls.length} URLs. All ${finalUrls.length} URLs are stored for link injection.` : undefined,
346
+ }, null, 2)
347
+ }],
348
+ };
349
+ });
350
+ // ============================================
351
+ // update_linking_settings
352
+ // ============================================
353
+ server.tool('update_linking_settings', 'Configure internal linking and cross-linking settings for a project. Changes are persisted to the database and visible in the web dashboard. Enables MCP users to set up linking without needing the web dashboard.', {
354
+ project_id: z.string().optional().describe('Project ID (defaults to active project)'),
355
+ internal_linking_enabled: z.boolean().optional().describe('Enable/disable internal linking'),
356
+ max_internal_links: z.number().optional().describe('Max internal links per article (1-10)'),
357
+ included_paths: z.array(z.string()).optional().describe('Subdirectory paths to include (e.g., ["/blog/", "/resources/"]). Empty = include all.'),
358
+ cross_linking_enabled: z.boolean().optional().describe('Enable/disable cross-linking between batch articles'),
359
+ cross_linking_base_url: z.string().optional().describe('Base URL for cross-linking slug assembly (e.g., https://example.com/blog)'),
360
+ max_cross_links: z.number().optional().describe('Max cross-links per article (1-10)'),
361
+ }, async (args) => {
362
+ const ctx = getUserContext();
363
+ if (!ctx.authenticated) {
364
+ return { content: [{ type: 'text', text: JSON.stringify({ error: 'Not authenticated.' }, null, 2) }] };
365
+ }
366
+ const project = getProjectSettings(args.project_id);
367
+ if (!project) {
368
+ return {
369
+ content: [{
370
+ type: 'text', text: JSON.stringify({
371
+ error: 'Project not found.',
372
+ available: ctx.projects.map(p => ({ id: p.id, name: p.name })),
373
+ }, null, 2)
374
+ }],
375
+ };
376
+ }
377
+ if (!project.settings) {
378
+ project.settings = {};
379
+ }
380
+ // Update internal linking settings (in-memory)
381
+ if (args.internal_linking_enabled !== undefined || args.max_internal_links || args.included_paths) {
382
+ const existing = project.settings.internal_linking || {
383
+ enabled: false,
384
+ sitemapUrls: [],
385
+ maxLinksPerPost: 5,
386
+ };
387
+ project.settings.internal_linking = {
388
+ ...existing,
389
+ enabled: args.internal_linking_enabled ?? existing.enabled,
390
+ maxLinksPerPost: args.max_internal_links ?? existing.maxLinksPerPost,
391
+ includedPaths: args.included_paths ?? existing.includedPaths,
392
+ };
393
+ }
394
+ // Update cross-linking settings (in-memory)
395
+ if (args.cross_linking_enabled !== undefined || args.cross_linking_base_url || args.max_cross_links) {
396
+ const existing = project.settings.cross_linking || {
397
+ enabled: false,
398
+ baseUrl: '',
399
+ maxLinksPerPost: 3,
400
+ };
401
+ project.settings.cross_linking = {
402
+ ...existing,
403
+ enabled: args.cross_linking_enabled ?? existing.enabled,
404
+ baseUrl: args.cross_linking_base_url ?? existing.baseUrl,
405
+ maxLinksPerPost: args.max_cross_links ?? existing.maxLinksPerPost,
406
+ };
407
+ }
408
+ // Persist to database
409
+ const persistResult = await persistProjectSettings(project.id, {
410
+ internal_linking: project.settings.internal_linking,
411
+ cross_linking: project.settings.cross_linking,
412
+ });
413
+ return {
414
+ content: [{
415
+ type: 'text', text: JSON.stringify({
416
+ status: 'updated',
417
+ persisted_to_database: persistResult.success,
418
+ persistence_error: persistResult.error || undefined,
419
+ project: { id: project.id, name: project.name },
420
+ internal_linking: project.settings.internal_linking || { enabled: false },
421
+ cross_linking: project.settings.cross_linking || { enabled: false },
422
+ }, null, 2)
423
+ }],
424
+ };
425
+ });
426
+ }
427
+ //# sourceMappingURL=linking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linking.js","sourceRoot":"","sources":["../../src/tools/linking.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bulkpublishing/mcp-server",
3
- "version": "1.0.5",
3
+ "version": "1.1.1",
4
4
  "description": "Bulk Publishing AI MCP Server - Content generation, WordPress publishing, and SEO indexing tools for MCP-compatible clients",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",