@fruition/fcp-mcp-server 1.12.1 → 1.14.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.
- package/dist/index.js +155 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -282,6 +282,19 @@ class FCPClient {
|
|
|
282
282
|
// Otherwise, get scan history list
|
|
283
283
|
return this.fetch(`/api/sites/${websiteId}/nuclei-scans`);
|
|
284
284
|
}
|
|
285
|
+
// Security Headers Methods
|
|
286
|
+
async scanSecurityHeaders(websiteId) {
|
|
287
|
+
return this.fetch(`/api/sites/${websiteId}/security-headers`, {
|
|
288
|
+
method: 'POST',
|
|
289
|
+
body: JSON.stringify({}),
|
|
290
|
+
}, 30000);
|
|
291
|
+
}
|
|
292
|
+
async getSecurityHeadersResults(websiteId, scanId) {
|
|
293
|
+
if (scanId) {
|
|
294
|
+
return this.fetch(`/api/sites/${websiteId}/security-headers/${scanId}`);
|
|
295
|
+
}
|
|
296
|
+
return this.fetch(`/api/sites/${websiteId}/security-headers/latest`);
|
|
297
|
+
}
|
|
285
298
|
// Site/Website CRUD Methods
|
|
286
299
|
async listSites(filters) {
|
|
287
300
|
const params = new URLSearchParams();
|
|
@@ -440,6 +453,19 @@ class FCPClient {
|
|
|
440
453
|
method: 'DELETE',
|
|
441
454
|
});
|
|
442
455
|
}
|
|
456
|
+
// Kinsta backup methods (separate S3 bucket: kinsta-backups-fru)
|
|
457
|
+
async kinstaBackupListSites() {
|
|
458
|
+
return this.fetch('/api/backup/kinsta?action=sites');
|
|
459
|
+
}
|
|
460
|
+
async kinstaBackupListBackups(siteId) {
|
|
461
|
+
return this.fetch(`/api/backup/kinsta?siteId=${siteId}`);
|
|
462
|
+
}
|
|
463
|
+
async kinstaBackupDownload(s3Key) {
|
|
464
|
+
return this.fetch('/api/backup/kinsta', {
|
|
465
|
+
method: 'POST',
|
|
466
|
+
body: JSON.stringify({ s3Key }),
|
|
467
|
+
});
|
|
468
|
+
}
|
|
443
469
|
}
|
|
444
470
|
// Unroo API Client
|
|
445
471
|
// Supports two modes:
|
|
@@ -1339,7 +1365,7 @@ const TOOLS = [
|
|
|
1339
1365
|
// Unroo Task Management Tools
|
|
1340
1366
|
{
|
|
1341
1367
|
name: 'unroo_list_projects',
|
|
1342
|
-
description: 'List all Unroo projects mapped to FCP
|
|
1368
|
+
description: 'List all Unroo projects (including those not mapped to FCP). Returns project details with organization, company, and JIRA key info.',
|
|
1343
1369
|
inputSchema: {
|
|
1344
1370
|
type: 'object',
|
|
1345
1371
|
properties: {},
|
|
@@ -1838,6 +1864,39 @@ const TOOLS = [
|
|
|
1838
1864
|
required: ['website_id'],
|
|
1839
1865
|
},
|
|
1840
1866
|
},
|
|
1867
|
+
// Security Headers Tools
|
|
1868
|
+
{
|
|
1869
|
+
name: 'fcp_scan_security_headers',
|
|
1870
|
+
description: 'Scan a website for HTTP security headers (CSP, HSTS, X-Frame-Options, etc.). Returns grade (A-F), score (0-100), and per-header analysis with issues and recommendations.',
|
|
1871
|
+
inputSchema: {
|
|
1872
|
+
type: 'object',
|
|
1873
|
+
properties: {
|
|
1874
|
+
website_id: {
|
|
1875
|
+
type: 'number',
|
|
1876
|
+
description: 'The website ID to scan (required)',
|
|
1877
|
+
},
|
|
1878
|
+
},
|
|
1879
|
+
required: ['website_id'],
|
|
1880
|
+
},
|
|
1881
|
+
},
|
|
1882
|
+
{
|
|
1883
|
+
name: 'fcp_get_security_headers_results',
|
|
1884
|
+
description: 'Get security headers scan results for a website. Returns the latest scan grade, score, and per-header findings with issues and recommendations.',
|
|
1885
|
+
inputSchema: {
|
|
1886
|
+
type: 'object',
|
|
1887
|
+
properties: {
|
|
1888
|
+
website_id: {
|
|
1889
|
+
type: 'number',
|
|
1890
|
+
description: 'The website ID to get results for (required)',
|
|
1891
|
+
},
|
|
1892
|
+
scan_id: {
|
|
1893
|
+
type: 'string',
|
|
1894
|
+
description: 'Specific scan ID to get detailed results for (optional, defaults to latest)',
|
|
1895
|
+
},
|
|
1896
|
+
},
|
|
1897
|
+
required: ['website_id'],
|
|
1898
|
+
},
|
|
1899
|
+
},
|
|
1841
1900
|
// Site/Website CRUD Tools
|
|
1842
1901
|
{
|
|
1843
1902
|
name: 'fcp_list_sites',
|
|
@@ -2050,10 +2109,22 @@ const TOOLS = [
|
|
|
2050
2109
|
type: 'string',
|
|
2051
2110
|
description: 'Updated backup cron schedule',
|
|
2052
2111
|
},
|
|
2112
|
+
backup_excluded: {
|
|
2113
|
+
type: 'boolean',
|
|
2114
|
+
description: 'Exclude site from backup eligibility (e.g. ephemeral sites, non-K8s hosting)',
|
|
2115
|
+
},
|
|
2116
|
+
backup_exclusion_reason: {
|
|
2117
|
+
type: 'string',
|
|
2118
|
+
description: 'Reason for backup exclusion (e.g. "Ephemeral captive portal site", "External hosting - not on K8s")',
|
|
2119
|
+
},
|
|
2053
2120
|
multisite_root_id: {
|
|
2054
2121
|
type: 'number',
|
|
2055
2122
|
description: 'Root site ID for WordPress multisite networks. Set to link as a subsite, null to unlink.',
|
|
2056
2123
|
},
|
|
2124
|
+
uptime_monitor_id: {
|
|
2125
|
+
type: 'number',
|
|
2126
|
+
description: 'UptimeRobot monitor ID for this site. Used by scheduler to pause/resume monitors on scale events.',
|
|
2127
|
+
},
|
|
2057
2128
|
},
|
|
2058
2129
|
required: ['website_id'],
|
|
2059
2130
|
},
|
|
@@ -2423,6 +2494,43 @@ const TOOLS = [
|
|
|
2423
2494
|
required: ['siteId'],
|
|
2424
2495
|
},
|
|
2425
2496
|
},
|
|
2497
|
+
// Kinsta backup tools (separate S3 bucket with weekly full-site zip backups)
|
|
2498
|
+
{
|
|
2499
|
+
name: 'fcp_kinsta_backup_list_sites',
|
|
2500
|
+
description: 'List all Kinsta-hosted sites that have S3 backup mappings configured. Returns site IDs, domains, and S3 prefixes.',
|
|
2501
|
+
inputSchema: {
|
|
2502
|
+
type: 'object',
|
|
2503
|
+
properties: {},
|
|
2504
|
+
},
|
|
2505
|
+
},
|
|
2506
|
+
{
|
|
2507
|
+
name: 'fcp_kinsta_backup_list',
|
|
2508
|
+
description: 'List available Kinsta backups for a specific site. Returns backup files with sizes, dates, and S3 keys for downloading.',
|
|
2509
|
+
inputSchema: {
|
|
2510
|
+
type: 'object',
|
|
2511
|
+
properties: {
|
|
2512
|
+
siteId: {
|
|
2513
|
+
type: 'string',
|
|
2514
|
+
description: 'The site ID (e.g., site-215 for bnpassociates.com)',
|
|
2515
|
+
},
|
|
2516
|
+
},
|
|
2517
|
+
required: ['siteId'],
|
|
2518
|
+
},
|
|
2519
|
+
},
|
|
2520
|
+
{
|
|
2521
|
+
name: 'fcp_kinsta_backup_download',
|
|
2522
|
+
description: 'Generate a presigned S3 download URL for a Kinsta backup zip file. URL expires in 1 hour.',
|
|
2523
|
+
inputSchema: {
|
|
2524
|
+
type: 'object',
|
|
2525
|
+
properties: {
|
|
2526
|
+
s3Key: {
|
|
2527
|
+
type: 'string',
|
|
2528
|
+
description: 'The S3 key from fcp_kinsta_backup_list (e.g., bnpassociates/filename.zip)',
|
|
2529
|
+
},
|
|
2530
|
+
},
|
|
2531
|
+
required: ['s3Key'],
|
|
2532
|
+
},
|
|
2533
|
+
},
|
|
2426
2534
|
];
|
|
2427
2535
|
// Register tool handlers
|
|
2428
2536
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
@@ -2621,6 +2729,31 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
2621
2729
|
],
|
|
2622
2730
|
};
|
|
2623
2731
|
}
|
|
2732
|
+
// Security Headers Handlers
|
|
2733
|
+
case 'fcp_scan_security_headers': {
|
|
2734
|
+
const { website_id } = args;
|
|
2735
|
+
const result = await client.scanSecurityHeaders(website_id);
|
|
2736
|
+
return {
|
|
2737
|
+
content: [
|
|
2738
|
+
{
|
|
2739
|
+
type: 'text',
|
|
2740
|
+
text: JSON.stringify(result, null, 2),
|
|
2741
|
+
},
|
|
2742
|
+
],
|
|
2743
|
+
};
|
|
2744
|
+
}
|
|
2745
|
+
case 'fcp_get_security_headers_results': {
|
|
2746
|
+
const { website_id, scan_id } = args;
|
|
2747
|
+
const result = await client.getSecurityHeadersResults(website_id, scan_id);
|
|
2748
|
+
return {
|
|
2749
|
+
content: [
|
|
2750
|
+
{
|
|
2751
|
+
type: 'text',
|
|
2752
|
+
text: JSON.stringify(result, null, 2),
|
|
2753
|
+
},
|
|
2754
|
+
],
|
|
2755
|
+
};
|
|
2756
|
+
}
|
|
2624
2757
|
// Site/Website CRUD Handlers
|
|
2625
2758
|
case 'fcp_list_sites': {
|
|
2626
2759
|
const filters = args;
|
|
@@ -3422,6 +3555,27 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
3422
3555
|
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
3423
3556
|
};
|
|
3424
3557
|
}
|
|
3558
|
+
// Kinsta backup tools
|
|
3559
|
+
case 'fcp_kinsta_backup_list_sites': {
|
|
3560
|
+
const result = await client.kinstaBackupListSites();
|
|
3561
|
+
return {
|
|
3562
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
3563
|
+
};
|
|
3564
|
+
}
|
|
3565
|
+
case 'fcp_kinsta_backup_list': {
|
|
3566
|
+
const { siteId } = args;
|
|
3567
|
+
const result = await client.kinstaBackupListBackups(siteId);
|
|
3568
|
+
return {
|
|
3569
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
3570
|
+
};
|
|
3571
|
+
}
|
|
3572
|
+
case 'fcp_kinsta_backup_download': {
|
|
3573
|
+
const { s3Key } = args;
|
|
3574
|
+
const result = await client.kinstaBackupDownload(s3Key);
|
|
3575
|
+
return {
|
|
3576
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
3577
|
+
};
|
|
3578
|
+
}
|
|
3425
3579
|
default:
|
|
3426
3580
|
throw new Error(`Unknown tool: ${name}`);
|
|
3427
3581
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fruition/fcp-mcp-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.1",
|
|
4
4
|
"description": "MCP Server for FCP Launch Coordination System - enables Claude Code to interact with FCP launches and track development time",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|