@tethral/acr-mcp 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/env-detect.d.ts +10 -0
- package/dist/src/env-detect.js +30 -0
- package/dist/src/env-detect.js.map +1 -0
- package/dist/src/http.d.ts +2 -0
- package/dist/src/http.js +112 -0
- package/dist/src/http.js.map +1 -0
- package/dist/src/index.js +6 -26
- package/dist/src/index.js.map +1 -1
- package/dist/src/middleware/self-log.d.ts +22 -0
- package/dist/src/middleware/self-log.js +72 -0
- package/dist/src/middleware/self-log.js.map +1 -0
- package/dist/src/server.d.ts +14 -0
- package/dist/src/server.js +67 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/session-state.d.ts +22 -0
- package/dist/src/session-state.js +81 -0
- package/dist/src/session-state.js.map +1 -0
- package/dist/src/state.d.ts +0 -5
- package/dist/src/state.js +9 -47
- package/dist/src/state.js.map +1 -1
- package/dist/src/tools/check-entity.js +38 -1
- package/dist/src/tools/check-entity.js.map +1 -1
- package/dist/src/tools/get-friction-report.js +14 -0
- package/dist/src/tools/get-friction-report.js.map +1 -1
- package/dist/src/tools/get-my-agent.js +15 -1
- package/dist/src/tools/get-my-agent.js.map +1 -1
- package/dist/src/tools/get-skill-versions.d.ts +2 -0
- package/dist/src/tools/get-skill-versions.js +71 -0
- package/dist/src/tools/get-skill-versions.js.map +1 -0
- package/dist/src/tools/log-interaction.js +15 -1
- package/dist/src/tools/log-interaction.js.map +1 -1
- package/dist/src/tools/search-skills.d.ts +2 -0
- package/dist/src/tools/search-skills.js +59 -0
- package/dist/src/tools/search-skills.js.map +1 -0
- package/dist/src/tools/update-composition.d.ts +3 -0
- package/dist/src/tools/update-composition.js +54 -0
- package/dist/src/tools/update-composition.js.map +1 -0
- package/package.json +5 -4
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface EnvironmentContext {
|
|
2
|
+
device_class: 'desktop' | 'server' | 'sbc' | 'mobile' | 'unknown';
|
|
3
|
+
platform: string;
|
|
4
|
+
arch: string;
|
|
5
|
+
client_type?: string;
|
|
6
|
+
transport_type: 'stdio' | 'streamable-http';
|
|
7
|
+
}
|
|
8
|
+
export declare function detectEnvironment(transportType: 'stdio' | 'streamable-http'): EnvironmentContext;
|
|
9
|
+
/** OS release string, useful for debugging but not stored by default. */
|
|
10
|
+
export declare function getOsRelease(): string;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-detect execution environment for ACR observability.
|
|
3
|
+
* Captures device class, platform, architecture at startup.
|
|
4
|
+
* Env var overrides: ACR_DEVICE_CLASS, ACR_PLATFORM, ACR_ARCH.
|
|
5
|
+
*/
|
|
6
|
+
import { totalmem, release } from 'node:os';
|
|
7
|
+
function inferDeviceClass() {
|
|
8
|
+
const override = process.env.ACR_DEVICE_CLASS;
|
|
9
|
+
if (override)
|
|
10
|
+
return override;
|
|
11
|
+
const memGB = totalmem() / (1024 ** 3);
|
|
12
|
+
if (memGB < 2)
|
|
13
|
+
return 'sbc';
|
|
14
|
+
if (memGB < 4)
|
|
15
|
+
return 'mobile';
|
|
16
|
+
return 'desktop';
|
|
17
|
+
}
|
|
18
|
+
export function detectEnvironment(transportType) {
|
|
19
|
+
return {
|
|
20
|
+
device_class: inferDeviceClass(),
|
|
21
|
+
platform: process.env.ACR_PLATFORM ?? process.platform,
|
|
22
|
+
arch: process.env.ACR_ARCH ?? process.arch,
|
|
23
|
+
transport_type: transportType,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/** OS release string, useful for debugging but not stored by default. */
|
|
27
|
+
export function getOsRelease() {
|
|
28
|
+
return release();
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=env-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-detect.js","sourceRoot":"","sources":["../../src/env-detect.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAU5C,SAAS,gBAAgB;IACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC9C,IAAI,QAAQ;QAAE,OAAO,QAA8C,CAAC;IAEpE,MAAM,KAAK,GAAG,QAAQ,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5B,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC/B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,aAA0C;IAE1C,OAAO;QACL,YAAY,EAAE,gBAAgB,EAAE;QAChC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,QAAQ;QACtD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI;QAC1C,cAAc,EAAE,aAAa;KAC9B,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,EAAE,CAAC;AACnB,CAAC"}
|
package/dist/src/http.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ACR MCP server — Streamable HTTP entry point.
|
|
4
|
+
* For browser-based clients (claude.ai) and remote MCP connections.
|
|
5
|
+
* For stdio transport, see index.ts.
|
|
6
|
+
*/
|
|
7
|
+
import { createServer } from 'node:http';
|
|
8
|
+
import { randomUUID } from 'node:crypto';
|
|
9
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
10
|
+
import { createAcrServer } from './server.js';
|
|
11
|
+
import { SessionState } from './session-state.js';
|
|
12
|
+
const PORT = parseInt(process.env.ACR_MCP_HTTP_PORT ?? '3001', 10);
|
|
13
|
+
const AUTH_TOKEN = process.env.ACR_MCP_AUTH_TOKEN;
|
|
14
|
+
const STATELESS = process.env.ACR_MCP_STATELESS === 'true';
|
|
15
|
+
// Track active transports per session for cleanup
|
|
16
|
+
const sessions = new Map();
|
|
17
|
+
function createTransport() {
|
|
18
|
+
const transport = new StreamableHTTPServerTransport({
|
|
19
|
+
sessionIdGenerator: STATELESS ? undefined : () => randomUUID(),
|
|
20
|
+
onsessioninitialized: (sessionId) => {
|
|
21
|
+
sessions.set(sessionId, transport);
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
return transport;
|
|
25
|
+
}
|
|
26
|
+
const httpServer = createServer(async (req, res) => {
|
|
27
|
+
const url = new URL(req.url ?? '/', `http://localhost:${PORT}`);
|
|
28
|
+
// CORS headers for browser access
|
|
29
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
30
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
|
|
31
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, Mcp-Session-Id');
|
|
32
|
+
res.setHeader('Access-Control-Expose-Headers', 'Mcp-Session-Id');
|
|
33
|
+
if (req.method === 'OPTIONS') {
|
|
34
|
+
res.writeHead(204);
|
|
35
|
+
res.end();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Health check
|
|
39
|
+
if (url.pathname === '/health') {
|
|
40
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
41
|
+
res.end(JSON.stringify({ status: 'ok', sessions: sessions.size }));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Only handle /mcp endpoint
|
|
45
|
+
if (url.pathname !== '/mcp') {
|
|
46
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
47
|
+
res.end(JSON.stringify({ error: 'Not found. Use /mcp for MCP protocol.' }));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Optional bearer auth
|
|
51
|
+
if (AUTH_TOKEN) {
|
|
52
|
+
const auth = req.headers.authorization;
|
|
53
|
+
if (!auth || auth !== `Bearer ${AUTH_TOKEN}`) {
|
|
54
|
+
res.writeHead(401, { 'Content-Type': 'application/json' });
|
|
55
|
+
res.end(JSON.stringify({ error: 'Unauthorized' }));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Route by session: existing session or new initialization
|
|
60
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
61
|
+
if (sessionId && sessions.has(sessionId)) {
|
|
62
|
+
// Existing session — route to its transport
|
|
63
|
+
const transport = sessions.get(sessionId);
|
|
64
|
+
await transport.handleRequest(req, res);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (req.method === 'POST' && !sessionId) {
|
|
68
|
+
// New session — create transport with its own session state, connect server
|
|
69
|
+
const transport = createTransport();
|
|
70
|
+
const session = new SessionState('streamable-http');
|
|
71
|
+
const server = createAcrServer({ session });
|
|
72
|
+
transport.onclose = () => {
|
|
73
|
+
const sid = transport.sessionId;
|
|
74
|
+
if (sid)
|
|
75
|
+
sessions.delete(sid);
|
|
76
|
+
server.close().catch(() => { });
|
|
77
|
+
};
|
|
78
|
+
await server.connect(transport);
|
|
79
|
+
await transport.handleRequest(req, res);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (req.method === 'DELETE' && sessionId) {
|
|
83
|
+
// Session cleanup
|
|
84
|
+
const transport = sessions.get(sessionId);
|
|
85
|
+
if (transport) {
|
|
86
|
+
await transport.close();
|
|
87
|
+
sessions.delete(sessionId);
|
|
88
|
+
}
|
|
89
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
90
|
+
res.end(JSON.stringify({ closed: true }));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Unknown session ID
|
|
94
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
95
|
+
res.end(JSON.stringify({ error: 'Session not found' }));
|
|
96
|
+
});
|
|
97
|
+
httpServer.listen(PORT, () => {
|
|
98
|
+
console.error(`ACR MCP HTTP server listening on port ${PORT}`);
|
|
99
|
+
console.error(` Endpoint: http://localhost:${PORT}/mcp`);
|
|
100
|
+
console.error(` Mode: ${STATELESS ? 'stateless' : 'stateful (session-based)'}`);
|
|
101
|
+
if (AUTH_TOKEN)
|
|
102
|
+
console.error(' Auth: bearer token required');
|
|
103
|
+
});
|
|
104
|
+
// Graceful shutdown
|
|
105
|
+
process.on('SIGTERM', () => {
|
|
106
|
+
console.error('Shutting down...');
|
|
107
|
+
for (const transport of sessions.values()) {
|
|
108
|
+
transport.close().catch(() => { });
|
|
109
|
+
}
|
|
110
|
+
httpServer.close();
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":";AACA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AACnE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,CAAC;AAE3D,kDAAkD;AAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyC,CAAC;AAElE,SAAS,eAAe;IACtB,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;QAClD,kBAAkB,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE;QAC9D,oBAAoB,EAAE,CAAC,SAAS,EAAE,EAAE;YAClC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACrC,CAAC;KACF,CAAC,CAAC;IACH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACjD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAC;IAEhE,kCAAkC;IAClC,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;IAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,4BAA4B,CAAC,CAAC;IAC5E,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,6CAA6C,CAAC,CAAC;IAC7F,GAAG,CAAC,SAAS,CAAC,+BAA+B,EAAE,gBAAgB,CAAC,CAAC;IAEjE,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACnB,GAAG,CAAC,GAAG,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IAED,eAAe;IACf,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC/B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,4BAA4B;IAC5B,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC5B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uCAAuC,EAAE,CAAC,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,uBAAuB;IACvB,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QACvC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,UAAU,UAAU,EAAE,EAAE,CAAC;YAC7C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;IAEtE,IAAI,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,4CAA4C;QAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;QAC3C,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACxC,4EAA4E;QAC5E,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,iBAAiB,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAE5C,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;YACvB,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC;YAChC,IAAI,GAAG;gBAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC;QAEF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,SAAS,EAAE,CAAC;QACzC,kBAAkB;QAClB,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;YACxB,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QACD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,qBAAqB;IACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IAC3B,OAAO,CAAC,KAAK,CAAC,yCAAyC,IAAI,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,KAAK,CAAC,gCAAgC,IAAI,MAAM,CAAC,CAAC;IAC1D,OAAO,CAAC,KAAK,CAAC,WAAW,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,0BAA0B,EAAE,CAAC,CAAC;IACjF,IAAI,UAAU;QAAE,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;AACjE,CAAC,CAAC,CAAC;AAEH,oBAAoB;AACpB,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAClC,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1C,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,UAAU,CAAC,KAAK,EAAE,CAAC;AACrB,CAAC,CAAC,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,32 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* ACR MCP server — stdio entry point.
|
|
4
|
+
* For HTTP transport, see http.ts.
|
|
5
|
+
*/
|
|
3
6
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
-
import {
|
|
5
|
-
import { logInteractionTool } from './tools/log-interaction.js';
|
|
6
|
-
import { checkEntityTool } from './tools/check-entity.js';
|
|
7
|
-
import { checkEnvironmentTool } from './tools/check-environment.js';
|
|
8
|
-
import { getFrictionReportTool } from './tools/get-friction-report.js';
|
|
9
|
-
import { getMyAgentTool } from './tools/get-my-agent.js';
|
|
10
|
-
import { getInteractionLogTool } from './tools/get-interaction-log.js';
|
|
11
|
-
import { getNetworkStatusTool } from './tools/get-network-status.js';
|
|
12
|
-
import { getSkillTrackerTool } from './tools/get-skill-tracker.js';
|
|
13
|
-
const ACR_API_URL = process.env.ACR_API_URL ?? 'https://acr.nfkey.ai';
|
|
14
|
-
const ACR_RESOLVER_URL = process.env.ACR_RESOLVER_URL ?? ACR_API_URL;
|
|
15
|
-
const server = new McpServer({
|
|
16
|
-
name: 'acr-agent-registry',
|
|
17
|
-
version: '0.2.0',
|
|
18
|
-
description: 'Agent Composition Records — observability for AI agents. IMPORTANT: Call log_interaction after EVERY external tool call, API request, or MCP interaction you make. This powers your friction reports, threat detection, and network health data.',
|
|
19
|
-
});
|
|
20
|
-
registerAgentTool(server, ACR_API_URL);
|
|
21
|
-
logInteractionTool(server, ACR_API_URL);
|
|
22
|
-
checkEntityTool(server, ACR_API_URL, ACR_RESOLVER_URL);
|
|
23
|
-
checkEnvironmentTool(server, ACR_API_URL, ACR_RESOLVER_URL);
|
|
24
|
-
getFrictionReportTool(server, ACR_API_URL);
|
|
25
|
-
getMyAgentTool(server);
|
|
26
|
-
getInteractionLogTool(server, ACR_API_URL);
|
|
27
|
-
getNetworkStatusTool(server, ACR_API_URL);
|
|
28
|
-
getSkillTrackerTool(server, ACR_API_URL);
|
|
7
|
+
import { createAcrServer } from './server.js';
|
|
29
8
|
async function main() {
|
|
9
|
+
const server = createAcrServer();
|
|
30
10
|
const transport = new StdioServerTransport();
|
|
31
11
|
await server.connect(transport);
|
|
32
12
|
}
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-logging middleware for ACR MCP tools.
|
|
3
|
+
* Wraps each tool handler to automatically log timing and status,
|
|
4
|
+
* without relying on the LLM to call log_interaction.
|
|
5
|
+
*
|
|
6
|
+
* Self-logged receipts use source='server' to distinguish from
|
|
7
|
+
* LLM-initiated logs (source='agent').
|
|
8
|
+
*/
|
|
9
|
+
import type { SessionState } from '../session-state.js';
|
|
10
|
+
type ToolResult = {
|
|
11
|
+
content: Array<{
|
|
12
|
+
type: string;
|
|
13
|
+
text: string;
|
|
14
|
+
}>;
|
|
15
|
+
};
|
|
16
|
+
type ToolHandler = (params: Record<string, unknown>, extra: unknown) => Promise<ToolResult>;
|
|
17
|
+
/**
|
|
18
|
+
* Wrap a tool handler with automatic interaction logging.
|
|
19
|
+
* Fires a non-blocking POST to the receipts API after each call.
|
|
20
|
+
*/
|
|
21
|
+
export declare function withSelfLog(toolName: string, handler: ToolHandler, getState: () => SessionState, apiUrl: string): ToolHandler;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { defaultSession } from '../session-state.js';
|
|
2
|
+
// Re-entrancy guard to prevent the self-log POST from triggering another self-log
|
|
3
|
+
let selfLogging = false;
|
|
4
|
+
/**
|
|
5
|
+
* Wrap a tool handler with automatic interaction logging.
|
|
6
|
+
* Fires a non-blocking POST to the receipts API after each call.
|
|
7
|
+
*/
|
|
8
|
+
export function withSelfLog(toolName, handler, getState, apiUrl) {
|
|
9
|
+
return async (params, extra) => {
|
|
10
|
+
const startMs = Date.now();
|
|
11
|
+
let status = 'success';
|
|
12
|
+
let result;
|
|
13
|
+
try {
|
|
14
|
+
result = await handler(params, extra);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
status = 'failure';
|
|
18
|
+
throw err;
|
|
19
|
+
}
|
|
20
|
+
finally {
|
|
21
|
+
// Fire-and-forget self-log (never block or fail the tool call)
|
|
22
|
+
if (!selfLogging) {
|
|
23
|
+
const durationMs = Date.now() - startMs;
|
|
24
|
+
const state = getState();
|
|
25
|
+
// Tools currently store agentId on defaultSession (via state.ts compat layer).
|
|
26
|
+
// Check both the provided session and defaultSession as fallback.
|
|
27
|
+
const agentId = state.agentId ?? defaultSession.agentId;
|
|
28
|
+
if (agentId) {
|
|
29
|
+
selfLogging = true;
|
|
30
|
+
fireAndForgetLog(apiUrl, agentId, toolName, status, durationMs, state.transportType)
|
|
31
|
+
.finally(() => { selfLogging = false; });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async function fireAndForgetLog(apiUrl, agentId, toolName, status, durationMs, transportType) {
|
|
39
|
+
try {
|
|
40
|
+
const controller = new AbortController();
|
|
41
|
+
const timeout = setTimeout(() => controller.abort(), 2000);
|
|
42
|
+
const res = await fetch(`${apiUrl}/api/v1/receipts`, {
|
|
43
|
+
method: 'POST',
|
|
44
|
+
headers: { 'Content-Type': 'application/json' },
|
|
45
|
+
signal: controller.signal,
|
|
46
|
+
body: JSON.stringify({
|
|
47
|
+
emitter: {
|
|
48
|
+
agent_id: agentId,
|
|
49
|
+
provider_class: 'unknown',
|
|
50
|
+
},
|
|
51
|
+
target: {
|
|
52
|
+
system_id: `mcp:acr-registry`,
|
|
53
|
+
system_type: 'mcp_server',
|
|
54
|
+
},
|
|
55
|
+
interaction: {
|
|
56
|
+
category: 'tool_call',
|
|
57
|
+
status,
|
|
58
|
+
duration_ms: durationMs,
|
|
59
|
+
request_timestamp_ms: Date.now() - durationMs,
|
|
60
|
+
},
|
|
61
|
+
anomaly: { flagged: false },
|
|
62
|
+
transport_type: transportType,
|
|
63
|
+
source: 'server',
|
|
64
|
+
}),
|
|
65
|
+
});
|
|
66
|
+
clearTimeout(timeout);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Silently ignore — self-logging must never break tool calls
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=self-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-log.js","sourceRoot":"","sources":["../../../src/middleware/self-log.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAKrD,kFAAkF;AAClF,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,QAAgB,EAChB,OAAoB,EACpB,QAA4B,EAC5B,MAAc;IAEd,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,MAAM,GAA0B,SAAS,CAAC;QAC9C,IAAI,MAAkB,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,SAAS,CAAC;YACnB,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,+DAA+D;YAC/D,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;gBACxC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;gBACzB,+EAA+E;gBAC/E,kEAAkE;gBAClE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC;gBAExD,IAAI,OAAO,EAAE,CAAC;oBACZ,WAAW,GAAG,IAAI,CAAC;oBACnB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC;yBACjF,OAAO,CAAC,GAAG,EAAE,GAAG,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAO,CAAC;IACjB,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,MAAc,EACd,OAAe,EACf,QAAgB,EAChB,MAAc,EACd,UAAkB,EAClB,aAAqB;IAErB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAE3D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,kBAAkB,EAAE;YACnD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO,EAAE;oBACP,QAAQ,EAAE,OAAO;oBACjB,cAAc,EAAE,SAAS;iBAC1B;gBACD,MAAM,EAAE;oBACN,SAAS,EAAE,kBAAkB;oBAC7B,WAAW,EAAE,YAAY;iBAC1B;gBACD,WAAW,EAAE;oBACX,QAAQ,EAAE,WAAW;oBACrB,MAAM;oBACN,WAAW,EAAE,UAAU;oBACvB,oBAAoB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU;iBAC9C;gBACD,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;gBAC3B,cAAc,EAAE,aAAa;gBAC7B,MAAM,EAAE,QAAQ;aACjB,CAAC;SACH,CAAC,CAAC;QAEH,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;IAC/D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared server factory for the ACR MCP server.
|
|
3
|
+
* Creates and configures the McpServer with all tools registered.
|
|
4
|
+
* Used by both stdio (index.ts) and HTTP (http.ts) entry points.
|
|
5
|
+
*/
|
|
6
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
import { SessionState } from './session-state.js';
|
|
8
|
+
export interface AcrServerOptions {
|
|
9
|
+
apiUrl?: string;
|
|
10
|
+
resolverUrl?: string;
|
|
11
|
+
/** Session state for this server instance. Defaults to the stdio singleton. */
|
|
12
|
+
session?: SessionState;
|
|
13
|
+
}
|
|
14
|
+
export declare function createAcrServer(options?: AcrServerOptions): McpServer;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared server factory for the ACR MCP server.
|
|
3
|
+
* Creates and configures the McpServer with all tools registered.
|
|
4
|
+
* Used by both stdio (index.ts) and HTTP (http.ts) entry points.
|
|
5
|
+
*/
|
|
6
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
import { registerAgentTool } from './tools/register-agent.js';
|
|
8
|
+
import { logInteractionTool } from './tools/log-interaction.js';
|
|
9
|
+
import { checkEntityTool } from './tools/check-entity.js';
|
|
10
|
+
import { checkEnvironmentTool } from './tools/check-environment.js';
|
|
11
|
+
import { getFrictionReportTool } from './tools/get-friction-report.js';
|
|
12
|
+
import { getMyAgentTool } from './tools/get-my-agent.js';
|
|
13
|
+
import { getInteractionLogTool } from './tools/get-interaction-log.js';
|
|
14
|
+
import { getNetworkStatusTool } from './tools/get-network-status.js';
|
|
15
|
+
import { getSkillTrackerTool } from './tools/get-skill-tracker.js';
|
|
16
|
+
import { searchSkillsTool } from './tools/search-skills.js';
|
|
17
|
+
import { getSkillVersionsTool } from './tools/get-skill-versions.js';
|
|
18
|
+
import { updateCompositionTool } from './tools/update-composition.js';
|
|
19
|
+
import { withSelfLog } from './middleware/self-log.js';
|
|
20
|
+
import { defaultSession } from './session-state.js';
|
|
21
|
+
/**
|
|
22
|
+
* Wraps server.tool() to automatically apply self-logging middleware.
|
|
23
|
+
* Each tool handler gets wrapped with withSelfLog before registration.
|
|
24
|
+
*/
|
|
25
|
+
function withSelfLogging(server, getState, apiUrl) {
|
|
26
|
+
const originalTool = server.tool.bind(server);
|
|
27
|
+
// Override server.tool to wrap handlers
|
|
28
|
+
// The SDK has multiple overloads; we intercept the most common pattern:
|
|
29
|
+
// server.tool(name, description, schema, handler)
|
|
30
|
+
// server.tool(name, description, handler) — no schema
|
|
31
|
+
server.tool = function (name, ...rest) {
|
|
32
|
+
// Find the handler (always the last argument in rest)
|
|
33
|
+
const lastIdx = rest.length - 1;
|
|
34
|
+
const handler = rest[lastIdx];
|
|
35
|
+
if (typeof handler === 'function') {
|
|
36
|
+
rest[lastIdx] = withSelfLog(name, handler, getState, apiUrl);
|
|
37
|
+
}
|
|
38
|
+
return originalTool.call(server, name, ...rest);
|
|
39
|
+
};
|
|
40
|
+
return server;
|
|
41
|
+
}
|
|
42
|
+
export function createAcrServer(options) {
|
|
43
|
+
const apiUrl = options?.apiUrl ?? process.env.ACR_API_URL ?? 'https://acr.nfkey.ai';
|
|
44
|
+
const resolverUrl = options?.resolverUrl ?? process.env.ACR_RESOLVER_URL ?? apiUrl;
|
|
45
|
+
const session = options?.session ?? defaultSession;
|
|
46
|
+
const server = new McpServer({
|
|
47
|
+
name: 'acr-agent-registry',
|
|
48
|
+
version: '0.4.0',
|
|
49
|
+
description: 'Agent Composition Records — observability for AI agents. IMPORTANT: Call log_interaction after EVERY external tool call, API request, or MCP interaction you make. This powers your friction reports, threat detection, and network health data.',
|
|
50
|
+
});
|
|
51
|
+
// Apply self-logging middleware before tool registration
|
|
52
|
+
withSelfLogging(server, () => session, apiUrl);
|
|
53
|
+
registerAgentTool(server, apiUrl);
|
|
54
|
+
logInteractionTool(server, apiUrl);
|
|
55
|
+
checkEntityTool(server, apiUrl, resolverUrl);
|
|
56
|
+
checkEnvironmentTool(server, apiUrl, resolverUrl);
|
|
57
|
+
getFrictionReportTool(server, apiUrl);
|
|
58
|
+
getMyAgentTool(server);
|
|
59
|
+
getInteractionLogTool(server, apiUrl);
|
|
60
|
+
getNetworkStatusTool(server, apiUrl);
|
|
61
|
+
getSkillTrackerTool(server, apiUrl);
|
|
62
|
+
searchSkillsTool(server, apiUrl);
|
|
63
|
+
getSkillVersionsTool(server, apiUrl, resolverUrl);
|
|
64
|
+
updateCompositionTool(server, apiUrl, () => session);
|
|
65
|
+
return server;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare class SessionState {
|
|
2
|
+
private _agentId;
|
|
3
|
+
private _agentName;
|
|
4
|
+
private _registering;
|
|
5
|
+
private _transportType;
|
|
6
|
+
private _clientType;
|
|
7
|
+
constructor(transportType?: 'stdio' | 'streamable-http');
|
|
8
|
+
get agentId(): string | null;
|
|
9
|
+
get agentName(): string | null;
|
|
10
|
+
get transportType(): 'stdio' | 'streamable-http';
|
|
11
|
+
get clientType(): string | null;
|
|
12
|
+
setAgentId(id: string): void;
|
|
13
|
+
setAgentName(name: string): void;
|
|
14
|
+
setClientType(type: string): void;
|
|
15
|
+
/**
|
|
16
|
+
* Ensure the agent is registered. Called before any tool that needs an agent_id.
|
|
17
|
+
* If not registered, auto-registers with a pseudo_ ID and sends environment context.
|
|
18
|
+
*/
|
|
19
|
+
ensureRegistered(apiUrl: string): Promise<string>;
|
|
20
|
+
}
|
|
21
|
+
/** Default singleton session for stdio mode. */
|
|
22
|
+
export declare const defaultSession: SessionState;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Instance-based session state for the ACR MCP server.
|
|
3
|
+
* Supports both stdio (single session) and HTTP (concurrent sessions).
|
|
4
|
+
*/
|
|
5
|
+
import { randomBytes } from 'node:crypto';
|
|
6
|
+
import { detectEnvironment } from './env-detect.js';
|
|
7
|
+
export class SessionState {
|
|
8
|
+
_agentId = null;
|
|
9
|
+
_agentName = null;
|
|
10
|
+
_registering = false;
|
|
11
|
+
_transportType;
|
|
12
|
+
_clientType = null;
|
|
13
|
+
constructor(transportType = 'stdio') {
|
|
14
|
+
this._transportType = transportType;
|
|
15
|
+
}
|
|
16
|
+
get agentId() {
|
|
17
|
+
return this._agentId;
|
|
18
|
+
}
|
|
19
|
+
get agentName() {
|
|
20
|
+
return this._agentName;
|
|
21
|
+
}
|
|
22
|
+
get transportType() {
|
|
23
|
+
return this._transportType;
|
|
24
|
+
}
|
|
25
|
+
get clientType() {
|
|
26
|
+
return this._clientType;
|
|
27
|
+
}
|
|
28
|
+
setAgentId(id) {
|
|
29
|
+
this._agentId = id;
|
|
30
|
+
}
|
|
31
|
+
setAgentName(name) {
|
|
32
|
+
this._agentName = name;
|
|
33
|
+
}
|
|
34
|
+
setClientType(type) {
|
|
35
|
+
this._clientType = type;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Ensure the agent is registered. Called before any tool that needs an agent_id.
|
|
39
|
+
* If not registered, auto-registers with a pseudo_ ID and sends environment context.
|
|
40
|
+
*/
|
|
41
|
+
async ensureRegistered(apiUrl) {
|
|
42
|
+
if (this._agentId)
|
|
43
|
+
return this._agentId;
|
|
44
|
+
if (this._registering) {
|
|
45
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
46
|
+
if (this._agentId)
|
|
47
|
+
return this._agentId;
|
|
48
|
+
}
|
|
49
|
+
this._registering = true;
|
|
50
|
+
try {
|
|
51
|
+
const pseudoKey = `pseudo_${randomBytes(16).toString('hex')}`;
|
|
52
|
+
const env = detectEnvironment(this._transportType);
|
|
53
|
+
if (this._clientType)
|
|
54
|
+
env.client_type = this._clientType;
|
|
55
|
+
const res = await fetch(`${apiUrl}/api/v1/register`, {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
headers: { 'Content-Type': 'application/json' },
|
|
58
|
+
body: JSON.stringify({
|
|
59
|
+
public_key: pseudoKey,
|
|
60
|
+
provider_class: 'unknown',
|
|
61
|
+
environment: env,
|
|
62
|
+
}),
|
|
63
|
+
});
|
|
64
|
+
if (res.ok) {
|
|
65
|
+
const data = await res.json();
|
|
66
|
+
this._agentId = data.agent_id;
|
|
67
|
+
this._agentName = data.name;
|
|
68
|
+
return this._agentId;
|
|
69
|
+
}
|
|
70
|
+
// Registration failed — use pseudo ID locally
|
|
71
|
+
this._agentId = `pseudo_${randomBytes(6).toString('hex')}`;
|
|
72
|
+
return this._agentId;
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
this._registering = false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** Default singleton session for stdio mode. */
|
|
80
|
+
export const defaultSession = new SessionState('stdio');
|
|
81
|
+
//# sourceMappingURL=session-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../src/session-state.ts"],"names":[],"mappings":"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"}
|
package/dist/src/state.d.ts
CHANGED
|
@@ -3,9 +3,4 @@ export declare function getAgentId(): string | null;
|
|
|
3
3
|
export declare function getAgentName(): string | null;
|
|
4
4
|
export declare function setAgentId(id: string): void;
|
|
5
5
|
export declare function setAgentName(name: string): void;
|
|
6
|
-
/**
|
|
7
|
-
* Ensure the agent is registered. Called before any tool that needs an agent_id.
|
|
8
|
-
* If not registered, auto-registers with a pseudo_ ID.
|
|
9
|
-
* Returns the agent_id.
|
|
10
|
-
*/
|
|
11
6
|
export declare function ensureRegistered(): Promise<string>;
|
package/dist/src/state.js
CHANGED
|
@@ -1,64 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Backwards-compatible state module.
|
|
3
|
+
* Delegates to the defaultSession singleton from session-state.ts.
|
|
4
|
+
* Tools continue to import from './state.js' without changes.
|
|
4
5
|
*/
|
|
5
|
-
import {
|
|
6
|
-
let agentId = null;
|
|
7
|
-
let agentName = null;
|
|
8
|
-
let registering = false;
|
|
6
|
+
import { defaultSession } from './session-state.js';
|
|
9
7
|
const ACR_API_URL = process.env.ACR_API_URL ?? 'https://acr.nfkey.ai';
|
|
10
8
|
export function getApiUrl() {
|
|
11
9
|
return ACR_API_URL;
|
|
12
10
|
}
|
|
13
11
|
export function getAgentId() {
|
|
14
|
-
return agentId;
|
|
12
|
+
return defaultSession.agentId;
|
|
15
13
|
}
|
|
16
14
|
export function getAgentName() {
|
|
17
|
-
return agentName;
|
|
15
|
+
return defaultSession.agentName;
|
|
18
16
|
}
|
|
19
17
|
export function setAgentId(id) {
|
|
20
|
-
|
|
18
|
+
defaultSession.setAgentId(id);
|
|
21
19
|
}
|
|
22
20
|
export function setAgentName(name) {
|
|
23
|
-
|
|
21
|
+
defaultSession.setAgentName(name);
|
|
24
22
|
}
|
|
25
|
-
/**
|
|
26
|
-
* Ensure the agent is registered. Called before any tool that needs an agent_id.
|
|
27
|
-
* If not registered, auto-registers with a pseudo_ ID.
|
|
28
|
-
* Returns the agent_id.
|
|
29
|
-
*/
|
|
30
23
|
export async function ensureRegistered() {
|
|
31
|
-
|
|
32
|
-
return agentId;
|
|
33
|
-
if (registering) {
|
|
34
|
-
// Another call is already registering — wait briefly
|
|
35
|
-
await new Promise((r) => setTimeout(r, 1000));
|
|
36
|
-
if (agentId)
|
|
37
|
-
return agentId;
|
|
38
|
-
}
|
|
39
|
-
registering = true;
|
|
40
|
-
try {
|
|
41
|
-
const pseudoKey = `pseudo_${randomBytes(16).toString('hex')}`;
|
|
42
|
-
const res = await fetch(`${ACR_API_URL}/api/v1/register`, {
|
|
43
|
-
method: 'POST',
|
|
44
|
-
headers: { 'Content-Type': 'application/json' },
|
|
45
|
-
body: JSON.stringify({
|
|
46
|
-
public_key: pseudoKey,
|
|
47
|
-
provider_class: 'unknown',
|
|
48
|
-
}),
|
|
49
|
-
});
|
|
50
|
-
if (res.ok) {
|
|
51
|
-
const data = await res.json();
|
|
52
|
-
agentId = data.agent_id;
|
|
53
|
-
agentName = data.name;
|
|
54
|
-
return agentId;
|
|
55
|
-
}
|
|
56
|
-
// Registration failed — use pseudo ID locally
|
|
57
|
-
agentId = `pseudo_${randomBytes(6).toString('hex')}`;
|
|
58
|
-
return agentId;
|
|
59
|
-
}
|
|
60
|
-
finally {
|
|
61
|
-
registering = false;
|
|
62
|
-
}
|
|
24
|
+
return defaultSession.ensureRegistered(ACR_API_URL);
|
|
63
25
|
}
|
|
64
26
|
//# sourceMappingURL=state.js.map
|
package/dist/src/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/state.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,sBAAsB,CAAC;AAEtE,MAAM,UAAU,SAAS;IACvB,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,cAAc,CAAC,OAAO,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,cAAc,CAAC,SAAS,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,OAAO,cAAc,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -21,10 +21,27 @@ export function checkEntityTool(server, apiUrl, resolverUrl) {
|
|
|
21
21
|
const data = await res.json();
|
|
22
22
|
if (entity_type === 'skill') {
|
|
23
23
|
if (!data.found) {
|
|
24
|
+
// Try to find similar skills via catalog search
|
|
25
|
+
let similarText = '';
|
|
26
|
+
try {
|
|
27
|
+
const searchRes = await fetch(`${apiUrl}/api/v1/skill-catalog/search?q=${encodeURIComponent(entity_id.slice(0, 16))}&limit=3`);
|
|
28
|
+
if (searchRes.ok) {
|
|
29
|
+
const searchData = await searchRes.json();
|
|
30
|
+
if (searchData.skills.length > 0) {
|
|
31
|
+
similarText = '\n\nSimilar skills in the catalog:';
|
|
32
|
+
for (const s of searchData.skills) {
|
|
33
|
+
similarText += `\n - ${s.skill_name} (${s.skill_source})`;
|
|
34
|
+
if (s.description)
|
|
35
|
+
similarText += `: ${s.description.slice(0, 80)}`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch { /* non-blocking */ }
|
|
24
41
|
return {
|
|
25
42
|
content: [{
|
|
26
43
|
type: 'text',
|
|
27
|
-
text: `Unknown skill. This hash has not been seen in the ACR network. Exercise caution with unfamiliar skills
|
|
44
|
+
text: `Unknown skill. This hash has not been seen in the ACR network. Exercise caution with unfamiliar skills.${similarText}`,
|
|
28
45
|
}],
|
|
29
46
|
};
|
|
30
47
|
}
|
|
@@ -32,12 +49,32 @@ export function checkEntityTool(server, apiUrl, resolverUrl) {
|
|
|
32
49
|
let text = `Skill found.\n\nThreat Level: ${level}`;
|
|
33
50
|
if (data.skill_name)
|
|
34
51
|
text += `\nName: ${data.skill_name}`;
|
|
52
|
+
if (data.description)
|
|
53
|
+
text += `\nDescription: ${data.description}`;
|
|
54
|
+
if (data.version)
|
|
55
|
+
text += `\nVersion: ${data.version}`;
|
|
56
|
+
if (data.author)
|
|
57
|
+
text += `\nAuthor: ${data.author}`;
|
|
58
|
+
if (data.category)
|
|
59
|
+
text += `\nCategory: ${data.category}`;
|
|
60
|
+
if (data.tags && data.tags.length > 0)
|
|
61
|
+
text += `\nTags: ${data.tags.join(', ')}`;
|
|
35
62
|
if (data.agent_count != null)
|
|
36
63
|
text += `\nAgents using: ${data.agent_count}`;
|
|
37
64
|
if (data.interaction_count != null)
|
|
38
65
|
text += `\nInteractions: ${data.interaction_count}`;
|
|
39
66
|
if (data.anomaly_rate != null)
|
|
40
67
|
text += `\nAnomaly rate: ${(data.anomaly_rate * 100).toFixed(1)}%`;
|
|
68
|
+
// Version freshness check
|
|
69
|
+
if (data.is_current_version === false) {
|
|
70
|
+
text += `\n\nOUTDATED: You are ${data.versions_behind ?? '?'} version(s) behind.`;
|
|
71
|
+
if (data.current_hash)
|
|
72
|
+
text += ` Current hash: ${data.current_hash.slice(0, 16)}...`;
|
|
73
|
+
text += '\nConsider updating to the latest version.';
|
|
74
|
+
}
|
|
75
|
+
else if (data.is_current_version === true) {
|
|
76
|
+
text += '\n\nThis is the latest version.';
|
|
77
|
+
}
|
|
41
78
|
if (data.threat_level === 'high' || data.threat_level === 'critical') {
|
|
42
79
|
text += `\n\nWARNING: This skill has been flagged. Do not install without explicit user confirmation.`;
|
|
43
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-entity.js","sourceRoot":"","sources":["../../../src/tools/check-entity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,MAAc,EAAE,WAAmB;IACpF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,0KAA0K,EAC1K;QACE,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACvF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;KACpG,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,IAAI,GAAW,CAAC;YAChB,QAAQ,WAAW,EAAE,CAAC;gBACpB,KAAK,OAAO;oBACV,GAAG,GAAG,GAAG,WAAW,aAAa,SAAS,EAAE,CAAC;oBAC7C,MAAM;gBACR,KAAK,OAAO;oBACV,GAAG,GAAG,GAAG,WAAW,aAAa,SAAS,EAAE,CAAC;oBAC7C,MAAM;gBACR,KAAK,QAAQ;oBACX,GAAG,GAAG,GAAG,WAAW,cAAc,kBAAkB,CAAC,SAAS,CAAC,SAAS,CAAC;oBACzE,MAAM;YACV,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAE9B,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBAChB,OAAO;wBACL,OAAO,EAAE,CAAC;gCACR,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"check-entity.js","sourceRoot":"","sources":["../../../src/tools/check-entity.ts"],"names":[],"mappings":"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"}
|
|
@@ -126,6 +126,20 @@ export function getFrictionReportTool(server, apiUrl) {
|
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
|
+
// Transport breakdown
|
|
130
|
+
if (data.by_transport && data.by_transport.length > 0) {
|
|
131
|
+
text += `\n── By Transport ──\n`;
|
|
132
|
+
for (const t of data.by_transport) {
|
|
133
|
+
text += ` ${t.transport}: ${t.interaction_count} calls, ${(t.total_duration_ms / 1000).toFixed(1)}s total\n`;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Source breakdown (server self-logs vs agent-initiated)
|
|
137
|
+
if (data.by_source && data.by_source.length > 0) {
|
|
138
|
+
text += `\n── By Source ──\n`;
|
|
139
|
+
for (const s of data.by_source) {
|
|
140
|
+
text += ` ${s.source}: ${s.interaction_count} interactions\n`;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
129
143
|
// Population comparison (paid tier)
|
|
130
144
|
if (data.population_comparison) {
|
|
131
145
|
text += `\n── Population ──\n`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-friction-report.js","sourceRoot":"","sources":["../../../src/tools/get-friction-report.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"get-friction-report.js","sourceRoot":"","sources":["../../../src/tools/get-friction-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,21 @@ export function getMyAgentTool(server) {
|
|
|
25
25
|
if (agent.operational_domain) {
|
|
26
26
|
text += `Domain: ${agent.operational_domain}\n`;
|
|
27
27
|
}
|
|
28
|
-
|
|
28
|
+
// Environment context
|
|
29
|
+
if (agent.platform || agent.device_class || agent.transport_type) {
|
|
30
|
+
text += `\nEnvironment:\n`;
|
|
31
|
+
if (agent.device_class)
|
|
32
|
+
text += ` Device: ${agent.device_class}\n`;
|
|
33
|
+
if (agent.platform)
|
|
34
|
+
text += ` Platform: ${agent.platform}\n`;
|
|
35
|
+
if (agent.arch)
|
|
36
|
+
text += ` Arch: ${agent.arch}\n`;
|
|
37
|
+
if (agent.client_type)
|
|
38
|
+
text += ` Client: ${agent.client_type}\n`;
|
|
39
|
+
if (agent.transport_type)
|
|
40
|
+
text += ` Transport: ${agent.transport_type}\n`;
|
|
41
|
+
}
|
|
42
|
+
text += `\nRegistered: ${agent.created_at}\n`;
|
|
29
43
|
text += `Last active: ${agent.last_active_at}\n`;
|
|
30
44
|
return { content: [{ type: 'text', text }] };
|
|
31
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-my-agent.js","sourceRoot":"","sources":["../../../src/tools/get-my-agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEpF,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,MAAM,CAAC,IAAI,CACT,cAAc,EACd,iIAAiI,EACjI,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,GAAG,UAAU,EAAE,IAAI,MAAM,gBAAgB,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,iBAAiB,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAE5E,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,0EAA0E;gBAC1E,IAAI,IAAI,GAAG,aAAa,EAAE,IAAI,CAAC;gBAC/B,IAAI,IAAI;oBAAE,IAAI,IAAI,SAAS,IAAI,IAAI,CAAC;gBACpC,IAAI,IAAI,uEAAuE,CAAC;gBAChF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACxD,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"get-my-agent.js","sourceRoot":"","sources":["../../../src/tools/get-my-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function getSkillVersionsTool(server, apiUrl, resolverUrl) {
|
|
3
|
+
server.tool('get_skill_versions', 'Get version history for a skill. Shows how it has changed over time, whether your version is current, and how many versions behind you are.', {
|
|
4
|
+
skill_hash: z.string().describe('The skill hash to look up version history for'),
|
|
5
|
+
}, async ({ skill_hash }) => {
|
|
6
|
+
try {
|
|
7
|
+
// First look up the skill via resolver to get catalog data
|
|
8
|
+
const skillRes = await fetch(`${resolverUrl}/v1/skill/${skill_hash}`);
|
|
9
|
+
const skillData = await skillRes.json();
|
|
10
|
+
if (!skillData.found) {
|
|
11
|
+
return {
|
|
12
|
+
content: [{
|
|
13
|
+
type: 'text',
|
|
14
|
+
text: `Skill hash ${skill_hash.slice(0, 16)}... not found in the network.`,
|
|
15
|
+
}],
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
let text = `Skill: ${skillData.skill_name ?? 'Unknown'}`;
|
|
19
|
+
if (skillData.skill_source)
|
|
20
|
+
text += ` (${skillData.skill_source})`;
|
|
21
|
+
text += '\n';
|
|
22
|
+
if (skillData.version)
|
|
23
|
+
text += `Version: ${skillData.version}\n`;
|
|
24
|
+
if (skillData.description)
|
|
25
|
+
text += `Description: ${skillData.description}\n`;
|
|
26
|
+
if (skillData.is_current_version === false) {
|
|
27
|
+
text += `\nOUTDATED: You are ${skillData.versions_behind ?? '?'} version(s) behind.`;
|
|
28
|
+
if (skillData.current_hash) {
|
|
29
|
+
text += `\nCurrent hash: ${skillData.current_hash.slice(0, 16)}...`;
|
|
30
|
+
}
|
|
31
|
+
text += '\nConsider updating to the latest version.';
|
|
32
|
+
}
|
|
33
|
+
else if (skillData.is_current_version === true) {
|
|
34
|
+
text += '\nYou have the latest version.';
|
|
35
|
+
}
|
|
36
|
+
// Try to get full version history from the catalog API
|
|
37
|
+
// We need the skill_id, which we can get by searching
|
|
38
|
+
if (skillData.skill_name) {
|
|
39
|
+
try {
|
|
40
|
+
const searchRes = await fetch(`${apiUrl}/api/v1/skill-catalog/search?q=${encodeURIComponent(skillData.skill_name)}&limit=1`);
|
|
41
|
+
const searchData = await searchRes.json();
|
|
42
|
+
if (searchData.skills.length > 0) {
|
|
43
|
+
const versionsRes = await fetch(`${apiUrl}/api/v1/skill-catalog/${searchData.skills[0].skill_id}/versions`);
|
|
44
|
+
const versionsData = await versionsRes.json();
|
|
45
|
+
if (versionsData.versions.length > 0) {
|
|
46
|
+
text += '\n\nVersion History:';
|
|
47
|
+
for (const v of versionsData.versions) {
|
|
48
|
+
const isCurrent = v.skill_hash === skill_hash ? ' ← YOU' : '';
|
|
49
|
+
const threat = v.threat_level && v.threat_level !== 'none'
|
|
50
|
+
? ` [${v.threat_level.toUpperCase()}]`
|
|
51
|
+
: '';
|
|
52
|
+
const ver = v.version ? `v${v.version}` : v.skill_hash.slice(0, 12);
|
|
53
|
+
const date = v.detected_at.split('T')[0];
|
|
54
|
+
text += `\n ${date} | ${ver} (${v.change_type})${threat}${isCurrent}`;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Version history is optional enrichment
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return { content: [{ type: 'text', text }] };
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
67
|
+
return { content: [{ type: 'text', text: `Version lookup error: ${msg}` }] };
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=get-skill-versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-skill-versions.js","sourceRoot":"","sources":["../../../src/tools/get-skill-versions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { ensureRegistered, getAgentId } from '../state.js';
|
|
3
|
+
import { defaultSession } from '../session-state.js';
|
|
3
4
|
function inferSystemType(systemId) {
|
|
4
5
|
const prefix = systemId.split(':')[0];
|
|
5
6
|
const map = {
|
|
@@ -50,16 +51,29 @@ export function logInteractionTool(server, apiUrl) {
|
|
|
50
51
|
flagged: params.anomaly_flagged,
|
|
51
52
|
detail: params.anomaly_detail,
|
|
52
53
|
},
|
|
54
|
+
transport_type: defaultSession.transportType,
|
|
55
|
+
source: 'agent',
|
|
53
56
|
}),
|
|
54
57
|
});
|
|
55
58
|
const data = await res.json();
|
|
56
59
|
if (!res.ok) {
|
|
57
60
|
return { content: [{ type: 'text', text: `Failed to log: ${JSON.stringify(data)}` }] };
|
|
58
61
|
}
|
|
62
|
+
let text = `Logged ${data.accepted} receipt(s). IDs: ${data.receipt_ids.join(', ')}`;
|
|
63
|
+
// Surface threat warnings from receipt response
|
|
64
|
+
if (data.threat_warnings && Array.isArray(data.threat_warnings) && data.threat_warnings.length > 0) {
|
|
65
|
+
text += '\n\nWARNING — Threat alerts for targets in this interaction:';
|
|
66
|
+
for (const w of data.threat_warnings) {
|
|
67
|
+
text += `\n ${w.target}: ${w.threat_level.toUpperCase()}`;
|
|
68
|
+
if (w.skill_name)
|
|
69
|
+
text += ` (${w.skill_name})`;
|
|
70
|
+
}
|
|
71
|
+
text += '\n\nExercise caution with flagged skills. Check with the user before continuing.';
|
|
72
|
+
}
|
|
59
73
|
return {
|
|
60
74
|
content: [{
|
|
61
75
|
type: 'text',
|
|
62
|
-
text
|
|
76
|
+
text,
|
|
63
77
|
}],
|
|
64
78
|
};
|
|
65
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-interaction.js","sourceRoot":"","sources":["../../../src/tools/log-interaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"log-interaction.js","sourceRoot":"","sources":["../../../src/tools/log-interaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function searchSkillsTool(server, apiUrl) {
|
|
3
|
+
server.tool('search_skills', 'Search the ACR skill catalog by name, description, or capability. Returns matching skills with threat status, version info, and descriptions. Use this to discover skills before installing them.', {
|
|
4
|
+
query: z.string().min(1).max(200).describe('Search text (skill name, keyword, or capability)'),
|
|
5
|
+
source: z.string().optional().describe('Filter by source (clawhub, github, npm)'),
|
|
6
|
+
category: z.string().optional().describe('Filter by category'),
|
|
7
|
+
threat_level: z.enum(['none', 'low', 'medium', 'high', 'critical']).optional().describe('Filter by threat level'),
|
|
8
|
+
limit: z.number().min(1).max(50).optional().default(10).describe('Max results to return'),
|
|
9
|
+
}, async ({ query: searchQuery, source, category, threat_level, limit }) => {
|
|
10
|
+
try {
|
|
11
|
+
const params = new URLSearchParams({ q: searchQuery });
|
|
12
|
+
if (source)
|
|
13
|
+
params.set('source', source);
|
|
14
|
+
if (category)
|
|
15
|
+
params.set('category', category);
|
|
16
|
+
if (threat_level)
|
|
17
|
+
params.set('threat_level', threat_level);
|
|
18
|
+
if (limit)
|
|
19
|
+
params.set('limit', String(limit));
|
|
20
|
+
const res = await fetch(`${apiUrl}/api/v1/skill-catalog/search?${params}`);
|
|
21
|
+
const data = await res.json();
|
|
22
|
+
if (data.skills.length === 0) {
|
|
23
|
+
return {
|
|
24
|
+
content: [{
|
|
25
|
+
type: 'text',
|
|
26
|
+
text: `No skills found matching "${searchQuery}".`,
|
|
27
|
+
}],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
let text = `Found ${data.total} skill(s) matching "${searchQuery}":\n`;
|
|
31
|
+
for (const skill of data.skills) {
|
|
32
|
+
const threat = skill.threat_level && skill.threat_level !== 'none'
|
|
33
|
+
? ` [${skill.threat_level.toUpperCase()}]`
|
|
34
|
+
: '';
|
|
35
|
+
const agents = skill.agent_count != null ? ` | ${skill.agent_count} agents` : '';
|
|
36
|
+
const ver = skill.version ? ` v${skill.version}` : '';
|
|
37
|
+
text += `\n ${skill.skill_name}${ver} (${skill.skill_source})${threat}${agents}`;
|
|
38
|
+
if (skill.description)
|
|
39
|
+
text += `\n ${skill.description}`;
|
|
40
|
+
if (skill.category)
|
|
41
|
+
text += `\n Category: ${skill.category}`;
|
|
42
|
+
if (skill.tags.length > 0)
|
|
43
|
+
text += `\n Tags: ${skill.tags.join(', ')}`;
|
|
44
|
+
if (skill.current_hash)
|
|
45
|
+
text += `\n Hash: ${skill.current_hash.slice(0, 16)}...`;
|
|
46
|
+
text += '\n';
|
|
47
|
+
}
|
|
48
|
+
if (data.total > data.skills.length) {
|
|
49
|
+
text += `\n... and ${data.total - data.skills.length} more. Increase limit to see more.`;
|
|
50
|
+
}
|
|
51
|
+
return { content: [{ type: 'text', text }] };
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
55
|
+
return { content: [{ type: 'text', text: `Search error: ${msg}` }] };
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=search-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-skills.js","sourceRoot":"","sources":["../../../src/tools/search-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function updateCompositionTool(server, apiUrl, getSession) {
|
|
3
|
+
server.tool('update_composition', 'Update your agent skill composition without re-registering. Use this after installing or removing skills to keep your composition current. Preserves your agent identity.', {
|
|
4
|
+
agent_id: z.string().optional().describe('Your agent ID (uses current session agent if omitted)'),
|
|
5
|
+
composition: z.object({
|
|
6
|
+
skills: z.array(z.string()).optional().describe('Skill names'),
|
|
7
|
+
skill_hashes: z.array(z.string()).optional().describe('SHA-256 hashes of each SKILL.md content'),
|
|
8
|
+
mcps: z.array(z.string()).optional().describe('MCP server names'),
|
|
9
|
+
tools: z.array(z.string()).optional().describe('Tool names'),
|
|
10
|
+
}).describe('Your current skill/tool composition'),
|
|
11
|
+
}, async ({ agent_id, composition }) => {
|
|
12
|
+
try {
|
|
13
|
+
const resolvedAgentId = agent_id ?? getSession().agentId;
|
|
14
|
+
if (!resolvedAgentId) {
|
|
15
|
+
return {
|
|
16
|
+
content: [{
|
|
17
|
+
type: 'text',
|
|
18
|
+
text: 'No agent ID available. Either provide agent_id or register first.',
|
|
19
|
+
}],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const res = await fetch(`${apiUrl}/api/v1/composition/update`, {
|
|
23
|
+
method: 'POST',
|
|
24
|
+
headers: { 'Content-Type': 'application/json' },
|
|
25
|
+
body: JSON.stringify({
|
|
26
|
+
agent_id: resolvedAgentId,
|
|
27
|
+
composition,
|
|
28
|
+
}),
|
|
29
|
+
});
|
|
30
|
+
const data = await res.json();
|
|
31
|
+
if (!res.ok) {
|
|
32
|
+
return {
|
|
33
|
+
content: [{
|
|
34
|
+
type: 'text',
|
|
35
|
+
text: `Composition update failed: ${data.error?.message ?? `HTTP ${res.status}`}`,
|
|
36
|
+
}],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const skillCount = (composition.skills?.length ?? 0) + (composition.skill_hashes?.length ?? 0);
|
|
40
|
+
const toolCount = (composition.mcps?.length ?? 0) + (composition.tools?.length ?? 0);
|
|
41
|
+
return {
|
|
42
|
+
content: [{
|
|
43
|
+
type: 'text',
|
|
44
|
+
text: `Composition updated successfully.\n\nComposition hash: ${data.composition_hash}\nSkills: ${skillCount}\nTools/MCPs: ${toolCount}\n\nYour agent identity (${resolvedAgentId}) is preserved.`,
|
|
45
|
+
}],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
50
|
+
return { content: [{ type: 'text', text: `Composition update error: ${msg}` }] };
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=update-composition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-composition.js","sourceRoot":"","sources":["../../../src/tools/update-composition.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tethral/acr-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "MCP server for the ACR (Agent Composition Records) network.
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "MCP server for the ACR (Agent Composition Records) network. Search skills, check threats, log interactions, track versions, get friction reports.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
7
7
|
"types": "dist/src/index.d.ts",
|
|
8
8
|
"bin": {
|
|
9
|
-
"acr-mcp": "dist/src/index.js"
|
|
9
|
+
"acr-mcp": "dist/src/index.js",
|
|
10
|
+
"acr-mcp-http": "dist/src/http.js"
|
|
10
11
|
},
|
|
11
12
|
"scripts": {
|
|
12
13
|
"build": "tsc",
|
|
@@ -33,6 +34,6 @@
|
|
|
33
34
|
"files": ["dist", "README.md", "LICENSE"],
|
|
34
35
|
"publishConfig": {
|
|
35
36
|
"access": "public",
|
|
36
|
-
"provenance":
|
|
37
|
+
"provenance": false
|
|
37
38
|
}
|
|
38
39
|
}
|