@tethral/acr-mcp 0.1.0 → 0.2.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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @tethral/acr-mcp
2
2
 
3
- MCP server for the [ACR](https://acr.nfkey.ai) (Agent Composition Records) network. Check skills before installing, log interactions, and get friction reports showing what's costing your agent the most.
3
+ MCP server for the [ACR](https://acr.nfkey.ai) (Agent Composition Records) network. Observability for AI agents friction reports, threat detection, and network health.
4
4
 
5
5
  ## Quick Start
6
6
 
@@ -15,16 +15,29 @@ MCP server for the [ACR](https://acr.nfkey.ai) (Agent Composition Records) netwo
15
15
  }
16
16
  ```
17
17
 
18
- That's it. The server auto-registers your agent on first use.
18
+ That's it. Your agent auto-registers on first use and gets a human-readable name (e.g. `anthropic-amber-fox`).
19
+
20
+ ## How It Works
21
+
22
+ Once installed, the agent calls `log_interaction` after every external tool call, API request, or MCP interaction. This happens automatically — the tool description instructs the agent to do it. No user configuration needed.
23
+
24
+ Logged data powers:
25
+ - **Friction reports** — what's costing you the most time
26
+ - **Threat detection** — anomaly patterns across the agent population
27
+ - **Network health** — which systems are degraded or failing
19
28
 
20
29
  ## Tools
21
30
 
22
- | Tool | Description | Required Params |
23
- |------|-------------|----------------|
24
- | `log_interaction` | Log an external interaction | `target_system_id`, `category`, `status` |
31
+ | Tool | Purpose | Params |
32
+ |------|---------|--------|
33
+ | `log_interaction` | Log every external call (called automatically) | `target_system_id`, `category`, `status` |
34
+ | `get_friction_report` | See what's costing you the most | (none) |
35
+ | `get_interaction_log` | View raw interaction history | `mode` (list/detail), filters |
36
+ | `get_network_status` | Network dashboard — systems, threats, escalations | (none) |
37
+ | `get_skill_tracker` | Skill adoption and threat tracking | `skill_hash` for deep-dive |
38
+ | `get_my_agent` | Your agent identity | (none) |
25
39
  | `check_entity` | Check if a skill/agent/system is known | `entity_type`, `entity_id` |
26
- | `get_friction_report` | See what's costing you the most | (none — uses auto-assigned ID) |
27
- | `check_environment` | Get network threat overview | (none) |
40
+ | `check_environment` | Quick threat check | (none) |
28
41
  | `register_agent` | Custom registration (optional) | `public_key`, `provider_class` |
29
42
 
30
43
  ## Configuration
package/dist/src/index.js CHANGED
@@ -6,17 +6,26 @@ import { logInteractionTool } from './tools/log-interaction.js';
6
6
  import { checkEntityTool } from './tools/check-entity.js';
7
7
  import { checkEnvironmentTool } from './tools/check-environment.js';
8
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';
9
13
  const ACR_API_URL = process.env.ACR_API_URL ?? 'https://acr.nfkey.ai';
10
14
  const ACR_RESOLVER_URL = process.env.ACR_RESOLVER_URL ?? ACR_API_URL;
11
15
  const server = new McpServer({
12
16
  name: 'acr-agent-registry',
13
- version: '0.1.0',
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.',
14
19
  });
15
20
  registerAgentTool(server, ACR_API_URL);
16
21
  logInteractionTool(server, ACR_API_URL);
17
22
  checkEntityTool(server, ACR_API_URL, ACR_RESOLVER_URL);
18
23
  checkEnvironmentTool(server, ACR_API_URL, ACR_RESOLVER_URL);
19
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);
20
29
  async function main() {
21
30
  const transport = new StdioServerTransport();
22
31
  await server.connect(transport);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,sBAAsB,CAAC;AACtE,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,WAAW,CAAC;AAErE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACvC,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACxC,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;AACvD,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;AAC5D,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,sBAAsB,CAAC;AACtE,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,WAAW,CAAC;AAErE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,kPAAkP;CAChQ,CAAC,CAAC;AAEH,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACvC,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACxC,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;AACvD,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;AAC5D,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC3C,cAAc,CAAC,MAAM,CAAC,CAAC;AACvB,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC3C,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC1C,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEzC,KAAK,UAAU,IAAI;IACjB,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"}
@@ -1,5 +1,8 @@
1
+ export declare function getApiUrl(): string;
1
2
  export declare function getAgentId(): string | null;
3
+ export declare function getAgentName(): string | null;
2
4
  export declare function setAgentId(id: string): void;
5
+ export declare function setAgentName(name: string): void;
3
6
  /**
4
7
  * Ensure the agent is registered. Called before any tool that needs an agent_id.
5
8
  * If not registered, auto-registers with a pseudo_ ID.
package/dist/src/state.js CHANGED
@@ -4,14 +4,24 @@
4
4
  */
5
5
  import { randomBytes } from 'node:crypto';
6
6
  let agentId = null;
7
+ let agentName = null;
7
8
  let registering = false;
8
9
  const ACR_API_URL = process.env.ACR_API_URL ?? 'https://acr.nfkey.ai';
10
+ export function getApiUrl() {
11
+ return ACR_API_URL;
12
+ }
9
13
  export function getAgentId() {
10
14
  return agentId;
11
15
  }
16
+ export function getAgentName() {
17
+ return agentName;
18
+ }
12
19
  export function setAgentId(id) {
13
20
  agentId = id;
14
21
  }
22
+ export function setAgentName(name) {
23
+ agentName = name;
24
+ }
15
25
  /**
16
26
  * Ensure the agent is registered. Called before any tool that needs an agent_id.
17
27
  * If not registered, auto-registers with a pseudo_ ID.
@@ -40,6 +50,7 @@ export async function ensureRegistered() {
40
50
  if (res.ok) {
41
51
  const data = await res.json();
42
52
  agentId = data.agent_id;
53
+ agentName = data.name;
43
54
  return agentId;
44
55
  }
45
56
  // Registration failed — use pseudo ID locally
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,IAAI,OAAO,GAAkB,IAAI,CAAC;AAClC,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,sBAAsB,CAAC;AAEtE,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,OAAO,GAAG,EAAE,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,WAAW,EAAE,CAAC;QAChB,qDAAqD;QACrD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9C,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;IAC9B,CAAC;IAED,WAAW,GAAG,IAAI,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,UAAU,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAE9D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,kBAAkB,EAAE;YACxD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,UAAU,EAAE,SAAS;gBACrB,cAAc,EAAE,SAAS;aAC1B,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA0B,CAAC;YACtD,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;YACxB,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,8CAA8C;QAC9C,OAAO,GAAG,UAAU,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,OAAO,OAAO,CAAC;IACjB,CAAC;YAAS,CAAC;QACT,WAAW,GAAG,KAAK,CAAC;IACtB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,IAAI,OAAO,GAAkB,IAAI,CAAC;AAClC,IAAI,SAAS,GAAkB,IAAI,CAAC;AACpC,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,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,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,OAAO,GAAG,EAAE,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,WAAW,EAAE,CAAC;QAChB,qDAAqD;QACrD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9C,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;IAC9B,CAAC;IAED,WAAW,GAAG,IAAI,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,UAAU,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAE9D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,kBAAkB,EAAE;YACxD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,UAAU,EAAE,SAAS;gBACrB,cAAc,EAAE,SAAS;aAC1B,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAwC,CAAC;YACpE,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;YACxB,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;YACtB,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,8CAA8C;QAC9C,OAAO,GAAG,UAAU,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,OAAO,OAAO,CAAC;IACjB,CAAC;YAAS,CAAC;QACT,WAAW,GAAG,KAAK,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -1,5 +1,5 @@
1
1
  export function checkEnvironmentTool(server, apiUrl, resolverUrl) {
2
- server.tool('check_environment', 'Check the current ACR network environment: active threats and system health. Call on startup or when assessing risk.', {}, async () => {
2
+ server.tool('check_environment', 'Check the current ACR network environment: active threats and system health. Call on startup or when assessing risk. Remember to call log_interaction after every external tool call so ACR can detect threats and track friction.', {}, async () => {
3
3
  try {
4
4
  const [threatsRes, healthRes] = await Promise.all([
5
5
  fetch(`${resolverUrl}/v1/threats/active`),
@@ -1 +1 @@
1
- {"version":3,"file":"check-environment.js","sourceRoot":"","sources":["../../../src/tools/check-environment.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAc,EAAE,WAAmB;IACzF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,sHAAsH,EACtH,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChD,KAAK,CAAC,GAAG,WAAW,oBAAoB,CAAC;gBACzC,KAAK,CAAC,GAAG,MAAM,gBAAgB,CAAC;aACjC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YAEtC,IAAI,IAAI,GAAG,uBAAuB,MAAM,CAAC,MAAM,IAAI,SAAS,IAAI,CAAC;YAEjE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjD,IAAI,IAAI,qBAAqB,OAAO,CAAC,MAAM,IAAI,CAAC;gBAChD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,IAAI,IAAI,MAAM,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,oBAAoB,aAAa,CAAC;gBAC/I,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,+BAA+B,CAAC;YAC1C,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,4BAA4B,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"check-environment.js","sourceRoot":"","sources":["../../../src/tools/check-environment.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAc,EAAE,WAAmB;IACzF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,oOAAoO,EACpO,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChD,KAAK,CAAC,GAAG,WAAW,oBAAoB,CAAC;gBACzC,KAAK,CAAC,GAAG,MAAM,gBAAgB,CAAC;aACjC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YAEtC,IAAI,IAAI,GAAG,uBAAuB,MAAM,CAAC,MAAM,IAAI,SAAS,IAAI,CAAC;YAEjE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjD,IAAI,IAAI,qBAAqB,OAAO,CAAC,MAAM,IAAI,CAAC;gBAChD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,IAAI,IAAI,MAAM,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,oBAAoB,aAAa,CAAC;gBAC/I,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,+BAA+B,CAAC;YAC1C,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,4BAA4B,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,43 +1,137 @@
1
1
  import { z } from 'zod';
2
- import { ensureRegistered, getAgentId } from '../state.js';
2
+ import { ensureRegistered, getAgentId, getAgentName, getApiUrl } from '../state.js';
3
+ /**
4
+ * Resolve an agent name to an agent_id via the lookup endpoint.
5
+ */
6
+ async function resolveAgentId(nameOrId) {
7
+ if (nameOrId.startsWith('acr_') || nameOrId.startsWith('pseudo_')) {
8
+ return nameOrId;
9
+ }
10
+ const apiUrl = getApiUrl();
11
+ const res = await fetch(`${apiUrl}/api/v1/agent/${encodeURIComponent(nameOrId)}`);
12
+ if (!res.ok) {
13
+ throw new Error(`Agent "${nameOrId}" not found`);
14
+ }
15
+ const data = await res.json();
16
+ return data.agent_id;
17
+ }
3
18
  export function getFrictionReportTool(server, apiUrl) {
4
- server.tool('get_friction_report', "Get a friction analysis report showing what's costing this agent the most time and money. Shows which external systems are the biggest bottlenecks. This is a read-only query of your own data.", {
19
+ server.tool('get_friction_report', "Get a friction analysis report showing what's costing this agent the most time and money. Shows which external systems are the biggest bottlenecks. Data comes from log_interaction — if the report is empty, you need to start logging your external calls.", {
5
20
  agent_id: z.string().optional().describe('Your ACR agent ID (auto-assigned if omitted)'),
21
+ agent_name: z.string().optional().describe('Your agent name (alternative to agent_id). Use this if you know your name but not your ID.'),
6
22
  scope: z.enum(['session', 'day', 'week']).optional().default('day').describe('Time window for the report'),
7
- }, async ({ agent_id, scope }) => {
8
- const id = agent_id || getAgentId() || await ensureRegistered();
23
+ }, async ({ agent_id, agent_name, scope }) => {
24
+ let id;
25
+ try {
26
+ if (agent_name) {
27
+ id = await resolveAgentId(agent_name);
28
+ }
29
+ else {
30
+ id = agent_id || getAgentId() || await ensureRegistered();
31
+ }
32
+ }
33
+ catch (err) {
34
+ const msg = err instanceof Error ? err.message : 'Unknown error';
35
+ return { content: [{ type: 'text', text: `Error: ${msg}` }] };
36
+ }
9
37
  try {
10
38
  const res = await fetch(`${apiUrl}/api/v1/agent/${id}/friction?scope=${scope}`);
39
+ if (!res.ok) {
40
+ const errText = await res.text().catch(() => `HTTP ${res.status}`);
41
+ return { content: [{ type: 'text', text: `Friction report error: ${errText}` }] };
42
+ }
11
43
  const data = await res.json();
12
44
  if (data.error) {
13
45
  return { content: [{ type: 'text', text: `Error: ${data.error.message}` }] };
14
46
  }
15
47
  const s = data.summary;
48
+ const displayName = data.name || agent_name || getAgentName() || id;
16
49
  if (s.total_interactions === 0) {
17
50
  return {
18
51
  content: [{
19
52
  type: 'text',
20
- text: `No interactions recorded for scope "${scope}". Start logging interactions to see friction data.`,
53
+ text: `No interactions recorded for ${displayName} (scope "${scope}"). Call log_interaction after each external tool call or API request to populate your friction data.`,
21
54
  }],
22
55
  };
23
56
  }
24
- let text = `Friction Report (${scope})\n`;
25
- text += `Period: ${data.period_start} to ${data.period_end}\n\n`;
26
- text += `Total interactions: ${s.total_interactions}\n`;
27
- text += `Total wait time: ${(s.total_wait_time_ms / 1000).toFixed(1)}s\n`;
28
- text += `Friction: ${s.friction_percentage.toFixed(2)}% of active time spent waiting\n`;
29
- text += `Failures: ${s.total_failures} (${(s.failure_rate * 100).toFixed(1)}% failure rate)\n`;
57
+ let text = `Friction Report for ${displayName} (${scope})\n`;
58
+ text += `Agent ID: ${data.agent_id}\n`;
59
+ text += `Period: ${data.period_start} to ${data.period_end}\n`;
60
+ text += `Tier: ${data.tier || 'free'}\n\n`;
61
+ // Summary metrics
62
+ text += `── Summary ──\n`;
63
+ text += ` Interactions: ${s.total_interactions}\n`;
64
+ text += ` Total wait: ${(s.total_wait_time_ms / 1000).toFixed(1)}s\n`;
65
+ text += ` Friction: ${s.friction_percentage.toFixed(2)}% of active time\n`;
66
+ text += ` Failures: ${s.total_failures} (${(s.failure_rate * 100).toFixed(1)}% rate)\n`;
67
+ // Category breakdown
68
+ if (data.by_category && data.by_category.length > 0) {
69
+ text += `\n── By Category ──\n`;
70
+ for (const cat of data.by_category) {
71
+ const avgMs = cat.interaction_count > 0 ? Math.round(cat.total_duration_ms / cat.interaction_count) : 0;
72
+ text += ` ${cat.category}: ${cat.interaction_count} calls, ${(cat.total_duration_ms / 1000).toFixed(1)}s total, avg ${avgMs}ms`;
73
+ if (cat.failure_count > 0)
74
+ text += `, ${cat.failure_count} failures`;
75
+ text += `\n`;
76
+ }
77
+ }
78
+ // Top targets with full metrics
30
79
  if (data.top_targets && data.top_targets.length > 0) {
31
- text += `\nTop Bottlenecks:\n`;
80
+ text += `\n── Top Targets ──\n`;
32
81
  for (const t of data.top_targets) {
33
82
  const pct = (t.proportion_of_total * 100).toFixed(1);
34
- text += `\n ${t.target_system_id}\n`;
35
- text += ` ${pct}% of wait time | ${t.interaction_count} calls | median ${t.median_duration_ms}ms\n`;
36
- if (t.failure_count > 0) {
83
+ text += `\n ${t.target_system_id} (${t.target_system_type})\n`;
84
+ text += ` ${t.interaction_count} calls | ${pct}% of wait time\n`;
85
+ text += ` median ${t.median_duration_ms}ms`;
86
+ if (t.p95_duration_ms != null)
87
+ text += ` | p95 ${t.p95_duration_ms}ms`;
88
+ text += `\n`;
89
+ // Status breakdown
90
+ if (t.status_breakdown) {
91
+ const statuses = Object.entries(t.status_breakdown)
92
+ .map(([s, c]) => `${s}: ${c}`)
93
+ .join(', ');
94
+ text += ` statuses: ${statuses}\n`;
95
+ }
96
+ // Baseline comparison (paid tier)
97
+ if (t.vs_baseline != null) {
98
+ const dir = t.vs_baseline > 1 ? 'slower' : t.vs_baseline < 1 ? 'faster' : 'same as';
99
+ const pctDiff = Math.abs(Math.round((t.vs_baseline - 1) * 100));
100
+ text += ` vs population: ${pctDiff}% ${dir} baseline`;
101
+ if (t.baseline_median_ms != null)
102
+ text += ` (baseline median ${t.baseline_median_ms}ms, p95 ${t.baseline_p95_ms}ms)`;
103
+ if (t.volatility != null)
104
+ text += `, volatility ${t.volatility}`;
105
+ text += `\n`;
106
+ }
107
+ // Recent anomalies
108
+ if (t.recent_anomalies && t.recent_anomalies.length > 0) {
109
+ text += ` recent anomalies:\n`;
110
+ for (const a of t.recent_anomalies) {
111
+ text += ` [${a.timestamp}] ${a.category || 'unknown'}`;
112
+ if (a.detail)
113
+ text += ` — ${a.detail}`;
114
+ text += `\n`;
115
+ }
116
+ }
117
+ if (t.failure_count > 0 && !t.recent_anomalies?.length) {
37
118
  text += ` ${t.failure_count} failures\n`;
38
119
  }
120
+ // Network health context
121
+ if (t.network_health_status) {
122
+ text += ` network: ${t.network_health_status.toUpperCase()}`;
123
+ text += ` — failure ${((t.network_failure_rate ?? 0) * 100).toFixed(1)}%`;
124
+ text += `, anomaly ${((t.network_anomaly_rate ?? 0) * 100).toFixed(1)}%`;
125
+ text += ` across ${t.network_agent_count ?? 0} agents\n`;
126
+ }
39
127
  }
40
128
  }
129
+ // Population comparison (paid tier)
130
+ if (data.population_comparison) {
131
+ text += `\n── Population ──\n`;
132
+ text += ` ${data.population_comparison.total_agents_in_period} agents active in period\n`;
133
+ text += ` ${data.population_comparison.baselines_available} baselines available\n`;
134
+ }
41
135
  return { content: [{ type: 'text', text }] };
42
136
  }
43
137
  catch (err) {
@@ -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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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function getInteractionLogTool(server: McpServer, apiUrl: string): void;
@@ -0,0 +1,202 @@
1
+ import { z } from 'zod';
2
+ import { ensureRegistered, getAgentId, getAgentName } from '../state.js';
3
+ const STATUS_TRANSLATIONS = {
4
+ success: 'success',
5
+ failure: 'failure — target returned an error',
6
+ timeout: 'timeout — target did not respond in time',
7
+ partial: 'partial — incomplete response received',
8
+ };
9
+ const ANOMALY_TRANSLATIONS = {
10
+ unexpected_behavior: 'unexpected behavior from target',
11
+ data_exfiltration: 'suspected data exfiltration attempt',
12
+ prompt_injection: 'suspicious content detected in response',
13
+ malformed_output: 'malformed or invalid response format',
14
+ excessive_latency: 'target responding slower than expected',
15
+ unauthorized_access: 'unauthorized access attempt detected',
16
+ other: 'other anomaly',
17
+ };
18
+ async function resolveId(agentName, agentId, apiUrl) {
19
+ if (agentName) {
20
+ if (agentName.startsWith('acr_') || agentName.startsWith('pseudo_'))
21
+ return agentName;
22
+ const res = await fetch(`${apiUrl}/api/v1/agent/${encodeURIComponent(agentName)}`);
23
+ if (!res.ok)
24
+ throw new Error(`Agent "${agentName}" not found`);
25
+ const data = await res.json();
26
+ return data.agent_id;
27
+ }
28
+ return agentId || getAgentId() || await ensureRegistered();
29
+ }
30
+ export function getInteractionLogTool(server, apiUrl) {
31
+ server.tool('get_interaction_log', 'View your interaction history. Use mode "list" for a scannable log, or "detail" (or provide receipt_id) for a full technical readout of a single interaction with network context.', {
32
+ agent_id: z.string().optional().describe('Your ACR agent ID'),
33
+ agent_name: z.string().optional().describe('Your agent name (alternative to agent_id)'),
34
+ receipt_id: z.string().optional().describe('Specific receipt ID for detail view'),
35
+ mode: z.enum(['list', 'detail']).optional().default('list').describe('Display mode: "list" for scannable log, "detail" for full readout'),
36
+ limit: z.number().min(1).max(200).optional().default(20).describe('Max interactions to show'),
37
+ target: z.string().optional().describe('Filter by target system (e.g. "mcp:github")'),
38
+ category: z.string().optional().describe('Filter by category (tool_call, delegation, etc.)'),
39
+ status: z.string().optional().describe('Filter by status (success, failure, timeout, partial)'),
40
+ anomaly_only: z.boolean().optional().default(false).describe('Show only anomaly-flagged interactions'),
41
+ since: z.string().optional().describe('Show interactions after this ISO timestamp'),
42
+ }, async ({ agent_id, agent_name, receipt_id, mode, limit, target, category, status, anomaly_only, since }) => {
43
+ let id;
44
+ try {
45
+ id = await resolveId(agent_name, agent_id, apiUrl);
46
+ }
47
+ catch (err) {
48
+ const msg = err instanceof Error ? err.message : 'Unknown error';
49
+ return { content: [{ type: 'text', text: `Error: ${msg}` }] };
50
+ }
51
+ try {
52
+ // Build query params
53
+ const params = new URLSearchParams();
54
+ if (receipt_id)
55
+ params.set('receipt_id', receipt_id);
56
+ if (limit)
57
+ params.set('limit', String(limit));
58
+ if (target)
59
+ params.set('target', target);
60
+ if (category)
61
+ params.set('category', category);
62
+ if (status)
63
+ params.set('status', status);
64
+ if (anomaly_only)
65
+ params.set('anomaly', 'true');
66
+ if (since)
67
+ params.set('since', since);
68
+ const res = await fetch(`${apiUrl}/api/v1/agent/${id}/receipts?${params}`);
69
+ if (!res.ok) {
70
+ const errText = await res.text().catch(() => `HTTP ${res.status}`);
71
+ return { content: [{ type: 'text', text: `Error: ${errText}` }] };
72
+ }
73
+ const data = await res.json();
74
+ if (data.error) {
75
+ return { content: [{ type: 'text', text: `Error: ${data.error.message}` }] };
76
+ }
77
+ const displayName = data.name || agent_name || getAgentName() || id;
78
+ // Detail mode — single receipt
79
+ if (receipt_id || mode === 'detail') {
80
+ if (data.receipt) {
81
+ return { content: [{ type: 'text', text: formatDetail(data, displayName) }] };
82
+ }
83
+ // If receipt_id was given but we got a list, show first item in detail
84
+ if (data.receipts && data.receipts.length > 0) {
85
+ return { content: [{ type: 'text', text: formatListDetailed(data.receipts.slice(0, 5), displayName) }] };
86
+ }
87
+ return { content: [{ type: 'text', text: `No interactions found for ${displayName}. Call log_interaction after each external tool call to start recording data.` }] };
88
+ }
89
+ // List mode
90
+ const receipts = data.receipts ?? [];
91
+ if (receipts.length === 0) {
92
+ return { content: [{ type: 'text', text: `No interactions found for ${displayName}. Call log_interaction after each external tool call to start recording data.` }] };
93
+ }
94
+ let text = `Interaction Log for ${displayName}\n`;
95
+ text += `Showing ${receipts.length} interaction${receipts.length === 1 ? '' : 's'}`;
96
+ if (data.next_cursor)
97
+ text += ' (more available)';
98
+ text += '\n\n';
99
+ for (const r of receipts) {
100
+ text += formatListLine(r);
101
+ }
102
+ if (data.next_cursor) {
103
+ text += `\n... more interactions available. Use since/target/category filters or cursor to paginate.`;
104
+ }
105
+ return { content: [{ type: 'text', text }] };
106
+ }
107
+ catch (err) {
108
+ const msg = err instanceof Error ? err.message : 'Unknown error';
109
+ return { content: [{ type: 'text', text: `Interaction log error: ${msg}` }] };
110
+ }
111
+ });
112
+ }
113
+ function formatListLine(r) {
114
+ let line = `[${r.created_at}] ${r.interaction_category} -> ${r.target_system_id} (${r.target_system_type})\n`;
115
+ line += ` ${r.duration_ms ?? '?'}ms | ${STATUS_TRANSLATIONS[r.status] ?? r.status}`;
116
+ if (r.anomaly_flagged) {
117
+ const cat = r.anomaly_category;
118
+ line += ` | ANOMALY: ${cat}`;
119
+ }
120
+ line += '\n';
121
+ if (r.anomaly_flagged && r.anomaly_detail) {
122
+ line += ` [reported] ${r.anomaly_detail}\n`;
123
+ }
124
+ return line + '\n';
125
+ }
126
+ function formatDetail(data, displayName) {
127
+ const r = data.receipt;
128
+ const ctx = data.network_context;
129
+ const baseline = data.baseline;
130
+ let text = `Receipt: ${r.receipt_id}\n`;
131
+ text += `${'='.repeat(40)}\n`;
132
+ text += `When: ${r.created_at}\n`;
133
+ text += `What: ${r.interaction_category} -> ${r.target_system_id} (${r.target_system_type})\n`;
134
+ // Duration with baseline context
135
+ const dur = r.duration_ms;
136
+ if (dur != null) {
137
+ text += `Duration: ${dur}ms`;
138
+ if (baseline) {
139
+ const bMedian = baseline.baseline_median_ms;
140
+ const bP95 = baseline.baseline_p95_ms;
141
+ if (bMedian > 0) {
142
+ const ratio = dur / bMedian;
143
+ if (ratio > 2) {
144
+ text += ` — ${ratio.toFixed(1)}x baseline median (${bMedian}ms), p95 ${bP95}ms`;
145
+ }
146
+ else {
147
+ text += ` — within normal range (baseline median ${bMedian}ms, p95 ${bP95}ms)`;
148
+ }
149
+ }
150
+ }
151
+ text += '\n';
152
+ }
153
+ text += `Status: ${STATUS_TRANSLATIONS[r.status] ?? r.status}\n`;
154
+ text += `\nAgent: ${displayName} (${r.emitter_agent_id})\n`;
155
+ if (r.emitter_provider_class)
156
+ text += `Provider: ${r.emitter_provider_class}\n`;
157
+ if (r.emitter_composition_hash)
158
+ text += `Composition: ${r.emitter_composition_hash}\n`;
159
+ if (r.anomaly_flagged) {
160
+ const cat = r.anomaly_category;
161
+ text += `\nAnomaly: ${cat} — ${ANOMALY_TRANSLATIONS[cat] ?? cat}\n`;
162
+ if (r.anomaly_detail) {
163
+ text += `[reported] ${r.anomaly_detail}\n`;
164
+ }
165
+ }
166
+ else {
167
+ text += `\nAnomaly: none\n`;
168
+ }
169
+ // Network context
170
+ if (ctx) {
171
+ text += `\n-- Network Context --\n`;
172
+ text += `${r.target_system_id} is ${ctx.health_status.toUpperCase()}`;
173
+ text += ` — failure ${(ctx.failure_rate * 100).toFixed(1)}%`;
174
+ text += `, anomaly ${(ctx.anomaly_rate * 100).toFixed(1)}%`;
175
+ text += ` across ${ctx.distinct_agent_count} agents\n`;
176
+ if (ctx.median_duration_ms != null) {
177
+ text += `Network median: ${ctx.median_duration_ms}ms`;
178
+ if (ctx.p95_duration_ms != null)
179
+ text += `, p95: ${ctx.p95_duration_ms}ms`;
180
+ text += '\n';
181
+ }
182
+ }
183
+ return text;
184
+ }
185
+ function formatListDetailed(receipts, displayName) {
186
+ let text = `Interaction Detail for ${displayName}\n${'='.repeat(40)}\n\n`;
187
+ for (const r of receipts) {
188
+ text += `[${r.created_at}] ${r.interaction_category} -> ${r.target_system_id}\n`;
189
+ text += ` ${r.duration_ms ?? '?'}ms | ${STATUS_TRANSLATIONS[r.status] ?? r.status}\n`;
190
+ if (r.emitter_composition_hash)
191
+ text += ` composition: ${r.emitter_composition_hash}\n`;
192
+ if (r.anomaly_flagged) {
193
+ text += ` ANOMALY: ${r.anomaly_category}`;
194
+ if (r.anomaly_detail)
195
+ text += ` — [reported] ${r.anomaly_detail}`;
196
+ text += '\n';
197
+ }
198
+ text += '\n';
199
+ }
200
+ return text;
201
+ }
202
+ //# sourceMappingURL=get-interaction-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-interaction-log.js","sourceRoot":"","sources":["../../../src/tools/get-interaction-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function getMyAgentTool(server: McpServer): void;
@@ -0,0 +1,38 @@
1
+ import { ensureRegistered, getAgentId, getAgentName, getApiUrl } from '../state.js';
2
+ export function getMyAgentTool(server) {
3
+ server.tool('get_my_agent', 'Get your agent profile — name, ID, provider, status, and registration date. Zero-config: uses the auto-assigned agent identity.', {}, async () => {
4
+ const id = getAgentId() || await ensureRegistered();
5
+ const name = getAgentName();
6
+ const apiUrl = getApiUrl();
7
+ try {
8
+ const res = await fetch(`${apiUrl}/api/v1/agent/${encodeURIComponent(id)}`);
9
+ if (!res.ok) {
10
+ // Fallback to local state if the API doesn't have the lookup endpoint yet
11
+ let text = `Agent ID: ${id}\n`;
12
+ if (name)
13
+ text += `Name: ${name}\n`;
14
+ text += `\n(Agent lookup endpoint not available — showing cached session data)`;
15
+ return { content: [{ type: 'text', text }] };
16
+ }
17
+ const agent = await res.json();
18
+ let text = '';
19
+ if (agent.name) {
20
+ text += `Name: ${agent.name}\n`;
21
+ }
22
+ text += `Agent ID: ${agent.agent_id}\n`;
23
+ text += `Provider: ${agent.provider_class}\n`;
24
+ text += `Status: ${agent.status}\n`;
25
+ if (agent.operational_domain) {
26
+ text += `Domain: ${agent.operational_domain}\n`;
27
+ }
28
+ text += `Registered: ${agent.created_at}\n`;
29
+ text += `Last active: ${agent.last_active_at}\n`;
30
+ return { content: [{ type: 'text', text }] };
31
+ }
32
+ catch (err) {
33
+ const msg = err instanceof Error ? err.message : 'Unknown error';
34
+ return { content: [{ type: 'text', text: `Error fetching agent profile: ${msg}` }] };
35
+ }
36
+ });
37
+ }
38
+ //# sourceMappingURL=get-my-agent.js.map
@@ -0,0 +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,EAQ3B,CAAC;YAEF,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,IAAI,IAAI,SAAS,KAAK,CAAC,IAAI,IAAI,CAAC;YAClC,CAAC;YACD,IAAI,IAAI,aAAa,KAAK,CAAC,QAAQ,IAAI,CAAC;YACxC,IAAI,IAAI,aAAa,KAAK,CAAC,cAAc,IAAI,CAAC;YAC9C,IAAI,IAAI,WAAW,KAAK,CAAC,MAAM,IAAI,CAAC;YACpC,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;gBAC7B,IAAI,IAAI,WAAW,KAAK,CAAC,kBAAkB,IAAI,CAAC;YAClD,CAAC;YACD,IAAI,IAAI,eAAe,KAAK,CAAC,UAAU,IAAI,CAAC;YAC5C,IAAI,IAAI,gBAAgB,KAAK,CAAC,cAAc,IAAI,CAAC;YAEjD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,iCAAiC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QAChG,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function getNetworkStatusTool(server: McpServer, apiUrl: string): void;
@@ -0,0 +1,82 @@
1
+ export function getNetworkStatusTool(server, apiUrl) {
2
+ server.tool('get_network_status', 'Get the full ACR network dashboard — agent/system totals, system health sorted worst-first, active skill threats, and recent cross-agent escalations. The COVID-tracker view for agent infrastructure.', {}, async () => {
3
+ try {
4
+ const res = await fetch(`${apiUrl}/api/v1/network/status`);
5
+ if (!res.ok) {
6
+ const errText = await res.text().catch(() => `HTTP ${res.status}`);
7
+ return { content: [{ type: 'text', text: `Network status error: ${errText}` }] };
8
+ }
9
+ const data = await res.json();
10
+ const t = data.totals ?? {};
11
+ let text = `ACR Network Dashboard\n${'='.repeat(30)}\n`;
12
+ if (data.stale) {
13
+ text += `\nDATA MAY BE STALE — background jobs may not have run recently.\n`;
14
+ }
15
+ // Totals
16
+ text += `\n-- Totals (24h) --\n`;
17
+ text += ` Active agents: ${t.active_agents ?? 0}`;
18
+ text += ` | Systems: ${t.active_systems ?? 0}`;
19
+ text += ` | Interactions: ${(t.interactions_24h ?? 0).toLocaleString()}\n`;
20
+ const anomalyPct = ((t.anomaly_rate_24h ?? 0) * 100).toFixed(1);
21
+ text += ` Anomaly rate: ${anomalyPct}%\n`;
22
+ // Systems
23
+ const systems = data.systems ?? [];
24
+ if (systems.length > 0) {
25
+ text += `\n-- Systems (${systems.length}, worst-first) --\n`;
26
+ for (const s of systems.slice(0, 20)) {
27
+ const badge = `[${(s.health_status ?? 'unknown').toUpperCase()}]`;
28
+ text += ` ${badge} ${s.system_id}`;
29
+ text += ` — ${s.agent_count ?? 0} agents`;
30
+ if (s.failure_rate > 0)
31
+ text += `, ${(s.failure_rate * 100).toFixed(1)}% failure`;
32
+ if (s.anomaly_rate > 0)
33
+ text += `, ${(s.anomaly_rate * 100).toFixed(1)}% anomaly`;
34
+ if (s.median_duration_ms != null)
35
+ text += `, ${s.median_duration_ms}ms median`;
36
+ text += '\n';
37
+ }
38
+ if (systems.length > 20) {
39
+ text += ` ... and ${systems.length - 20} more systems\n`;
40
+ }
41
+ }
42
+ else {
43
+ text += `\n-- Systems --\n No system health data available.\n`;
44
+ }
45
+ // Threats
46
+ const threats = data.threats ?? [];
47
+ if (threats.length > 0) {
48
+ text += `\n-- Active Threats (${threats.length}) --\n`;
49
+ for (const th of threats) {
50
+ text += ` [${th.threat_level.toUpperCase()}] ${th.skill_name || th.skill_hash.substring(0, 16) + '...'}`;
51
+ text += ` — ${th.anomaly_signal_count} signals, ${th.agent_count} agents`;
52
+ text += '\n';
53
+ }
54
+ }
55
+ else {
56
+ text += `\n-- Active Threats --\n No active threats detected.\n`;
57
+ }
58
+ // Escalations
59
+ const escalations = data.recent_escalations ?? [];
60
+ if (escalations.length > 0) {
61
+ text += `\n-- Recent Escalations (${escalations.length}) --\n`;
62
+ for (const e of escalations) {
63
+ text += ` ${e.target} — ${e.agents_affected} agents`;
64
+ if (e.providers_affected?.length > 0) {
65
+ text += `, ${e.providers_affected.length} providers [${e.providers_affected.join(', ')}]`;
66
+ }
67
+ text += '\n';
68
+ if (e.anomaly_categories?.length > 0) {
69
+ text += ` Categories: ${e.anomaly_categories.join(', ')}\n`;
70
+ }
71
+ text += ` Detected: ${e.detected_at}\n`;
72
+ }
73
+ }
74
+ return { content: [{ type: 'text', text }] };
75
+ }
76
+ catch (err) {
77
+ const msg = err instanceof Error ? err.message : 'Unknown error';
78
+ return { content: [{ type: 'text', text: `Network status error: ${msg}` }] };
79
+ }
80
+ });
81
+ }
82
+ //# sourceMappingURL=get-network-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-network-status.js","sourceRoot":"","sources":["../../../src/tools/get-network-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function getSkillTrackerTool(server: McpServer, apiUrl: string): void;
@@ -0,0 +1,91 @@
1
+ import { z } from 'zod';
2
+ export function getSkillTrackerTool(server, apiUrl) {
3
+ server.tool('get_skill_tracker', 'Track skill adoption, anomaly rates, and threat levels across the agent population. Use without skill_hash for an overview, or with skill_hash for a deep-dive with provider breakdown and cross-provider correlation data.', {
4
+ skill_hash: z.string().optional().describe('Specific skill hash for deep-dive view'),
5
+ threat_level: z.string().optional().describe('Filter by threat level (none, low, medium, high, critical)'),
6
+ sort: z.enum(['agent_count', 'interaction_count', 'anomaly_signal_rate', 'threat_level']).optional().default('agent_count').describe('Sort field'),
7
+ limit: z.number().min(1).max(100).optional().default(20).describe('Max skills to show'),
8
+ }, async ({ skill_hash, threat_level, sort, limit }) => {
9
+ try {
10
+ // Deep-dive mode
11
+ if (skill_hash) {
12
+ const res = await fetch(`${apiUrl}/api/v1/network/skills/${encodeURIComponent(skill_hash)}`);
13
+ if (!res.ok) {
14
+ const data = await res.json().catch(() => ({}));
15
+ return { content: [{ type: 'text', text: `Error: ${data.message ?? 'Skill not found'}` }] };
16
+ }
17
+ const skill = await res.json();
18
+ return { content: [{ type: 'text', text: formatSkillDetail(skill) }] };
19
+ }
20
+ // List mode
21
+ const params = new URLSearchParams();
22
+ if (threat_level)
23
+ params.set('threat_level', threat_level);
24
+ if (sort)
25
+ params.set('sort', sort);
26
+ if (limit)
27
+ params.set('limit', String(limit));
28
+ const res = await fetch(`${apiUrl}/api/v1/network/skills?${params}`);
29
+ if (!res.ok) {
30
+ const errText = await res.text().catch(() => `HTTP ${res.status}`);
31
+ return { content: [{ type: 'text', text: `Skill tracker error: ${errText}` }] };
32
+ }
33
+ const data = await res.json();
34
+ if (!data.skills || data.skills.length === 0) {
35
+ return { content: [{ type: 'text', text: 'No skills tracked yet.' }] };
36
+ }
37
+ let text = `Skill Tracker\n${'='.repeat(20)}\n\n`;
38
+ for (const s of data.skills) {
39
+ const threatBadge = s.threat_level !== 'none' ? ` — ${s.threat_level.toUpperCase()}` : '';
40
+ text += `${s.skill_name || s.skill_hash.substring(0, 16) + '...'}${threatBadge}\n`;
41
+ text += ` ${s.agent_count} agents | ${s.interaction_count} interactions`;
42
+ const sigRate = s.anomaly_signal_rate;
43
+ if (sigRate > 0) {
44
+ text += ` | ${s.anomaly_signal_count} anomaly signals (${(sigRate * 100).toFixed(2)}%)`;
45
+ }
46
+ text += '\n\n';
47
+ }
48
+ if (data.next_cursor) {
49
+ text += `... more skills available. Use filters or cursor to paginate.\n`;
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: `Skill tracker error: ${msg}` }] };
56
+ }
57
+ });
58
+ }
59
+ function formatSkillDetail(skill) {
60
+ let text = `Skill: ${skill.skill_name || skill.skill_hash}\n`;
61
+ text += `${'='.repeat(40)}\n`;
62
+ text += ` Hash: ${skill.skill_hash}\n`;
63
+ text += ` Threat level: ${skill.threat_level.toUpperCase()}\n`;
64
+ text += ` Adoption: ${skill.agent_count} agents | ${skill.interaction_count} interactions\n`;
65
+ const sigCount = skill.anomaly_signal_count;
66
+ const sigRate = skill.anomaly_signal_rate;
67
+ text += ` Anomaly rate: ${(sigRate * 100).toFixed(2)}% (${sigCount} signals)\n`;
68
+ text += ` First seen: ${skill.first_seen} | Last updated: ${skill.last_updated}\n`;
69
+ // Provider breakdown
70
+ const providers = skill.provider_breakdown;
71
+ if (providers && providers.length > 0) {
72
+ text += `\n By provider:\n`;
73
+ for (const p of providers) {
74
+ text += ` ${p.provider_class}: ${p.agent_count} agents\n`;
75
+ }
76
+ }
77
+ // Cross-provider anomaly data
78
+ const crossProvider = skill.cross_provider_anomalies;
79
+ if (crossProvider && crossProvider.length > 0) {
80
+ text += `\n Anomalies by provider (last 7d):\n`;
81
+ for (const cp of crossProvider) {
82
+ text += ` ${cp.provider}: ${cp.anomaly_count} anomalies\n`;
83
+ }
84
+ }
85
+ const correlated = skill.cross_provider_correlation;
86
+ if (correlated) {
87
+ text += `\n Cross-provider correlation: YES (${crossProvider?.length ?? 0} providers reporting anomalies)\n`;
88
+ }
89
+ return text;
90
+ }
91
+ //# sourceMappingURL=get-skill-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-skill-tracker.js","sourceRoot":"","sources":["../../../src/tools/get-skill-tracker.ts"],"names":[],"mappings":"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"}
@@ -8,18 +8,22 @@ function inferSystemType(systemId) {
8
8
  };
9
9
  return map[prefix ?? ''] ?? 'unknown';
10
10
  }
11
- const DATA_NOTICE = ' ACR collects interaction metadata (target names, timing, status) for threat detection and friction analysis. No request/response content is collected. Terms: https://acr.nfkey.ai/terms';
11
+ const TOOL_DESCRIPTION = `Log an interaction to the ACR network. You MUST call this after EVERY external tool call, API request, or MCP server interaction you make. This is how your friction report, threat detection, and performance data are populated without logging, those features return nothing.
12
+
13
+ How to use: After each external call completes, call log_interaction with the target (e.g. "mcp:github", "api:stripe.com"), the category, the outcome status, and how long it took. If something seemed off, set anomaly_flagged to true.
14
+
15
+ ACR collects interaction metadata only (target names, timing, status). No request/response content is collected. Terms: https://acr.nfkey.ai/terms`;
12
16
  export function logInteractionTool(server, apiUrl) {
13
- server.tool('log_interaction', 'Log an interaction receipt to the ACR network. Call after interacting with any external tool, API, or service.' + DATA_NOTICE, {
14
- target_system_id: z.string().describe('Target in type:name format (e.g., mcp:github, api:stripe.com)'),
17
+ server.tool('log_interaction', TOOL_DESCRIPTION, {
18
+ target_system_id: z.string().describe('Target in type:name format (e.g., mcp:github, api:stripe.com, mcp:filesystem)'),
15
19
  category: z.enum([
16
20
  'tool_call', 'delegation', 'data_exchange', 'skill_install',
17
21
  'commerce', 'research', 'code', 'communication',
18
- ]).describe('Interaction category'),
19
- status: z.enum(['success', 'failure', 'timeout', 'partial']).describe('Outcome'),
22
+ ]).describe('Interaction category. Use "tool_call" for MCP tool calls and API requests.'),
23
+ status: z.enum(['success', 'failure', 'timeout', 'partial']).describe('Outcome of the interaction'),
20
24
  duration_ms: z.number().nonnegative().optional().default(0).describe('Duration in ms (0 if unknown)'),
21
25
  agent_id: z.string().optional().describe('Your ACR agent ID (auto-assigned if omitted)'),
22
- anomaly_flagged: z.boolean().optional().default(false).describe('Set true if something seemed wrong'),
26
+ anomaly_flagged: z.boolean().optional().default(false).describe('Set true if something seemed wrong (unexpected behavior, suspicious output, excessive latency)'),
23
27
  anomaly_detail: z.string().max(500).optional().describe('What seemed wrong. DO NOT include credentials or API keys.'),
24
28
  }, async (params) => {
25
29
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"log-interaction.js","sourceRoot":"","sources":["../../../src/tools/log-interaction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"log-interaction.js","sourceRoot":"","sources":["../../../src/tools/log-interaction.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { setAgentId } from '../state.js';
2
+ import { setAgentId, setAgentName } from '../state.js';
3
3
  const DATA_NOTICE = ' ACR collects interaction metadata (target names, timing, status) for threat detection and friction analysis. No request/response content is collected. Terms: https://acr.nfkey.ai/terms';
4
4
  export function registerAgentTool(server, apiUrl) {
5
5
  server.tool('register_agent', 'Register an agent with the ACR network. Optional — agents are auto-registered on first tool call.' + DATA_NOTICE, {
@@ -8,10 +8,11 @@ export function registerAgentTool(server, apiUrl) {
8
8
  'anthropic', 'openai', 'google', 'openclaw', 'langchain',
9
9
  'crewai', 'autogen', 'custom', 'unknown',
10
10
  ]).describe('Agent provider/framework'),
11
+ name: z.string().max(64).optional().describe('Human-readable name for this agent (e.g. "my-dev-assistant"). Auto-generated if omitted.'),
11
12
  skills: z.array(z.string()).optional().describe('List of installed skill names'),
12
13
  skill_hashes: z.array(z.string()).optional().describe('SHA-256 hashes of installed SKILL.md files'),
13
14
  operational_domain: z.string().max(200).optional().describe('What domain this agent operates in'),
14
- }, async ({ public_key, provider_class, skills, skill_hashes, operational_domain }) => {
15
+ }, async ({ public_key, provider_class, name, skills, skill_hashes, operational_domain }) => {
15
16
  try {
16
17
  const res = await fetch(`${apiUrl}/api/v1/register`, {
17
18
  method: 'POST',
@@ -19,18 +20,22 @@ export function registerAgentTool(server, apiUrl) {
19
20
  body: JSON.stringify({
20
21
  public_key,
21
22
  provider_class,
23
+ name,
22
24
  composition: (skills || skill_hashes) ? { skills, skill_hashes } : undefined,
23
25
  operational_domain,
24
26
  }),
25
27
  });
26
- const data = await res.json();
27
28
  if (!res.ok) {
28
- return { content: [{ type: 'text', text: `Registration failed: ${JSON.stringify(data)}` }] };
29
+ const errText = await res.text().catch(() => `HTTP ${res.status}`);
30
+ return { content: [{ type: 'text', text: `Registration failed: ${errText}` }] };
29
31
  }
30
- // Store agent_id for auto-use in other tools
32
+ const data = await res.json();
33
+ // Store agent_id and name for auto-use in other tools
31
34
  setAgentId(data.agent_id);
35
+ if (data.name)
36
+ setAgentName(data.name);
32
37
  const briefing = data.environment_briefing;
33
- let text = `Registered successfully.\n\nAgent ID: ${data.agent_id}\nComposition Hash: ${data.composition_hash}\n`;
38
+ let text = `Registered successfully.\n\nName: ${data.name}\nAgent ID: ${data.agent_id}\nComposition Hash: ${data.composition_hash}\n`;
34
39
  if (briefing.connected_systems.length > 0) {
35
40
  text += `\nConnected Systems: ${briefing.connected_systems.length}`;
36
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"register-agent.js","sourceRoot":"","sources":["../../../src/tools/register-agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,GAAG,2LAA2L,CAAC;AAEhN,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,MAAc;IACjE,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,mGAAmG,GAAG,WAAW,EACjH;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,sDAAsD,CAAC;QAC/F,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC;YACrB,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW;YACxD,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS;SACzC,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACvC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAChF,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QACnG,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;KAClG,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,EAAE,EAAE;QACjF,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,kBAAkB,EAAE;gBACnD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,UAAU;oBACV,cAAc;oBACd,WAAW,EAAE,CAAC,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS;oBAC5E,kBAAkB;iBACnB,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAE9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,wBAAwB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACxG,CAAC;YAED,6CAA6C;YAC7C,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE1B,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC;YAC3C,IAAI,IAAI,GAAG,yCAAyC,IAAI,CAAC,QAAQ,uBAAuB,IAAI,CAAC,gBAAgB,IAAI,CAAC;YAElH,IAAI,QAAQ,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,IAAI,IAAI,wBAAwB,QAAQ,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;YACtE,CAAC;YACD,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvC,IAAI,IAAI,uBAAuB,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBAChE,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;oBACxC,IAAI,IAAI,QAAQ,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;gBACnE,CAAC;YACH,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,uBAAuB,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QACtF,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"register-agent.js","sourceRoot":"","sources":["../../../src/tools/register-agent.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tethral/acr-mcp",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "MCP server for the ACR (Agent Composition Records) network. Check skills, log interactions, get friction reports.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",