capix-mcp 2.1.0 → 2.2.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 +51 -72
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +18 -8
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +130 -6
- package/dist/index.js.map +1 -1
- package/dist/prompts.d.ts +6 -1
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +41 -75
- package/dist/prompts.js.map +1 -1
- package/dist/route-families.d.ts +47 -0
- package/dist/route-families.d.ts.map +1 -0
- package/dist/route-families.js +96 -0
- package/dist/route-families.js.map +1 -0
- package/dist/server.d.ts +36 -6
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +67 -11
- package/dist/server.js.map +1 -1
- package/dist/tools/define-tool.d.ts +33 -0
- package/dist/tools/define-tool.d.ts.map +1 -0
- package/dist/tools/define-tool.js +28 -0
- package/dist/tools/define-tool.js.map +1 -0
- package/dist/tools/factory.d.ts +42 -0
- package/dist/tools/factory.d.ts.map +1 -0
- package/dist/tools/factory.js +363 -0
- package/dist/tools/factory.js.map +1 -0
- package/dist/tools/generate.d.ts +108 -0
- package/dist/tools/generate.d.ts.map +1 -0
- package/dist/tools/generate.js +149 -0
- package/dist/tools/generate.js.map +1 -0
- package/dist/tools/infra-context.d.ts +28 -0
- package/dist/tools/infra-context.d.ts.map +1 -0
- package/dist/tools/infra-context.js +90 -0
- package/dist/tools/infra-context.js.map +1 -0
- package/dist/tools/memes.d.ts +31 -0
- package/dist/tools/memes.d.ts.map +1 -0
- package/dist/tools/memes.js +175 -0
- package/dist/tools/memes.js.map +1 -0
- package/dist/tools.d.ts +48 -7
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +346 -911
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +17 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -2
- package/dist/types.js.map +1 -1
- package/package.json +4 -3
package/dist/prompts.js
CHANGED
|
@@ -4,48 +4,44 @@
|
|
|
4
4
|
* Prompts are parameterised, server-side message templates the MCP client can
|
|
5
5
|
* list and instantiate. Each prompt returns a short multi-message transcript
|
|
6
6
|
* that guides an agent through a common Capix workflow (deploy, diagnose,
|
|
7
|
-
*
|
|
7
|
+
* ship a website, cleanup) — always ending with an assistant reminder that
|
|
8
8
|
* billable tools require a bound approval token before they will execute.
|
|
9
|
+
*
|
|
10
|
+
* 2026-07 repair: every prompt references only tools that exist in the
|
|
11
|
+
* post-repair registry. The plan_stack prompt was removed (no stack backend)
|
|
12
|
+
* and create_preview became ship_website (website previews are implicit per
|
|
13
|
+
* release; there is no preview-trigger route).
|
|
9
14
|
*/
|
|
10
15
|
import { z } from "zod";
|
|
11
16
|
export const CAPIX_PROMPTS = [
|
|
12
17
|
{
|
|
13
18
|
name: "deploy_repository",
|
|
14
|
-
description: "
|
|
19
|
+
description: "Quote and deploy a workload on Capix compute, then track the operation.",
|
|
15
20
|
arguments: [
|
|
16
|
-
{ name: "
|
|
17
|
-
{ name: "
|
|
18
|
-
{ name: "region", description: "Preferred region." },
|
|
19
|
-
{ name: "workloadType", description: "Workload type, e.g. replicated_service.v1." },
|
|
21
|
+
{ name: "workloadType", description: "Workload type, e.g. replicated_service.v1.", required: true },
|
|
22
|
+
{ name: "region", description: "Preferred region (eu | us | asia | global)." },
|
|
20
23
|
],
|
|
21
24
|
},
|
|
22
25
|
{
|
|
23
26
|
name: "diagnose_deployment",
|
|
24
|
-
description: "Diagnose a failing deployment:
|
|
27
|
+
description: "Diagnose a failing deployment: inspect phase, placement receipt, and settlement.",
|
|
25
28
|
arguments: [
|
|
26
29
|
{ name: "deploymentId", description: "Deployment to diagnose.", required: true },
|
|
27
30
|
],
|
|
28
31
|
},
|
|
29
32
|
{
|
|
30
|
-
name: "
|
|
31
|
-
description: "Create a
|
|
33
|
+
name: "ship_website",
|
|
34
|
+
description: "Create a website from a source ref, wait for the build, and promote it to production.",
|
|
32
35
|
arguments: [
|
|
33
|
-
{ name: "
|
|
34
|
-
{ name: "
|
|
35
|
-
],
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
name: "plan_stack",
|
|
39
|
-
description: "Validate and plan a multi-service stack from a manifest URL or inline spec.",
|
|
40
|
-
arguments: [
|
|
41
|
-
{ name: "manifestUrl", description: "Stack manifest URL or inline spec.", required: true },
|
|
36
|
+
{ name: "name", description: "Site name.", required: true },
|
|
37
|
+
{ name: "sourceRef", description: "Source reference (repository/archive URL).", required: true },
|
|
42
38
|
],
|
|
43
39
|
},
|
|
44
40
|
{
|
|
45
41
|
name: "cleanup_task",
|
|
46
|
-
description: "Destroy
|
|
42
|
+
description: "Destroy the resources created for a completed task (§18 cleanup gate).",
|
|
47
43
|
arguments: [
|
|
48
|
-
{ name: "taskId", description: "Task
|
|
44
|
+
{ name: "taskId", description: "Task label for the cleanup summary.", required: true },
|
|
49
45
|
],
|
|
50
46
|
},
|
|
51
47
|
];
|
|
@@ -60,10 +56,8 @@ export function registerPrompts(server) {
|
|
|
60
56
|
server.registerPrompt("deploy_repository", {
|
|
61
57
|
description: CAPIX_PROMPTS[0].description,
|
|
62
58
|
argsSchema: {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
region: z.string().optional().describe("Preferred region."),
|
|
66
|
-
workloadType: z.string().optional().describe("Workload type, e.g. replicated_service.v1."),
|
|
59
|
+
workloadType: z.string().describe("Workload type, e.g. replicated_service.v1."),
|
|
60
|
+
region: z.string().optional().describe("Preferred region (eu | us | asia | global)."),
|
|
67
61
|
},
|
|
68
62
|
}, async (args) => ({
|
|
69
63
|
messages: [
|
|
@@ -72,15 +66,14 @@ export function registerPrompts(server) {
|
|
|
72
66
|
content: {
|
|
73
67
|
type: "text",
|
|
74
68
|
text: [
|
|
75
|
-
`Deploy
|
|
69
|
+
`Deploy a ${args.workloadType} workload on Capix.`,
|
|
76
70
|
args.region ? `Target region: ${args.region}.` : "Region: auto-select cheapest feasible.",
|
|
77
|
-
args.workloadType ? `Workload type: ${args.workloadType}.` : "",
|
|
78
71
|
"Steps:",
|
|
79
|
-
"1.
|
|
80
|
-
"2. capix_compute_quote — obtain a canonical quote.",
|
|
72
|
+
"1. capix_compute_catalog — confirm the workload type is enabled and pick a provider/region.",
|
|
73
|
+
"2. capix_compute_quote — obtain a canonical quote (15-minute TTL).",
|
|
81
74
|
"3. capix_deploy — provision against the quote (requires approvalToken).",
|
|
82
|
-
"4.
|
|
83
|
-
].
|
|
75
|
+
"4. capix_deployments — track the deployment phase until ready.",
|
|
76
|
+
].join("\n"),
|
|
84
77
|
},
|
|
85
78
|
},
|
|
86
79
|
{
|
|
@@ -103,10 +96,10 @@ export function registerPrompts(server) {
|
|
|
103
96
|
type: "text",
|
|
104
97
|
text: [
|
|
105
98
|
`Diagnose deployment ${args.deploymentId}:`,
|
|
106
|
-
"1.
|
|
107
|
-
"2.
|
|
108
|
-
"3.
|
|
109
|
-
"Summarise the failure mode and propose remediation (
|
|
99
|
+
"1. capix_deployments — locate the deployment, its phase, and its allocations.",
|
|
100
|
+
"2. capix_inspect_receipt — review the signed route receipt (placement + pricing evidence) behind it.",
|
|
101
|
+
"3. capix_receipts — check the account's work receipts for related failures.",
|
|
102
|
+
"Summarise the failure mode and propose remediation (redeploy vs terminate).",
|
|
110
103
|
].join("\n"),
|
|
111
104
|
},
|
|
112
105
|
},
|
|
@@ -119,12 +112,12 @@ export function registerPrompts(server) {
|
|
|
119
112
|
},
|
|
120
113
|
],
|
|
121
114
|
}));
|
|
122
|
-
//
|
|
123
|
-
server.registerPrompt("
|
|
115
|
+
// ship_website
|
|
116
|
+
server.registerPrompt("ship_website", {
|
|
124
117
|
description: CAPIX_PROMPTS[2].description,
|
|
125
118
|
argsSchema: {
|
|
126
|
-
|
|
127
|
-
|
|
119
|
+
name: z.string().describe("Site name."),
|
|
120
|
+
sourceRef: z.string().describe("Source reference (repository/archive URL)."),
|
|
128
121
|
},
|
|
129
122
|
}, async (args) => ({
|
|
130
123
|
messages: [
|
|
@@ -133,9 +126,10 @@ export function registerPrompts(server) {
|
|
|
133
126
|
content: {
|
|
134
127
|
type: "text",
|
|
135
128
|
text: [
|
|
136
|
-
`
|
|
137
|
-
"1.
|
|
138
|
-
"2.
|
|
129
|
+
`Ship the website ${args.name} from ${args.sourceRef}.`,
|
|
130
|
+
"1. capix_website_create — create + build (requires approvalToken).",
|
|
131
|
+
"2. capix_website_get — poll until the latest release is built (check its status/step/logTail).",
|
|
132
|
+
"3. Return the preview URL, then capix_website_promote — promote to production (requires approvalToken).",
|
|
139
133
|
].join("\n"),
|
|
140
134
|
},
|
|
141
135
|
},
|
|
@@ -145,40 +139,11 @@ export function registerPrompts(server) {
|
|
|
145
139
|
},
|
|
146
140
|
],
|
|
147
141
|
}));
|
|
148
|
-
// plan_stack
|
|
149
|
-
server.registerPrompt("plan_stack", {
|
|
150
|
-
description: CAPIX_PROMPTS[3].description,
|
|
151
|
-
argsSchema: {
|
|
152
|
-
manifestUrl: z.string().describe("Stack manifest URL or inline spec."),
|
|
153
|
-
},
|
|
154
|
-
}, async (args) => ({
|
|
155
|
-
messages: [
|
|
156
|
-
{
|
|
157
|
-
role: "user",
|
|
158
|
-
content: {
|
|
159
|
-
type: "text",
|
|
160
|
-
text: [
|
|
161
|
-
`Validate and plan the stack manifest at ${args.manifestUrl}.`,
|
|
162
|
-
"1. capix_stack_validate — check the manifest.",
|
|
163
|
-
"2. capix_stack_plan — produce a service plan graph + aggregate quote.",
|
|
164
|
-
"Report feasibility and per-service cost.",
|
|
165
|
-
].join("\n"),
|
|
166
|
-
},
|
|
167
|
-
},
|
|
168
|
-
{
|
|
169
|
-
role: "assistant",
|
|
170
|
-
content: {
|
|
171
|
-
type: "text",
|
|
172
|
-
text: "Stack planning tools are read-only and may auto-run; no approval token required.",
|
|
173
|
-
},
|
|
174
|
-
},
|
|
175
|
-
],
|
|
176
|
-
}));
|
|
177
142
|
// cleanup_task
|
|
178
143
|
server.registerPrompt("cleanup_task", {
|
|
179
|
-
description: CAPIX_PROMPTS[
|
|
144
|
+
description: CAPIX_PROMPTS[3].description,
|
|
180
145
|
argsSchema: {
|
|
181
|
-
taskId: z.string().describe("Task
|
|
146
|
+
taskId: z.string().describe("Task label for the cleanup summary."),
|
|
182
147
|
},
|
|
183
148
|
}, async (args) => ({
|
|
184
149
|
messages: [
|
|
@@ -187,9 +152,10 @@ export function registerPrompts(server) {
|
|
|
187
152
|
content: {
|
|
188
153
|
type: "text",
|
|
189
154
|
text: [
|
|
190
|
-
`Destroy all
|
|
191
|
-
"1.
|
|
192
|
-
"2.
|
|
155
|
+
`Destroy all resources created for ${args.taskId} (§18 cleanup gate).`,
|
|
156
|
+
"1. capix_deployments / capix_agent_list / capix_website_list — enumerate what is still running.",
|
|
157
|
+
"2. capix_delete / capix_agent_destroy / capix_website_destroy — release each one (requires approvalToken).",
|
|
158
|
+
"3. capix_receipts — confirm final settlement.",
|
|
193
159
|
].join("\n"),
|
|
194
160
|
},
|
|
195
161
|
},
|
package/dist/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capix MCP Server — the allowlist of REAL control-plane route families.
|
|
3
|
+
*
|
|
4
|
+
* Encoded from the 2026-07 live audit of the protocol repo
|
|
5
|
+
* (app/api/v1/* in CapIX-Protocol): every entry below is backed by a route
|
|
6
|
+
* handler that exists in the control plane today. The registry gate
|
|
7
|
+
* (tools/registry.test.ts) asserts that every registered tool's `routePath`
|
|
8
|
+
* starts with one of these families — this is the anti-regression guard that
|
|
9
|
+
* keeps phantom tools (tools pointing at routes the backend never
|
|
10
|
+
* implemented) out of the MCP surface.
|
|
11
|
+
*
|
|
12
|
+
* When the control plane ships a new route family, add it here WITH the
|
|
13
|
+
* backend evidence (route file path) in the comment, then add the tool.
|
|
14
|
+
*
|
|
15
|
+
* Evidence pointers are relative to the protocol repo root.
|
|
16
|
+
*/
|
|
17
|
+
export interface RouteFamily {
|
|
18
|
+
/** Canonical path prefix, e.g. "/api/v1/jobs". */
|
|
19
|
+
prefix: string;
|
|
20
|
+
/** Route file(s) in the protocol repo proving the family exists. */
|
|
21
|
+
evidence: string;
|
|
22
|
+
}
|
|
23
|
+
export declare const REAL_ROUTE_FAMILIES: readonly RouteFamily[];
|
|
24
|
+
/**
|
|
25
|
+
* Route families that were advertised by pre-repair tools but DO NOT EXIST
|
|
26
|
+
* in the control plane (verified 2026-07 against app/api/v1/). Tools were
|
|
27
|
+
* removed from the registry; they return when the backend ships. Listed here
|
|
28
|
+
* so the gate test can also assert no tool regresses onto them.
|
|
29
|
+
*
|
|
30
|
+
* /api/v1/website (singular) — real family is /api/v1/websites (plural)
|
|
31
|
+
* /api/v1/networking, /api/v1/vpc — networking roadmap N1–N5, not built
|
|
32
|
+
* /api/v1/verification, /api/v1/attestations — Secured Cloud (TEE/zkVM) deferred
|
|
33
|
+
* /api/v1/testing — disposable test envs, not built
|
|
34
|
+
* /api/v1/planning — superseded by /api/v1/quotes
|
|
35
|
+
* /api/v1/lifecycle — superseded by /api/v1/deployments (+PATCH)
|
|
36
|
+
* /api/v1/projects — no projects list route exists
|
|
37
|
+
* /api/v1/catalog/compute, /api/v1/catalog/models — real: catalog/capabilities, models
|
|
38
|
+
* /api/v1/network/status — real: /api/v1/health
|
|
39
|
+
* /api/v1/account/balance — real: /api/v1/billing
|
|
40
|
+
* /api/v1/nodes/status, /api/v1/earnings — only nodes/[id]/earnings exists
|
|
41
|
+
*/
|
|
42
|
+
export declare const REMOVED_ROUTE_FAMILIES: readonly string[];
|
|
43
|
+
/** True when `path` (may contain :params) targets a real route family. */
|
|
44
|
+
export declare function isRealRoutePath(path: string): boolean;
|
|
45
|
+
/** True when `path` targets a family removed because the backend never existed. */
|
|
46
|
+
export declare function isRemovedRoutePath(path: string): boolean;
|
|
47
|
+
//# sourceMappingURL=route-families.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-families.d.ts","sourceRoot":"","sources":["../src/route-families.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,mBAAmB,EAAE,SAAS,WAAW,EAmC5C,CAAC;AAEX;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAgB1C,CAAC;AAEX,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIrD;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIxD"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capix MCP Server — the allowlist of REAL control-plane route families.
|
|
3
|
+
*
|
|
4
|
+
* Encoded from the 2026-07 live audit of the protocol repo
|
|
5
|
+
* (app/api/v1/* in CapIX-Protocol): every entry below is backed by a route
|
|
6
|
+
* handler that exists in the control plane today. The registry gate
|
|
7
|
+
* (tools/registry.test.ts) asserts that every registered tool's `routePath`
|
|
8
|
+
* starts with one of these families — this is the anti-regression guard that
|
|
9
|
+
* keeps phantom tools (tools pointing at routes the backend never
|
|
10
|
+
* implemented) out of the MCP surface.
|
|
11
|
+
*
|
|
12
|
+
* When the control plane ships a new route family, add it here WITH the
|
|
13
|
+
* backend evidence (route file path) in the comment, then add the tool.
|
|
14
|
+
*
|
|
15
|
+
* Evidence pointers are relative to the protocol repo root.
|
|
16
|
+
*/
|
|
17
|
+
export const REAL_ROUTE_FAMILIES = [
|
|
18
|
+
// GET /api/v1/account re-exports GET /api/v1/me (account/route.ts).
|
|
19
|
+
{ prefix: "/api/v1/account", evidence: "app/api/v1/account/route.ts" },
|
|
20
|
+
// GET /api/v1/billing — balances, valuation, transactions (billing/route.ts).
|
|
21
|
+
{ prefix: "/api/v1/billing", evidence: "app/api/v1/billing/route.ts" },
|
|
22
|
+
// GET /api/v1/catalog/capabilities — workload types + providers (public).
|
|
23
|
+
{ prefix: "/api/v1/catalog/capabilities", evidence: "app/api/v1/catalog/capabilities/route.ts" },
|
|
24
|
+
// GET/POST /api/v1/deployments, GET/PATCH/DELETE /api/v1/deployments/[id].
|
|
25
|
+
{ prefix: "/api/v1/deployments", evidence: "app/api/v1/deployments/route.ts + [id]/route.ts" },
|
|
26
|
+
// GET /api/v1/health — service status + feature gates (public).
|
|
27
|
+
{ prefix: "/api/v1/health", evidence: "app/api/v1/health/route.ts" },
|
|
28
|
+
// POST /api/v1/images — text-to-image (billable).
|
|
29
|
+
{ prefix: "/api/v1/images", evidence: "app/api/v1/images/route.ts" },
|
|
30
|
+
// POST/GET /api/v1/jobs (+ [id]/cancel, [id]/logs, [id]/rerun).
|
|
31
|
+
{ prefix: "/api/v1/jobs", evidence: "app/api/v1/jobs/route.ts + [id]/{cancel,logs,rerun}/route.ts" },
|
|
32
|
+
// GET /api/v1/marketplace/offers — provider-anonymized capacity offers (public).
|
|
33
|
+
{ prefix: "/api/v1/marketplace/offers", evidence: "app/api/v1/marketplace/offers/route.ts" },
|
|
34
|
+
// GET/POST /api/v1/memes, GET /api/v1/memes/[id].
|
|
35
|
+
{ prefix: "/api/v1/memes", evidence: "app/api/v1/memes/route.ts + [id]/route.ts" },
|
|
36
|
+
// GET /api/v1/models — public catalog + owned private endpoints.
|
|
37
|
+
{ prefix: "/api/v1/models", evidence: "app/api/v1/models/route.ts" },
|
|
38
|
+
// GET/POST /api/v1/operations/[id] (POST = cancel), GET [id]/events.
|
|
39
|
+
{ prefix: "/api/v1/operations", evidence: "app/api/v1/operations/[id]/route.ts" },
|
|
40
|
+
// GET/POST /api/v1/quotes (GET requires ?quoteId=).
|
|
41
|
+
{ prefix: "/api/v1/quotes", evidence: "app/api/v1/quotes/route.ts" },
|
|
42
|
+
// GET/POST /api/v1/receipts — work receipts (list/create only; no [id] route).
|
|
43
|
+
{ prefix: "/api/v1/receipts", evidence: "app/api/v1/receipts/route.ts" },
|
|
44
|
+
// GET /api/v1/route-receipts/[id] — signed placement receipt (by-id only).
|
|
45
|
+
{ prefix: "/api/v1/route-receipts", evidence: "app/api/v1/route-receipts/[id]/route.ts" },
|
|
46
|
+
// POST/GET /api/v1/training, GET [id], POST [id]/deploy.
|
|
47
|
+
{ prefix: "/api/v1/training", evidence: "app/api/v1/training/route.ts + [id]/{route,deploy/route}.ts" },
|
|
48
|
+
// POST/GET /api/v1/agent-deploys, GET/DELETE [id].
|
|
49
|
+
{ prefix: "/api/v1/agent-deploys", evidence: "app/api/v1/agent-deploys/route.ts + [id]/route.ts" },
|
|
50
|
+
// POST/GET /api/v1/websites, GET/DELETE [id], POST [id]/promote|rollback.
|
|
51
|
+
{ prefix: "/api/v1/websites", evidence: "app/api/v1/websites/route.ts + [id]/route.ts" },
|
|
52
|
+
];
|
|
53
|
+
/**
|
|
54
|
+
* Route families that were advertised by pre-repair tools but DO NOT EXIST
|
|
55
|
+
* in the control plane (verified 2026-07 against app/api/v1/). Tools were
|
|
56
|
+
* removed from the registry; they return when the backend ships. Listed here
|
|
57
|
+
* so the gate test can also assert no tool regresses onto them.
|
|
58
|
+
*
|
|
59
|
+
* /api/v1/website (singular) — real family is /api/v1/websites (plural)
|
|
60
|
+
* /api/v1/networking, /api/v1/vpc — networking roadmap N1–N5, not built
|
|
61
|
+
* /api/v1/verification, /api/v1/attestations — Secured Cloud (TEE/zkVM) deferred
|
|
62
|
+
* /api/v1/testing — disposable test envs, not built
|
|
63
|
+
* /api/v1/planning — superseded by /api/v1/quotes
|
|
64
|
+
* /api/v1/lifecycle — superseded by /api/v1/deployments (+PATCH)
|
|
65
|
+
* /api/v1/projects — no projects list route exists
|
|
66
|
+
* /api/v1/catalog/compute, /api/v1/catalog/models — real: catalog/capabilities, models
|
|
67
|
+
* /api/v1/network/status — real: /api/v1/health
|
|
68
|
+
* /api/v1/account/balance — real: /api/v1/billing
|
|
69
|
+
* /api/v1/nodes/status, /api/v1/earnings — only nodes/[id]/earnings exists
|
|
70
|
+
*/
|
|
71
|
+
export const REMOVED_ROUTE_FAMILIES = [
|
|
72
|
+
"/api/v1/website",
|
|
73
|
+
"/api/v1/networking",
|
|
74
|
+
"/api/v1/vpc",
|
|
75
|
+
"/api/v1/verification",
|
|
76
|
+
"/api/v1/attestations",
|
|
77
|
+
"/api/v1/testing",
|
|
78
|
+
"/api/v1/planning",
|
|
79
|
+
"/api/v1/lifecycle",
|
|
80
|
+
"/api/v1/projects",
|
|
81
|
+
"/api/v1/catalog/compute",
|
|
82
|
+
"/api/v1/catalog/models",
|
|
83
|
+
"/api/v1/network",
|
|
84
|
+
"/api/v1/account/balance",
|
|
85
|
+
"/api/v1/nodes",
|
|
86
|
+
"/api/v1/earnings",
|
|
87
|
+
];
|
|
88
|
+
/** True when `path` (may contain :params) targets a real route family. */
|
|
89
|
+
export function isRealRoutePath(path) {
|
|
90
|
+
return REAL_ROUTE_FAMILIES.some(({ prefix }) => path === prefix || path.startsWith(`${prefix}/`));
|
|
91
|
+
}
|
|
92
|
+
/** True when `path` targets a family removed because the backend never existed. */
|
|
93
|
+
export function isRemovedRoutePath(path) {
|
|
94
|
+
return REMOVED_ROUTE_FAMILIES.some((prefix) => path === prefix || path.startsWith(`${prefix}/`));
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=route-families.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-families.js","sourceRoot":"","sources":["../src/route-families.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AASH,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IACzD,oEAAoE;IACpE,EAAE,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,6BAA6B,EAAE;IACtE,8EAA8E;IAC9E,EAAE,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,6BAA6B,EAAE;IACtE,0EAA0E;IAC1E,EAAE,MAAM,EAAE,8BAA8B,EAAE,QAAQ,EAAE,0CAA0C,EAAE;IAChG,2EAA2E;IAC3E,EAAE,MAAM,EAAE,qBAAqB,EAAE,QAAQ,EAAE,iDAAiD,EAAE;IAC9F,gEAAgE;IAChE,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,4BAA4B,EAAE;IACpE,kDAAkD;IAClD,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,4BAA4B,EAAE;IACpE,gEAAgE;IAChE,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,8DAA8D,EAAE;IACpG,iFAAiF;IACjF,EAAE,MAAM,EAAE,4BAA4B,EAAE,QAAQ,EAAE,wCAAwC,EAAE;IAC5F,kDAAkD;IAClD,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,2CAA2C,EAAE;IAClF,iEAAiE;IACjE,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,4BAA4B,EAAE;IACpE,qEAAqE;IACrE,EAAE,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,qCAAqC,EAAE;IACjF,oDAAoD;IACpD,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,4BAA4B,EAAE;IACpE,+EAA+E;IAC/E,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,8BAA8B,EAAE;IACxE,2EAA2E;IAC3E,EAAE,MAAM,EAAE,wBAAwB,EAAE,QAAQ,EAAE,yCAAyC,EAAE;IACzF,yDAAyD;IACzD,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,6DAA6D,EAAE;IACvG,mDAAmD;IACnD,EAAE,MAAM,EAAE,uBAAuB,EAAE,QAAQ,EAAE,mDAAmD,EAAE;IAClG,0EAA0E;IAC1E,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,8CAA8C,EAAE;CAChF,CAAC;AAEX;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB;IACvD,iBAAiB;IACjB,oBAAoB;IACpB,aAAa;IACb,sBAAsB;IACtB,sBAAsB;IACtB,iBAAiB;IACjB,kBAAkB;IAClB,mBAAmB;IACnB,kBAAkB;IAClB,yBAAyB;IACzB,wBAAwB;IACxB,iBAAiB;IACjB,yBAAyB;IACzB,eAAe;IACf,kBAAkB;CACV,CAAC;AAEX,0EAA0E;AAC1E,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,mBAAmB,CAAC,IAAI,CAC7B,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CACjE,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,sBAAsB,CAAC,IAAI,CAChC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAC7D,CAAC;AACJ,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Capix MCP Server — the McpServer assembly + transport wiring.
|
|
3
3
|
*
|
|
4
|
-
* `createCapixMcpServer(client)` builds an {@link McpServer} with
|
|
5
|
-
*
|
|
6
|
-
* registration wires:
|
|
4
|
+
* `createCapixMcpServer(client)` builds an {@link McpServer} with every tool
|
|
5
|
+
* in the registry (TOOL_COUNT), the capix:// resources, and the guided
|
|
6
|
+
* prompts registered. Each tool registration wires:
|
|
7
7
|
* - inputSchema → the tool's Zod raw shape (validated by the SDK)
|
|
8
8
|
* - outputSchema → the tool's Zod raw output shape
|
|
9
9
|
* - annotations → readOnlyHint / destructiveHint / idempotentHint derived
|
|
@@ -17,6 +17,13 @@
|
|
|
17
17
|
* 3. every billable tool's cost is the canonical quote the agent obtained
|
|
18
18
|
* upstream (no in-line price guess); the approval token binds that quote.
|
|
19
19
|
*
|
|
20
|
+
* Auto-discovery: when run as `capix-mcp server --stdio`, the server checks
|
|
21
|
+
* for credentials in this order:
|
|
22
|
+
* 1. CAPIX_API_KEY in env (set by the IDE/CLI as a session token)
|
|
23
|
+
* 2. CAPIX_REFRESH_TOKEN in env -> attempt OAuth refresh via the broker
|
|
24
|
+
* 3. Stored broker credentials (~/.capix/credentials.json or OS keyring)
|
|
25
|
+
* If none are found, the server exits with a helpful message.
|
|
26
|
+
*
|
|
20
27
|
* Transports:
|
|
21
28
|
* - stdio : StdioServerTransport, for local agent integration
|
|
22
29
|
* - streamable HTTP : StreamableHTTPServerTransport, for remote / hosted use
|
|
@@ -25,8 +32,8 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
25
32
|
import type { CapixClient } from "./client.js";
|
|
26
33
|
import type { ToolDef, ToolScope } from "./types.js";
|
|
27
34
|
/**
|
|
28
|
-
* Build a fully-wired McpServer. All
|
|
29
|
-
*
|
|
35
|
+
* Build a fully-wired McpServer. All registered tools, resources, and prompts
|
|
36
|
+
* are wired before returning; the caller just attaches a transport.
|
|
30
37
|
*/
|
|
31
38
|
export declare function createCapixMcpServer(client: CapixClient, opts?: {
|
|
32
39
|
version?: string;
|
|
@@ -37,8 +44,31 @@ export interface CapixServerOptions {
|
|
|
37
44
|
httpPort?: number;
|
|
38
45
|
/** Bearer service token guarding the HTTP transport (required if httpPort>0). */
|
|
39
46
|
httpServiceToken?: string;
|
|
47
|
+
/**
|
|
48
|
+
* When true (default for stdio), the server performs auto-discovery:
|
|
49
|
+
* checks CAPIX_API_KEY, then CAPIX_REFRESH_TOKEN, then the broker's
|
|
50
|
+
* stored credentials before starting. If none are found, it exits.
|
|
51
|
+
*/
|
|
52
|
+
autoDiscover?: boolean;
|
|
40
53
|
}
|
|
41
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* Resolve credentials via auto-discovery. Checks (in order):
|
|
56
|
+
* 1. CAPIX_API_KEY in env (session token set by the IDE/CLI)
|
|
57
|
+
* 2. CAPIX_REFRESH_TOKEN in env -> refresh via the broker
|
|
58
|
+
* 3. Stored broker credentials (OS keyring or ~/.capix/credentials.json)
|
|
59
|
+
* Returns the resolved API key (if using env), or null if the broker
|
|
60
|
+
* should be used.
|
|
61
|
+
*/
|
|
62
|
+
export declare function resolveAutoDiscovery(): Promise<{
|
|
63
|
+
apiKey: string | null;
|
|
64
|
+
useBroker: boolean;
|
|
65
|
+
}>;
|
|
66
|
+
/**
|
|
67
|
+
* Start the MCP server on stdio (the default for local agent integration).
|
|
68
|
+
* Performs auto-discovery: checks CAPIX_API_KEY, then CAPIX_REFRESH_TOKEN,
|
|
69
|
+
* then stored broker credentials. If none are found, exits with a helpful
|
|
70
|
+
* message instead of starting an unauthenticated server.
|
|
71
|
+
*/
|
|
42
72
|
export declare function startStdioServer(client: CapixClient, opts?: CapixServerOptions): Promise<void>;
|
|
43
73
|
/**
|
|
44
74
|
* Start the MCP server on a streamable HTTP transport.
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM/C,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAsBrD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,WAAW,EACnB,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1B,SAAS,CAmFX;AA8DD,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC;IACpD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC,CAkBD;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,WAAW,EACnB,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,kBAAkB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GACxE,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAMD,wBAAgB,cAAc,IAAI,KAAK,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC,CAOD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE5D"}
|
package/dist/server.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Capix MCP Server — the McpServer assembly + transport wiring.
|
|
3
3
|
*
|
|
4
|
-
* `createCapixMcpServer(client)` builds an {@link McpServer} with
|
|
5
|
-
*
|
|
6
|
-
* registration wires:
|
|
4
|
+
* `createCapixMcpServer(client)` builds an {@link McpServer} with every tool
|
|
5
|
+
* in the registry (TOOL_COUNT), the capix:// resources, and the guided
|
|
6
|
+
* prompts registered. Each tool registration wires:
|
|
7
7
|
* - inputSchema → the tool's Zod raw shape (validated by the SDK)
|
|
8
8
|
* - outputSchema → the tool's Zod raw output shape
|
|
9
9
|
* - annotations → readOnlyHint / destructiveHint / idempotentHint derived
|
|
@@ -17,6 +17,13 @@
|
|
|
17
17
|
* 3. every billable tool's cost is the canonical quote the agent obtained
|
|
18
18
|
* upstream (no in-line price guess); the approval token binds that quote.
|
|
19
19
|
*
|
|
20
|
+
* Auto-discovery: when run as `capix-mcp server --stdio`, the server checks
|
|
21
|
+
* for credentials in this order:
|
|
22
|
+
* 1. CAPIX_API_KEY in env (set by the IDE/CLI as a session token)
|
|
23
|
+
* 2. CAPIX_REFRESH_TOKEN in env -> attempt OAuth refresh via the broker
|
|
24
|
+
* 3. Stored broker credentials (~/.capix/credentials.json or OS keyring)
|
|
25
|
+
* If none are found, the server exits with a helpful message.
|
|
26
|
+
*
|
|
20
27
|
* Transports:
|
|
21
28
|
* - stdio : StdioServerTransport, for local agent integration
|
|
22
29
|
* - streamable HTTP : StreamableHTTPServerTransport, for remote / hosted use
|
|
@@ -26,16 +33,17 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
|
|
|
26
33
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
27
34
|
import { randomUUID } from "node:crypto";
|
|
28
35
|
import http from "node:http";
|
|
36
|
+
import { tryCreateBrokerAuthProvider } from "./client.js";
|
|
29
37
|
import { TOOLS, TOOL_MAP, TOOL_COUNT } from "./tools.js";
|
|
30
38
|
import { registerResources } from "./resources.js";
|
|
31
39
|
import { registerPrompts } from "./prompts.js";
|
|
32
40
|
import { CapixApiError } from "./types.js";
|
|
33
41
|
/** MCP tool annotations derived from a tool's billing/approval/scope flags. */
|
|
34
42
|
function annotationsFor(tool) {
|
|
35
|
-
const isDestructive =
|
|
36
|
-
tool.name === "
|
|
43
|
+
const isDestructive = tool.name === "capix_delete" ||
|
|
44
|
+
tool.name === "capix_cancel" ||
|
|
37
45
|
tool.name === "capix_website_destroy" ||
|
|
38
|
-
tool.name === "
|
|
46
|
+
tool.name === "capix_agent_destroy";
|
|
39
47
|
return {
|
|
40
48
|
readOnlyHint: !tool.billable && !tool.requiresApproval,
|
|
41
49
|
destructiveHint: isDestructive,
|
|
@@ -44,13 +52,13 @@ function annotationsFor(tool) {
|
|
|
44
52
|
};
|
|
45
53
|
}
|
|
46
54
|
/**
|
|
47
|
-
* Build a fully-wired McpServer. All
|
|
48
|
-
*
|
|
55
|
+
* Build a fully-wired McpServer. All registered tools, resources, and prompts
|
|
56
|
+
* are wired before returning; the caller just attaches a transport.
|
|
49
57
|
*/
|
|
50
58
|
export function createCapixMcpServer(client, opts) {
|
|
51
59
|
const server = new McpServer({
|
|
52
60
|
name: "capix-mcp",
|
|
53
|
-
version: opts?.version ?? "2.
|
|
61
|
+
version: opts?.version ?? "2.1.0",
|
|
54
62
|
});
|
|
55
63
|
// ── Tools ───────────────────────────────────────────────────────────────
|
|
56
64
|
for (const tool of TOOLS) {
|
|
@@ -168,8 +176,56 @@ function errorResult(err, toolName) {
|
|
|
168
176
|
],
|
|
169
177
|
};
|
|
170
178
|
}
|
|
171
|
-
/**
|
|
179
|
+
/**
|
|
180
|
+
* Resolve credentials via auto-discovery. Checks (in order):
|
|
181
|
+
* 1. CAPIX_API_KEY in env (session token set by the IDE/CLI)
|
|
182
|
+
* 2. CAPIX_REFRESH_TOKEN in env -> refresh via the broker
|
|
183
|
+
* 3. Stored broker credentials (OS keyring or ~/.capix/credentials.json)
|
|
184
|
+
* Returns the resolved API key (if using env), or null if the broker
|
|
185
|
+
* should be used.
|
|
186
|
+
*/
|
|
187
|
+
export async function resolveAutoDiscovery() {
|
|
188
|
+
// 1. Direct API key from environment (IDE/CLI sets this as a session token)
|
|
189
|
+
if (process.env.CAPIX_API_KEY) {
|
|
190
|
+
return { apiKey: process.env.CAPIX_API_KEY, useBroker: false };
|
|
191
|
+
}
|
|
192
|
+
// 2. Refresh token from environment -> use the broker to obtain an access token
|
|
193
|
+
if (process.env.CAPIX_REFRESH_TOKEN) {
|
|
194
|
+
return { apiKey: null, useBroker: true };
|
|
195
|
+
}
|
|
196
|
+
// 3. Fall back to stored broker credentials
|
|
197
|
+
const broker = await tryCreateBrokerAuthProvider();
|
|
198
|
+
if (broker && broker.isAuthenticated()) {
|
|
199
|
+
return { apiKey: null, useBroker: true };
|
|
200
|
+
}
|
|
201
|
+
return { apiKey: null, useBroker: false };
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Start the MCP server on stdio (the default for local agent integration).
|
|
205
|
+
* Performs auto-discovery: checks CAPIX_API_KEY, then CAPIX_REFRESH_TOKEN,
|
|
206
|
+
* then stored broker credentials. If none are found, exits with a helpful
|
|
207
|
+
* message instead of starting an unauthenticated server.
|
|
208
|
+
*/
|
|
172
209
|
export async function startStdioServer(client, opts) {
|
|
210
|
+
// ── Auto-discovery: check env vars before starting ───────────────────
|
|
211
|
+
// If the client is not authenticated and auto-discovery is enabled,
|
|
212
|
+
// check for credentials in the standard order. If none are found, exit.
|
|
213
|
+
if (opts?.autoDiscover !== false && !client.isAuthenticated()) {
|
|
214
|
+
const discovery = await resolveAutoDiscovery();
|
|
215
|
+
if (!discovery.apiKey && !discovery.useBroker) {
|
|
216
|
+
process.stderr.write("Capix MCP Server: no credentials found.\n" +
|
|
217
|
+
"Auto-discovery checked:\n" +
|
|
218
|
+
" 1. CAPIX_API_KEY — not set\n" +
|
|
219
|
+
" 2. CAPIX_REFRESH_TOKEN — not set\n" +
|
|
220
|
+
" 3. Stored OAuth credentials — not found\n" +
|
|
221
|
+
"\n" +
|
|
222
|
+
"Options:\n" +
|
|
223
|
+
" • Run `capix-mcp login` to authenticate via OAuth\n" +
|
|
224
|
+
" • Set CAPIX_API_KEY with a session token from capix.network\n" +
|
|
225
|
+
" • Set CAPIX_REFRESH_TOKEN (the IDE sets this automatically when signed in)\n");
|
|
226
|
+
process.exit(1);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
173
229
|
const server = createCapixMcpServer(client, opts);
|
|
174
230
|
const transport = new StdioServerTransport();
|
|
175
231
|
await server.connect(transport);
|
|
@@ -194,7 +250,7 @@ export async function startHttpServer(client, opts) {
|
|
|
194
250
|
res.end(JSON.stringify({
|
|
195
251
|
ok: true,
|
|
196
252
|
service: "capix-mcp",
|
|
197
|
-
version: opts.version ?? "2.
|
|
253
|
+
version: opts.version ?? "2.1.0",
|
|
198
254
|
tools: TOOL_COUNT,
|
|
199
255
|
authenticated: client.isAuthenticated(),
|
|
200
256
|
}));
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|