@shield-agent/kya 0.10.1 → 0.12.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/.mcp.json +1 -1
- package/README.md +3 -3
- package/amp/settings.example.json +1 -1
- package/claude/claude_desktop_config.example.json +1 -1
- package/cline/cline_mcp_settings.example.json +1 -1
- package/copilot/mcp-config.example.json +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +80 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/connect.d.ts +14 -2
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +84 -31
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/gate-serve.d.ts +23 -0
- package/dist/commands/gate-serve.d.ts.map +1 -0
- package/dist/commands/gate-serve.js +93 -0
- package/dist/commands/gate-serve.js.map +1 -0
- package/dist/commands/gate.d.ts +85 -0
- package/dist/commands/gate.d.ts.map +1 -0
- package/dist/commands/gate.js +268 -0
- package/dist/commands/gate.js.map +1 -0
- package/dist/commands/stop.d.ts +3 -0
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +34 -0
- package/dist/commands/stop.js.map +1 -1
- package/dist/gate/binary.d.ts +49 -0
- package/dist/gate/binary.d.ts.map +1 -0
- package/dist/gate/binary.js +129 -0
- package/dist/gate/binary.js.map +1 -0
- package/dist/gate/config-gen.d.ts +24 -0
- package/dist/gate/config-gen.d.ts.map +1 -0
- package/dist/gate/config-gen.js +146 -0
- package/dist/gate/config-gen.js.map +1 -0
- package/dist/gate/config.d.ts +39 -0
- package/dist/gate/config.d.ts.map +1 -0
- package/dist/gate/config.js +177 -0
- package/dist/gate/config.js.map +1 -0
- package/dist/gate/daemon.d.ts +38 -0
- package/dist/gate/daemon.d.ts.map +1 -0
- package/dist/gate/daemon.js +117 -0
- package/dist/gate/daemon.js.map +1 -0
- package/dist/gate/otlp-decode.d.ts +21 -0
- package/dist/gate/otlp-decode.d.ts.map +1 -0
- package/dist/gate/otlp-decode.js +268 -0
- package/dist/gate/otlp-decode.js.map +1 -0
- package/dist/gate/otlp-receiver.d.ts +35 -0
- package/dist/gate/otlp-receiver.d.ts.map +1 -0
- package/dist/gate/otlp-receiver.js +186 -0
- package/dist/gate/otlp-receiver.js.map +1 -0
- package/dist/mcp-servers.d.ts +34 -0
- package/dist/mcp-servers.d.ts.map +1 -0
- package/dist/mcp-servers.js +272 -0
- package/dist/mcp-servers.js.map +1 -0
- package/dist/offline-evaluate.d.ts.map +1 -1
- package/dist/offline-evaluate.js +19 -0
- package/dist/offline-evaluate.js.map +1 -1
- package/dist/receipt/dashboard.d.ts +2 -0
- package/dist/receipt/dashboard.d.ts.map +1 -1
- package/dist/receipt/dashboard.js +12 -0
- package/dist/receipt/dashboard.js.map +1 -1
- package/dist/receipt/render-receipt.d.ts +2 -0
- package/dist/receipt/render-receipt.d.ts.map +1 -1
- package/dist/receipt/render-receipt.js +24 -4
- package/dist/receipt/render-receipt.js.map +1 -1
- package/droid/README.md +1 -1
- package/droid/mcp.example.json +1 -1
- package/gemini/settings.example.json +1 -1
- package/grok/README.md +1 -1
- package/kilo/kilo.example.json +1 -1
- package/kimi/mcp.example.json +1 -1
- package/kiro/mcp.example.json +1 -1
- package/manifest.json +1 -1
- package/mastracode/mcp.example.json +1 -1
- package/mcp.json +1 -1
- package/openai/codex.config.example.toml +1 -1
- package/opencode/opencode.example.json +1 -1
- package/package.json +1 -1
- package/qwen/settings.example.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local OTLP/HTTP traces receiver. The gateway exports spans to
|
|
3
|
+
* `http://127.0.0.1:<otlpPort>/v1/traces`; each `tools/call` span becomes one
|
|
4
|
+
* TrailEvent on the global trail (mode "observe") so the report's MCP server
|
|
5
|
+
* facet lights up for gate traffic.
|
|
6
|
+
*
|
|
7
|
+
* Privacy: only whitelisted span attributes are read (method, target, tool
|
|
8
|
+
* name, session id). Tool arguments are never extracted, and the persisted
|
|
9
|
+
* fields pass through the secret scanner before hitting the trail.
|
|
10
|
+
*
|
|
11
|
+
* Known limitation: the receiver is unauthenticated — any local process can
|
|
12
|
+
* POST spans and inject trail events. That is the same trust boundary as the
|
|
13
|
+
* user-writable trail file itself (any local process can append to
|
|
14
|
+
* ~/.kya/trail.jsonl), so no new privilege is granted; remote injection is
|
|
15
|
+
* impossible because the receiver binds 127.0.0.1 only.
|
|
16
|
+
*/
|
|
17
|
+
import { createServer } from "node:http";
|
|
18
|
+
import { appendTrail } from "../trail.js";
|
|
19
|
+
import { assertNoSecrets } from "../dash/render.js";
|
|
20
|
+
import { decodeTraceJson, decodeTraceProtobuf, } from "./otlp-decode.js";
|
|
21
|
+
const STATUS_ERROR = 2;
|
|
22
|
+
/** Twin-collapse window: how long a sessioned call suppresses its client-span twin. */
|
|
23
|
+
const TWIN_TTL_MS = 30_000;
|
|
24
|
+
// Verified against the real gateway (v1.5.0): a CEL-filtered tool call is
|
|
25
|
+
// refused as `-32602 Unknown tool` over HTTP 400; the span carries ERROR
|
|
26
|
+
// status and an "Unknown tool" error message. Downstream API denials (a
|
|
27
|
+
// tool's own 403/"forbidden" result) are NOT policy denials and must not
|
|
28
|
+
// match this signal — they classify as TOOL_ERROR.
|
|
29
|
+
const DENIAL_SIGNAL = /\bunknown tool\b/i;
|
|
30
|
+
function attr(span, key) {
|
|
31
|
+
const v = span.attributes[key];
|
|
32
|
+
return typeof v === "string" && v ? v : undefined;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Map one decoded span to a TrailEvent, or undefined when the span is not an
|
|
36
|
+
* MCP tools/call. toolId is `<target>__<tool>` so the registry's MCP facet
|
|
37
|
+
* recognizes calls to known servers.
|
|
38
|
+
*/
|
|
39
|
+
export function spanToTrailEvent(span, ctx) {
|
|
40
|
+
if (attr(span, "mcp.method.name") !== "tools/call")
|
|
41
|
+
return undefined;
|
|
42
|
+
const tool = attr(span, "gen_ai.tool.name");
|
|
43
|
+
if (!tool)
|
|
44
|
+
return undefined;
|
|
45
|
+
const target = attr(span, "mcp.target") ?? "unknown";
|
|
46
|
+
const sessionId = attr(span, "mcp.session.id") || ctx.fallbackSessionId;
|
|
47
|
+
let verdict = "ALLOW";
|
|
48
|
+
let reasonCode = "ALLOW";
|
|
49
|
+
if (span.statusCode === STATUS_ERROR) {
|
|
50
|
+
if (DENIAL_SIGNAL.test(span.statusMessage ?? "")) {
|
|
51
|
+
verdict = "DENY";
|
|
52
|
+
reasonCode = "POLICY_DENY";
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// The gate allowed the call; the tool itself failed.
|
|
56
|
+
reasonCode = "TOOL_ERROR";
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const toolId = `${target}__${tool}`;
|
|
60
|
+
// Defense-in-depth: nothing we persist may smuggle a secret out of a span.
|
|
61
|
+
assertNoSecrets(`${toolId}\n${sessionId}`);
|
|
62
|
+
return {
|
|
63
|
+
ts: new Date().toISOString(),
|
|
64
|
+
sessionId,
|
|
65
|
+
toolId,
|
|
66
|
+
verdict,
|
|
67
|
+
reasonCode,
|
|
68
|
+
mode: "observe",
|
|
69
|
+
summary: `gate: ${target}.${tool}`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function readBody(req) {
|
|
73
|
+
return new Promise((resolve, reject) => {
|
|
74
|
+
const chunks = [];
|
|
75
|
+
let size = 0;
|
|
76
|
+
req.on("data", (c) => {
|
|
77
|
+
size += c.length;
|
|
78
|
+
if (size > 8 * 1024 * 1024) {
|
|
79
|
+
req.destroy();
|
|
80
|
+
reject(new Error("payload too large"));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
chunks.push(c);
|
|
84
|
+
});
|
|
85
|
+
req.on("end", () => resolve(Buffer.concat(chunks)));
|
|
86
|
+
req.on("error", reject);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Accept OTLP trace exports on 127.0.0.1 and append tools/call spans to the
|
|
91
|
+
* trail. Malformed payloads get a 400 and are dropped — the receiver never
|
|
92
|
+
* dies on bad input (the gateway keeps exporting).
|
|
93
|
+
*/
|
|
94
|
+
export async function startOtlpReceiver(opts) {
|
|
95
|
+
const env = opts.env ?? process.env;
|
|
96
|
+
const append = opts.append ?? appendTrail;
|
|
97
|
+
const ctx = { fallbackSessionId: opts.fallbackSessionId, cwd: opts.cwd };
|
|
98
|
+
const seenSpanIds = new Set();
|
|
99
|
+
/** traceId|target__tool → expiry: sessioned calls, for cross-batch twin collapse. */
|
|
100
|
+
const sessionedCalls = new Map();
|
|
101
|
+
const server = createServer((req, res) => {
|
|
102
|
+
void (async () => {
|
|
103
|
+
if (req.method !== "POST" || req.url !== "/v1/traces") {
|
|
104
|
+
res.writeHead(404, { "content-type": "text/plain" }).end("not found\n");
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
let spans;
|
|
108
|
+
try {
|
|
109
|
+
const body = await readBody(req);
|
|
110
|
+
const contentType = (req.headers["content-type"] ?? "").toLowerCase();
|
|
111
|
+
spans = contentType.includes("json")
|
|
112
|
+
? decodeTraceJson(JSON.parse(body.toString("utf8")))
|
|
113
|
+
: decodeTraceProtobuf(body);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
res.writeHead(400, { "content-type": "text/plain" }).end("bad otlp payload\n");
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
// The gateway emits a client span per target call next to the server
|
|
120
|
+
// span for the same tools/call; only the server span carries
|
|
121
|
+
// mcp.session.id. Twins share a trace_id: collapse the sessionless one
|
|
122
|
+
// via a short-TTL cache so a pair split across export batches (or
|
|
123
|
+
// re-exported) still trails exactly once.
|
|
124
|
+
const now = Date.now();
|
|
125
|
+
for (const [k, exp] of sessionedCalls) {
|
|
126
|
+
if (exp <= now)
|
|
127
|
+
sessionedCalls.delete(k);
|
|
128
|
+
}
|
|
129
|
+
const twinKey = (s) => `${s.traceId ?? ""}|${String(s.attributes["mcp.target"] ?? "unknown")}__${String(s.attributes["gen_ai.tool.name"] ?? "")}`;
|
|
130
|
+
const batchTwins = new Set(spans
|
|
131
|
+
.filter((s) => s.attributes["mcp.method.name"] === "tools/call" &&
|
|
132
|
+
typeof s.attributes["mcp.session.id"] === "string")
|
|
133
|
+
.map(twinKey));
|
|
134
|
+
for (const span of spans) {
|
|
135
|
+
const isCall = span.attributes["mcp.method.name"] === "tools/call";
|
|
136
|
+
const hasSession = typeof span.attributes["mcp.session.id"] === "string";
|
|
137
|
+
if (isCall && hasSession) {
|
|
138
|
+
sessionedCalls.set(twinKey(span), now + TWIN_TTL_MS);
|
|
139
|
+
}
|
|
140
|
+
if (isCall &&
|
|
141
|
+
!hasSession &&
|
|
142
|
+
(batchTwins.has(twinKey(span)) ||
|
|
143
|
+
(sessionedCalls.get(twinKey(span)) ?? 0) > now)) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (span.spanId) {
|
|
147
|
+
if (seenSpanIds.has(span.spanId))
|
|
148
|
+
continue;
|
|
149
|
+
seenSpanIds.add(span.spanId);
|
|
150
|
+
if (seenSpanIds.size > 100_000)
|
|
151
|
+
seenSpanIds.clear();
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
const event = spanToTrailEvent(span, ctx);
|
|
155
|
+
if (event)
|
|
156
|
+
append(opts.cwd, event, env);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Secret-scanner trip or append failure: drop the event, keep serving.
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// OTLP/HTTP success: partialSuccess-free empty response.
|
|
163
|
+
res.writeHead(200, { "content-type": "application/x-protobuf" }).end(Buffer.alloc(0));
|
|
164
|
+
})().catch(() => {
|
|
165
|
+
try {
|
|
166
|
+
res.writeHead(500).end();
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
/* already closed */
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
await new Promise((resolve, reject) => {
|
|
174
|
+
server.once("error", reject);
|
|
175
|
+
server.listen(opts.port, "127.0.0.1", () => resolve());
|
|
176
|
+
});
|
|
177
|
+
const port = server.address().port;
|
|
178
|
+
return {
|
|
179
|
+
port,
|
|
180
|
+
url: `http://127.0.0.1:${port}`,
|
|
181
|
+
close: () => new Promise((resolve) => {
|
|
182
|
+
server.close(() => resolve());
|
|
183
|
+
}),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=otlp-receiver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp-receiver.js","sourceRoot":"","sources":["../../src/gate/otlp-receiver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry of well-known third-party MCP servers for the offline evaluator
|
|
3
|
+
* and the report's server facet. Advisory only: production authorization
|
|
4
|
+
* stays with the control plane. Unknown server ids stay unknown — the
|
|
5
|
+
* registry never guesses.
|
|
6
|
+
*/
|
|
7
|
+
export type McpToolTier = "READ" | "WRITE" | "ADMIN";
|
|
8
|
+
export interface McpToolRef {
|
|
9
|
+
readonly server: string;
|
|
10
|
+
readonly tool: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Recognize a tool id as an MCP-server call. Handles `mcp__<server>__<tool>`,
|
|
14
|
+
* `<server>__<tool>`, `<server>.<tool>`, and `<server>/<tool>`; ids are
|
|
15
|
+
* normalized case-insensitively with dashes folded to underscores, and common
|
|
16
|
+
* aliases resolve to one canonical server (postgres → postgresql,
|
|
17
|
+
* ms-playwright → playwright). Unknown servers return undefined.
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseMcpToolId(toolId: string): McpToolRef | undefined;
|
|
20
|
+
export declare function mcpServerLabel(serverId: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Advisory risk tier for one tool of a known MCP server: pattern families per
|
|
23
|
+
* server, ADMIN first, then the server's default. Unknown server → undefined.
|
|
24
|
+
*/
|
|
25
|
+
export declare function mcpToolTier(serverId: string, toolName: string): McpToolTier | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* ADMIN-tier rule patterns (regex sources) for a known server, in registry
|
|
28
|
+
* order. Undefined for unknown servers — the gate's CEL generation treats
|
|
29
|
+
* those as "no server-specific deny rules" (destructive-name deny only).
|
|
30
|
+
*/
|
|
31
|
+
export declare function mcpServerAdminPatterns(serverId: string): readonly string[] | undefined;
|
|
32
|
+
/** Fallback tier for tools no rule matches; undefined for unknown servers. */
|
|
33
|
+
export declare function mcpServerDefaultTier(serverId: string): McpToolTier | undefined;
|
|
34
|
+
//# sourceMappingURL=mcp-servers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-servers.d.ts","sourceRoot":"","sources":["../src/mcp-servers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAErD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAyOD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAQrE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAQvF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAItF;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAE9E"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry of well-known third-party MCP servers for the offline evaluator
|
|
3
|
+
* and the report's server facet. Advisory only: production authorization
|
|
4
|
+
* stays with the control plane. Unknown server ids stay unknown — the
|
|
5
|
+
* registry never guesses.
|
|
6
|
+
*/
|
|
7
|
+
const r = (pattern, tier) => ({ pattern, tier });
|
|
8
|
+
const MCP_SERVERS = [
|
|
9
|
+
{
|
|
10
|
+
id: "playwright",
|
|
11
|
+
label: "Playwright",
|
|
12
|
+
aliases: ["ms-playwright"],
|
|
13
|
+
rules: [
|
|
14
|
+
r(/^(?:browser_)?(?:file_upload|drag|hover|select_option|press_key|type|fill_form|click|navigate|navigate_back|navigate_forward|go_back|go_forward|tab_new|tab_close|tab_select|close|resize|run_code|evaluate|wait_for|handle_dialog|install)/, "WRITE"),
|
|
15
|
+
r(/^(?:browser_)?(?:snapshot|take_screenshot|screenshot|console_messages|console|network_requests|tabs|pdf_save|generate_locator)/, "READ"),
|
|
16
|
+
],
|
|
17
|
+
defaultTier: "WRITE",
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: "github",
|
|
21
|
+
label: "GitHub",
|
|
22
|
+
aliases: [],
|
|
23
|
+
rules: [
|
|
24
|
+
r(/^(?:delete_|remove_|merge_|close_|dismiss_|revoke_|transfer_|archive_)/, "ADMIN"),
|
|
25
|
+
r(/^(?:create|update|add|push|fork|request|assign|unassign|comment|review|submit|open|reopen|rename|enable|disable|set_|tag|label|star|follow|trigger|dispatch|run_|cancel_|rerun)/, "WRITE"),
|
|
26
|
+
r(/^(?:get|list|search|find|read|resolve|fetch|check|describe|diff|compare|show|me$|notifications)/, "READ"),
|
|
27
|
+
],
|
|
28
|
+
defaultTier: "WRITE",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: "context7",
|
|
32
|
+
label: "Context7",
|
|
33
|
+
aliases: [],
|
|
34
|
+
rules: [r(/^/, "READ")],
|
|
35
|
+
defaultTier: "READ",
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: "filesystem",
|
|
39
|
+
label: "Filesystem",
|
|
40
|
+
aliases: ["fs"],
|
|
41
|
+
rules: [
|
|
42
|
+
r(/^(?:write_file|edit_file|create_directory|move_file|copy_file)/, "WRITE"),
|
|
43
|
+
r(/^(?:read_|list_|search_|get_|directory_tree|find_)/, "READ"),
|
|
44
|
+
],
|
|
45
|
+
defaultTier: "WRITE",
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: "figma",
|
|
49
|
+
label: "Figma",
|
|
50
|
+
aliases: [],
|
|
51
|
+
rules: [
|
|
52
|
+
r(/^(?:delete_|remove_)/, "ADMIN"),
|
|
53
|
+
r(/^(?:create|update|add|post|set_|rename|move|duplicate|insert|modify|apply)/, "WRITE"),
|
|
54
|
+
r(/^(?:get|list|export|read|fetch|download)/, "READ"),
|
|
55
|
+
],
|
|
56
|
+
defaultTier: "WRITE",
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: "browser-use",
|
|
60
|
+
label: "Browser Use",
|
|
61
|
+
aliases: ["browseruse", "browser_use"],
|
|
62
|
+
rules: [r(/^browser_(?:state|screenshot|console)/, "READ")],
|
|
63
|
+
defaultTier: "WRITE",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: "chrome-devtools",
|
|
67
|
+
label: "Chrome DevTools",
|
|
68
|
+
aliases: ["chromedevtools", "chrome_devtools", "devtools"],
|
|
69
|
+
rules: [
|
|
70
|
+
r(/^(?:take_screenshot|take_snapshot|list_console_messages|get_console_message|list_network_requests|get_network_request|list_pages|list_scripts|read_)/, "READ"),
|
|
71
|
+
],
|
|
72
|
+
defaultTier: "WRITE",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: "atlassian",
|
|
76
|
+
label: "Atlassian",
|
|
77
|
+
aliases: ["jira", "confluence"],
|
|
78
|
+
rules: [
|
|
79
|
+
r(/^(?:jira_delete|confluence_delete|.*_delete_)/, "ADMIN"),
|
|
80
|
+
r(/^(?:jira_(?:create|update|add|transition|assign|link|unlink|remove|attach|edit|move|watch)|confluence_(?:create|update|add|link|unlink|remove|attach|edit|move|watch)|.*_(?:create|update|add|transition|assign|link|unlink|remove|attach|edit|move|watch)_)/, "WRITE"),
|
|
81
|
+
r(/^(?:jira_(?:get|search)|confluence_(?:get|search)|atlassian|.*_(?:get|search)_)/, "READ"),
|
|
82
|
+
],
|
|
83
|
+
defaultTier: "WRITE",
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: "notion",
|
|
87
|
+
label: "Notion",
|
|
88
|
+
aliases: [],
|
|
89
|
+
rules: [
|
|
90
|
+
r(/^(?:delete_|remove_|archive_|trash_)/, "ADMIN"),
|
|
91
|
+
r(/^(?:create|update|add|post|append|insert|move|duplicate|rename|set_|comment|upload)/, "WRITE"),
|
|
92
|
+
r(/^(?:get|list|search|query|read|fetch|retrieve|find)/, "READ"),
|
|
93
|
+
],
|
|
94
|
+
defaultTier: "WRITE",
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
id: "slack",
|
|
98
|
+
label: "Slack",
|
|
99
|
+
aliases: [],
|
|
100
|
+
rules: [
|
|
101
|
+
r(/^(?:delete_|remove_|archive_|kick_|leave_)/, "ADMIN"),
|
|
102
|
+
r(/^(?:post|send|create|update|add|reply|react|pin|unpin|invite|upload|share|set_|rename|join)/, "WRITE"),
|
|
103
|
+
r(/^(?:get|list|search|read|fetch|history|find|lookup)/, "READ"),
|
|
104
|
+
],
|
|
105
|
+
defaultTier: "WRITE",
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
id: "supabase",
|
|
109
|
+
label: "Supabase",
|
|
110
|
+
aliases: [],
|
|
111
|
+
rules: [
|
|
112
|
+
r(/^(?:delete|drop|truncate|reset|purge|revoke|destroy|disable_)/, "ADMIN"),
|
|
113
|
+
r(/^(?:create|update|insert|upsert|apply|deploy|execute|run|grant|enable|alter|migrate|set_|invoke|call|upload|generate|branch|pause|restore)/, "WRITE"),
|
|
114
|
+
r(/^(?:get|list|search|read|fetch|describe|select|inspect|check)/, "READ"),
|
|
115
|
+
],
|
|
116
|
+
defaultTier: "WRITE",
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: "postgresql",
|
|
120
|
+
label: "PostgreSQL",
|
|
121
|
+
aliases: ["postgres"],
|
|
122
|
+
rules: [
|
|
123
|
+
r(/(?:drop|truncate|purge)/, "ADMIN"),
|
|
124
|
+
r(/^(?:execute|query|run|write|exec|apply|insert|update|delete|alter|create)/, "WRITE"),
|
|
125
|
+
r(/^(?:get|list|describe|read|select|inspect|schema|explain)/, "READ"),
|
|
126
|
+
],
|
|
127
|
+
defaultTier: "WRITE",
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
id: "firecrawl",
|
|
131
|
+
label: "Firecrawl",
|
|
132
|
+
aliases: [],
|
|
133
|
+
rules: [r(/^(?:firecrawl_)?(?:scrape|crawl|map|search|extract|batch_scrape|deep_research|generate_llmstxt)/, "READ")],
|
|
134
|
+
defaultTier: "WRITE",
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
id: "sequential-thinking",
|
|
138
|
+
label: "Sequential Thinking",
|
|
139
|
+
aliases: ["sequentialthinking", "sequential_thinking"],
|
|
140
|
+
rules: [r(/^/, "READ")],
|
|
141
|
+
defaultTier: "READ",
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
id: "n8n",
|
|
145
|
+
label: "n8n",
|
|
146
|
+
aliases: [],
|
|
147
|
+
rules: [
|
|
148
|
+
r(/^(?:delete_|remove_|purge_)/, "ADMIN"),
|
|
149
|
+
r(/^(?:create|update|add|run|trigger|execute|activate|deactivate|publish|deploy|set_|stop|test_)/, "WRITE"),
|
|
150
|
+
r(/^(?:get|list|search|read|fetch|describe|validate)/, "READ"),
|
|
151
|
+
],
|
|
152
|
+
defaultTier: "WRITE",
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
id: "linear",
|
|
156
|
+
label: "Linear",
|
|
157
|
+
aliases: [],
|
|
158
|
+
rules: [
|
|
159
|
+
r(/^(?:delete_|remove_|archive_)/, "ADMIN"),
|
|
160
|
+
r(/^(?:create|update|add|assign|comment|move|rename|set_|attach)/, "WRITE"),
|
|
161
|
+
r(/^(?:get|list|search|read|fetch|find|query)/, "READ"),
|
|
162
|
+
],
|
|
163
|
+
defaultTier: "WRITE",
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
id: "serena",
|
|
167
|
+
label: "Serena",
|
|
168
|
+
aliases: [],
|
|
169
|
+
rules: [
|
|
170
|
+
r(/^(?:delete|remove)/, "ADMIN"),
|
|
171
|
+
r(/^(?:create|write|edit|replace|insert|rename|apply|execute|run|move|activate|onboarding|think|prepare|restart|summarize_changes)/, "WRITE"),
|
|
172
|
+
r(/^(?:read|get|list|search|find|check|initial|think_about|describe|overview)/, "READ"),
|
|
173
|
+
],
|
|
174
|
+
defaultTier: "WRITE",
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
id: "sentry",
|
|
178
|
+
label: "Sentry",
|
|
179
|
+
aliases: [],
|
|
180
|
+
rules: [
|
|
181
|
+
r(/^(?:delete_|remove_|purge_)/, "ADMIN"),
|
|
182
|
+
r(/^(?:create|update|resolve|assign|ignore|mute|unmute|archive|merge|reprocess|set_|comment|add|trigger)/, "WRITE"),
|
|
183
|
+
r(/^(?:get|list|search|find|read|fetch|describe|whoami)/, "READ"),
|
|
184
|
+
],
|
|
185
|
+
defaultTier: "WRITE",
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
id: "zapier",
|
|
189
|
+
label: "Zapier",
|
|
190
|
+
aliases: [],
|
|
191
|
+
rules: [
|
|
192
|
+
r(/^(?:delete_|remove_|disable_|turn_off)/, "ADMIN"),
|
|
193
|
+
r(/^(?:trigger|run|execute|create|update|add|enable|turn_on|invoke|perform|send|test_)/, "WRITE"),
|
|
194
|
+
r(/^(?:get|list|search|read|fetch|describe|find)/, "READ"),
|
|
195
|
+
],
|
|
196
|
+
defaultTier: "WRITE",
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
id: "exa",
|
|
200
|
+
label: "Web Search",
|
|
201
|
+
aliases: ["brave", "brave-search", "fetch"],
|
|
202
|
+
rules: [
|
|
203
|
+
r(/^(?:web_search|brave_(?:web|local)_search|fetch|search|crawl|scrape|extract|map|get_content)/, "READ"),
|
|
204
|
+
],
|
|
205
|
+
defaultTier: "WRITE",
|
|
206
|
+
},
|
|
207
|
+
];
|
|
208
|
+
const LOOKUP = (() => {
|
|
209
|
+
const map = new Map();
|
|
210
|
+
for (const entry of MCP_SERVERS) {
|
|
211
|
+
map.set(normalizeId(entry.id), entry);
|
|
212
|
+
for (const alias of entry.aliases)
|
|
213
|
+
map.set(normalizeId(alias), entry);
|
|
214
|
+
}
|
|
215
|
+
return map;
|
|
216
|
+
})();
|
|
217
|
+
function normalizeId(s) {
|
|
218
|
+
return s.trim().toLowerCase().replace(/-/g, "_");
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Recognize a tool id as an MCP-server call. Handles `mcp__<server>__<tool>`,
|
|
222
|
+
* `<server>__<tool>`, `<server>.<tool>`, and `<server>/<tool>`; ids are
|
|
223
|
+
* normalized case-insensitively with dashes folded to underscores, and common
|
|
224
|
+
* aliases resolve to one canonical server (postgres → postgresql,
|
|
225
|
+
* ms-playwright → playwright). Unknown servers return undefined.
|
|
226
|
+
*/
|
|
227
|
+
export function parseMcpToolId(toolId) {
|
|
228
|
+
const raw = toolId.trim().toLowerCase();
|
|
229
|
+
if (!raw)
|
|
230
|
+
return undefined;
|
|
231
|
+
const m = /^(?:mcp__)?([a-z0-9][a-z0-9_-]*?)(?:__|\.|\/)([a-z0-9][a-z0-9_-]*)$/.exec(raw);
|
|
232
|
+
if (!m)
|
|
233
|
+
return undefined;
|
|
234
|
+
const entry = LOOKUP.get(normalizeId(m[1]));
|
|
235
|
+
if (!entry)
|
|
236
|
+
return undefined;
|
|
237
|
+
return { server: entry.id, tool: m[2] };
|
|
238
|
+
}
|
|
239
|
+
export function mcpServerLabel(serverId) {
|
|
240
|
+
return LOOKUP.get(normalizeId(serverId))?.label ?? serverId;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Advisory risk tier for one tool of a known MCP server: pattern families per
|
|
244
|
+
* server, ADMIN first, then the server's default. Unknown server → undefined.
|
|
245
|
+
*/
|
|
246
|
+
export function mcpToolTier(serverId, toolName) {
|
|
247
|
+
const entry = LOOKUP.get(normalizeId(serverId));
|
|
248
|
+
if (!entry)
|
|
249
|
+
return undefined;
|
|
250
|
+
const tool = toolName.trim().toLowerCase();
|
|
251
|
+
for (const rule of entry.rules) {
|
|
252
|
+
if (rule.pattern.test(tool))
|
|
253
|
+
return rule.tier;
|
|
254
|
+
}
|
|
255
|
+
return entry.defaultTier;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* ADMIN-tier rule patterns (regex sources) for a known server, in registry
|
|
259
|
+
* order. Undefined for unknown servers — the gate's CEL generation treats
|
|
260
|
+
* those as "no server-specific deny rules" (destructive-name deny only).
|
|
261
|
+
*/
|
|
262
|
+
export function mcpServerAdminPatterns(serverId) {
|
|
263
|
+
const entry = LOOKUP.get(normalizeId(serverId));
|
|
264
|
+
if (!entry)
|
|
265
|
+
return undefined;
|
|
266
|
+
return entry.rules.filter((rule) => rule.tier === "ADMIN").map((rule) => rule.pattern.source);
|
|
267
|
+
}
|
|
268
|
+
/** Fallback tier for tools no rule matches; undefined for unknown servers. */
|
|
269
|
+
export function mcpServerDefaultTier(serverId) {
|
|
270
|
+
return LOOKUP.get(normalizeId(serverId))?.defaultTier;
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=mcp-servers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-servers.js","sourceRoot":"","sources":["../src/mcp-servers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwBH,MAAM,CAAC,GAAG,CAAC,OAAe,EAAE,IAAiB,EAAY,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAEhF,MAAM,WAAW,GAA8B;IAC7C;QACE,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,CAAC,eAAe,CAAC;QAC1B,KAAK,EAAE;YACL,CAAC,CAAC,6OAA6O,EAAE,OAAO,CAAC;YACzP,CAAC,CAAC,gIAAgI,EAAE,MAAM,CAAC;SAC5I;QACD,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,EAAE;QACX,KAAK,EAAE;YACL,CAAC,CAAC,wEAAwE,EAAE,OAAO,CAAC;YACpF,CAAC,CAAC,iLAAiL,EAAE,OAAO,CAAC;YAC7L,CAAC,CAAC,iGAAiG,EAAE,MAAM,CAAC;SAC7G;QACD,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvB,WAAW,EAAE,MAAM;KACpB;IACD;QACE,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,CAAC,IAAI,CAAC;QACf,KAAK,EAAE;YACL,CAAC,CAAC,gEAAgE,EAAE,OAAO,CAAC;YAC5E,CAAC,CAAC,oDAAoD,EAAE,MAAM,CAAC;SAChE;QACD,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,EAAE;QACX,KAAK,EAAE;YACL,CAAC,CAAC,sBAAsB,EAAE,OAAO,CAAC;YAClC,CAAC,CAAC,4EAA4E,EAAE,OAAO,CAAC;YACxF,CAAC,CAAC,0CAA0C,EAAE,MAAM,CAAC;SACtD;QACD,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC;QACtC,KAAK,EAAE,CAAC,CAAC,CAAC,uCAAuC,EAAE,MAAM,CAAC,CAAC;QAC3D,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,iBAAiB;QACxB,OAAO,EAAE,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,CAAC;QAC1D,KAAK,EAAE;YACL,CAAC,CAAC,sJAAsJ,EAAE,MAAM,CAAC;SAClK;QACD,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC;QAC/B,KAAK,EAAE;YACL,CAAC,CAAC,+CAA+C,EAAE,OAAO,CAAC;YAC3D,CAAC,CAAC,8PAA8P,EAAE,OAAO,CAAC;YAC1Q,CAAC,CAAC,iFAAiF,EAAE,MAAM,CAAC;SAC7F;QACD,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,EAAE;QACX,KAAK,EAAE;YACL,CAAC,CAAC,sCAAsC,EAAE,OAAO,CAAC;YAClD,CAAC,CAAC,qFAAqF,EAAE,OAAO,CAAC;YACjG,CAAC,CAAC,qDAAqD,EAAE,MAAM,CAAC;SACjE;QACD,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,EAAE;QACX,KAAK,EAAE;YACL,CAAC,CAAC,4CAA4C,EAAE,OAAO,CAAC;YACxD,CAAC,CAAC,6FAA6F,EAAE,OAAO,CAAC;YACzG,CAAC,CAAC,qDAAqD,EAAE,MAAM,CAAC;SACjE;QACD,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,EAAE;QACX,KAAK,EAAE;YACL,CAAC,CAAC,+DAA+D,EAAE,OAAO,CAAC;YAC3E,CAAC,CAAC,4IAA4I,EAAE,OAAO,CAAC;YACxJ,CAAC,CAAC,+DAA+D,EAAE,MAAM,CAAC;SAC3E;QACD,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,KAAK,EAAE;YACL,CAAC,CAAC,yBAAyB,EAAE,OAAO,CAAC;YACrC,CAAC,CAAC,2EAA2E,EAAE,OAAO,CAAC;YACvF,CAAC,CAAC,2DAA2D,EAAE,MAAM,CAAC;SACvE;QACD,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,CAAC,CAAC,CAAC,iGAAiG,EAAE,MAAM,CAAC,CAAC;QACrH,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,qBAAqB;QACzB,KAAK,EAAE,qBAAqB;QAC5B,OAAO,EAAE,CAAC,oBAAoB,EAAE,qBAAqB,CAAC;QACtD,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvB,WAAW,EAAE,MAAM;KACpB;IACD;QACE,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,EAAE;QACX,KAAK,EAAE;YACL,CAAC,CAAC,6BAA6B,EAAE,OAAO,CAAC;YACzC,CAAC,CAAC,+FAA+F,EAAE,OAAO,CAAC;YAC3G,CAAC,CAAC,mDAAmD,EAAE,MAAM,CAAC;SAC/D;QACD,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,EAAE;QACX,KAAK,EAAE;YACL,CAAC,CAAC,+BAA+B,EAAE,OAAO,CAAC;YAC3C,CAAC,CAAC,+DAA+D,EAAE,OAAO,CAAC;YAC3E,CAAC,CAAC,4CAA4C,EAAE,MAAM,CAAC;SACxD;QACD,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,EAAE;QACX,KAAK,EAAE;YACL,CAAC,CAAC,oBAAoB,EAAE,OAAO,CAAC;YAChC,CAAC,CAAC,iIAAiI,EAAE,OAAO,CAAC;YAC7I,CAAC,CAAC,4EAA4E,EAAE,MAAM,CAAC;SACxF;QACD,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,EAAE;QACX,KAAK,EAAE;YACL,CAAC,CAAC,6BAA6B,EAAE,OAAO,CAAC;YACzC,CAAC,CAAC,uGAAuG,EAAE,OAAO,CAAC;YACnH,CAAC,CAAC,sDAAsD,EAAE,MAAM,CAAC;SAClE;QACD,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,EAAE;QACX,KAAK,EAAE;YACL,CAAC,CAAC,wCAAwC,EAAE,OAAO,CAAC;YACpD,CAAC,CAAC,qFAAqF,EAAE,OAAO,CAAC;YACjG,CAAC,CAAC,+CAA+C,EAAE,MAAM,CAAC;SAC3D;QACD,WAAW,EAAE,OAAO;KACrB;IACD;QACE,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC;QAC3C,KAAK,EAAE;YACL,CAAC,CAAC,8FAA8F,EAAE,MAAM,CAAC;SAC1G;QACD,WAAW,EAAE,OAAO;KACrB;CACF,CAAC;AAEF,MAAM,MAAM,GAAwC,CAAC,GAAG,EAAE;IACxD,MAAM,GAAG,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO;YAAE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC,EAAE,CAAC;AAEL,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxC,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,CAAC,GAAG,qEAAqE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1F,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI,QAAQ,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,QAAgB;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC,WAAW,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAChG,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,OAAO,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,WAAW,CAAC;AACxD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offline-evaluate.d.ts","sourceRoot":"","sources":["../src/offline-evaluate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"offline-evaluate.d.ts","sourceRoot":"","sources":["../src/offline-evaluate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAGjF,OAAO,EAAoC,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEzF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAsEpD,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EACpD,IAAI,EAAE,WAAW,GAAG,SAAS,GAC5B;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAWhD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,qBAAqB,EAC1B,IAAI,GAAE,IAAY,GACjB,sBAAsB,CAiCxB"}
|
package/dist/offline-evaluate.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* plus the well-known host tool vocabulary in host-tools.ts.
|
|
6
6
|
*/
|
|
7
7
|
import { findHostToolTier } from "./host-tools.js";
|
|
8
|
+
import { mcpToolTier, parseMcpToolId } from "./mcp-servers.js";
|
|
8
9
|
import { findSampleTool } from "./sample-tools.js";
|
|
9
10
|
function baseTier(toolId, irreversible, actionClass) {
|
|
10
11
|
if (!toolId || toolId.trim() === "") {
|
|
@@ -20,6 +21,12 @@ function baseTier(toolId, irreversible, actionClass) {
|
|
|
20
21
|
}
|
|
21
22
|
return { verdict: "ALLOW", reasonCode: "ALLOW" };
|
|
22
23
|
}
|
|
24
|
+
// Clearly destructive admin names on a KNOWN MCP server deny outright, even
|
|
25
|
+
// when the caller declared risk signals — mirroring sample-tool NEVER.
|
|
26
|
+
const mcp = parseMcpToolId(toolId);
|
|
27
|
+
if (mcp && /drop|truncate|purge|transfer/.test(mcp.tool)) {
|
|
28
|
+
return { verdict: "DENY", reasonCode: "NEVER_EVENT" };
|
|
29
|
+
}
|
|
23
30
|
// Advisory vocabulary only applies when the caller declared no risk signals;
|
|
24
31
|
// explicit irreversible/actionClass keep their stricter paths below.
|
|
25
32
|
if (!irreversible && (actionClass ?? "").trim() === "") {
|
|
@@ -33,6 +40,18 @@ function baseTier(toolId, irreversible, actionClass) {
|
|
|
33
40
|
if (hostTier === "SHELL") {
|
|
34
41
|
return { verdict: "REQUIRE_APPROVE", reasonCode: "SHELL_EXEC" };
|
|
35
42
|
}
|
|
43
|
+
if (mcp) {
|
|
44
|
+
const mcpTier = mcpToolTier(mcp.server, mcp.tool);
|
|
45
|
+
if (mcpTier === "READ") {
|
|
46
|
+
return { verdict: "ALLOW", reasonCode: "LOW_RISK_READ" };
|
|
47
|
+
}
|
|
48
|
+
if (mcpTier === "WRITE") {
|
|
49
|
+
return { verdict: "REQUIRE_APPROVE", reasonCode: "HIGH_STAKES_WRITE" };
|
|
50
|
+
}
|
|
51
|
+
if (mcpTier === "ADMIN") {
|
|
52
|
+
return { verdict: "REQUIRE_APPROVE", reasonCode: "HIGH_STAKES_ADMIN" };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
36
55
|
}
|
|
37
56
|
const ac = (actionClass ?? "");
|
|
38
57
|
if (ac === "EXTERNAL_SIDE_EFFECT") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offline-evaluate.js","sourceRoot":"","sources":["../src/offline-evaluate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"offline-evaluate.js","sourceRoot":"","sources":["../src/offline-evaluate.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,8 @@ export interface Dashboard {
|
|
|
41
41
|
readonly productHotspots: readonly DashboardRow[];
|
|
42
42
|
/** deny+never counts per project, desc, top 8. */
|
|
43
43
|
readonly projectHotspots: readonly DashboardRow[];
|
|
44
|
+
/** deny+never counts per recognized MCP server label, desc, top 8. */
|
|
45
|
+
readonly serverHotspots: readonly DashboardRow[];
|
|
44
46
|
}
|
|
45
47
|
export interface BucketWindowInput {
|
|
46
48
|
readonly counts: ReadonlyMap<number, number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/receipt/dashboard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/receipt/dashboard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAG5D,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE9D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC;IACrC,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,oEAAoE;IACpE,QAAQ,CAAC,eAAe,EAAE,SAAS,YAAY,EAAE,CAAC;IAClD,kDAAkD;IAClD,QAAQ,CAAC,eAAe,EAAE,SAAS,YAAY,EAAE,CAAC;IAClD,sEAAsE;IACtE,QAAQ,CAAC,cAAc,EAAE,SAAS,YAAY,EAAE,CAAC;CAClD;AAkDD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1D,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,eAAe,EAAE,CAU5E;AAuCD,wBAAgB,OAAO,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC,EAAE,UAAU,GAAG,SAAS,CAUhF;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,CAuEzE"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Everything is computed from the same events array the feed renders.
|
|
4
4
|
*/
|
|
5
5
|
import { productLabel } from "../trail.js";
|
|
6
|
+
import { mcpServerLabel, parseMcpToolId } from "../mcp-servers.js";
|
|
6
7
|
const HOUR_MS = 3_600_000;
|
|
7
8
|
/** Spans up to this many ms render as hourly buckets; beyond it, daily. */
|
|
8
9
|
const HOURLY_SPAN_LIMIT_MS = 36 * HOUR_MS;
|
|
@@ -119,6 +120,7 @@ export function computeDashboard(events) {
|
|
|
119
120
|
const tools = new Map();
|
|
120
121
|
const productHits = new Map();
|
|
121
122
|
const projectHits = new Map();
|
|
123
|
+
const serverHits = new Map();
|
|
122
124
|
for (const e of events) {
|
|
123
125
|
const v = e.verdict.toUpperCase();
|
|
124
126
|
if (v === "ALLOW")
|
|
@@ -143,6 +145,11 @@ export function computeDashboard(events) {
|
|
|
143
145
|
const project = e.project?.trim();
|
|
144
146
|
if (project)
|
|
145
147
|
projectHits.set(project, (projectHits.get(project) ?? 0) + 1);
|
|
148
|
+
const server = parseMcpToolId(e.toolId);
|
|
149
|
+
if (server) {
|
|
150
|
+
const label = mcpServerLabel(server.server);
|
|
151
|
+
serverHits.set(label, (serverHits.get(label) ?? 0) + 1);
|
|
152
|
+
}
|
|
146
153
|
}
|
|
147
154
|
}
|
|
148
155
|
const topTools = [...tools.entries()]
|
|
@@ -161,12 +168,17 @@ export function computeDashboard(events) {
|
|
|
161
168
|
.map(([label, count]) => ({ label, value: label, count }))
|
|
162
169
|
.sort((a, b) => b.count - a.count || a.label.localeCompare(b.label))
|
|
163
170
|
.slice(0, TOP_N);
|
|
171
|
+
const serverHotspots = [...serverHits.entries()]
|
|
172
|
+
.map(([label, count]) => ({ label, value: label, count }))
|
|
173
|
+
.sort((a, b) => b.count - a.count || a.label.localeCompare(b.label))
|
|
174
|
+
.slice(0, TOP_N);
|
|
164
175
|
return {
|
|
165
176
|
verdictMix: mix,
|
|
166
177
|
activity: computeActivity(events),
|
|
167
178
|
topTools,
|
|
168
179
|
productHotspots,
|
|
169
180
|
projectHotspots,
|
|
181
|
+
serverHotspots,
|
|
170
182
|
};
|
|
171
183
|
}
|
|
172
184
|
//# sourceMappingURL=dashboard.js.map
|