@mesh-tech/mesh-cli 0.39.0 → 0.40.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/bin/{mesh.auth-preflight-JO5G7SOF.js → mesh.auth-preflight-AUFQ2FGD.js} +1 -1
- package/dist/bin/{mesh.chunk-CNLSVKYY.js → mesh.chunk-2ASXJ5DO.js} +233 -581
- package/dist/bin/mesh.chunk-2ASXJ5DO.js.map +6 -0
- package/dist/bin/{mesh.chunk-WODQO6TP.js → mesh.chunk-6AIG5OJM.js} +3 -3
- package/dist/bin/{mesh.chunk-OSV3EZQ3.js → mesh.chunk-6SSOVZOI.js} +1 -1
- package/dist/bin/{mesh.chunk-2ZJR5LGN.js → mesh.chunk-7HTKSUWR.js} +1507 -548
- package/dist/bin/mesh.chunk-7HTKSUWR.js.map +6 -0
- package/dist/bin/{mesh.chunk-UI6EFAMD.js → mesh.chunk-F44A3ACW.js} +2 -2
- package/dist/bin/{mesh.chunk-C2TKCYHP.js → mesh.chunk-HJGMOEUG.js} +1 -1
- package/dist/bin/{mesh.chunk-O6WRZU4X.js → mesh.chunk-NSQJEX36.js} +1 -1
- package/dist/bin/{mesh.chunk-C4ZM7DM2.js → mesh.chunk-PZVI7V3J.js} +1 -1
- package/dist/bin/mesh.chunk-TDCH4SFQ.js +419 -0
- package/dist/bin/mesh.chunk-TDCH4SFQ.js.map +6 -0
- package/dist/bin/mesh.chunk-YE2WIY3Y.js +473 -0
- package/dist/bin/mesh.chunk-YE2WIY3Y.js.map +6 -0
- package/dist/bin/{mesh.create-app-SOHBL75U.js → mesh.create-app-Z3RKSTBO.js} +3 -3
- package/dist/bin/{mesh.dev-token-server-SS7QEQOQ.js → mesh.dev-token-server-XG26C6IQ.js} +2 -2
- package/dist/bin/mesh.generate-XSM4C6FQ.js +10 -0
- package/dist/bin/mesh.js +9 -8
- package/dist/bin/mesh.js.map +1 -1
- package/dist/bin/{mesh.login-6VPMWHHU.js → mesh.login-3AWVGPCM.js} +2 -2
- package/dist/bin/{mesh.platform-setup-DJJB2PWL.js → mesh.platform-setup-2ZDMHRCI.js} +1 -1
- package/dist/bin/{mesh.program-Y4HUNBFP.js → mesh.program-K5JQXEHX.js} +9 -8
- package/dist/bin/{mesh.registry-5P4ZLFLJ.js → mesh.registry-JLQYFUNN.js} +4 -4
- package/dist/bin/{mesh.registry-identity-ONGUJQAY.js → mesh.registry-identity-3AR27UGO.js} +3 -3
- package/dist/bin/mesh.registry-identity-3AR27UGO.js.map +6 -0
- package/dist/bin/mesh.review-command-LUVZQN2T.js +238 -0
- package/dist/bin/mesh.review-command-LUVZQN2T.js.map +6 -0
- package/dist/bin/{mesh.start-5CPWOHDJ.js → mesh.start-KZ5L6SOJ.js} +2 -2
- package/dist/bin/{mesh.wizard-FNRTSGVN.js → mesh.wizard-FCTT55KI.js} +7 -7
- package/dist/bin/mesh.workspace-membership-DI3YQGEK.js +65 -0
- package/dist/bin/mesh.workspace-membership-DI3YQGEK.js.map +6 -0
- package/dist/build-info.json +2 -2
- package/dist/src/commands/dev-doctor.d.ts +22 -0
- package/dist/src/commands/dev-doctor.js +149 -0
- package/dist/src/commands/dev-env-leaks.d.ts +24 -0
- package/dist/src/commands/dev-env-leaks.js +178 -0
- package/dist/src/commands/dev-launch.d.ts +17 -1
- package/dist/src/commands/dev-launch.js +130 -5
- package/dist/src/commands/dev-readiness.d.ts +49 -0
- package/dist/src/commands/dev-readiness.js +78 -0
- package/dist/src/commands/dev.d.ts +60 -0
- package/dist/src/commands/dev.js +539 -140
- package/dist/src/commands/hub/index.js +10 -7
- package/dist/src/commands/mcp/generate.d.ts +11 -0
- package/dist/src/commands/mcp/generate.js +78 -0
- package/dist/src/commands/mcp/index.d.ts +2 -0
- package/dist/src/commands/mcp/index.js +70 -0
- package/dist/src/commands/mcp/manifest-file.d.ts +5 -0
- package/dist/src/commands/mcp/manifest-file.js +24 -0
- package/dist/src/commands/mcp/review-command.d.ts +24 -0
- package/dist/src/commands/mcp/review-command.js +66 -0
- package/dist/src/commands/mcp/review.d.ts +41 -0
- package/dist/src/commands/mcp/review.js +140 -0
- package/dist/src/commands/mcp/workspace-membership.d.ts +7 -0
- package/dist/src/commands/mcp/workspace-membership.js +77 -0
- package/dist/src/commands/secrets/reindex.js +2 -7
- package/dist/src/commands/secrets/set.d.ts +22 -1
- package/dist/src/commands/secrets/set.js +31 -8
- package/dist/src/commands/temporal.js +35 -4
- package/dist/src/commands/temporal.js.map +2 -2
- package/dist/src/program.js +2 -0
- package/dist/src/utils/aws-auth.d.ts +4 -0
- package/dist/src/utils/aws-auth.js +7 -3
- package/dist/src/utils/dev-sessions-root.d.ts +3 -0
- package/dist/src/utils/dev-sessions-root.js +45 -0
- package/dist/src/utils/kubeconfig.js +2 -2
- package/dist/src/utils/tailscale.js +7 -1
- package/dist/src/utils/temporal-auth.js +2 -1
- package/dist/src/utils/workflow-fingerprint.js +23 -12
- package/fragments/base/index.ts.hbs +3 -0
- package/package.json +7 -5
- package/skills/mesh/SKILL.md +10 -6
- package/templates/api-auth/index.ts.hbs +1 -0
- package/templates/api-role-gating/index.ts.hbs +1 -0
- package/templates/external-service/index.ts.hbs +1 -0
- package/templates/workflow/index.ts.hbs +2 -0
- package/dist/bin/mesh.chunk-2ZJR5LGN.js.map +0 -6
- package/dist/bin/mesh.chunk-CNLSVKYY.js.map +0 -6
- /package/dist/bin/{mesh.auth-preflight-JO5G7SOF.js.map → mesh.auth-preflight-AUFQ2FGD.js.map} +0 -0
- /package/dist/bin/{mesh.chunk-WODQO6TP.js.map → mesh.chunk-6AIG5OJM.js.map} +0 -0
- /package/dist/bin/{mesh.chunk-OSV3EZQ3.js.map → mesh.chunk-6SSOVZOI.js.map} +0 -0
- /package/dist/bin/{mesh.chunk-UI6EFAMD.js.map → mesh.chunk-F44A3ACW.js.map} +0 -0
- /package/dist/bin/{mesh.chunk-C2TKCYHP.js.map → mesh.chunk-HJGMOEUG.js.map} +0 -0
- /package/dist/bin/{mesh.chunk-O6WRZU4X.js.map → mesh.chunk-NSQJEX36.js.map} +0 -0
- /package/dist/bin/{mesh.chunk-C4ZM7DM2.js.map → mesh.chunk-PZVI7V3J.js.map} +0 -0
- /package/dist/bin/{mesh.create-app-SOHBL75U.js.map → mesh.create-app-Z3RKSTBO.js.map} +0 -0
- /package/dist/bin/{mesh.dev-token-server-SS7QEQOQ.js.map → mesh.dev-token-server-XG26C6IQ.js.map} +0 -0
- /package/dist/bin/{mesh.login-6VPMWHHU.js.map → mesh.generate-XSM4C6FQ.js.map} +0 -0
- /package/dist/bin/{mesh.platform-setup-DJJB2PWL.js.map → mesh.login-3AWVGPCM.js.map} +0 -0
- /package/dist/bin/{mesh.program-Y4HUNBFP.js.map → mesh.platform-setup-2ZDMHRCI.js.map} +0 -0
- /package/dist/bin/{mesh.registry-5P4ZLFLJ.js.map → mesh.program-K5JQXEHX.js.map} +0 -0
- /package/dist/bin/{mesh.registry-identity-ONGUJQAY.js.map → mesh.registry-JLQYFUNN.js.map} +0 -0
- /package/dist/bin/{mesh.start-5CPWOHDJ.js.map → mesh.start-KZ5L6SOJ.js.map} +0 -0
- /package/dist/bin/{mesh.wizard-FNRTSGVN.js.map → mesh.wizard-FCTT55KI.js.map} +0 -0
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
jsonReport,
|
|
12
12
|
renderHuman,
|
|
13
13
|
runChecks
|
|
14
|
-
} from "./mesh.chunk-
|
|
14
|
+
} from "./mesh.chunk-7HTKSUWR.js";
|
|
15
15
|
import {
|
|
16
16
|
findPackageRoot
|
|
17
17
|
} from "./mesh.chunk-MCBMHWXP.js";
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
} from "./mesh.chunk-IQOBTL42.js";
|
|
28
28
|
import {
|
|
29
29
|
registryPreflight
|
|
30
|
-
} from "./mesh.chunk-
|
|
30
|
+
} from "./mesh.chunk-6SSOVZOI.js";
|
|
31
31
|
|
|
32
32
|
// packages/mesh-cli/src/commands/create-app.ts
|
|
33
33
|
import * as fs3 from "fs";
|
|
@@ -181,7 +181,7 @@ async function scaffoldPlatformRepo(setup) {
|
|
|
181
181
|
remediation: { command: `mesh init platform ${setup.tenant} --dir <empty-dir>` }
|
|
182
182
|
});
|
|
183
183
|
}
|
|
184
|
-
const { copyTemplate } = await import("./mesh.create-app-
|
|
184
|
+
const { copyTemplate } = await import("./mesh.create-app-Z3RKSTBO.js");
|
|
185
185
|
const { findPackageRoot } = await import("./mesh.stack-EFTFAOCV.js");
|
|
186
186
|
const { syncSkills } = await import("./mesh.skills-MNDSMBIE.js");
|
|
187
187
|
const templateDir = path.join(findPackageRoot(), "templates", "platform-repo");
|
|
@@ -1051,7 +1051,7 @@ async function cliReferenceStaleness(repoRoot) {
|
|
|
1051
1051
|
{ createProgram },
|
|
1052
1052
|
{ extractCliReference, renderCliReferenceMarkdown }
|
|
1053
1053
|
] = await Promise.all([
|
|
1054
|
-
import("./mesh.program-
|
|
1054
|
+
import("./mesh.program-K5JQXEHX.js"),
|
|
1055
1055
|
import("./mesh.cli-reference-H3TOPIET.js")
|
|
1056
1056
|
]);
|
|
1057
1057
|
const outPath = path3.join(repoRoot, "docs/portal/generated/cli-reference.md");
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
// packages/mesh-cli/src/commands/mcp/generate.ts
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import * as path2 from "node:path";
|
|
5
|
+
|
|
6
|
+
// packages/api-registry/src/mcp-manifest.ts
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
var opName = z.string().regex(
|
|
9
|
+
/^[A-Za-z_][A-Za-z0-9_-]*$/,
|
|
10
|
+
"MCP tool names must be Mesh operation names (letter or underscore, then letters/digits/_/-)"
|
|
11
|
+
);
|
|
12
|
+
var mcpToolSchema = z.looseObject({
|
|
13
|
+
name: opName,
|
|
14
|
+
title: z.string().optional(),
|
|
15
|
+
description: z.string().optional(),
|
|
16
|
+
/** JSON Schema for the tool's arguments; published verbatim in the OpenAPI. */
|
|
17
|
+
inputSchema: z.looseObject({}),
|
|
18
|
+
outputSchema: z.looseObject({}).optional(),
|
|
19
|
+
annotations: z.looseObject({
|
|
20
|
+
readOnlyHint: z.boolean().optional(),
|
|
21
|
+
destructiveHint: z.boolean().optional()
|
|
22
|
+
}).optional()
|
|
23
|
+
});
|
|
24
|
+
function parseMcpToolSnapshot(value, label = "the tool snapshot") {
|
|
25
|
+
const list = Array.isArray(value) ? value : typeof value === "object" && value !== null ? value.tools : void 0;
|
|
26
|
+
if (!Array.isArray(list)) {
|
|
27
|
+
throw new Error(`MCP snapshot: ${label} must be a tools array or a { tools: [...] } object`);
|
|
28
|
+
}
|
|
29
|
+
const parsed = z.array(mcpToolSchema).safeParse(list);
|
|
30
|
+
if (!parsed.success) {
|
|
31
|
+
throw new Error(
|
|
32
|
+
`MCP snapshot: ${label} is not a valid tools/list: ${z.prettifyError(parsed.error)}`
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
const seen = /* @__PURE__ */ new Set();
|
|
36
|
+
for (const tool of parsed.data) {
|
|
37
|
+
if (seen.has(tool.name)) {
|
|
38
|
+
throw new Error(`MCP snapshot: ${label} lists the tool "${tool.name}" twice`);
|
|
39
|
+
}
|
|
40
|
+
seen.add(tool.name);
|
|
41
|
+
}
|
|
42
|
+
return parsed.data;
|
|
43
|
+
}
|
|
44
|
+
function mcpToolsOpenApi(definition, tools) {
|
|
45
|
+
return {
|
|
46
|
+
openapi: "3.1.0",
|
|
47
|
+
info: { title: definition.title ?? definition.name, version: definition.version ?? "1.0.0" },
|
|
48
|
+
paths: Object.fromEntries(
|
|
49
|
+
tools.map((tool, index) => [
|
|
50
|
+
`/v1/${tool.name}`,
|
|
51
|
+
{
|
|
52
|
+
post: {
|
|
53
|
+
operationId: tool.name,
|
|
54
|
+
summary: tool.title ?? tool.name,
|
|
55
|
+
description: tool.description,
|
|
56
|
+
requestBody: {
|
|
57
|
+
required: true,
|
|
58
|
+
content: {
|
|
59
|
+
"application/json": {
|
|
60
|
+
schema: { $ref: `#/components/schemas/McpToolInput${index}` }
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
responses: {
|
|
65
|
+
"200": {
|
|
66
|
+
description: "MCP tool result, preserving content, structuredContent and isError",
|
|
67
|
+
content: {
|
|
68
|
+
"application/json": { schema: { type: "object", additionalProperties: true } }
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
])
|
|
75
|
+
),
|
|
76
|
+
// Integration discovery resolves request fields from named components.
|
|
77
|
+
// An inline body renders as an empty argument schema in the docs engine.
|
|
78
|
+
components: {
|
|
79
|
+
schemas: Object.fromEntries(
|
|
80
|
+
tools.map((tool, index) => [`McpToolInput${index}`, tool.inputSchema])
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
var MCP_ACCESS_EXTENSION = "x-mesh-access";
|
|
86
|
+
var sharedHeaderAuth = z.strictObject({
|
|
87
|
+
kind: z.literal("shared-header"),
|
|
88
|
+
/** Request header the credential rides in. */
|
|
89
|
+
header: z.string().min(1).default("Authorization"),
|
|
90
|
+
/** Field of the Integration's credential secret holding the value. */
|
|
91
|
+
credential: z.string().min(1).default("authorization"),
|
|
92
|
+
/** Header value template; must interpolate `{credential}` exactly. */
|
|
93
|
+
template: z.string().min(1).default("{credential}").refine((t) => t.includes("{credential}"), {
|
|
94
|
+
message: "auth.template must contain the {credential} placeholder"
|
|
95
|
+
}),
|
|
96
|
+
/** Hub/`mesh secrets set` prompt for the credential field. */
|
|
97
|
+
credentialDescription: z.string().optional()
|
|
98
|
+
});
|
|
99
|
+
var oauthPerUserAuth = z.strictObject({
|
|
100
|
+
kind: z.literal("oauth-per-user"),
|
|
101
|
+
/** Authorization-server issuer the per-user connection is keyed by. */
|
|
102
|
+
authorizationServer: z.string().url().optional(),
|
|
103
|
+
scopes: z.array(z.string()).optional()
|
|
104
|
+
});
|
|
105
|
+
var noAuth = z.strictObject({ kind: z.literal("none") });
|
|
106
|
+
var mcpAuthSchema = z.discriminatedUnion("kind", [
|
|
107
|
+
sharedHeaderAuth,
|
|
108
|
+
oauthPerUserAuth,
|
|
109
|
+
noAuth
|
|
110
|
+
]);
|
|
111
|
+
var mcpManifestSchema = z.strictObject({
|
|
112
|
+
/** Registry entry / Nexus service name; also the agent's `name__op` prefix. */
|
|
113
|
+
name: z.string().regex(/^[a-z][a-z0-9-]*$/, "manifest name must be a lowercase slug (a-z, 0-9, -)"),
|
|
114
|
+
title: z.string().optional(),
|
|
115
|
+
description: z.string().optional(),
|
|
116
|
+
/** Hub family label, e.g. "q2". */
|
|
117
|
+
provider: z.string().optional(),
|
|
118
|
+
version: z.string().default("1.0.0"),
|
|
119
|
+
/** Hub ExternalService category. */
|
|
120
|
+
type: z.string().default("api"),
|
|
121
|
+
/** HTTPS, or HTTP on loopback; never embedded credentials. Every reader enforces it. */
|
|
122
|
+
serverUrl: z.string().url().refine(
|
|
123
|
+
(value) => {
|
|
124
|
+
const url = new URL(value);
|
|
125
|
+
const loopback = ["localhost", "127.0.0.1", "[::1]"].includes(url.hostname);
|
|
126
|
+
return (url.protocol === "https:" || url.protocol === "http:" && loopback) && !url.username && !url.password;
|
|
127
|
+
},
|
|
128
|
+
{ message: "serverUrl must use HTTPS (HTTP only on loopback) without embedded credentials" }
|
|
129
|
+
),
|
|
130
|
+
auth: mcpAuthSchema,
|
|
131
|
+
/** Path to the reviewed `tools/list` snapshot, relative to the manifest. */
|
|
132
|
+
tools: z.string().min(1),
|
|
133
|
+
/** Callable subset of the snapshot. Absent = every reviewed tool. */
|
|
134
|
+
enabledOps: z.array(opName).optional(),
|
|
135
|
+
/**
|
|
136
|
+
* Per-tool read/write decision, overriding whatever the snapshot's
|
|
137
|
+
* annotations say. The only way a tool becomes `read`: the vendor asserts
|
|
138
|
+
* `readOnlyHint`, it does not promise it.
|
|
139
|
+
*/
|
|
140
|
+
classification: z.record(opName, z.enum(["read", "write", "unknown"])).optional(),
|
|
141
|
+
/** Bounds each MCP connection and tool request. */
|
|
142
|
+
timeoutMs: z.number().int().positive().optional(),
|
|
143
|
+
/**
|
|
144
|
+
* Why no liveness op exists. MCP tools take arguments and may mutate, so
|
|
145
|
+
* `createMcpIntegration` refuses a definition without this.
|
|
146
|
+
*/
|
|
147
|
+
healthUnavailable: z.string().default("MCP tools require arguments; no dedicated liveness tool is advertised.")
|
|
148
|
+
});
|
|
149
|
+
function accessFromAnnotations(tool) {
|
|
150
|
+
const annotations = tool.annotations;
|
|
151
|
+
if (annotations?.destructiveHint === true || annotations?.readOnlyHint === false)
|
|
152
|
+
return { access: "write", source: "annotation" };
|
|
153
|
+
if (annotations?.readOnlyHint === true)
|
|
154
|
+
return { access: "unknown", source: "default", suggested: "read" };
|
|
155
|
+
return { access: "unknown", source: "default" };
|
|
156
|
+
}
|
|
157
|
+
function classifyMcpTools(tools, overrides = {}) {
|
|
158
|
+
const out = /* @__PURE__ */ Object.create(null);
|
|
159
|
+
for (const tool of tools) {
|
|
160
|
+
const override = Object.hasOwn(overrides, tool.name) ? overrides[tool.name] : void 0;
|
|
161
|
+
out[tool.name] = override ? { access: override, source: "manifest" } : accessFromAnnotations(tool);
|
|
162
|
+
}
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
function parseMcpManifest(value) {
|
|
166
|
+
return mcpManifestSchema.parse(value);
|
|
167
|
+
}
|
|
168
|
+
function definitionFromManifest(manifest, tools) {
|
|
169
|
+
const names = tools.map((t) => t.name);
|
|
170
|
+
const enabled = manifest.enabledOps ?? names;
|
|
171
|
+
const known = new Set(names);
|
|
172
|
+
for (const op of enabled) {
|
|
173
|
+
if (!known.has(op)) {
|
|
174
|
+
throw new Error(
|
|
175
|
+
`MCP manifest "${manifest.name}": enabledOps names "${op}", which is absent from the reviewed snapshot \u2014 re-run \`mesh mcp review\` on the manifest before enabling it`
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const credentialSchema = manifest.auth.kind === "shared-header" ? {
|
|
180
|
+
fields: {
|
|
181
|
+
[manifest.auth.credential]: {
|
|
182
|
+
name: `${manifest.title ?? manifest.name} ${manifest.auth.header} value`,
|
|
183
|
+
description: manifest.auth.credentialDescription ?? `Value interpolated into the ${manifest.auth.header} header as "${manifest.auth.template}".`,
|
|
184
|
+
secret: true
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
} : { fields: {} };
|
|
188
|
+
return {
|
|
189
|
+
name: manifest.name,
|
|
190
|
+
...manifest.provider ? { provider: manifest.provider } : {},
|
|
191
|
+
...manifest.title ? { title: manifest.title } : {},
|
|
192
|
+
...manifest.description ? { description: manifest.description } : {},
|
|
193
|
+
version: manifest.version,
|
|
194
|
+
type: manifest.type,
|
|
195
|
+
defaultEnabledOps: enabled,
|
|
196
|
+
health: { unavailable: manifest.healthUnavailable },
|
|
197
|
+
credentialSchema
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
function resolveMcpManifest(manifest, snapshot, opts = {}) {
|
|
201
|
+
const parsed = parseMcpManifest(manifest);
|
|
202
|
+
const tools = parseMcpToolSnapshot(snapshot, opts.toolsPath ?? parsed.tools);
|
|
203
|
+
if (tools.length === 0) {
|
|
204
|
+
throw new Error(
|
|
205
|
+
`MCP manifest "${parsed.name}": the reviewed snapshot is empty \u2014 an Integration with no reviewed tools has nothing to serve`
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
for (const op of Object.keys(parsed.classification ?? {})) {
|
|
209
|
+
if (!tools.some((t) => t.name === op)) {
|
|
210
|
+
throw new Error(
|
|
211
|
+
`MCP manifest "${parsed.name}": classification names "${op}", which is absent from the reviewed snapshot`
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
manifest: parsed,
|
|
217
|
+
tools,
|
|
218
|
+
...opts.toolsPath ? { toolsPath: opts.toolsPath } : {},
|
|
219
|
+
classification: classifyMcpTools(tools, parsed.classification ?? {}),
|
|
220
|
+
definition: definitionFromManifest(parsed, tools)
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function mcpManifestOpenApi(loaded) {
|
|
224
|
+
const doc = mcpToolsOpenApi(loaded.definition, loaded.tools);
|
|
225
|
+
for (const tool of loaded.tools) {
|
|
226
|
+
const operation = doc.paths[`/v1/${tool.name}`]?.post;
|
|
227
|
+
if (!operation) continue;
|
|
228
|
+
const entry = loaded.classification[tool.name];
|
|
229
|
+
operation[MCP_ACCESS_EXTENSION] = entry.access;
|
|
230
|
+
operation["x-mesh-access-source"] = entry.source;
|
|
231
|
+
}
|
|
232
|
+
return doc;
|
|
233
|
+
}
|
|
234
|
+
function mcpAuthHeaders(manifest, credentials) {
|
|
235
|
+
const auth = manifest.auth;
|
|
236
|
+
if (auth.kind === "none") return {};
|
|
237
|
+
if (auth.kind === "oauth-per-user") {
|
|
238
|
+
throw new Error(
|
|
239
|
+
`MCP manifest "${manifest.name}": auth.kind "oauth-per-user" is declared but not implemented \u2014 refusing to serve rather than fall back to a shared credential`
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
const value = credentials[auth.credential];
|
|
243
|
+
if (!value || value.trim() === "") {
|
|
244
|
+
throw new Error(
|
|
245
|
+
`MCP manifest "${manifest.name}": credential field "${auth.credential}" is missing \u2014 populate it with \`mesh secrets set external/${manifest.name}\``
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
return { [auth.header]: auth.template.replace("{credential}", value) };
|
|
249
|
+
}
|
|
250
|
+
var MCP_GENERATED_HEADER = "// GENERATED by `mesh mcp generate` \u2014 edit the manifest, not this file.";
|
|
251
|
+
var MCP_SERVE_ENTRY = "main.ts";
|
|
252
|
+
var MCP_SERVE_SPEC = "openapi.json";
|
|
253
|
+
var MCP_SERVE_DEPENDENCIES = {
|
|
254
|
+
"@hono/node-server": "^1.18.2",
|
|
255
|
+
"@mesh-tech/api-registry": "^1.14.0",
|
|
256
|
+
"@mesh-tech/app-kit": "^2.41.2",
|
|
257
|
+
"@mesh-tech/context": "^0.2.1",
|
|
258
|
+
"@mesh-tech/core-api": "^0.3.1",
|
|
259
|
+
"@mesh-tech/logger": "^2.41.2",
|
|
260
|
+
"@mesh-tech/nexus-utils": "^0.4.6",
|
|
261
|
+
"@mesh-tech/secrets": "^0.1.0",
|
|
262
|
+
"@modelcontextprotocol/client": "^2.0.0",
|
|
263
|
+
"@temporalio/activity": "^1.24.0",
|
|
264
|
+
"@temporalio/client": "^1.24.0",
|
|
265
|
+
"@temporalio/common": "^1.24.0",
|
|
266
|
+
"@temporalio/nexus": "^1.24.0",
|
|
267
|
+
"@temporalio/worker": "^1.24.0",
|
|
268
|
+
"@temporalio/workflow": "^1.24.0",
|
|
269
|
+
hono: "^4.10.6",
|
|
270
|
+
"nexus-rpc": "^0.0.3",
|
|
271
|
+
zod: "^4.3.5"
|
|
272
|
+
};
|
|
273
|
+
var MCP_SERVE_DEV_DEPENDENCIES = {
|
|
274
|
+
esbuild: "^0.25.8",
|
|
275
|
+
tsx: "^4.19.2",
|
|
276
|
+
typescript: "^5.7.2"
|
|
277
|
+
};
|
|
278
|
+
function mcpServePackageJson(name, dependencies) {
|
|
279
|
+
return {
|
|
280
|
+
name: `mesh-mcp-serve-${name}`,
|
|
281
|
+
version: "0.0.1",
|
|
282
|
+
private: true,
|
|
283
|
+
type: "module",
|
|
284
|
+
"//": `${MCP_GENERATED_HEADER} This package exists only to be the worker image's install closure; see mesh.apps.McpIntegration.`,
|
|
285
|
+
scripts: { dev: `tsx ${MCP_SERVE_ENTRY}`, "check-types": "tsc --noEmit" },
|
|
286
|
+
dependencies: { ...dependencies },
|
|
287
|
+
devDependencies: { ...MCP_SERVE_DEV_DEPENDENCIES }
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
function mcpServeEntrySource(manifest, tools) {
|
|
291
|
+
return [
|
|
292
|
+
MCP_GENERATED_HEADER,
|
|
293
|
+
"//",
|
|
294
|
+
"// The manifest and its reviewed tools/list snapshot are inlined: the deployed",
|
|
295
|
+
"// image is a bundle, not a copy of the repo, and a snapshot read at boot would",
|
|
296
|
+
"// be a live catalog, the thing the review step exists to prevent.",
|
|
297
|
+
'import { serveMcpManifest } from "@mesh-tech/app-kit/serve/mcp";',
|
|
298
|
+
"",
|
|
299
|
+
`const manifest = ${JSON.stringify(manifest, null, 2)} as const;`,
|
|
300
|
+
"",
|
|
301
|
+
`const tools = ${JSON.stringify(tools, null, 2)};`,
|
|
302
|
+
"",
|
|
303
|
+
"await serveMcpManifest({ manifest, tools });",
|
|
304
|
+
""
|
|
305
|
+
].join("\n");
|
|
306
|
+
}
|
|
307
|
+
function mcpServeSpecSource(loaded) {
|
|
308
|
+
return `${JSON.stringify(mcpManifestOpenApi(loaded), null, 2)}
|
|
309
|
+
`;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// packages/mesh-cli/src/commands/mcp/manifest-file.ts
|
|
313
|
+
import { readFileSync } from "node:fs";
|
|
314
|
+
import * as path from "node:path";
|
|
315
|
+
function readJson(file) {
|
|
316
|
+
let text;
|
|
317
|
+
try {
|
|
318
|
+
text = readFileSync(file, "utf8");
|
|
319
|
+
} catch (error) {
|
|
320
|
+
throw new Error(
|
|
321
|
+
`MCP manifest: cannot read ${file} (${error instanceof Error ? error.message : String(error)})`
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
try {
|
|
325
|
+
return JSON.parse(text);
|
|
326
|
+
} catch (error) {
|
|
327
|
+
throw new Error(
|
|
328
|
+
`MCP manifest: ${file} is not valid JSON (${error instanceof Error ? error.message : String(error)})`
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
function readMcpManifestFile(manifestPath) {
|
|
333
|
+
const absolute = path.resolve(manifestPath);
|
|
334
|
+
const manifest = parseMcpManifest(readJson(absolute));
|
|
335
|
+
const toolsPath = path.resolve(path.dirname(absolute), manifest.tools);
|
|
336
|
+
return { ...resolveMcpManifest(manifest, readJson(toolsPath), { toolsPath }), toolsPath };
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// packages/mesh-cli/src/commands/mcp/generate.ts
|
|
340
|
+
var SERVE_HOST_PACKAGE = "@mesh-tech/app-kit";
|
|
341
|
+
function installedManifest(require_, from, name) {
|
|
342
|
+
try {
|
|
343
|
+
return require_(`${name}/package.json`);
|
|
344
|
+
} catch {
|
|
345
|
+
}
|
|
346
|
+
let dir = path2.resolve(from);
|
|
347
|
+
for (; ; ) {
|
|
348
|
+
const file = path2.join(dir, "node_modules", ...name.split("/"), "package.json");
|
|
349
|
+
if (fs.existsSync(file)) {
|
|
350
|
+
try {
|
|
351
|
+
return JSON.parse(fs.readFileSync(file, "utf8"));
|
|
352
|
+
} catch {
|
|
353
|
+
return void 0;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
const parent = path2.dirname(dir);
|
|
357
|
+
if (parent === dir) return void 0;
|
|
358
|
+
dir = parent;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
function resolveServeDependencies(from, pinned = {}, declared = MCP_SERVE_DEPENDENCIES) {
|
|
362
|
+
const require_ = createRequire(path2.join(path2.resolve(from), "noop.js"));
|
|
363
|
+
const host = installedManifest(require_, from, SERVE_HOST_PACKAGE);
|
|
364
|
+
const peers = host?.peerDependencies ?? {};
|
|
365
|
+
const out = {};
|
|
366
|
+
for (const [name, fallback] of Object.entries(declared)) {
|
|
367
|
+
const peer = name === SERVE_HOST_PACKAGE ? void 0 : peers[name];
|
|
368
|
+
const usablePeer = peer && !peer.startsWith("workspace:") ? peer : void 0;
|
|
369
|
+
out[name] = pinned[name] ?? usablePeer ?? installedManifest(require_, from, name)?.version ?? fallback;
|
|
370
|
+
}
|
|
371
|
+
return out;
|
|
372
|
+
}
|
|
373
|
+
function defaultServeDir(manifestPath, name) {
|
|
374
|
+
return path2.join(path2.dirname(path2.resolve(manifestPath)), ".mesh-mcp", name);
|
|
375
|
+
}
|
|
376
|
+
function readPinned(packageJsonPath) {
|
|
377
|
+
if (!fs.existsSync(packageJsonPath)) return {};
|
|
378
|
+
try {
|
|
379
|
+
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
380
|
+
return Object.fromEntries(
|
|
381
|
+
Object.entries(pkg.dependencies ?? {}).filter(
|
|
382
|
+
(entry) => typeof entry[1] === "string"
|
|
383
|
+
)
|
|
384
|
+
);
|
|
385
|
+
} catch {
|
|
386
|
+
return {};
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
function generateMcpServeDir(manifestPath, opts = {}) {
|
|
390
|
+
const loaded = readMcpManifestFile(manifestPath);
|
|
391
|
+
const serveDir = path2.resolve(opts.out ?? defaultServeDir(manifestPath, loaded.manifest.name));
|
|
392
|
+
fs.mkdirSync(serveDir, { recursive: true });
|
|
393
|
+
const packageJsonPath = path2.join(serveDir, "package.json");
|
|
394
|
+
const dependencies = opts.dependencies ?? resolveServeDependencies(serveDir, opts.refreshVersions ? {} : readPinned(packageJsonPath));
|
|
395
|
+
const files = {
|
|
396
|
+
"package.json": `${JSON.stringify(mcpServePackageJson(loaded.manifest.name, dependencies), null, 2)}
|
|
397
|
+
`,
|
|
398
|
+
[MCP_SERVE_ENTRY]: mcpServeEntrySource(loaded.manifest, loaded.tools),
|
|
399
|
+
[MCP_SERVE_SPEC]: mcpServeSpecSource(loaded)
|
|
400
|
+
};
|
|
401
|
+
const written = [];
|
|
402
|
+
for (const [name, content] of Object.entries(files)) {
|
|
403
|
+
const file = path2.join(serveDir, name);
|
|
404
|
+
if (fs.existsSync(file) && fs.readFileSync(file, "utf8") === content) continue;
|
|
405
|
+
fs.writeFileSync(file, content);
|
|
406
|
+
written.push(name);
|
|
407
|
+
}
|
|
408
|
+
return { serveDir, written };
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
export {
|
|
412
|
+
parseMcpToolSnapshot,
|
|
413
|
+
classifyMcpTools,
|
|
414
|
+
mcpAuthHeaders,
|
|
415
|
+
readMcpManifestFile,
|
|
416
|
+
resolveServeDependencies,
|
|
417
|
+
defaultServeDir,
|
|
418
|
+
generateMcpServeDir
|
|
419
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/commands/mcp/generate.ts", "../../../api-registry/src/mcp-manifest.ts", "../../src/commands/mcp/manifest-file.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["path"]
|
|
6
|
+
}
|