@fruition/fcp-mcp-server 1.6.1 → 1.7.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/dist/index.js +216 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -329,6 +329,44 @@ class FCPClient {
|
|
|
329
329
|
body: JSON.stringify(options || {}),
|
|
330
330
|
});
|
|
331
331
|
}
|
|
332
|
+
// Shield Domain Management
|
|
333
|
+
async shieldListDomains(filters) {
|
|
334
|
+
const params = new URLSearchParams();
|
|
335
|
+
if (filters?.status)
|
|
336
|
+
params.append('status', filters.status);
|
|
337
|
+
if (filters?.account_id)
|
|
338
|
+
params.append('account_id', String(filters.account_id));
|
|
339
|
+
const qs = params.toString();
|
|
340
|
+
return this.fetch(`/api/shield/domains${qs ? `?${qs}` : ''}`);
|
|
341
|
+
}
|
|
342
|
+
async shieldAddDomain(input) {
|
|
343
|
+
return this.fetch('/api/shield/domains', {
|
|
344
|
+
method: 'POST',
|
|
345
|
+
body: JSON.stringify(input),
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
async shieldGetDomain(domainId) {
|
|
349
|
+
return this.fetch(`/api/shield/domains/${domainId}`);
|
|
350
|
+
}
|
|
351
|
+
async shieldUpdateDomain(domainId, updates) {
|
|
352
|
+
return this.fetch(`/api/shield/domains/${domainId}`, {
|
|
353
|
+
method: 'PUT',
|
|
354
|
+
body: JSON.stringify(updates),
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
async shieldRemoveDomain(domainId) {
|
|
358
|
+
return this.fetch(`/api/shield/domains/${domainId}`, {
|
|
359
|
+
method: 'DELETE',
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
async shieldGetMetrics() {
|
|
363
|
+
return this.fetch('/api/shield/metrics?include_health=true');
|
|
364
|
+
}
|
|
365
|
+
async shieldVerifyDomain(domainId) {
|
|
366
|
+
return this.fetch(`/api/shield/domains/${domainId}/verify`, {
|
|
367
|
+
method: 'POST',
|
|
368
|
+
});
|
|
369
|
+
}
|
|
332
370
|
}
|
|
333
371
|
// Unroo API Client
|
|
334
372
|
// Supports two modes:
|
|
@@ -754,7 +792,7 @@ const TOOLS = [
|
|
|
754
792
|
},
|
|
755
793
|
category: {
|
|
756
794
|
type: 'string',
|
|
757
|
-
description: 'Optional: filter by category (
|
|
795
|
+
description: 'Optional: filter by category (infrastructure, security, pre_launch_webops, pre_launch_devops, pre_launch_dev, launch_day_devops, launch_day_seo, post_launch_day1, post_launch_week1, post_launch_day30)',
|
|
758
796
|
},
|
|
759
797
|
status: {
|
|
760
798
|
type: 'string',
|
|
@@ -780,7 +818,7 @@ const TOOLS = [
|
|
|
780
818
|
},
|
|
781
819
|
category: {
|
|
782
820
|
type: 'string',
|
|
783
|
-
enum: ['
|
|
821
|
+
enum: ['infrastructure', 'security', 'pre_launch_webops', 'pre_launch_devops', 'pre_launch_dev', 'launch_day_devops', 'launch_day_seo', 'post_launch_day1', 'post_launch_week1', 'post_launch_day30'],
|
|
784
822
|
description: 'Category for the checklist item',
|
|
785
823
|
},
|
|
786
824
|
description: {
|
|
@@ -860,7 +898,7 @@ const TOOLS = [
|
|
|
860
898
|
},
|
|
861
899
|
category: {
|
|
862
900
|
type: 'string',
|
|
863
|
-
enum: ['
|
|
901
|
+
enum: ['infrastructure', 'security', 'pre_launch_webops', 'pre_launch_devops', 'pre_launch_dev', 'launch_day_devops', 'launch_day_seo', 'post_launch_day1', 'post_launch_week1', 'post_launch_day30'],
|
|
864
902
|
description: 'Updated category',
|
|
865
903
|
},
|
|
866
904
|
role: {
|
|
@@ -1061,6 +1099,14 @@ const TOOLS = [
|
|
|
1061
1099
|
type: 'number',
|
|
1062
1100
|
description: 'The ID of the launch to update (required)',
|
|
1063
1101
|
},
|
|
1102
|
+
website_id: {
|
|
1103
|
+
type: 'number',
|
|
1104
|
+
description: 'Associated website ID (null to unlink)',
|
|
1105
|
+
},
|
|
1106
|
+
account_id: {
|
|
1107
|
+
type: 'number',
|
|
1108
|
+
description: 'Associated account/client ID (null to unlink)',
|
|
1109
|
+
},
|
|
1064
1110
|
name: {
|
|
1065
1111
|
type: 'string',
|
|
1066
1112
|
description: 'Updated launch name',
|
|
@@ -1935,6 +1981,129 @@ const TOOLS = [
|
|
|
1935
1981
|
required: ['website_id'],
|
|
1936
1982
|
},
|
|
1937
1983
|
},
|
|
1984
|
+
// Fruition Shield - Shared WAF Gateway
|
|
1985
|
+
{
|
|
1986
|
+
name: 'fcp_shield_list_domains',
|
|
1987
|
+
description: 'List all domains protected by Fruition Shield WAF. Filter by status (pending_dns, pending_cert, active, suspended) or account_id.',
|
|
1988
|
+
inputSchema: {
|
|
1989
|
+
type: 'object',
|
|
1990
|
+
properties: {
|
|
1991
|
+
status: {
|
|
1992
|
+
type: 'string',
|
|
1993
|
+
description: 'Filter by status: pending_dns, pending_cert, cert_validating, active, suspended, removed',
|
|
1994
|
+
},
|
|
1995
|
+
account_id: {
|
|
1996
|
+
type: 'number',
|
|
1997
|
+
description: 'Filter by account/client ID',
|
|
1998
|
+
},
|
|
1999
|
+
},
|
|
2000
|
+
},
|
|
2001
|
+
},
|
|
2002
|
+
{
|
|
2003
|
+
name: 'fcp_shield_add_domain',
|
|
2004
|
+
description: 'Add a domain to Fruition Shield WAF protection. Returns DNS records (traffic CNAME + cert validation CNAME) that must be added at the registrar.',
|
|
2005
|
+
inputSchema: {
|
|
2006
|
+
type: 'object',
|
|
2007
|
+
properties: {
|
|
2008
|
+
domain: {
|
|
2009
|
+
type: 'string',
|
|
2010
|
+
description: 'Domain to protect (e.g., www.butterflies.org)',
|
|
2011
|
+
},
|
|
2012
|
+
origin_host: {
|
|
2013
|
+
type: 'string',
|
|
2014
|
+
description: 'Origin server IP or hostname (e.g., 146.190.2.169 for K8s prod)',
|
|
2015
|
+
},
|
|
2016
|
+
origin_port: {
|
|
2017
|
+
type: 'number',
|
|
2018
|
+
description: 'Origin port (default: 443)',
|
|
2019
|
+
},
|
|
2020
|
+
origin_protocol: {
|
|
2021
|
+
type: 'string',
|
|
2022
|
+
description: 'Origin protocol: http or https (default: https)',
|
|
2023
|
+
},
|
|
2024
|
+
website_id: {
|
|
2025
|
+
type: 'number',
|
|
2026
|
+
description: 'Link to existing FCP website ID',
|
|
2027
|
+
},
|
|
2028
|
+
account_id: {
|
|
2029
|
+
type: 'number',
|
|
2030
|
+
description: 'Associated account/client ID',
|
|
2031
|
+
},
|
|
2032
|
+
cache_profile: {
|
|
2033
|
+
type: 'string',
|
|
2034
|
+
description: 'Cache profile: standard, aggressive, minimal, none (default: standard)',
|
|
2035
|
+
},
|
|
2036
|
+
notes: {
|
|
2037
|
+
type: 'string',
|
|
2038
|
+
description: 'Notes about this domain',
|
|
2039
|
+
},
|
|
2040
|
+
},
|
|
2041
|
+
required: ['domain', 'origin_host'],
|
|
2042
|
+
},
|
|
2043
|
+
},
|
|
2044
|
+
{
|
|
2045
|
+
name: 'fcp_shield_get_domain',
|
|
2046
|
+
description: 'Get Shield domain details including onboarding status, DNS records needed, and WAF configuration.',
|
|
2047
|
+
inputSchema: {
|
|
2048
|
+
type: 'object',
|
|
2049
|
+
properties: {
|
|
2050
|
+
domain_id: {
|
|
2051
|
+
type: 'number',
|
|
2052
|
+
description: 'The Shield domain ID',
|
|
2053
|
+
},
|
|
2054
|
+
},
|
|
2055
|
+
required: ['domain_id'],
|
|
2056
|
+
},
|
|
2057
|
+
},
|
|
2058
|
+
{
|
|
2059
|
+
name: 'fcp_shield_update_domain',
|
|
2060
|
+
description: 'Update Shield domain configuration (origin, cache profile, WAF rules, geo-blocking, rate limiting).',
|
|
2061
|
+
inputSchema: {
|
|
2062
|
+
type: 'object',
|
|
2063
|
+
properties: {
|
|
2064
|
+
domain_id: {
|
|
2065
|
+
type: 'number',
|
|
2066
|
+
description: 'The Shield domain ID',
|
|
2067
|
+
},
|
|
2068
|
+
origin_host: { type: 'string', description: 'Updated origin host' },
|
|
2069
|
+
origin_port: { type: 'number', description: 'Updated origin port' },
|
|
2070
|
+
cache_profile: { type: 'string', description: 'Cache profile: standard, aggressive, minimal, none' },
|
|
2071
|
+
waf_profile: { type: 'string', description: 'WAF profile: standard, premium, custom' },
|
|
2072
|
+
geo_block_countries: {
|
|
2073
|
+
type: 'array',
|
|
2074
|
+
items: { type: 'string' },
|
|
2075
|
+
description: 'Country codes to block (e.g., ["CN","RU","KP","IR","BY"])',
|
|
2076
|
+
},
|
|
2077
|
+
rate_limit_tier: { type: 'string', description: 'Rate limit: standard, strict, relaxed' },
|
|
2078
|
+
bot_control_enabled: { type: 'boolean', description: 'Enable AWS Bot Control (+$10/mo)' },
|
|
2079
|
+
enabled: { type: 'boolean', description: 'Enable/disable domain' },
|
|
2080
|
+
notes: { type: 'string', description: 'Updated notes' },
|
|
2081
|
+
},
|
|
2082
|
+
required: ['domain_id'],
|
|
2083
|
+
},
|
|
2084
|
+
},
|
|
2085
|
+
{
|
|
2086
|
+
name: 'fcp_shield_remove_domain',
|
|
2087
|
+
description: 'Remove a domain from Fruition Shield protection. Removes from CloudFront, DynamoDB, and deletes ACM certificate.',
|
|
2088
|
+
inputSchema: {
|
|
2089
|
+
type: 'object',
|
|
2090
|
+
properties: {
|
|
2091
|
+
domain_id: {
|
|
2092
|
+
type: 'number',
|
|
2093
|
+
description: 'The Shield domain ID to remove',
|
|
2094
|
+
},
|
|
2095
|
+
},
|
|
2096
|
+
required: ['domain_id'],
|
|
2097
|
+
},
|
|
2098
|
+
},
|
|
2099
|
+
{
|
|
2100
|
+
name: 'fcp_shield_get_metrics',
|
|
2101
|
+
description: 'Get aggregate Fruition Shield WAF metrics: total domains, requests, blocks, block rate, and infrastructure health.',
|
|
2102
|
+
inputSchema: {
|
|
2103
|
+
type: 'object',
|
|
2104
|
+
properties: {},
|
|
2105
|
+
},
|
|
2106
|
+
},
|
|
1938
2107
|
];
|
|
1939
2108
|
// Register tool handlers
|
|
1940
2109
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
@@ -2776,6 +2945,50 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
2776
2945
|
],
|
|
2777
2946
|
};
|
|
2778
2947
|
}
|
|
2948
|
+
// Fruition Shield Handlers
|
|
2949
|
+
case 'fcp_shield_list_domains': {
|
|
2950
|
+
const { status, account_id } = args;
|
|
2951
|
+
const result = await client.shieldListDomains({ status, account_id });
|
|
2952
|
+
return {
|
|
2953
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
2954
|
+
};
|
|
2955
|
+
}
|
|
2956
|
+
case 'fcp_shield_add_domain': {
|
|
2957
|
+
const { domain, origin_host, origin_port, origin_protocol, website_id, account_id, cache_profile, notes } = args;
|
|
2958
|
+
const result = await client.shieldAddDomain({
|
|
2959
|
+
domain, origin_host, origin_port, origin_protocol, website_id, account_id, cache_profile, notes,
|
|
2960
|
+
});
|
|
2961
|
+
return {
|
|
2962
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
2963
|
+
};
|
|
2964
|
+
}
|
|
2965
|
+
case 'fcp_shield_get_domain': {
|
|
2966
|
+
const { domain_id } = args;
|
|
2967
|
+
const result = await client.shieldGetDomain(domain_id);
|
|
2968
|
+
return {
|
|
2969
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
2970
|
+
};
|
|
2971
|
+
}
|
|
2972
|
+
case 'fcp_shield_update_domain': {
|
|
2973
|
+
const { domain_id, ...updates } = args;
|
|
2974
|
+
const result = await client.shieldUpdateDomain(domain_id, updates);
|
|
2975
|
+
return {
|
|
2976
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
2977
|
+
};
|
|
2978
|
+
}
|
|
2979
|
+
case 'fcp_shield_remove_domain': {
|
|
2980
|
+
const { domain_id } = args;
|
|
2981
|
+
const result = await client.shieldRemoveDomain(domain_id);
|
|
2982
|
+
return {
|
|
2983
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
2984
|
+
};
|
|
2985
|
+
}
|
|
2986
|
+
case 'fcp_shield_get_metrics': {
|
|
2987
|
+
const result = await client.shieldGetMetrics();
|
|
2988
|
+
return {
|
|
2989
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
2990
|
+
};
|
|
2991
|
+
}
|
|
2779
2992
|
default:
|
|
2780
2993
|
throw new Error(`Unknown tool: ${name}`);
|
|
2781
2994
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fruition/fcp-mcp-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
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",
|