@atbash/atbash-mcp 0.0.6-dev.1 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +32 -82
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/index.ts
|
|
4
|
-
import {
|
|
4
|
+
import { Atbash, setupTelemetry, shutdownTelemetry } from "@atbash/sdk";
|
|
5
5
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
6
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
7
7
|
|
|
@@ -41,25 +41,15 @@ function registerSafetyPrompt(server2) {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
// src/resources/policy.ts
|
|
44
|
-
function registerPolicyResource(server2,
|
|
44
|
+
function registerPolicyResource(server2, client2) {
|
|
45
45
|
void server2;
|
|
46
|
-
void
|
|
47
|
-
void endpoint2;
|
|
48
|
-
return;
|
|
46
|
+
void client2;
|
|
49
47
|
}
|
|
50
48
|
|
|
51
49
|
// src/tools/judge.ts
|
|
52
|
-
import { Atbash } from "@atbash/sdk";
|
|
53
50
|
import { z as z2 } from "zod";
|
|
54
51
|
|
|
55
52
|
// src/utils.ts
|
|
56
|
-
function createClientOpts(agent2, endpoint2, orgName2) {
|
|
57
|
-
void agent2;
|
|
58
|
-
const opts = {};
|
|
59
|
-
if (endpoint2) opts.endpoint = endpoint2;
|
|
60
|
-
if (orgName2) opts.orgName = orgName2;
|
|
61
|
-
return Object.keys(opts).length > 0 ? opts : void 0;
|
|
62
|
-
}
|
|
63
53
|
function safeErrorMessage(error) {
|
|
64
54
|
return error instanceof Error ? error.message : String(error);
|
|
65
55
|
}
|
|
@@ -76,9 +66,7 @@ function toErrorContent(error) {
|
|
|
76
66
|
}
|
|
77
67
|
|
|
78
68
|
// src/tools/judge.ts
|
|
79
|
-
function registerJudgeTools(server2,
|
|
80
|
-
const opts = createClientOpts(agent2, endpoint2, orgName2);
|
|
81
|
-
const client = new Atbash(agent2.privkey, opts);
|
|
69
|
+
function registerJudgeTools(server2, client2) {
|
|
82
70
|
server2.registerTool(
|
|
83
71
|
"atbash_judge",
|
|
84
72
|
{
|
|
@@ -100,7 +88,7 @@ function registerJudgeTools(server2, agent2, endpoint2, orgName2) {
|
|
|
100
88
|
parsedArgs = tool_args_json;
|
|
101
89
|
}
|
|
102
90
|
}
|
|
103
|
-
const decision = await
|
|
91
|
+
const decision = await client2.auditToolCall({
|
|
104
92
|
toolName: tool_name ?? "mcp_judge",
|
|
105
93
|
args: parsedArgs ?? { action },
|
|
106
94
|
context: `${action} \u2014 ${context}`
|
|
@@ -140,7 +128,7 @@ function registerJudgeTools(server2, agent2, endpoint2, orgName2) {
|
|
|
140
128
|
parsedArgs = tool_args_json;
|
|
141
129
|
}
|
|
142
130
|
}
|
|
143
|
-
const result = await
|
|
131
|
+
const result = await client2.auditToolCall({
|
|
144
132
|
toolName: tool_name ?? "mcp_log",
|
|
145
133
|
args: parsedArgs ?? { action },
|
|
146
134
|
context: `${action} \u2014 ${context}`
|
|
@@ -169,8 +157,8 @@ function registerJudgeTools(server2, agent2, endpoint2, orgName2) {
|
|
|
169
157
|
},
|
|
170
158
|
async ({ pubkey }) => {
|
|
171
159
|
try {
|
|
172
|
-
const selectedPubkey = pubkey ??
|
|
173
|
-
const registered = await
|
|
160
|
+
const selectedPubkey = pubkey ?? client2.pubkey;
|
|
161
|
+
const registered = await client2.checkAgentExists(selectedPubkey);
|
|
174
162
|
return toJsonContent({ registered, pubkey: selectedPubkey });
|
|
175
163
|
} catch (error) {
|
|
176
164
|
return toErrorContent(error);
|
|
@@ -180,14 +168,11 @@ function registerJudgeTools(server2, agent2, endpoint2, orgName2) {
|
|
|
180
168
|
}
|
|
181
169
|
|
|
182
170
|
// src/tools/queries.ts
|
|
183
|
-
import { Atbash as Atbash2 } from "@atbash/sdk";
|
|
184
171
|
import { z as z3 } from "zod";
|
|
185
172
|
function defaultMaxCount(value) {
|
|
186
173
|
return value ?? 20;
|
|
187
174
|
}
|
|
188
|
-
function registerQueryTools(server2,
|
|
189
|
-
const opts = createClientOpts(agent2, endpoint2, orgName2);
|
|
190
|
-
const client = new Atbash2(agent2.privkey, opts);
|
|
175
|
+
function registerQueryTools(server2, client2) {
|
|
191
176
|
server2.registerTool(
|
|
192
177
|
"atbash_get_policy",
|
|
193
178
|
{
|
|
@@ -198,7 +183,7 @@ function registerQueryTools(server2, agent2, endpoint2, orgName2) {
|
|
|
198
183
|
},
|
|
199
184
|
async ({ pubkey }) => {
|
|
200
185
|
try {
|
|
201
|
-
return toJsonContent(await
|
|
186
|
+
return toJsonContent(await client2.getAgentPolicy(pubkey ?? client2.pubkey));
|
|
202
187
|
} catch (error) {
|
|
203
188
|
return toErrorContent(error);
|
|
204
189
|
}
|
|
@@ -214,7 +199,7 @@ function registerQueryTools(server2, agent2, endpoint2, orgName2) {
|
|
|
214
199
|
},
|
|
215
200
|
async ({ pubkey }) => {
|
|
216
201
|
try {
|
|
217
|
-
return toJsonContent(await
|
|
202
|
+
return toJsonContent(await client2.getAgentDetail(pubkey ?? client2.pubkey));
|
|
218
203
|
} catch (error) {
|
|
219
204
|
return toErrorContent(error);
|
|
220
205
|
}
|
|
@@ -230,7 +215,7 @@ function registerQueryTools(server2, agent2, endpoint2, orgName2) {
|
|
|
230
215
|
},
|
|
231
216
|
async ({ max_count }) => {
|
|
232
217
|
try {
|
|
233
|
-
return toJsonContent(await
|
|
218
|
+
return toJsonContent(await client2.getToolCalls(defaultMaxCount(max_count)));
|
|
234
219
|
} catch (error) {
|
|
235
220
|
return toErrorContent(error);
|
|
236
221
|
}
|
|
@@ -248,7 +233,7 @@ function registerQueryTools(server2, agent2, endpoint2, orgName2) {
|
|
|
248
233
|
async ({ pubkey, max_count }) => {
|
|
249
234
|
try {
|
|
250
235
|
return toJsonContent(
|
|
251
|
-
await
|
|
236
|
+
await client2.getAgentToolCalls(pubkey ?? client2.pubkey, defaultMaxCount(max_count))
|
|
252
237
|
);
|
|
253
238
|
} catch (error) {
|
|
254
239
|
return toErrorContent(error);
|
|
@@ -266,7 +251,7 @@ function registerQueryTools(server2, agent2, endpoint2, orgName2) {
|
|
|
266
251
|
},
|
|
267
252
|
async ({ org_name, max_count }) => {
|
|
268
253
|
try {
|
|
269
|
-
return toJsonContent(await
|
|
254
|
+
return toJsonContent(await client2.getOrgToolCalls(org_name, defaultMaxCount(max_count)));
|
|
270
255
|
} catch (error) {
|
|
271
256
|
return toErrorContent(error);
|
|
272
257
|
}
|
|
@@ -282,7 +267,7 @@ function registerQueryTools(server2, agent2, endpoint2, orgName2) {
|
|
|
282
267
|
},
|
|
283
268
|
async ({ tool_call_id }) => {
|
|
284
269
|
try {
|
|
285
|
-
return toJsonContent(await
|
|
270
|
+
return toJsonContent(await client2.getToolCallFull(tool_call_id));
|
|
286
271
|
} catch (error) {
|
|
287
272
|
return toErrorContent(error);
|
|
288
273
|
}
|
|
@@ -296,7 +281,7 @@ function registerQueryTools(server2, agent2, endpoint2, orgName2) {
|
|
|
296
281
|
},
|
|
297
282
|
async () => {
|
|
298
283
|
try {
|
|
299
|
-
return toJsonContent({ count: await
|
|
284
|
+
return toJsonContent({ count: await client2.getToolCallCount() });
|
|
300
285
|
} catch (error) {
|
|
301
286
|
return toErrorContent(error);
|
|
302
287
|
}
|
|
@@ -305,14 +290,14 @@ function registerQueryTools(server2, agent2, endpoint2, orgName2) {
|
|
|
305
290
|
server2.registerTool(
|
|
306
291
|
"atbash_get_tier_info",
|
|
307
292
|
{
|
|
308
|
-
description: "Get an organization's tier information.",
|
|
293
|
+
description: "Get an organization's tier and enforcement information.",
|
|
309
294
|
inputSchema: z3.object({
|
|
310
295
|
org_name: z3.string().describe("Organization name")
|
|
311
296
|
})
|
|
312
297
|
},
|
|
313
298
|
async ({ org_name }) => {
|
|
314
299
|
try {
|
|
315
|
-
return toJsonContent(await
|
|
300
|
+
return toJsonContent(await client2.getOrgTierInfo(org_name));
|
|
316
301
|
} catch (error) {
|
|
317
302
|
return toErrorContent(error);
|
|
318
303
|
}
|
|
@@ -330,7 +315,7 @@ function registerQueryTools(server2, agent2, endpoint2, orgName2) {
|
|
|
330
315
|
async ({ org_name, max_count }) => {
|
|
331
316
|
try {
|
|
332
317
|
return toJsonContent(
|
|
333
|
-
await
|
|
318
|
+
await client2.getPendingHeldActions(org_name, defaultMaxCount(max_count))
|
|
334
319
|
);
|
|
335
320
|
} catch (error) {
|
|
336
321
|
return toErrorContent(error);
|
|
@@ -348,7 +333,7 @@ function registerQueryTools(server2, agent2, endpoint2, orgName2) {
|
|
|
348
333
|
},
|
|
349
334
|
async ({ org_name, max_count }) => {
|
|
350
335
|
try {
|
|
351
|
-
return toJsonContent(await
|
|
336
|
+
return toJsonContent(await client2.getHeldActionReviews(org_name, defaultMaxCount(max_count)));
|
|
352
337
|
} catch (error) {
|
|
353
338
|
return toErrorContent(error);
|
|
354
339
|
}
|
|
@@ -362,7 +347,7 @@ function registerQueryTools(server2, agent2, endpoint2, orgName2) {
|
|
|
362
347
|
},
|
|
363
348
|
async () => {
|
|
364
349
|
try {
|
|
365
|
-
return toJsonContent(await
|
|
350
|
+
return toJsonContent(await client2.getSafetyStats());
|
|
366
351
|
} catch (error) {
|
|
367
352
|
return toErrorContent(error);
|
|
368
353
|
}
|
|
@@ -372,23 +357,7 @@ function registerQueryTools(server2, agent2, endpoint2, orgName2) {
|
|
|
372
357
|
|
|
373
358
|
// src/tools/status.ts
|
|
374
359
|
import { z as z4 } from "zod";
|
|
375
|
-
function
|
|
376
|
-
if (raw == null) return "No verdict";
|
|
377
|
-
const value = String(raw).toUpperCase();
|
|
378
|
-
if (value === "ALLOW" || value === "GREEN") return "ALLOW";
|
|
379
|
-
if (value === "HOLD" || value === "YELLOW") return "HOLD";
|
|
380
|
-
if (value === "BLOCK" || value === "RED") return "BLOCK";
|
|
381
|
-
return value;
|
|
382
|
-
}
|
|
383
|
-
function normalizeStatus(raw) {
|
|
384
|
-
const value = String(raw ?? "").toLowerCase();
|
|
385
|
-
if (value === "pending" || value === "answered" || value === "error") {
|
|
386
|
-
return value;
|
|
387
|
-
}
|
|
388
|
-
return "error";
|
|
389
|
-
}
|
|
390
|
-
function registerStatusTools(server2, defaultPubkey, endpoint2) {
|
|
391
|
-
const baseUrl = (endpoint2 ?? "https://atbash.ai").replace(/\/$/, "");
|
|
360
|
+
function registerStatusTools(server2, client2) {
|
|
392
361
|
server2.registerTool(
|
|
393
362
|
"atbash_judgment_status",
|
|
394
363
|
{
|
|
@@ -400,30 +369,8 @@ function registerStatusTools(server2, defaultPubkey, endpoint2) {
|
|
|
400
369
|
},
|
|
401
370
|
async ({ tool_call_id, agent_pubkey }) => {
|
|
402
371
|
try {
|
|
403
|
-
const
|
|
404
|
-
|
|
405
|
-
url.searchParams.set("tool_call_id", tool_call_id);
|
|
406
|
-
url.searchParams.set("agent_pubkey", pubkey);
|
|
407
|
-
const response = await fetch(url, {
|
|
408
|
-
method: "GET",
|
|
409
|
-
headers: { Accept: "application/json" }
|
|
410
|
-
});
|
|
411
|
-
if (!response.ok) {
|
|
412
|
-
const body = await response.text().catch(() => "");
|
|
413
|
-
throw new Error(`API error ${response.status}: ${body || response.statusText}`);
|
|
414
|
-
}
|
|
415
|
-
const data = await response.json();
|
|
416
|
-
return toJsonContent({
|
|
417
|
-
status: normalizeStatus(data.status),
|
|
418
|
-
verdict: normalizeVerdict(data.verdict),
|
|
419
|
-
reason: String(data.reason ?? ""),
|
|
420
|
-
judgmentId: String(data.judgmentId ?? tool_call_id),
|
|
421
|
-
onChain: Boolean(data.onChain),
|
|
422
|
-
cached: Boolean(data.cached),
|
|
423
|
-
responseTimeMs: Number(data.responseTimeMs ?? 0),
|
|
424
|
-
tool_call_id,
|
|
425
|
-
agent_pubkey: pubkey
|
|
426
|
-
});
|
|
372
|
+
const status = await client2.getJudgmentStatus(tool_call_id, agent_pubkey);
|
|
373
|
+
return toJsonContent(status);
|
|
427
374
|
} catch (error) {
|
|
428
375
|
return toErrorContent(error);
|
|
429
376
|
}
|
|
@@ -437,21 +384,24 @@ if (!privkey) {
|
|
|
437
384
|
console.error("ATBASH_AGENT_PRIVKEY env var is required");
|
|
438
385
|
process.exit(1);
|
|
439
386
|
}
|
|
440
|
-
var agent = loadAgent(privkey);
|
|
441
387
|
var endpoint = process.env.ATBASH_ENDPOINT;
|
|
442
388
|
var orgName = process.env.ATBASH_ORG_NAME;
|
|
443
389
|
setupTelemetry({ enabled: true, source: "plugin:mcp" });
|
|
444
390
|
process.once("beforeExit", () => shutdownTelemetry());
|
|
445
391
|
process.once("SIGINT", () => shutdownTelemetry().finally(() => process.exit(0)));
|
|
446
392
|
process.once("SIGTERM", () => shutdownTelemetry().finally(() => process.exit(0)));
|
|
393
|
+
var clientOpts = {};
|
|
394
|
+
if (endpoint) clientOpts.endpoint = endpoint;
|
|
395
|
+
if (orgName) clientOpts.orgName = orgName;
|
|
396
|
+
var client = new Atbash(privkey, clientOpts);
|
|
447
397
|
var server = new McpServer({
|
|
448
398
|
name: "atbash-safety",
|
|
449
399
|
version: "1.0.0"
|
|
450
400
|
});
|
|
451
|
-
registerJudgeTools(server,
|
|
452
|
-
registerStatusTools(server,
|
|
453
|
-
registerQueryTools(server,
|
|
454
|
-
registerPolicyResource(server,
|
|
401
|
+
registerJudgeTools(server, client);
|
|
402
|
+
registerStatusTools(server, client);
|
|
403
|
+
registerQueryTools(server, client);
|
|
404
|
+
registerPolicyResource(server, client);
|
|
455
405
|
registerSafetyPrompt(server);
|
|
456
406
|
var transport = new StdioServerTransport();
|
|
457
407
|
await server.connect(transport);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atbash/atbash-mcp",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "Atbash safety judge exposed as a standalone MCP server",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"publish:dev": "node scripts/publish-dev.mjs"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@atbash/sdk": "0.5.
|
|
44
|
+
"@atbash/sdk": "0.5.4",
|
|
45
45
|
"@modelcontextprotocol/sdk": "^1.12.3",
|
|
46
46
|
"zod": "^3.25.76"
|
|
47
47
|
},
|