@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.
Files changed (79) hide show
  1. package/.mcp.json +1 -1
  2. package/README.md +3 -3
  3. package/amp/settings.example.json +1 -1
  4. package/claude/claude_desktop_config.example.json +1 -1
  5. package/cline/cline_mcp_settings.example.json +1 -1
  6. package/copilot/mcp-config.example.json +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +80 -1
  9. package/dist/cli.js.map +1 -1
  10. package/dist/commands/connect.d.ts +14 -2
  11. package/dist/commands/connect.d.ts.map +1 -1
  12. package/dist/commands/connect.js +84 -31
  13. package/dist/commands/connect.js.map +1 -1
  14. package/dist/commands/gate-serve.d.ts +23 -0
  15. package/dist/commands/gate-serve.d.ts.map +1 -0
  16. package/dist/commands/gate-serve.js +93 -0
  17. package/dist/commands/gate-serve.js.map +1 -0
  18. package/dist/commands/gate.d.ts +85 -0
  19. package/dist/commands/gate.d.ts.map +1 -0
  20. package/dist/commands/gate.js +268 -0
  21. package/dist/commands/gate.js.map +1 -0
  22. package/dist/commands/stop.d.ts +3 -0
  23. package/dist/commands/stop.d.ts.map +1 -1
  24. package/dist/commands/stop.js +34 -0
  25. package/dist/commands/stop.js.map +1 -1
  26. package/dist/gate/binary.d.ts +49 -0
  27. package/dist/gate/binary.d.ts.map +1 -0
  28. package/dist/gate/binary.js +129 -0
  29. package/dist/gate/binary.js.map +1 -0
  30. package/dist/gate/config-gen.d.ts +24 -0
  31. package/dist/gate/config-gen.d.ts.map +1 -0
  32. package/dist/gate/config-gen.js +146 -0
  33. package/dist/gate/config-gen.js.map +1 -0
  34. package/dist/gate/config.d.ts +39 -0
  35. package/dist/gate/config.d.ts.map +1 -0
  36. package/dist/gate/config.js +177 -0
  37. package/dist/gate/config.js.map +1 -0
  38. package/dist/gate/daemon.d.ts +38 -0
  39. package/dist/gate/daemon.d.ts.map +1 -0
  40. package/dist/gate/daemon.js +117 -0
  41. package/dist/gate/daemon.js.map +1 -0
  42. package/dist/gate/otlp-decode.d.ts +21 -0
  43. package/dist/gate/otlp-decode.d.ts.map +1 -0
  44. package/dist/gate/otlp-decode.js +268 -0
  45. package/dist/gate/otlp-decode.js.map +1 -0
  46. package/dist/gate/otlp-receiver.d.ts +35 -0
  47. package/dist/gate/otlp-receiver.d.ts.map +1 -0
  48. package/dist/gate/otlp-receiver.js +186 -0
  49. package/dist/gate/otlp-receiver.js.map +1 -0
  50. package/dist/mcp-servers.d.ts +34 -0
  51. package/dist/mcp-servers.d.ts.map +1 -0
  52. package/dist/mcp-servers.js +272 -0
  53. package/dist/mcp-servers.js.map +1 -0
  54. package/dist/offline-evaluate.d.ts.map +1 -1
  55. package/dist/offline-evaluate.js +19 -0
  56. package/dist/offline-evaluate.js.map +1 -1
  57. package/dist/receipt/dashboard.d.ts +2 -0
  58. package/dist/receipt/dashboard.d.ts.map +1 -1
  59. package/dist/receipt/dashboard.js +12 -0
  60. package/dist/receipt/dashboard.js.map +1 -1
  61. package/dist/receipt/render-receipt.d.ts +2 -0
  62. package/dist/receipt/render-receipt.d.ts.map +1 -1
  63. package/dist/receipt/render-receipt.js +24 -4
  64. package/dist/receipt/render-receipt.js.map +1 -1
  65. package/droid/README.md +1 -1
  66. package/droid/mcp.example.json +1 -1
  67. package/gemini/settings.example.json +1 -1
  68. package/grok/README.md +1 -1
  69. package/kilo/kilo.example.json +1 -1
  70. package/kimi/mcp.example.json +1 -1
  71. package/kiro/mcp.example.json +1 -1
  72. package/manifest.json +1 -1
  73. package/mastracode/mcp.example.json +1 -1
  74. package/mcp.json +1 -1
  75. package/openai/codex.config.example.toml +1 -1
  76. package/opencode/opencode.example.json +1 -1
  77. package/package.json +1 -1
  78. package/qwen/settings.example.json +1 -1
  79. 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":"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"}
@@ -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;AAEjF,OAAO,EAAoC,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEzF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAmDpD,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"}
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"}
@@ -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;AAE5D,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;CACnD;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,CA2DzE"}
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