@adtl/gateway 0.0.0-stage → 0.1.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 +201 -0
- package/README.md +102 -2
- package/dist/audit.d.ts +30 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +25 -0
- package/dist/audit.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +76 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +199 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +90 -0
- package/dist/config.js.map +1 -0
- package/dist/gateway.d.ts +34 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +151 -0
- package/dist/gateway.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/invoker.d.ts +56 -0
- package/dist/invoker.d.ts.map +1 -0
- package/dist/invoker.js +114 -0
- package/dist/invoker.js.map +1 -0
- package/dist/startup.d.ts +23 -0
- package/dist/startup.d.ts.map +1 -0
- package/dist/startup.js +133 -0
- package/dist/startup.js.map +1 -0
- package/package.json +59 -4
- package/src/audit.ts +47 -0
- package/src/cli.ts +73 -0
- package/src/config.ts +100 -0
- package/src/gateway.ts +198 -0
- package/src/index.ts +5 -0
- package/src/invoker.ts +175 -0
- package/src/startup.ts +159 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `gateway:` section of adtl.yaml.
|
|
3
|
+
*
|
|
4
|
+
* gateway:
|
|
5
|
+
* audit: ./adtl-audit.jsonl # optional JSONL audit log
|
|
6
|
+
* upstreams:
|
|
7
|
+
* github: # id must match `servers.github` in the label config
|
|
8
|
+
* command: npx
|
|
9
|
+
* args: ["-y", "@modelcontextprotocol/server-github"]
|
|
10
|
+
* env: { GITHUB_PERSONAL_ACCESS_TOKEN: "${GITHUB_TOKEN}" }
|
|
11
|
+
* docs:
|
|
12
|
+
* url: https://example.com/mcp
|
|
13
|
+
* headers: { Authorization: "Bearer ${DOCS_TOKEN}" }
|
|
14
|
+
*
|
|
15
|
+
* `${VAR}` in command, args, env, cwd, url and headers is replaced from the
|
|
16
|
+
* gateway's environment. A missing variable is a config error.
|
|
17
|
+
*/
|
|
18
|
+
import { z } from "zod";
|
|
19
|
+
const UPSTREAM_ID = /^[A-Za-z0-9-]+$/;
|
|
20
|
+
export const StdioUpstreamSchema = z
|
|
21
|
+
.object({
|
|
22
|
+
command: z.string().min(1),
|
|
23
|
+
args: z.array(z.string()).default([]),
|
|
24
|
+
env: z.record(z.string()).default({}),
|
|
25
|
+
cwd: z.string().optional(),
|
|
26
|
+
})
|
|
27
|
+
.strict();
|
|
28
|
+
export const HttpUpstreamSchema = z
|
|
29
|
+
.object({
|
|
30
|
+
url: z.string().min(1),
|
|
31
|
+
headers: z.record(z.string()).default({}),
|
|
32
|
+
})
|
|
33
|
+
.strict();
|
|
34
|
+
export const UpstreamSchema = z.union([StdioUpstreamSchema, HttpUpstreamSchema]);
|
|
35
|
+
export const GatewayConfigSchema = z
|
|
36
|
+
.object({
|
|
37
|
+
upstreams: z
|
|
38
|
+
.record(UpstreamSchema)
|
|
39
|
+
.refine((u) => Object.keys(u).length > 0, "At least one upstream server is required")
|
|
40
|
+
.refine((u) => Object.keys(u).every((id) => UPSTREAM_ID.test(id)), {
|
|
41
|
+
message: "Upstream ids may only contain letters, digits and '-' (they prefix tool names as <id>__<tool>)",
|
|
42
|
+
}),
|
|
43
|
+
/** How to start the interceptor server. Default: the bundled adtl-interceptors with this same config file. */
|
|
44
|
+
interceptors: StdioUpstreamSchema.optional(),
|
|
45
|
+
/** Path of a JSONL audit log. Relative paths are resolved against the config file's directory. */
|
|
46
|
+
audit: z.string().min(1).optional(),
|
|
47
|
+
/** Timeout for each interceptor invocation, in milliseconds. */
|
|
48
|
+
interceptorTimeoutMs: z.number().int().positive().default(5000),
|
|
49
|
+
})
|
|
50
|
+
.strict();
|
|
51
|
+
export const TOOL_SEPARATOR = "__";
|
|
52
|
+
export class EnvExpansionError extends Error {
|
|
53
|
+
variable;
|
|
54
|
+
constructor(variable, where) {
|
|
55
|
+
super(`Environment variable ${variable} is not set (used in ${where})`);
|
|
56
|
+
this.variable = variable;
|
|
57
|
+
this.name = "EnvExpansionError";
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Replace `${VAR}` with values from `env`. `$${VAR}` keeps a literal `${VAR}`. */
|
|
61
|
+
export function expandEnv(value, env, where) {
|
|
62
|
+
return value.replace(/(\$?)\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (match, escape, name) => {
|
|
63
|
+
if (escape)
|
|
64
|
+
return match.slice(1);
|
|
65
|
+
const v = env[name];
|
|
66
|
+
if (v === undefined)
|
|
67
|
+
throw new EnvExpansionError(name, where);
|
|
68
|
+
return v;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function expandRecord(rec, env, where) {
|
|
72
|
+
return Object.fromEntries(Object.entries(rec).map(([k, v]) => [k, expandEnv(v, env, `${where}.${k}`)]));
|
|
73
|
+
}
|
|
74
|
+
export function expandUpstream(id, u, env) {
|
|
75
|
+
const where = `gateway.upstreams.${id}`;
|
|
76
|
+
if ("url" in u) {
|
|
77
|
+
return { ...u, url: expandEnv(u.url, env, `${where}.url`), headers: expandRecord(u.headers, env, `${where}.headers`) };
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
...u,
|
|
81
|
+
command: expandEnv(u.command, env, `${where}.command`),
|
|
82
|
+
args: u.args.map((a, i) => expandEnv(a, env, `${where}.args[${i}]`)),
|
|
83
|
+
env: expandRecord(u.env, env, `${where}.env`),
|
|
84
|
+
...(u.cwd !== undefined ? { cwd: expandEnv(u.cwd, env, `${where}.cwd`) } : {}),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export function isHttpUpstream(u) {
|
|
88
|
+
return "url" in u;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { type CallToolResult, type Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
4
|
+
import type { AuditSink } from "./audit.js";
|
|
5
|
+
import type { InterceptorInvoker } from "./invoker.js";
|
|
6
|
+
export declare const GATEWAY_VERSION = "0.1.0";
|
|
7
|
+
/** `_meta` key on gateway-generated error results describing why a call was stopped. */
|
|
8
|
+
export declare const GATEWAY_DECISION_KEY = "adtl/gateway";
|
|
9
|
+
export interface GatewayLogger {
|
|
10
|
+
info(msg: string): void;
|
|
11
|
+
warn(msg: string): void;
|
|
12
|
+
}
|
|
13
|
+
export interface AdtlGatewayOptions {
|
|
14
|
+
upstreams: Map<string, Client>;
|
|
15
|
+
invoker: InterceptorInvoker;
|
|
16
|
+
/** One gateway process serves one agent session over stdio. */
|
|
17
|
+
sessionId?: string;
|
|
18
|
+
audit?: AuditSink;
|
|
19
|
+
logger?: GatewayLogger;
|
|
20
|
+
}
|
|
21
|
+
export declare class AdtlGateway {
|
|
22
|
+
readonly sessionId: string;
|
|
23
|
+
private readonly upstreams;
|
|
24
|
+
private readonly invoker;
|
|
25
|
+
private readonly audit;
|
|
26
|
+
private readonly log;
|
|
27
|
+
private routes;
|
|
28
|
+
constructor(opts: AdtlGatewayOptions);
|
|
29
|
+
/** The downstream MCP server the agent connects to. */
|
|
30
|
+
createServer(): Server;
|
|
31
|
+
listTools(): Promise<Tool[]>;
|
|
32
|
+
callTool(name: string, args: Record<string, unknown>): Promise<CallToolResult>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,IAAI,EACV,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,EAAc,SAAS,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,KAAK,EAAyB,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE9E,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC,wFAAwF;AACxF,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AAQnD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAOD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAoBD,qBAAa,WAAW;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,MAAM,CAA4B;gBAE9B,IAAI,EAAE,kBAAkB;IAQpC,uDAAuD;IACvD,YAAY,IAAI,MAAM;IAehB,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAuB5B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;CAoErF"}
|
package/dist/gateway.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The gateway: one MCP server facing the agent, many MCP clients facing the
|
|
3
|
+
* upstream servers, and an interceptor chain in between.
|
|
4
|
+
*
|
|
5
|
+
* tools/list → every upstream's tools, renamed <upstream>__<tool>
|
|
6
|
+
* tools/call → request interceptors (adtl.policy) → upstream → response
|
|
7
|
+
* interceptors (adtl.label) → agent
|
|
8
|
+
*
|
|
9
|
+
* When a call is stopped, the agent receives a normal tool result with
|
|
10
|
+
* `isError: true` explaining why, so the model can tell the user. In v0.1 an
|
|
11
|
+
* "ask" decision is treated as a block; approvals arrive in v0.2.
|
|
12
|
+
*/
|
|
13
|
+
import { randomUUID } from "node:crypto";
|
|
14
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
15
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
16
|
+
import { TOOL_SEPARATOR } from "./config.js";
|
|
17
|
+
export const GATEWAY_VERSION = "0.1.0";
|
|
18
|
+
/** `_meta` key on gateway-generated error results describing why a call was stopped. */
|
|
19
|
+
export const GATEWAY_DECISION_KEY = "adtl/gateway";
|
|
20
|
+
const stderrLogger = {
|
|
21
|
+
info: (m) => console.error(`[adtl-gateway] ${m}`),
|
|
22
|
+
warn: (m) => console.error(`[adtl-gateway] warning: ${m}`),
|
|
23
|
+
};
|
|
24
|
+
function textError(text, meta) {
|
|
25
|
+
return { content: [{ type: "text", text }], isError: true, _meta: { [GATEWAY_DECISION_KEY]: meta } };
|
|
26
|
+
}
|
|
27
|
+
function blockedMessage(b) {
|
|
28
|
+
if (b.decision === "ask") {
|
|
29
|
+
return (`ADTL stopped this call because it needs a human's approval: ${b.reason}. ` +
|
|
30
|
+
`This version of ADTL cannot ask for approval yet, so the call was not run. Tell the user what you were trying to do.`);
|
|
31
|
+
}
|
|
32
|
+
return `ADTL blocked this call: ${b.reason}. The call was not run.`;
|
|
33
|
+
}
|
|
34
|
+
function infoOf(outcome, interceptor) {
|
|
35
|
+
return outcome.results.find((r) => r.interceptor === interceptor)?.info ?? {};
|
|
36
|
+
}
|
|
37
|
+
export class AdtlGateway {
|
|
38
|
+
sessionId;
|
|
39
|
+
upstreams;
|
|
40
|
+
invoker;
|
|
41
|
+
audit;
|
|
42
|
+
log;
|
|
43
|
+
routes = new Map();
|
|
44
|
+
constructor(opts) {
|
|
45
|
+
this.upstreams = opts.upstreams;
|
|
46
|
+
this.invoker = opts.invoker;
|
|
47
|
+
this.sessionId = opts.sessionId ?? randomUUID();
|
|
48
|
+
this.audit = opts.audit;
|
|
49
|
+
this.log = opts.logger ?? stderrLogger;
|
|
50
|
+
}
|
|
51
|
+
/** The downstream MCP server the agent connects to. */
|
|
52
|
+
createServer() {
|
|
53
|
+
const server = new Server({ name: "adtl-gateway", version: GATEWAY_VERSION }, {
|
|
54
|
+
capabilities: { tools: {} },
|
|
55
|
+
instructions: "Tools from several MCP servers, named <server>__<tool>. ADTL checks each call against trust labels; " +
|
|
56
|
+
"if a call is stopped, the result explains why.",
|
|
57
|
+
});
|
|
58
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: await this.listTools() }));
|
|
59
|
+
server.setRequestHandler(CallToolRequestSchema, async (req) => this.callTool(req.params.name, req.params.arguments ?? {}));
|
|
60
|
+
return server;
|
|
61
|
+
}
|
|
62
|
+
async listTools() {
|
|
63
|
+
const routes = new Map();
|
|
64
|
+
const tools = [];
|
|
65
|
+
for (const [upstream, client] of this.upstreams) {
|
|
66
|
+
let cursor;
|
|
67
|
+
try {
|
|
68
|
+
do {
|
|
69
|
+
const page = await client.listTools(cursor ? { cursor } : {});
|
|
70
|
+
for (const t of page.tools) {
|
|
71
|
+
const name = `${upstream}${TOOL_SEPARATOR}${t.name}`;
|
|
72
|
+
routes.set(name, { upstream, tool: t.name, ...(t.annotations ? { annotations: t.annotations } : {}) });
|
|
73
|
+
tools.push({ ...t, name });
|
|
74
|
+
}
|
|
75
|
+
cursor = page.nextCursor;
|
|
76
|
+
} while (cursor);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
this.log.warn(`tools/list failed for ${upstream}: ${err.message}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
this.routes = routes;
|
|
83
|
+
return tools;
|
|
84
|
+
}
|
|
85
|
+
async callTool(name, args) {
|
|
86
|
+
const started = performance.now();
|
|
87
|
+
let route = this.routes.get(name);
|
|
88
|
+
if (!route) {
|
|
89
|
+
await this.listTools();
|
|
90
|
+
route = this.routes.get(name);
|
|
91
|
+
}
|
|
92
|
+
if (!route)
|
|
93
|
+
return textError(`Unknown tool: ${name}`, { reason: "unknown_tool" });
|
|
94
|
+
const client = this.upstreams.get(route.upstream);
|
|
95
|
+
const context = {
|
|
96
|
+
sessionId: this.sessionId,
|
|
97
|
+
timestamp: new Date().toISOString(),
|
|
98
|
+
principal: { type: "anonymous" },
|
|
99
|
+
};
|
|
100
|
+
const config = {
|
|
101
|
+
server: route.upstream,
|
|
102
|
+
...(route.annotations ? { toolAnnotations: route.annotations } : {}),
|
|
103
|
+
};
|
|
104
|
+
const base = { sessionId: this.sessionId, event: "tools/call", server: route.upstream, tool: route.tool };
|
|
105
|
+
const finish = (entry) => this.audit?.write({ ts: context.timestamp, ...base, ...entry, durationMs: Math.round(performance.now() - started) });
|
|
106
|
+
// 1. Request phase: adtl.policy decides whether the call may run.
|
|
107
|
+
const requestPayload = { method: "tools/call", params: { name: route.tool, arguments: args } };
|
|
108
|
+
const req = await this.invoker.runRequest({ event: "tools/call", payload: requestPayload, config, context });
|
|
109
|
+
const policy = infoOf(req, "adtl.policy");
|
|
110
|
+
if (req.blocked) {
|
|
111
|
+
finish({ outcome: "blocked", decision: req.blocked.decision, reason: req.blocked.reason, matched: policy.matched, callHash: policy.callHash, sessionLabel: policy.sessionLabel, warnings: req.warnings });
|
|
112
|
+
this.log.info(`${req.blocked.decision} ${name}: ${req.blocked.reason}`);
|
|
113
|
+
return textError(blockedMessage(req.blocked), { ...req.blocked, callHash: policy.callHash });
|
|
114
|
+
}
|
|
115
|
+
const forwarded = req.payload.params;
|
|
116
|
+
// 2. Forward to the upstream server.
|
|
117
|
+
let result;
|
|
118
|
+
try {
|
|
119
|
+
result = (await client.callTool({ name: forwarded.name, arguments: forwarded.arguments }));
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
const reason = err.message;
|
|
123
|
+
finish({ outcome: "upstream_error", decision: "allow", reason, callHash: policy.callHash, warnings: req.warnings });
|
|
124
|
+
return textError(`The ${route.upstream} server returned an error: ${reason}`, { reason: "upstream_error" });
|
|
125
|
+
}
|
|
126
|
+
// 3. Response phase: adtl.label labels the result and records it in the session.
|
|
127
|
+
const res = await this.invoker.runResponse({
|
|
128
|
+
event: "tools/call",
|
|
129
|
+
payload: { method: "tools/call", params: forwarded, result },
|
|
130
|
+
config,
|
|
131
|
+
context,
|
|
132
|
+
});
|
|
133
|
+
if (res.blocked) {
|
|
134
|
+
// Fail closed: an unlabeled result must not reach the agent.
|
|
135
|
+
finish({ outcome: "blocked", decision: res.blocked.decision, reason: res.blocked.reason, callHash: policy.callHash, warnings: [...req.warnings, ...res.warnings] });
|
|
136
|
+
this.log.warn(`result of ${name} withheld: ${res.blocked.reason}`);
|
|
137
|
+
return textError(`ADTL could not label the result of this call, so it was withheld: ${res.blocked.reason}`, { ...res.blocked });
|
|
138
|
+
}
|
|
139
|
+
const label = infoOf(res, "adtl.label");
|
|
140
|
+
finish({
|
|
141
|
+
outcome: "forwarded",
|
|
142
|
+
decision: policy["adtl/decision"] ?? "allow",
|
|
143
|
+
callHash: policy.callHash,
|
|
144
|
+
label: label.label,
|
|
145
|
+
sessionLabel: label.sessionLabel,
|
|
146
|
+
warnings: [...req.warnings, ...res.warnings],
|
|
147
|
+
});
|
|
148
|
+
return res.payload.result;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs interceptors in the order SEP-2624 requires:
|
|
3
|
+
*
|
|
4
|
+
* - Sending (request phase, gateway → upstream): Mutate (sequential, by
|
|
5
|
+
* priorityHint then name) → Validate (parallel).
|
|
6
|
+
* - Receiving (response phase, upstream → gateway): Validate (parallel) →
|
|
7
|
+
* Mutate (sequential).
|
|
8
|
+
*
|
|
9
|
+
* Only `severity: "error"` blocks. Audit-mode interceptors never block, and
|
|
10
|
+
* their mutations are not applied. An interceptor that fails (error or
|
|
11
|
+
* timeout) blocks the message unless it declares `failOpen: true`.
|
|
12
|
+
*/
|
|
13
|
+
import type { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
14
|
+
import { type InterceptorDefinition, type InterceptorResult, type InvocationContext } from "@adtl/interceptors";
|
|
15
|
+
import type { Decision } from "@adtl/labels";
|
|
16
|
+
export interface BoundInterceptor {
|
|
17
|
+
client: Client;
|
|
18
|
+
definition: InterceptorDefinition;
|
|
19
|
+
}
|
|
20
|
+
export interface Blocked {
|
|
21
|
+
interceptor: string;
|
|
22
|
+
decision: Decision;
|
|
23
|
+
reason: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ChainOutcome {
|
|
26
|
+
payload: unknown;
|
|
27
|
+
blocked?: Blocked;
|
|
28
|
+
results: InterceptorResult[];
|
|
29
|
+
/** Interceptors that failed but were allowed to (failOpen or audit mode). */
|
|
30
|
+
warnings: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface InvokeOptions {
|
|
33
|
+
event: string;
|
|
34
|
+
payload: unknown;
|
|
35
|
+
config: Record<string, unknown>;
|
|
36
|
+
context: InvocationContext;
|
|
37
|
+
}
|
|
38
|
+
export declare class InterceptorInvoker {
|
|
39
|
+
private readonly interceptors;
|
|
40
|
+
private readonly timeoutMs;
|
|
41
|
+
constructor(interceptors: BoundInterceptor[], timeoutMs?: number);
|
|
42
|
+
/** Discover the interceptors an interceptor server offers. */
|
|
43
|
+
static discover(client: Client): Promise<BoundInterceptor[]>;
|
|
44
|
+
get definitions(): InterceptorDefinition[];
|
|
45
|
+
runRequest(opts: InvokeOptions): Promise<ChainOutcome>;
|
|
46
|
+
runResponse(opts: InvokeOptions): Promise<ChainOutcome>;
|
|
47
|
+
private select;
|
|
48
|
+
private invoke;
|
|
49
|
+
/** Handle an interceptor failure. Returns false if the chain must stop. */
|
|
50
|
+
private failed;
|
|
51
|
+
/** Sequential mutations, atomic: on failure the original payload is kept. */
|
|
52
|
+
private mutate;
|
|
53
|
+
/** Parallel validations. Only severity "error" blocks. */
|
|
54
|
+
private validate;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=invoker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoker.d.ts","sourceRoot":"","sources":["../src/invoker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,EAIL,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAIvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAa7C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,qBAAqB,CAAC;CACnC;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAaD,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,YAAY,EAAE,gBAAgB,EAAE,EAChC,SAAS,SAAO;IAGnC,8DAA8D;WACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAMlE,IAAI,WAAW,IAAI,qBAAqB,EAAE,CAEzC;IAEK,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAOtD,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAO7D,OAAO,CAAC,MAAM;YAIA,MAAM;IAUpB,2EAA2E;IAC3E,OAAO,CAAC,MAAM;IAUd,6EAA6E;YAC/D,MAAM;IAoBpB,0DAA0D;YAC5C,QAAQ;CAsBvB"}
|
package/dist/invoker.js
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { DECISION_INFO_KEY, INVOKE_METHOD, LIST_METHOD, } from "@adtl/interceptors";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
const AnyResult = z.object({}).passthrough();
|
|
4
|
+
/** Untyped request: interceptor methods are extension methods the SDK does not type. */
|
|
5
|
+
function request(client, method, params, timeout) {
|
|
6
|
+
const r = client.request;
|
|
7
|
+
return r.call(client, { method, params }, AnyResult, { timeout });
|
|
8
|
+
}
|
|
9
|
+
function priority(def, phase) {
|
|
10
|
+
const p = def.priorityHint;
|
|
11
|
+
if (p === undefined)
|
|
12
|
+
return 0;
|
|
13
|
+
if (typeof p === "number")
|
|
14
|
+
return p;
|
|
15
|
+
return p[phase] ?? 0;
|
|
16
|
+
}
|
|
17
|
+
function hooks(def, event, phase) {
|
|
18
|
+
return def.hooks.some((h) => h.phase === phase && (h.events.includes(event) || h.events.includes("*")));
|
|
19
|
+
}
|
|
20
|
+
export class InterceptorInvoker {
|
|
21
|
+
interceptors;
|
|
22
|
+
timeoutMs;
|
|
23
|
+
constructor(interceptors, timeoutMs = 5000) {
|
|
24
|
+
this.interceptors = interceptors;
|
|
25
|
+
this.timeoutMs = timeoutMs;
|
|
26
|
+
}
|
|
27
|
+
/** Discover the interceptors an interceptor server offers. */
|
|
28
|
+
static async discover(client) {
|
|
29
|
+
const res = await request(client, LIST_METHOD, {}, 10_000);
|
|
30
|
+
const defs = (res.interceptors ?? []);
|
|
31
|
+
return defs.map((definition) => ({ client, definition }));
|
|
32
|
+
}
|
|
33
|
+
get definitions() {
|
|
34
|
+
return this.interceptors.map((i) => i.definition);
|
|
35
|
+
}
|
|
36
|
+
async runRequest(opts) {
|
|
37
|
+
const out = { payload: opts.payload, results: [], warnings: [] };
|
|
38
|
+
if (!(await this.mutate("request", opts, out)))
|
|
39
|
+
return out;
|
|
40
|
+
await this.validate("request", opts, out);
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
async runResponse(opts) {
|
|
44
|
+
const out = { payload: opts.payload, results: [], warnings: [] };
|
|
45
|
+
if (!(await this.validate("response", opts, out)))
|
|
46
|
+
return out;
|
|
47
|
+
await this.mutate("response", opts, out);
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
select(type, event, phase) {
|
|
51
|
+
return this.interceptors.filter((i) => i.definition.type === type && hooks(i.definition, event, phase));
|
|
52
|
+
}
|
|
53
|
+
async invoke(i, phase, opts, payload) {
|
|
54
|
+
const res = await request(i.client, INVOKE_METHOD, { name: i.definition.name, event: opts.event, phase, payload, config: opts.config, timeoutMs: this.timeoutMs, context: opts.context }, this.timeoutMs);
|
|
55
|
+
return res;
|
|
56
|
+
}
|
|
57
|
+
/** Handle an interceptor failure. Returns false if the chain must stop. */
|
|
58
|
+
failed(i, err, out) {
|
|
59
|
+
const msg = `${i.definition.name} failed: ${err instanceof Error ? err.message : String(err)}`;
|
|
60
|
+
if (i.definition.mode === "audit" || i.definition.failOpen === true) {
|
|
61
|
+
out.warnings.push(msg);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
out.blocked = { interceptor: i.definition.name, decision: "block", reason: msg };
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
/** Sequential mutations, atomic: on failure the original payload is kept. */
|
|
68
|
+
async mutate(phase, opts, out) {
|
|
69
|
+
const chain = this.select("mutation", opts.event, phase).sort((a, b) => priority(a.definition, phase) - priority(b.definition, phase) || a.definition.name.localeCompare(b.definition.name));
|
|
70
|
+
let payload = out.payload;
|
|
71
|
+
for (const i of chain) {
|
|
72
|
+
let r;
|
|
73
|
+
try {
|
|
74
|
+
r = (await this.invoke(i, phase, opts, payload));
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
if (!this.failed(i, err, out))
|
|
78
|
+
return false;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
out.results.push(r);
|
|
82
|
+
if (i.definition.mode !== "audit" && r.modified)
|
|
83
|
+
payload = r.payload;
|
|
84
|
+
}
|
|
85
|
+
out.payload = payload;
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
/** Parallel validations. Only severity "error" blocks. */
|
|
89
|
+
async validate(phase, opts, out) {
|
|
90
|
+
const chain = this.select("validation", opts.event, phase);
|
|
91
|
+
const settled = await Promise.allSettled(chain.map((i) => this.invoke(i, phase, opts, out.payload)));
|
|
92
|
+
let ok = true;
|
|
93
|
+
settled.forEach((s, idx) => {
|
|
94
|
+
const i = chain[idx];
|
|
95
|
+
if (s.status === "rejected") {
|
|
96
|
+
if (!this.failed(i, s.reason, out))
|
|
97
|
+
ok = false;
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const r = s.value;
|
|
101
|
+
out.results.push(r);
|
|
102
|
+
if (r.valid || r.severity !== "error" || i.definition.mode === "audit")
|
|
103
|
+
return;
|
|
104
|
+
if (!out.blocked) {
|
|
105
|
+
const decision = r.info?.[DECISION_INFO_KEY] ?? "block";
|
|
106
|
+
const reason = r.messages?.map((m) => m.message).join("; ") || `${i.definition.name} rejected the call`;
|
|
107
|
+
out.blocked = { interceptor: i.definition.name, decision, reason };
|
|
108
|
+
}
|
|
109
|
+
ok = false;
|
|
110
|
+
});
|
|
111
|
+
return ok;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=invoker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoker.js","sourceRoot":"","sources":["../src/invoker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AdtlConfig } from "@adtl/labels";
|
|
2
|
+
import { type GatewayConfig } from "./config.js";
|
|
3
|
+
import { AdtlGateway, type GatewayLogger } from "./gateway.js";
|
|
4
|
+
export declare class GatewayConfigError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
export interface LoadedConfig {
|
|
8
|
+
path: string;
|
|
9
|
+
labels: AdtlConfig;
|
|
10
|
+
gateway: GatewayConfig;
|
|
11
|
+
}
|
|
12
|
+
export declare function loadGatewayConfig(path: string): Promise<LoadedConfig>;
|
|
13
|
+
/** Path of the bundled adtl-interceptors CLI. */
|
|
14
|
+
export declare function bundledInterceptorsCli(): string;
|
|
15
|
+
export interface StartedGateway {
|
|
16
|
+
gateway: AdtlGateway;
|
|
17
|
+
close(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export declare function startGateway(loaded: LoadedConfig, opts?: {
|
|
20
|
+
env?: NodeJS.ProcessEnv;
|
|
21
|
+
logger?: GatewayLogger;
|
|
22
|
+
}): Promise<StartedGateway>;
|
|
23
|
+
//# sourceMappingURL=startup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/C,OAAO,EAIL,KAAK,aAAa,EAGnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAmB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAGhF,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA2B3E;AAED,iDAAiD;AACjD,wBAAgB,sBAAsB,IAAI,MAAM,CAI/C;AAsBD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,aAAa,CAAA;CAAO,GAC7D,OAAO,CAAC,cAAc,CAAC,CAuDzB"}
|