@axtary/mcp 0.0.1 → 0.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/LICENSE +202 -0
- package/README.md +57 -3
- package/dist/conformance.d.ts +150 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +131 -0
- package/dist/conformance.js.map +1 -0
- package/dist/core.d.ts +95 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +311 -0
- package/dist/core.js.map +1 -0
- package/dist/http-client.d.ts +46 -0
- package/dist/http-client.d.ts.map +1 -0
- package/dist/http-client.js +280 -0
- package/dist/http-client.js.map +1 -0
- package/dist/index.d.ts +7 -86
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -295
- package/dist/index.js.map +1 -1
- package/dist/oauth.d.ts +168 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +449 -0
- package/dist/oauth.js.map +1 -0
- package/dist/pins.d.ts +179 -0
- package/dist/pins.d.ts.map +1 -0
- package/dist/pins.js +243 -0
- package/dist/pins.js.map +1 -0
- package/dist/server.d.ts +85 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +289 -0
- package/dist/server.js.map +1 -0
- package/dist/signing.d.ts +218 -0
- package/dist/signing.d.ts.map +1 -0
- package/dist/signing.js +429 -0
- package/dist/signing.js.map +1 -0
- package/package.json +6 -7
package/dist/pins.js
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
export const MCP_PINS_SCHEMA_VERSION = "axtary.mcp_pins.v1";
|
|
5
|
+
/** Legacy hash-only manifest; still loadable and upgraded in place. */
|
|
6
|
+
export const MCP_PINS_SCHEMA_VERSION_V0 = "axtary.mcp_pins.v0";
|
|
7
|
+
/**
|
|
8
|
+
* A pin is the human-reviewed, persisted identity of an MCP tool: the exact
|
|
9
|
+
* `definitionHash` that was approved for governance. Provenance enforcement is
|
|
10
|
+
* only meaningful if it survives across sessions — otherwise a server that
|
|
11
|
+
* poisons a tool definition between launches is silently re-trusted. The pin
|
|
12
|
+
* manifest is that durable record; the `description` is kept solely so a human
|
|
13
|
+
* can diff old vs new at review time.
|
|
14
|
+
*
|
|
15
|
+
* v1 adds publisher provenance (`publisher`/`kid`/`semver`) and the version
|
|
16
|
+
* chain link (`priorDefinitionHash`): the hash of the version this pin
|
|
17
|
+
* supersedes. The chain is what makes a silent re-definition (rug pull)
|
|
18
|
+
* detectable — a new signed version must reference the version it replaces and
|
|
19
|
+
* bump its semver. These fields are nullable so a hash-only (unsigned) pin and
|
|
20
|
+
* a legacy v0 manifest remain valid.
|
|
21
|
+
*/
|
|
22
|
+
export const McpToolPinSchema = z.object({
|
|
23
|
+
toolName: z.string().min(1),
|
|
24
|
+
definitionHash: z.string().regex(/^sha256:[a-f0-9]{64}$/),
|
|
25
|
+
schemaVersion: z.string().min(1),
|
|
26
|
+
description: z.string().nullable().default(null),
|
|
27
|
+
pinnedAt: z.string().min(1),
|
|
28
|
+
publisher: z.string().min(1).nullable().default(null),
|
|
29
|
+
kid: z.string().min(1).nullable().default(null),
|
|
30
|
+
semver: z.string().min(1).nullable().default(null),
|
|
31
|
+
priorDefinitionHash: z
|
|
32
|
+
.string()
|
|
33
|
+
.regex(/^sha256:[a-f0-9]{64}$/)
|
|
34
|
+
.nullable()
|
|
35
|
+
.default(null),
|
|
36
|
+
});
|
|
37
|
+
export const McpServerPinsSchema = z.object({
|
|
38
|
+
serverIdentity: z.string().min(1),
|
|
39
|
+
serverVersion: z.string().nullable().default(null),
|
|
40
|
+
tools: z.array(McpToolPinSchema).default([]),
|
|
41
|
+
});
|
|
42
|
+
export const McpPinManifestSchema = z
|
|
43
|
+
.object({
|
|
44
|
+
// Accept the legacy v0 marker so old manifests keep loading; every pin is
|
|
45
|
+
// normalized to the v1 shape (null provenance) and re-saved as v1.
|
|
46
|
+
schemaVersion: z.union([
|
|
47
|
+
z.literal(MCP_PINS_SCHEMA_VERSION),
|
|
48
|
+
z.literal(MCP_PINS_SCHEMA_VERSION_V0),
|
|
49
|
+
]),
|
|
50
|
+
servers: z.array(McpServerPinsSchema).default([]),
|
|
51
|
+
})
|
|
52
|
+
.transform((manifest) => ({
|
|
53
|
+
schemaVersion: MCP_PINS_SCHEMA_VERSION,
|
|
54
|
+
servers: manifest.servers,
|
|
55
|
+
}));
|
|
56
|
+
export function emptyMcpPinManifest() {
|
|
57
|
+
return { schemaVersion: MCP_PINS_SCHEMA_VERSION, servers: [] };
|
|
58
|
+
}
|
|
59
|
+
export function parseMcpPinManifest(input) {
|
|
60
|
+
return McpPinManifestSchema.parse(input);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Load the pin manifest. A missing file is the legitimate first-use state and
|
|
64
|
+
* yields an empty manifest; a present-but-corrupt file fails loud (we never
|
|
65
|
+
* silently fall back to "trust everything").
|
|
66
|
+
*/
|
|
67
|
+
export async function loadMcpPinManifest(path) {
|
|
68
|
+
let raw;
|
|
69
|
+
try {
|
|
70
|
+
raw = await readFile(path, "utf8");
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
if (error.code === "ENOENT") {
|
|
74
|
+
return emptyMcpPinManifest();
|
|
75
|
+
}
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
return parseMcpPinManifest(JSON.parse(raw));
|
|
79
|
+
}
|
|
80
|
+
export async function saveMcpPinManifest(path, manifest) {
|
|
81
|
+
await mkdir(dirname(path), { recursive: true });
|
|
82
|
+
await writeFile(path, `${JSON.stringify(normalizeManifest(manifest), null, 2)}\n`, {
|
|
83
|
+
encoding: "utf8",
|
|
84
|
+
mode: 0o600,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function findServer(manifest, serverIdentity) {
|
|
88
|
+
return manifest.servers.find((server) => server.serverIdentity === serverIdentity);
|
|
89
|
+
}
|
|
90
|
+
export function findMcpToolPin(manifest, serverIdentity, toolName) {
|
|
91
|
+
return findServer(manifest, serverIdentity)?.tools.find((tool) => tool.toolName === toolName);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Compare what the upstream advertises now against the persisted pins. Pure:
|
|
95
|
+
* no IO, no mutation. This is the heart of cross-session drift detection.
|
|
96
|
+
*/
|
|
97
|
+
export function reconcileMcpPins(manifest, definitions) {
|
|
98
|
+
return definitions.map((definition) => {
|
|
99
|
+
const pin = findMcpToolPin(manifest, definition.serverIdentity, definition.name);
|
|
100
|
+
const discoveredDescription = definition.description ?? null;
|
|
101
|
+
if (!pin) {
|
|
102
|
+
return {
|
|
103
|
+
status: "new",
|
|
104
|
+
serverIdentity: definition.serverIdentity,
|
|
105
|
+
toolName: definition.name,
|
|
106
|
+
discoveredHash: definition.definitionHash,
|
|
107
|
+
discoveredDescription,
|
|
108
|
+
pinnedHash: null,
|
|
109
|
+
pinnedDescription: null,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const status = pin.definitionHash === definition.definitionHash ? "pinned" : "drifted";
|
|
113
|
+
return {
|
|
114
|
+
status,
|
|
115
|
+
serverIdentity: definition.serverIdentity,
|
|
116
|
+
toolName: definition.name,
|
|
117
|
+
discoveredHash: definition.definitionHash,
|
|
118
|
+
discoveredDescription,
|
|
119
|
+
pinnedHash: pin.definitionHash,
|
|
120
|
+
pinnedDescription: pin.description,
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Return a new manifest with the given definitions pinned at their current
|
|
126
|
+
* hash. Used both for trust-on-first-use (new tools) and for the explicit
|
|
127
|
+
* `mcp review --accept` path (drifted tools). Never mutates the input.
|
|
128
|
+
*/
|
|
129
|
+
export function pinMcpDefinitions(manifest, definitions, options = {}) {
|
|
130
|
+
const now = options.now ?? (() => new Date().toISOString());
|
|
131
|
+
const next = normalizeManifest(manifest);
|
|
132
|
+
for (const definition of definitions) {
|
|
133
|
+
let server = next.servers.find((entry) => entry.serverIdentity === definition.serverIdentity);
|
|
134
|
+
if (!server) {
|
|
135
|
+
server = {
|
|
136
|
+
serverIdentity: definition.serverIdentity,
|
|
137
|
+
serverVersion: definition.serverVersion ?? null,
|
|
138
|
+
tools: [],
|
|
139
|
+
};
|
|
140
|
+
next.servers.push(server);
|
|
141
|
+
}
|
|
142
|
+
else if (definition.serverVersion) {
|
|
143
|
+
server.serverVersion = definition.serverVersion;
|
|
144
|
+
}
|
|
145
|
+
const provenance = options.provenance?.(definition);
|
|
146
|
+
const pin = {
|
|
147
|
+
toolName: definition.name,
|
|
148
|
+
definitionHash: definition.definitionHash,
|
|
149
|
+
schemaVersion: definition.schemaVersion,
|
|
150
|
+
description: definition.description ?? null,
|
|
151
|
+
pinnedAt: now(),
|
|
152
|
+
publisher: provenance?.publisher ?? null,
|
|
153
|
+
kid: provenance?.kid ?? null,
|
|
154
|
+
semver: provenance?.semver ?? null,
|
|
155
|
+
priorDefinitionHash: provenance?.priorDefinitionHash ?? null,
|
|
156
|
+
};
|
|
157
|
+
const existingIndex = server.tools.findIndex((tool) => tool.toolName === definition.name);
|
|
158
|
+
if (existingIndex === -1) {
|
|
159
|
+
server.tools.push(pin);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
server.tools[existingIndex] = pin;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return normalizeManifest(next);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Pure: compare a verified candidate against the current pin. No IO. Used by
|
|
169
|
+
* the review/accept path to decide whether a drifted-but-signed definition is
|
|
170
|
+
* a legitimate next version or a broken/regressed chain that needs a human.
|
|
171
|
+
*/
|
|
172
|
+
export function evaluateMcpVersionChain(input) {
|
|
173
|
+
if (!input.pin) {
|
|
174
|
+
return { verdict: "first_pin", reason: null };
|
|
175
|
+
}
|
|
176
|
+
if (input.pin.definitionHash === input.candidateHash) {
|
|
177
|
+
return { verdict: "unchanged", reason: null };
|
|
178
|
+
}
|
|
179
|
+
// A signed re-version must point back at exactly the version it replaces.
|
|
180
|
+
if (input.candidatePriorHash !== input.pin.definitionHash) {
|
|
181
|
+
return {
|
|
182
|
+
verdict: "broken_chain",
|
|
183
|
+
reason: `mcp_chain_prior_mismatch:${input.pin.definitionHash}`,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
// And it must advance the semantic version (ETDI immutable versioning).
|
|
187
|
+
if (input.pin.semver &&
|
|
188
|
+
input.candidateSemver &&
|
|
189
|
+
compareSemver(input.candidateSemver, input.pin.semver) <= 0) {
|
|
190
|
+
return {
|
|
191
|
+
verdict: "version_not_incremented",
|
|
192
|
+
reason: `mcp_chain_version_not_incremented:${input.pin.semver}`,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
return { verdict: "continuous", reason: null };
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Deterministic semver ordering: numeric major.minor.patch, then prerelease
|
|
199
|
+
* (a build *with* a prerelease tag is lower than the same release without).
|
|
200
|
+
* Returns <0, 0, or >0.
|
|
201
|
+
*/
|
|
202
|
+
export function compareSemver(left, right) {
|
|
203
|
+
const a = parseSemver(left);
|
|
204
|
+
const b = parseSemver(right);
|
|
205
|
+
for (let index = 0; index < 3; index += 1) {
|
|
206
|
+
const core = (a.core[index] ?? 0) - (b.core[index] ?? 0);
|
|
207
|
+
if (core !== 0)
|
|
208
|
+
return core < 0 ? -1 : 1;
|
|
209
|
+
}
|
|
210
|
+
if (a.prerelease === b.prerelease)
|
|
211
|
+
return 0;
|
|
212
|
+
if (a.prerelease === null)
|
|
213
|
+
return 1; // release > prerelease
|
|
214
|
+
if (b.prerelease === null)
|
|
215
|
+
return -1;
|
|
216
|
+
return a.prerelease < b.prerelease ? -1 : 1;
|
|
217
|
+
}
|
|
218
|
+
function parseSemver(value) {
|
|
219
|
+
const [core, prerelease = null] = value.split("-", 2);
|
|
220
|
+
const parts = core.split(".").map((part) => Number.parseInt(part, 10));
|
|
221
|
+
return {
|
|
222
|
+
core: [parts[0] ?? 0, parts[1] ?? 0, parts[2] ?? 0],
|
|
223
|
+
prerelease,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/** Stable ordering so the manifest is diff-friendly and deterministic on disk. */
|
|
227
|
+
function normalizeManifest(manifest) {
|
|
228
|
+
return {
|
|
229
|
+
schemaVersion: MCP_PINS_SCHEMA_VERSION,
|
|
230
|
+
servers: [...manifest.servers]
|
|
231
|
+
.map((server) => ({
|
|
232
|
+
serverIdentity: server.serverIdentity,
|
|
233
|
+
serverVersion: server.serverVersion ?? null,
|
|
234
|
+
tools: [...server.tools].sort((left, right) => left.toolName < right.toolName ? -1 : left.toolName > right.toolName ? 1 : 0),
|
|
235
|
+
}))
|
|
236
|
+
.sort((left, right) => left.serverIdentity < right.serverIdentity
|
|
237
|
+
? -1
|
|
238
|
+
: left.serverIdentity > right.serverIdentity
|
|
239
|
+
? 1
|
|
240
|
+
: 0),
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=pins.js.map
|
package/dist/pins.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pins.js","sourceRoot":"","sources":["../src/pins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,uBAAuB,GAAG,oBAAoB,CAAC;AAC5D,uEAAuE;AACvE,MAAM,CAAC,MAAM,0BAA0B,GAAG,oBAAoB,CAAC;AAE/D;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,uBAAuB,CAAC;IACzD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAChD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACrD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC/C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClD,mBAAmB,EAAE,CAAC;SACnB,MAAM,EAAE;SACR,KAAK,CAAC,uBAAuB,CAAC;SAC9B,QAAQ,EAAE;SACV,OAAO,CAAC,IAAI,CAAC;CACjB,CAAC,CAAC;AAWH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC7C,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC;KAClC,MAAM,CAAC;IACN,0EAA0E;IAC1E,mEAAmE;IACnE,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC;QACrB,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC;QAClC,CAAC,CAAC,OAAO,CAAC,0BAA0B,CAAC;KACtC,CAAC;IACF,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAClD,CAAC;KACD,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACxB,aAAa,EAAE,uBAAuB;IACtC,OAAO,EAAE,QAAQ,CAAC,OAAO;CAC1B,CAAC,CAAC,CAAC;AAiBN,MAAM,UAAU,mBAAmB;IACjC,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACnD,IAAI,GAAW,CAAC;IAEhB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,mBAAmB,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;IAED,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAY,EACZ,QAAwB;IAExB,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACjF,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CACjB,QAAwB,EACxB,cAAsB;IAEtB,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,KAAK,cAAc,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,QAAwB,EACxB,cAAsB,EACtB,QAAgB;IAEhB,OAAO,UAAU,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,KAAK,CAAC,IAAI,CACrD,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CACrC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAwB,EACxB,WAAsC;IAEtC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;QACpC,MAAM,GAAG,GAAG,cAAc,CACxB,QAAQ,EACR,UAAU,CAAC,cAAc,EACzB,UAAU,CAAC,IAAI,CAChB,CAAC;QACF,MAAM,qBAAqB,GAAG,UAAU,CAAC,WAAW,IAAI,IAAI,CAAC;QAE7D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,cAAc,EAAE,UAAU,CAAC,cAAc;gBACzC,QAAQ,EAAE,UAAU,CAAC,IAAI;gBACzB,cAAc,EAAE,UAAU,CAAC,cAAc;gBACzC,qBAAqB;gBACrB,UAAU,EAAE,IAAI;gBAChB,iBAAiB,EAAE,IAAI;aACxB,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GACV,GAAG,CAAC,cAAc,KAAK,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1E,OAAO;YACL,MAAM;YACN,cAAc,EAAE,UAAU,CAAC,cAAc;YACzC,QAAQ,EAAE,UAAU,CAAC,IAAI;YACzB,cAAc,EAAE,UAAU,CAAC,cAAc;YACzC,qBAAqB;YACrB,UAAU,EAAE,GAAG,CAAC,cAAc;YAC9B,iBAAiB,EAAE,GAAG,CAAC,WAAW;SACnC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAwB,EACxB,WAAsC,EACtC,UAQI,EAAE;IAEN,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAEzC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAC5B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,KAAK,UAAU,CAAC,cAAc,CAC9D,CAAC;QAEF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG;gBACP,cAAc,EAAE,UAAU,CAAC,cAAc;gBACzC,aAAa,EAAE,UAAU,CAAC,aAAa,IAAI,IAAI;gBAC/C,KAAK,EAAE,EAAE;aACV,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC;YACpC,MAAM,CAAC,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;QAClD,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,GAAG,GAAe;YACtB,QAAQ,EAAE,UAAU,CAAC,IAAI;YACzB,cAAc,EAAE,UAAU,CAAC,cAAc;YACzC,aAAa,EAAE,UAAU,CAAC,aAAa;YACvC,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,IAAI;YAC3C,QAAQ,EAAE,GAAG,EAAE;YACf,SAAS,EAAE,UAAU,EAAE,SAAS,IAAI,IAAI;YACxC,GAAG,EAAE,UAAU,EAAE,GAAG,IAAI,IAAI;YAC5B,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI,IAAI;YAClC,mBAAmB,EAAE,UAAU,EAAE,mBAAmB,IAAI,IAAI;SAC7D,CAAC;QACF,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAC1C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,UAAU,CAAC,IAAI,CAC5C,CAAC;QAEF,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAqBD;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAKvC;IACC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IACD,IAAI,KAAK,CAAC,GAAG,CAAC,cAAc,KAAK,KAAK,CAAC,aAAa,EAAE,CAAC;QACrD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IACD,0EAA0E;IAC1E,IAAI,KAAK,CAAC,kBAAkB,KAAK,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC1D,OAAO;YACL,OAAO,EAAE,cAAc;YACvB,MAAM,EAAE,4BAA4B,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE;SAC/D,CAAC;IACJ,CAAC;IACD,wEAAwE;IACxE,IACE,KAAK,CAAC,GAAG,CAAC,MAAM;QAChB,KAAK,CAAC,eAAe;QACrB,aAAa,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAC3D,CAAC;QACD,OAAO;YACL,OAAO,EAAE,yBAAyB;YAClC,MAAM,EAAE,qCAAqC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE;SAChE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,KAAa;IACvD,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;QAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC,uBAAuB;IAC5D,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAIhC,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACvE,OAAO;QACL,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnD,UAAU;KACX,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,SAAS,iBAAiB,CAAC,QAAwB;IACjD,OAAO;QACL,aAAa,EAAE,uBAAuB;QACtC,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC;aAC3B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAChB,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;YAC3C,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC5C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC7E;SACF,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc;YACxC,CAAC,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc;gBAC1C,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,CAAC,CACR;KACJ,CAAC;AACJ,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { JsonValue, NormalizedAction } from "@axtary/actionpass";
|
|
2
|
+
import type { ProxyHandleResult, ToolHandler } from "@axtary/proxy";
|
|
3
|
+
import { type McpToolDefinitionInput, type McpToolDefinitionRecord, type McpToolInvoker } from "./core.js";
|
|
4
|
+
export declare const MCP_PROTOCOL_VERSION = "2025-06-18";
|
|
5
|
+
export declare const MCP_WRAPPER_SERVER_NAME = "axtary-mcp-wrapper";
|
|
6
|
+
export type McpWrapperTool = {
|
|
7
|
+
definition: McpToolDefinitionRecord;
|
|
8
|
+
invoke: McpToolInvoker;
|
|
9
|
+
};
|
|
10
|
+
export declare function createMcpWrapperTool(input: {
|
|
11
|
+
definition: McpToolDefinitionInput | McpToolDefinitionRecord;
|
|
12
|
+
invoke: McpToolInvoker;
|
|
13
|
+
}): McpWrapperTool;
|
|
14
|
+
export declare function createMcpToolRouter(tools: McpWrapperTool[]): ToolHandler;
|
|
15
|
+
export type McpWrapperRuntime = {
|
|
16
|
+
handle(action: unknown): Promise<ProxyHandleResult>;
|
|
17
|
+
};
|
|
18
|
+
export type McpWrapperServerConfig = {
|
|
19
|
+
name?: string;
|
|
20
|
+
version?: string;
|
|
21
|
+
tools: McpWrapperTool[];
|
|
22
|
+
runtime: McpWrapperRuntime;
|
|
23
|
+
actor: NormalizedAction["actor"];
|
|
24
|
+
intent?: NormalizedAction["intent"];
|
|
25
|
+
};
|
|
26
|
+
export declare class McpWrapperServer {
|
|
27
|
+
private readonly config;
|
|
28
|
+
private readonly toolsByName;
|
|
29
|
+
constructor(config: McpWrapperServerConfig);
|
|
30
|
+
listToolDefinitions(): McpToolDefinitionRecord[];
|
|
31
|
+
handleMessage(raw: JsonValue): Promise<JsonValue | null>;
|
|
32
|
+
private handleToolCall;
|
|
33
|
+
}
|
|
34
|
+
export declare function createMcpWrapperServer(config: McpWrapperServerConfig): McpWrapperServer;
|
|
35
|
+
export type McpStdioClientConfig = {
|
|
36
|
+
command: string;
|
|
37
|
+
args?: string[];
|
|
38
|
+
cwd?: string;
|
|
39
|
+
env?: Record<string, string>;
|
|
40
|
+
timeoutMs?: number;
|
|
41
|
+
clientName?: string;
|
|
42
|
+
clientVersion?: string;
|
|
43
|
+
};
|
|
44
|
+
export type McpUpstreamToolListing = {
|
|
45
|
+
name: string;
|
|
46
|
+
description?: string;
|
|
47
|
+
inputSchema: Record<string, JsonValue>;
|
|
48
|
+
};
|
|
49
|
+
export type McpUpstreamServerInfo = {
|
|
50
|
+
name: string;
|
|
51
|
+
version: string;
|
|
52
|
+
protocolVersion: string;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* The transport-agnostic surface the governance path needs from an upstream
|
|
56
|
+
* MCP server. Both `McpStdioClient` and `McpHttpClient` implement it, so
|
|
57
|
+
* `axtary mcp serve`/`mcp review` pin and govern identically regardless of how
|
|
58
|
+
* the upstream is reached.
|
|
59
|
+
*/
|
|
60
|
+
export interface McpUpstreamClient {
|
|
61
|
+
serverInfo: McpUpstreamServerInfo | null;
|
|
62
|
+
listTools(): Promise<McpUpstreamToolListing[]>;
|
|
63
|
+
callTool(name: string, callArguments: Record<string, JsonValue>): Promise<JsonValue>;
|
|
64
|
+
close(): void;
|
|
65
|
+
}
|
|
66
|
+
export declare class McpStdioClient implements McpUpstreamClient {
|
|
67
|
+
private readonly child;
|
|
68
|
+
private readonly timeoutMs;
|
|
69
|
+
private readonly pending;
|
|
70
|
+
private buffer;
|
|
71
|
+
private nextId;
|
|
72
|
+
private closed;
|
|
73
|
+
serverInfo: McpUpstreamServerInfo | null;
|
|
74
|
+
private constructor();
|
|
75
|
+
static start(config: McpStdioClientConfig): Promise<McpStdioClient>;
|
|
76
|
+
request(method: string, params: Record<string, JsonValue>): Promise<JsonValue>;
|
|
77
|
+
notify(method: string, params: Record<string, JsonValue>): void;
|
|
78
|
+
listTools(): Promise<McpUpstreamToolListing[]>;
|
|
79
|
+
callTool(name: string, callArguments: Record<string, JsonValue>): Promise<JsonValue>;
|
|
80
|
+
close(): void;
|
|
81
|
+
private onData;
|
|
82
|
+
private onLine;
|
|
83
|
+
private rejectAll;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createMcpAction, createMcpToolDefinition, createMcpToolHandler, parseMcpActionCall, } from "./core.js";
|
|
3
|
+
export const MCP_PROTOCOL_VERSION = "2025-06-18";
|
|
4
|
+
export const MCP_WRAPPER_SERVER_NAME = "axtary-mcp-wrapper";
|
|
5
|
+
export function createMcpWrapperTool(input) {
|
|
6
|
+
return {
|
|
7
|
+
definition: createMcpToolDefinition(input.definition),
|
|
8
|
+
invoke: input.invoke,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function createMcpToolRouter(tools) {
|
|
12
|
+
const handlers = new Map(tools.map((tool) => [
|
|
13
|
+
tool.definition.name,
|
|
14
|
+
createMcpToolHandler({ definition: tool.definition, invoke: tool.invoke }),
|
|
15
|
+
]));
|
|
16
|
+
return (request) => {
|
|
17
|
+
const call = parseMcpActionCall(request.action);
|
|
18
|
+
const handler = handlers.get(call.toolName);
|
|
19
|
+
if (!handler) {
|
|
20
|
+
throw new Error(`mcp_tool_not_wrapped:${call.toolName}`);
|
|
21
|
+
}
|
|
22
|
+
return handler(request);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export class McpWrapperServer {
|
|
26
|
+
config;
|
|
27
|
+
toolsByName;
|
|
28
|
+
constructor(config) {
|
|
29
|
+
this.config = config;
|
|
30
|
+
this.toolsByName = new Map(config.tools.map((tool) => [tool.definition.name, tool]));
|
|
31
|
+
}
|
|
32
|
+
listToolDefinitions() {
|
|
33
|
+
return [...this.toolsByName.values()].map((tool) => tool.definition);
|
|
34
|
+
}
|
|
35
|
+
async handleMessage(raw) {
|
|
36
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
37
|
+
return errorResponse(null, -32600, "invalid_request");
|
|
38
|
+
}
|
|
39
|
+
const message = raw;
|
|
40
|
+
const id = isJsonRpcId(message.id) ? message.id : null;
|
|
41
|
+
const method = typeof message.method === "string" ? message.method : null;
|
|
42
|
+
const params = message.params && typeof message.params === "object" && !Array.isArray(message.params)
|
|
43
|
+
? message.params
|
|
44
|
+
: {};
|
|
45
|
+
const isNotification = !("id" in message);
|
|
46
|
+
if (!method) {
|
|
47
|
+
return isNotification ? null : errorResponse(id, -32600, "method_required");
|
|
48
|
+
}
|
|
49
|
+
if (isNotification) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
if (method === "initialize") {
|
|
53
|
+
const requestedVersion = typeof params.protocolVersion === "string"
|
|
54
|
+
? params.protocolVersion
|
|
55
|
+
: MCP_PROTOCOL_VERSION;
|
|
56
|
+
return resultResponse(id, {
|
|
57
|
+
protocolVersion: requestedVersion,
|
|
58
|
+
capabilities: { tools: { listChanged: false } },
|
|
59
|
+
serverInfo: {
|
|
60
|
+
name: this.config.name ?? MCP_WRAPPER_SERVER_NAME,
|
|
61
|
+
version: this.config.version ?? "0.0.1",
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (method === "ping") {
|
|
66
|
+
return resultResponse(id, {});
|
|
67
|
+
}
|
|
68
|
+
if (method === "tools/list") {
|
|
69
|
+
return resultResponse(id, {
|
|
70
|
+
tools: this.listToolDefinitions().map((definition) => ({
|
|
71
|
+
name: definition.name,
|
|
72
|
+
description: definition.description ??
|
|
73
|
+
`Axtary-wrapped MCP tool from ${definition.serverIdentity}`,
|
|
74
|
+
inputSchema: definition.inputSchema,
|
|
75
|
+
})),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
if (method === "tools/call") {
|
|
79
|
+
return this.handleToolCall(id, params);
|
|
80
|
+
}
|
|
81
|
+
return errorResponse(id, -32601, `method_not_found:${method}`);
|
|
82
|
+
}
|
|
83
|
+
async handleToolCall(id, params) {
|
|
84
|
+
const toolName = typeof params.name === "string" ? params.name : null;
|
|
85
|
+
if (!toolName) {
|
|
86
|
+
return errorResponse(id, -32602, "tool_name_required");
|
|
87
|
+
}
|
|
88
|
+
const tool = this.toolsByName.get(toolName);
|
|
89
|
+
if (!tool) {
|
|
90
|
+
return errorResponse(id, -32602, `unknown_tool:${toolName}`);
|
|
91
|
+
}
|
|
92
|
+
const callArguments = params.arguments && typeof params.arguments === "object" && !Array.isArray(params.arguments)
|
|
93
|
+
? params.arguments
|
|
94
|
+
: {};
|
|
95
|
+
const action = createMcpAction({
|
|
96
|
+
definition: tool.definition,
|
|
97
|
+
actor: this.config.actor,
|
|
98
|
+
intent: this.config.intent ?? {
|
|
99
|
+
taskId: "mcp-wrapper:session",
|
|
100
|
+
declaredGoal: `MCP tool call ${toolName} through the Axtary wrapper`,
|
|
101
|
+
},
|
|
102
|
+
call: { toolName, arguments: callArguments },
|
|
103
|
+
});
|
|
104
|
+
const result = await this.config.runtime.handle(action);
|
|
105
|
+
if (result.status === "executed") {
|
|
106
|
+
return resultResponse(id, {
|
|
107
|
+
content: [{ type: "text", text: stringifyResult(result.result) }],
|
|
108
|
+
isError: false,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
if (result.status === "blocked") {
|
|
112
|
+
return resultResponse(id, {
|
|
113
|
+
content: [
|
|
114
|
+
{
|
|
115
|
+
type: "text",
|
|
116
|
+
text: `axtary_blocked: ${result.decision.reasons.join(", ")}`,
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
isError: true,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
if (result.status === "failed") {
|
|
123
|
+
return resultResponse(id, {
|
|
124
|
+
content: [
|
|
125
|
+
{ type: "text", text: `axtary_execution_failed: ${result.error.reason}` },
|
|
126
|
+
],
|
|
127
|
+
isError: true,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return errorResponse(id, -32602, `malformed_action:${result.error.reason}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export function createMcpWrapperServer(config) {
|
|
134
|
+
return new McpWrapperServer(config);
|
|
135
|
+
}
|
|
136
|
+
export class McpStdioClient {
|
|
137
|
+
child;
|
|
138
|
+
timeoutMs;
|
|
139
|
+
pending = new Map();
|
|
140
|
+
buffer = "";
|
|
141
|
+
nextId = 1;
|
|
142
|
+
closed = false;
|
|
143
|
+
serverInfo = null;
|
|
144
|
+
constructor(config) {
|
|
145
|
+
this.timeoutMs = config.timeoutMs ?? 15_000;
|
|
146
|
+
this.child = spawn(config.command, config.args ?? [], {
|
|
147
|
+
cwd: config.cwd,
|
|
148
|
+
env: { ...process.env, ...config.env },
|
|
149
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
150
|
+
});
|
|
151
|
+
this.child.stdout?.setEncoding("utf8");
|
|
152
|
+
this.child.stdout?.on("data", (chunk) => this.onData(chunk));
|
|
153
|
+
this.child.on("error", (error) => this.rejectAll(error));
|
|
154
|
+
this.child.on("close", () => this.rejectAll(new Error("mcp_upstream_closed")));
|
|
155
|
+
}
|
|
156
|
+
static async start(config) {
|
|
157
|
+
const client = new McpStdioClient(config);
|
|
158
|
+
const initialized = (await client.request("initialize", {
|
|
159
|
+
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
160
|
+
capabilities: {},
|
|
161
|
+
clientInfo: {
|
|
162
|
+
name: config.clientName ?? "axtary-mcp-wrapper",
|
|
163
|
+
version: config.clientVersion ?? "0.0.1",
|
|
164
|
+
},
|
|
165
|
+
}));
|
|
166
|
+
const serverInfo = initialized.serverInfo && typeof initialized.serverInfo === "object" && !Array.isArray(initialized.serverInfo)
|
|
167
|
+
? initialized.serverInfo
|
|
168
|
+
: {};
|
|
169
|
+
client.serverInfo = {
|
|
170
|
+
name: typeof serverInfo.name === "string" ? serverInfo.name : "upstream",
|
|
171
|
+
version: typeof serverInfo.version === "string" ? serverInfo.version : "unknown",
|
|
172
|
+
protocolVersion: typeof initialized.protocolVersion === "string"
|
|
173
|
+
? initialized.protocolVersion
|
|
174
|
+
: MCP_PROTOCOL_VERSION,
|
|
175
|
+
};
|
|
176
|
+
client.notify("notifications/initialized", {});
|
|
177
|
+
return client;
|
|
178
|
+
}
|
|
179
|
+
request(method, params) {
|
|
180
|
+
if (this.closed) {
|
|
181
|
+
return Promise.reject(new Error("mcp_upstream_closed"));
|
|
182
|
+
}
|
|
183
|
+
const id = this.nextId;
|
|
184
|
+
this.nextId += 1;
|
|
185
|
+
return new Promise((resolve, reject) => {
|
|
186
|
+
const timer = setTimeout(() => {
|
|
187
|
+
this.pending.delete(id);
|
|
188
|
+
reject(new Error(`mcp_upstream_timeout:${method}`));
|
|
189
|
+
}, this.timeoutMs);
|
|
190
|
+
this.pending.set(id, { resolve, reject, timer });
|
|
191
|
+
this.child.stdin?.write(`${JSON.stringify({ jsonrpc: "2.0", id, method, params })}\n`);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
notify(method, params) {
|
|
195
|
+
this.child.stdin?.write(`${JSON.stringify({ jsonrpc: "2.0", method, params })}\n`);
|
|
196
|
+
}
|
|
197
|
+
async listTools() {
|
|
198
|
+
const result = (await this.request("tools/list", {}));
|
|
199
|
+
const tools = Array.isArray(result.tools) ? result.tools : [];
|
|
200
|
+
return tools.flatMap((tool) => {
|
|
201
|
+
if (!tool || typeof tool !== "object" || Array.isArray(tool)) {
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
const record = tool;
|
|
205
|
+
if (typeof record.name !== "string" || record.name.length === 0) {
|
|
206
|
+
return [];
|
|
207
|
+
}
|
|
208
|
+
return [
|
|
209
|
+
{
|
|
210
|
+
name: record.name,
|
|
211
|
+
description: typeof record.description === "string" ? record.description : undefined,
|
|
212
|
+
inputSchema: record.inputSchema && typeof record.inputSchema === "object" && !Array.isArray(record.inputSchema)
|
|
213
|
+
? record.inputSchema
|
|
214
|
+
: {},
|
|
215
|
+
},
|
|
216
|
+
];
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
callTool(name, callArguments) {
|
|
220
|
+
return this.request("tools/call", { name, arguments: callArguments });
|
|
221
|
+
}
|
|
222
|
+
close() {
|
|
223
|
+
this.closed = true;
|
|
224
|
+
this.child.kill("SIGTERM");
|
|
225
|
+
this.rejectAll(new Error("mcp_upstream_closed"));
|
|
226
|
+
}
|
|
227
|
+
onData(chunk) {
|
|
228
|
+
this.buffer += chunk;
|
|
229
|
+
let newlineIndex = this.buffer.indexOf("\n");
|
|
230
|
+
while (newlineIndex !== -1) {
|
|
231
|
+
const line = this.buffer.slice(0, newlineIndex).trim();
|
|
232
|
+
this.buffer = this.buffer.slice(newlineIndex + 1);
|
|
233
|
+
if (line.length > 0) {
|
|
234
|
+
this.onLine(line);
|
|
235
|
+
}
|
|
236
|
+
newlineIndex = this.buffer.indexOf("\n");
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
onLine(line) {
|
|
240
|
+
let message;
|
|
241
|
+
try {
|
|
242
|
+
const parsed = JSON.parse(line);
|
|
243
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
message = parsed;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
const id = typeof message.id === "number" ? message.id : null;
|
|
252
|
+
if (id === null) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const pending = this.pending.get(id);
|
|
256
|
+
if (!pending) {
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
this.pending.delete(id);
|
|
260
|
+
clearTimeout(pending.timer);
|
|
261
|
+
if (message.error && typeof message.error === "object" && !Array.isArray(message.error)) {
|
|
262
|
+
const error = message.error;
|
|
263
|
+
pending.reject(new Error(`mcp_upstream_error:${typeof error.code === "number" ? error.code : "unknown"}:${typeof error.message === "string" ? error.message : "unknown"}`));
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
pending.resolve(message.result ?? null);
|
|
267
|
+
}
|
|
268
|
+
rejectAll(error) {
|
|
269
|
+
this.closed = true;
|
|
270
|
+
for (const [id, pending] of this.pending) {
|
|
271
|
+
this.pending.delete(id);
|
|
272
|
+
clearTimeout(pending.timer);
|
|
273
|
+
pending.reject(error);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
function resultResponse(id, result) {
|
|
278
|
+
return { jsonrpc: "2.0", id, result };
|
|
279
|
+
}
|
|
280
|
+
function errorResponse(id, code, message) {
|
|
281
|
+
return { jsonrpc: "2.0", id, error: { code, message } };
|
|
282
|
+
}
|
|
283
|
+
function isJsonRpcId(value) {
|
|
284
|
+
return typeof value === "string" || typeof value === "number";
|
|
285
|
+
}
|
|
286
|
+
function stringifyResult(result) {
|
|
287
|
+
return typeof result === "string" ? result : JSON.stringify(result);
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|