@tethral/acr-mcp 2.1.1 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/dist/http.mjs +0 -1
  2. package/dist/index.mjs +0 -1
  3. package/package.json +11 -11
  4. package/dist/http.mjs.map +0 -7
  5. package/dist/index.mjs.map +0 -7
  6. package/dist/src/acr-state-file.d.ts +0 -6
  7. package/dist/src/acr-state-file.js +0 -32
  8. package/dist/src/acr-state-file.js.map +0 -1
  9. package/dist/src/env-detect.d.ts +0 -25
  10. package/dist/src/env-detect.js +0 -52
  11. package/dist/src/env-detect.js.map +0 -1
  12. package/dist/src/http.d.ts +0 -2
  13. package/dist/src/http.js +0 -112
  14. package/dist/src/http.js.map +0 -1
  15. package/dist/src/index.d.ts +0 -2
  16. package/dist/src/index.js +0 -17
  17. package/dist/src/index.js.map +0 -1
  18. package/dist/src/middleware/correlation-window.d.ts +0 -68
  19. package/dist/src/middleware/correlation-window.js +0 -113
  20. package/dist/src/middleware/correlation-window.js.map +0 -1
  21. package/dist/src/middleware/self-log.d.ts +0 -22
  22. package/dist/src/middleware/self-log.js +0 -72
  23. package/dist/src/middleware/self-log.js.map +0 -1
  24. package/dist/src/server.d.ts +0 -17
  25. package/dist/src/server.js +0 -96
  26. package/dist/src/server.js.map +0 -1
  27. package/dist/src/session-state.d.ts +0 -29
  28. package/dist/src/session-state.js +0 -102
  29. package/dist/src/session-state.js.map +0 -1
  30. package/dist/src/state.d.ts +0 -10
  31. package/dist/src/state.js +0 -39
  32. package/dist/src/state.js.map +0 -1
  33. package/dist/src/strip-sub-components.d.ts +0 -7
  34. package/dist/src/strip-sub-components.js +0 -15
  35. package/dist/src/strip-sub-components.js.map +0 -1
  36. package/dist/src/tools/acknowledge-threat.d.ts +0 -3
  37. package/dist/src/tools/acknowledge-threat.js +0 -38
  38. package/dist/src/tools/acknowledge-threat.js.map +0 -1
  39. package/dist/src/tools/check-entity.d.ts +0 -2
  40. package/dist/src/tools/check-entity.js +0 -144
  41. package/dist/src/tools/check-entity.js.map +0 -1
  42. package/dist/src/tools/check-environment.d.ts +0 -2
  43. package/dist/src/tools/check-environment.js +0 -32
  44. package/dist/src/tools/check-environment.js.map +0 -1
  45. package/dist/src/tools/disable-deep-composition.d.ts +0 -20
  46. package/dist/src/tools/disable-deep-composition.js +0 -45
  47. package/dist/src/tools/disable-deep-composition.js.map +0 -1
  48. package/dist/src/tools/get-coverage.d.ts +0 -2
  49. package/dist/src/tools/get-coverage.js +0 -67
  50. package/dist/src/tools/get-coverage.js.map +0 -1
  51. package/dist/src/tools/get-failure-registry.d.ts +0 -2
  52. package/dist/src/tools/get-failure-registry.js +0 -75
  53. package/dist/src/tools/get-failure-registry.js.map +0 -1
  54. package/dist/src/tools/get-friction-report.d.ts +0 -2
  55. package/dist/src/tools/get-friction-report.js +0 -208
  56. package/dist/src/tools/get-friction-report.js.map +0 -1
  57. package/dist/src/tools/get-interaction-log.d.ts +0 -2
  58. package/dist/src/tools/get-interaction-log.js +0 -199
  59. package/dist/src/tools/get-interaction-log.js.map +0 -1
  60. package/dist/src/tools/get-my-agent.d.ts +0 -2
  61. package/dist/src/tools/get-my-agent.js +0 -36
  62. package/dist/src/tools/get-my-agent.js.map +0 -1
  63. package/dist/src/tools/get-network-status.d.ts +0 -2
  64. package/dist/src/tools/get-network-status.js +0 -85
  65. package/dist/src/tools/get-network-status.js.map +0 -1
  66. package/dist/src/tools/get-notifications.d.ts +0 -3
  67. package/dist/src/tools/get-notifications.js +0 -34
  68. package/dist/src/tools/get-notifications.js.map +0 -1
  69. package/dist/src/tools/get-profile.d.ts +0 -2
  70. package/dist/src/tools/get-profile.js +0 -89
  71. package/dist/src/tools/get-profile.js.map +0 -1
  72. package/dist/src/tools/get-skill-tracker.d.ts +0 -2
  73. package/dist/src/tools/get-skill-tracker.js +0 -93
  74. package/dist/src/tools/get-skill-tracker.js.map +0 -1
  75. package/dist/src/tools/get-skill-versions.d.ts +0 -2
  76. package/dist/src/tools/get-skill-versions.js +0 -74
  77. package/dist/src/tools/get-skill-versions.js.map +0 -1
  78. package/dist/src/tools/get-stable-corridors.d.ts +0 -2
  79. package/dist/src/tools/get-stable-corridors.js +0 -65
  80. package/dist/src/tools/get-stable-corridors.js.map +0 -1
  81. package/dist/src/tools/get-trend.d.ts +0 -2
  82. package/dist/src/tools/get-trend.js +0 -75
  83. package/dist/src/tools/get-trend.js.map +0 -1
  84. package/dist/src/tools/log-interaction.d.ts +0 -3
  85. package/dist/src/tools/log-interaction.js +0 -177
  86. package/dist/src/tools/log-interaction.js.map +0 -1
  87. package/dist/src/tools/register-agent.d.ts +0 -2
  88. package/dist/src/tools/register-agent.js +0 -102
  89. package/dist/src/tools/register-agent.js.map +0 -1
  90. package/dist/src/tools/search-skills.d.ts +0 -2
  91. package/dist/src/tools/search-skills.js +0 -78
  92. package/dist/src/tools/search-skills.js.map +0 -1
  93. package/dist/src/tools/summarize-my-agent.d.ts +0 -2
  94. package/dist/src/tools/summarize-my-agent.js +0 -100
  95. package/dist/src/tools/summarize-my-agent.js.map +0 -1
  96. package/dist/src/tools/update-composition.d.ts +0 -3
  97. package/dist/src/tools/update-composition.js +0 -89
  98. package/dist/src/tools/update-composition.js.map +0 -1
@@ -1,78 +0,0 @@
1
- import { z } from 'zod';
2
- export function searchSkillsTool(server, apiUrl) {
3
- server.registerTool('search_skills', {
4
- description: 'Search ACR network knowledge about a skill by name, description, or capability. Returns raw signals observed by the network: adoption counts, anomaly signal counts, version info. Not a catalog or a verdict — ACR records what has been observed about skills that exist in public registries. Read-only.',
5
- inputSchema: {
6
- query: z.string().min(1).max(200).describe('Search text (skill name, keyword, or capability)'),
7
- source: z.string().optional().describe('Filter by source (clawhub, github, npm)'),
8
- category: z.string().optional().describe('Filter by category'),
9
- min_agents: z.number().min(0).optional().describe('Only return skills observed being used by at least N agents'),
10
- min_anomaly_signals: z.number().min(0).optional().describe('Only return skills with at least N observed anomaly signals'),
11
- limit: z.number().min(1).max(50).optional().default(10).describe('Max results to return'),
12
- },
13
- annotations: { readOnlyHint: true, destructiveHint: false },
14
- _meta: { priorityHint: 0.6 },
15
- }, async ({ query: searchQuery, source, category, min_agents, min_anomaly_signals, limit }) => {
16
- try {
17
- const params = new URLSearchParams({ q: searchQuery });
18
- if (source)
19
- params.set('source', source);
20
- if (category)
21
- params.set('category', category);
22
- if (min_agents != null)
23
- params.set('min_agents', String(min_agents));
24
- if (min_anomaly_signals != null)
25
- params.set('min_anomaly_signals', String(min_anomaly_signals));
26
- if (limit)
27
- params.set('limit', String(limit));
28
- const res = await fetch(`${apiUrl}/api/v1/skill-catalog/search?${params}`);
29
- const data = await res.json();
30
- if (data.skills.length === 0) {
31
- return {
32
- content: [{
33
- type: 'text',
34
- text: `No skills found matching "${searchQuery}".`,
35
- }],
36
- };
37
- }
38
- let text = `Found ${data.total} skill(s) matching "${searchQuery}":\n`;
39
- for (const skill of data.skills) {
40
- const ver = skill.version ? ` v${skill.version}` : '';
41
- text += `\n ${skill.skill_name}${ver} (${skill.skill_source})`;
42
- if (skill.description)
43
- text += `\n ${skill.description}`;
44
- if (skill.category)
45
- text += `\n Category: ${skill.category}`;
46
- if (skill.tags.length > 0)
47
- text += `\n Tags: ${skill.tags.join(', ')}`;
48
- // Raw network signals — no synthetic severity label.
49
- const signals = [];
50
- if (skill.agent_count != null)
51
- signals.push(`${skill.agent_count} agents`);
52
- if (skill.interaction_count != null)
53
- signals.push(`${skill.interaction_count} interactions`);
54
- if (skill.anomaly_signal_count != null && skill.anomaly_signal_count > 0) {
55
- signals.push(`${skill.anomaly_signal_count} anomaly signals`);
56
- }
57
- if (skill.anomaly_signal_rate != null && skill.anomaly_signal_rate > 0) {
58
- signals.push(`${(skill.anomaly_signal_rate * 100).toFixed(1)}% anomaly rate`);
59
- }
60
- if (signals.length > 0) {
61
- text += `\n Signals: ${signals.join(', ')}`;
62
- }
63
- if (skill.current_hash)
64
- text += `\n Hash: ${skill.current_hash.slice(0, 16)}...`;
65
- text += '\n';
66
- }
67
- if (data.total > data.skills.length) {
68
- text += `\n... and ${data.total - data.skills.length} more. Increase limit to see more.`;
69
- }
70
- return { content: [{ type: 'text', text }] };
71
- }
72
- catch (err) {
73
- const msg = err instanceof Error ? err.message : 'Unknown error';
74
- return { content: [{ type: 'text', text: `Search error: ${msg}` }] };
75
- }
76
- });
77
- }
78
- //# sourceMappingURL=search-skills.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search-skills.js","sourceRoot":"","sources":["../../../src/tools/search-skills.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- export declare function summarizeMyAgentTool(server: McpServer, apiUrl: string): void;
@@ -1,100 +0,0 @@
1
- import { z } from 'zod';
2
- import { ensureRegistered, getAgentId, getAgentName, getApiUrl, getAuthHeaders } from '../state.js';
3
- async function resolveId(nameOrId) {
4
- if (nameOrId.startsWith('acr_') || nameOrId.startsWith('pseudo_'))
5
- return nameOrId;
6
- const res = await fetch(`${getApiUrl()}/api/v1/agent/${encodeURIComponent(nameOrId)}`);
7
- if (!res.ok)
8
- throw new Error(`Agent "${nameOrId}" not found`);
9
- return (await res.json()).agent_id;
10
- }
11
- async function fetchJSON(url) {
12
- try {
13
- const res = await fetch(url, { headers: getAuthHeaders() });
14
- if (!res.ok)
15
- return null;
16
- return await res.json();
17
- }
18
- catch {
19
- return null;
20
- }
21
- }
22
- export function summarizeMyAgentTool(server, apiUrl) {
23
- server.registerTool('summarize_my_agent', {
24
- description: 'Single-read overview of your interaction profile across all available lenses. Fetches profile, friction summary, and coverage in one call. Use this for a quick status check instead of calling each lens individually.',
25
- inputSchema: {
26
- agent_id: z.string().optional().describe('Your ACR agent ID (auto-assigned if omitted)'),
27
- agent_name: z.string().optional().describe('Your agent name (alternative to agent_id)'),
28
- },
29
- annotations: { readOnlyHint: true, destructiveHint: false },
30
- _meta: { priorityHint: 0.8 },
31
- }, async ({ agent_id, agent_name }) => {
32
- let id;
33
- try {
34
- id = agent_name ? await resolveId(agent_name) : (agent_id || getAgentId() || await ensureRegistered());
35
- }
36
- catch (err) {
37
- return { content: [{ type: 'text', text: `Error: ${err instanceof Error ? err.message : 'Unknown'}` }] };
38
- }
39
- // Fetch all three in parallel
40
- const [profile, friction, coverage] = await Promise.all([
41
- fetchJSON(`${apiUrl}/api/v1/agent/${id}/profile`),
42
- fetchJSON(`${apiUrl}/api/v1/agent/${id}/friction?scope=day`),
43
- fetchJSON(`${apiUrl}/api/v1/agent/${id}/coverage`),
44
- ]);
45
- const displayName = profile?.name || agent_name || getAgentName() || id;
46
- let text = `Agent Summary: ${displayName}\n${'='.repeat(40)}\n`;
47
- // Profile section
48
- if (profile) {
49
- const c = profile.counts;
50
- const comp = profile.composition_summary;
51
- text += `\n-- Profile --\n`;
52
- text += ` ${c.total_receipts} receipts across ${c.distinct_targets} targets over ${c.days_active} day(s)\n`;
53
- text += ` Last 24h: ${c.receipts_last_24h} receipts\n`;
54
- text += ` Composition: ${comp?.skill_count ?? 0} skills, ${comp?.mcp_count ?? 0} MCPs, ${comp?.tool_count ?? 0} tools\n`;
55
- }
56
- else {
57
- text += `\n-- Profile --\n Not available (agent may not be registered)\n`;
58
- }
59
- // Friction section
60
- if (friction && !friction.error) {
61
- const s = friction.summary;
62
- if (s && s.total_interactions > 0) {
63
- text += `\n-- Friction (today) --\n`;
64
- text += ` ${s.total_interactions} interactions | ${(s.friction_percentage ?? 0).toFixed(1)}% friction\n`;
65
- text += ` ${s.total_failures} failures (${(s.failure_rate * 100).toFixed(1)}%)\n`;
66
- const targets = friction.top_targets;
67
- if (targets && targets.length > 0) {
68
- text += ` Top targets:\n`;
69
- for (const t of targets.slice(0, 5)) {
70
- text += ` ${t.target_system_id}: ${t.interaction_count} calls, median ${t.median_duration_ms}ms\n`;
71
- }
72
- }
73
- }
74
- else {
75
- text += `\n-- Friction (today) --\n No interactions recorded today.\n`;
76
- }
77
- }
78
- else {
79
- text += `\n-- Friction (today) --\n Not available.\n`;
80
- }
81
- // Coverage section
82
- if (coverage && !coverage.error) {
83
- const rules = coverage.rules;
84
- if (rules) {
85
- const gaps = rules.filter((r) => r.triggered);
86
- const covered = rules.filter((r) => !r.triggered);
87
- text += `\n-- Coverage --\n`;
88
- text += ` ${covered.length}/${rules.length} signals covered\n`;
89
- if (gaps.length > 0) {
90
- text += ` Gaps: ${gaps.map((g) => g.signal).join(', ')}\n`;
91
- }
92
- }
93
- }
94
- else {
95
- text += `\n-- Coverage --\n Not available.\n`;
96
- }
97
- return { content: [{ type: 'text', text }] };
98
- });
99
- }
100
- //# sourceMappingURL=summarize-my-agent.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"summarize-my-agent.js","sourceRoot":"","sources":["../../../src/tools/summarize-my-agent.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { SessionState } from '../session-state.js';
3
- export declare function updateCompositionTool(server: McpServer, apiUrl: string, getSession: () => SessionState): void;
@@ -1,89 +0,0 @@
1
- import { z } from 'zod';
2
- import { stripSubComponents } from '../strip-sub-components.js';
3
- // Component schema — matches shared/schemas/agent.ts CompositionSchema.
4
- // Kept local so we don't need to cross package boundaries for the Zod type.
5
- const ComponentSchema = z.object({
6
- id: z.string().max(128),
7
- name: z.string().max(128).optional(),
8
- version: z.string().max(64).optional(),
9
- sub_components: z.array(z.object({
10
- id: z.string().max(128),
11
- name: z.string().max(128).optional(),
12
- version: z.string().max(64).optional(),
13
- type: z.string().max(32).optional(),
14
- })).max(64).optional(),
15
- });
16
- export function updateCompositionTool(server, apiUrl, getSession) {
17
- server.registerTool('update_composition', {
18
- description: 'Update your agent composition without re-registering. Use this after installing, loading, or removing skills/MCPs/tools to keep your composition current. Preserves your agent identity. Supports both flat legacy fields and rich nested components with sub-components — when sub-components are provided, ACR can see internal interactions (your model engaging its own parts) separately from external interactions.',
19
- inputSchema: {
20
- agent_id: z.string().optional().describe('Your agent ID (uses current session agent if omitted)'),
21
- composition: z.object({
22
- // Flat legacy fields — backwards compat
23
- skills: z.array(z.string()).optional().describe('Skill names (flat legacy format)'),
24
- skill_hashes: z.array(z.string()).optional().describe('SHA-256 hashes of each SKILL.md content (flat legacy format)'),
25
- mcps: z.array(z.string()).optional().describe('MCP server names (flat legacy format)'),
26
- tools: z.array(z.string()).optional().describe('Tool names (flat legacy format)'),
27
- // Rich nested fields — preferred for new clients
28
- skill_components: z.array(ComponentSchema).max(64).optional().describe('Rich nested skill composition. Each skill can declare sub_components.'),
29
- mcp_components: z.array(ComponentSchema).max(64).optional().describe('Rich nested MCP composition with sub_components.'),
30
- api_components: z.array(ComponentSchema).max(64).optional().describe('External APIs the agent calls with sub_components.'),
31
- tool_components: z.array(ComponentSchema).max(64).optional().describe('Tools bound to the agent with sub_components.'),
32
- }).describe('Your current composition'),
33
- },
34
- annotations: { readOnlyHint: false, destructiveHint: false },
35
- _meta: { priorityHint: 0.4 },
36
- }, async ({ agent_id, composition }) => {
37
- try {
38
- const resolvedAgentId = agent_id ?? getSession().agentId ?? await getSession().ensureRegistered(apiUrl);
39
- const session = getSession();
40
- const deep = session.deepComposition;
41
- const effectiveComposition = {
42
- ...composition,
43
- skill_components: stripSubComponents(composition.skill_components, deep),
44
- mcp_components: stripSubComponents(composition.mcp_components, deep),
45
- api_components: stripSubComponents(composition.api_components, deep),
46
- tool_components: stripSubComponents(composition.tool_components, deep),
47
- };
48
- const res = await fetch(`${apiUrl}/api/v1/composition/update`, {
49
- method: 'POST',
50
- headers: { 'Content-Type': 'application/json' },
51
- body: JSON.stringify({
52
- agent_id: resolvedAgentId,
53
- composition: effectiveComposition,
54
- composition_source: 'agent_reported',
55
- }),
56
- });
57
- const data = await res.json();
58
- if (!res.ok) {
59
- return {
60
- content: [{
61
- type: 'text',
62
- text: `Composition update failed: ${data.error?.message ?? `HTTP ${res.status}`}`,
63
- }],
64
- };
65
- }
66
- const skillCount = (composition.skills?.length ?? 0)
67
- + (composition.skill_hashes?.length ?? 0)
68
- + (composition.skill_components?.length ?? 0);
69
- const toolCount = (composition.mcps?.length ?? 0)
70
- + (composition.tools?.length ?? 0)
71
- + (composition.mcp_components?.length ?? 0)
72
- + (composition.tool_components?.length ?? 0);
73
- const deepNote = session.deepComposition
74
- ? ''
75
- : '\n\n(Deep composition is disabled. Sub-components, if provided, were stripped before sending.)';
76
- return {
77
- content: [{
78
- type: 'text',
79
- text: `Composition updated successfully.\n\nComposition hash: ${data.composition_hash}\nSkills: ${skillCount}\nTools/MCPs: ${toolCount}\n\nYour agent identity (${resolvedAgentId}) is preserved.${deepNote}`,
80
- }],
81
- };
82
- }
83
- catch (err) {
84
- const msg = err instanceof Error ? err.message : 'Unknown error';
85
- return { content: [{ type: 'text', text: `Composition update error: ${msg}` }] };
86
- }
87
- });
88
- }
89
- //# sourceMappingURL=update-composition.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update-composition.js","sourceRoot":"","sources":["../../../src/tools/update-composition.ts"],"names":[],"mappings":"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"}