@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/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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pins.js","sourceRoot":"","sources":["../src/pins.ts"],"names":[],"mappings":"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"}
@@ -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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"}