@rickydata/agent0-mcp 0.1.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/.env.example +17 -0
- package/Dockerfile +25 -0
- package/README.md +85 -0
- package/dist/auth/sdk-client.d.ts +47 -0
- package/dist/auth/sdk-client.js +142 -0
- package/dist/auth/sdk-client.js.map +1 -0
- package/dist/auth/token.d.ts +5 -0
- package/dist/auth/token.js +6 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/auth/wallet-derivation.d.ts +26 -0
- package/dist/auth/wallet-derivation.js +76 -0
- package/dist/auth/wallet-derivation.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +140 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/a2a.d.ts +3 -0
- package/dist/tools/a2a.js +170 -0
- package/dist/tools/a2a.js.map +1 -0
- package/dist/tools/discovery.d.ts +3 -0
- package/dist/tools/discovery.js +465 -0
- package/dist/tools/discovery.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +38 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/payments.d.ts +3 -0
- package/dist/tools/payments.js +124 -0
- package/dist/tools/payments.js.map +1 -0
- package/dist/tools/registration.d.ts +3 -0
- package/dist/tools/registration.js +324 -0
- package/dist/tools/registration.js.map +1 -0
- package/dist/tools/reputation.d.ts +3 -0
- package/dist/tools/reputation.js +147 -0
- package/dist/tools/reputation.js.map +1 -0
- package/dist/utils/chains.d.ts +10 -0
- package/dist/utils/chains.js +33 -0
- package/dist/utils/chains.js.map +1 -0
- package/dist/utils/trust-labels.d.ts +10 -0
- package/dist/utils/trust-labels.js +48 -0
- package/dist/utils/trust-labels.js.map +1 -0
- package/dist/utils/validation.d.ts +12 -0
- package/dist/utils/validation.js +19 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +32 -0
- package/src/auth/sdk-client.ts +171 -0
- package/src/auth/token.ts +19 -0
- package/src/auth/wallet-derivation.ts +91 -0
- package/src/index.ts +184 -0
- package/src/tools/a2a.ts +205 -0
- package/src/tools/discovery.ts +517 -0
- package/src/tools/index.ts +45 -0
- package/src/tools/payments.ts +146 -0
- package/src/tools/registration.ts +389 -0
- package/src/tools/reputation.ts +183 -0
- package/src/utils/chains.ts +42 -0
- package/src/utils/trust-labels.ts +53 -0
- package/src/utils/validation.ts +20 -0
- package/tests/a2a.test.ts +234 -0
- package/tests/chains.test.ts +57 -0
- package/tests/discovery.test.ts +455 -0
- package/tests/e2e.test.ts +234 -0
- package/tests/payments.test.ts +148 -0
- package/tests/registration.test.ts +313 -0
- package/tests/reputation.test.ts +231 -0
- package/tests/sdk-client.test.ts +143 -0
- package/tests/tool-router.test.ts +28 -0
- package/tests/trust-labels.test.ts +229 -0
- package/tests/validation.test.ts +132 -0
- package/tests/wallet-derivation.test.ts +109 -0
- package/tsconfig.json +8 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { getAuthenticatedSDK, hasAuthentication, } from "../auth/sdk-client.js";
|
|
2
|
+
import { getChainName } from "../utils/chains.js";
|
|
3
|
+
export const a2aTools = [
|
|
4
|
+
{
|
|
5
|
+
name: "a2a_send_message",
|
|
6
|
+
description: "Send a message to an ERC-8004 agent via the A2A (Agent-to-Agent) protocol. " +
|
|
7
|
+
"The agent must have an A2A endpoint configured. Requires configured wallet. " +
|
|
8
|
+
"Returns a task ID for tracking the conversation.",
|
|
9
|
+
inputSchema: {
|
|
10
|
+
type: "object",
|
|
11
|
+
properties: {
|
|
12
|
+
agentId: {
|
|
13
|
+
type: "string",
|
|
14
|
+
description: "Agent ID in chainId:tokenId format (e.g. '11155111:42')",
|
|
15
|
+
},
|
|
16
|
+
message: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "Message text to send to the agent",
|
|
19
|
+
},
|
|
20
|
+
taskId: {
|
|
21
|
+
type: "string",
|
|
22
|
+
description: "Existing task ID to continue a conversation (optional)",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
required: ["agentId", "message"],
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: "a2a_list_tasks",
|
|
30
|
+
description: "List A2A tasks/conversations with a specific agent. " +
|
|
31
|
+
"Returns task IDs, statuses, and summaries.",
|
|
32
|
+
inputSchema: {
|
|
33
|
+
type: "object",
|
|
34
|
+
properties: {
|
|
35
|
+
agentId: {
|
|
36
|
+
type: "string",
|
|
37
|
+
description: "Agent ID in chainId:tokenId format",
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
required: ["agentId"],
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: "a2a_get_task",
|
|
45
|
+
description: "Get details of a specific A2A task including messages and artifacts.",
|
|
46
|
+
inputSchema: {
|
|
47
|
+
type: "object",
|
|
48
|
+
properties: {
|
|
49
|
+
agentId: {
|
|
50
|
+
type: "string",
|
|
51
|
+
description: "Agent ID in chainId:tokenId format",
|
|
52
|
+
},
|
|
53
|
+
taskId: {
|
|
54
|
+
type: "string",
|
|
55
|
+
description: "Task ID to retrieve",
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
required: ["agentId", "taskId"],
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
// ============================================================================
|
|
63
|
+
// HELPERS
|
|
64
|
+
// ============================================================================
|
|
65
|
+
function requireAuth() {
|
|
66
|
+
if (!hasAuthentication()) {
|
|
67
|
+
return {
|
|
68
|
+
sdk: null,
|
|
69
|
+
error: "No wallet configured. Call configure_wallet first.",
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const sdk = getAuthenticatedSDK();
|
|
73
|
+
if (!sdk) {
|
|
74
|
+
return { sdk: null, error: "Failed to initialize authenticated SDK." };
|
|
75
|
+
}
|
|
76
|
+
return { sdk, error: undefined };
|
|
77
|
+
}
|
|
78
|
+
function parseChainId(agentId) {
|
|
79
|
+
const parts = agentId.split(":");
|
|
80
|
+
return parts.length === 2 ? parseInt(parts[0], 10) : 11155111;
|
|
81
|
+
}
|
|
82
|
+
// ============================================================================
|
|
83
|
+
// HANDLERS
|
|
84
|
+
// ============================================================================
|
|
85
|
+
async function handleSendMessage(args) {
|
|
86
|
+
const { sdk, error } = requireAuth();
|
|
87
|
+
if (error || !sdk)
|
|
88
|
+
return { error };
|
|
89
|
+
const agentId = args.agentId;
|
|
90
|
+
const message = args.message;
|
|
91
|
+
// Load agent summary to get A2A endpoint
|
|
92
|
+
const agentSummary = await sdk.getAgent(agentId);
|
|
93
|
+
if (!agentSummary) {
|
|
94
|
+
return { error: `Agent ${agentId} not found` };
|
|
95
|
+
}
|
|
96
|
+
if (!agentSummary.a2a) {
|
|
97
|
+
return {
|
|
98
|
+
error: `Agent ${agentId} does not have an A2A endpoint configured`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// Create A2A client from summary
|
|
102
|
+
const a2aClient = sdk.createA2AClient(agentSummary);
|
|
103
|
+
// Send message
|
|
104
|
+
const result = await a2aClient.messageA2A(message, {
|
|
105
|
+
taskId: args.taskId ?? undefined,
|
|
106
|
+
});
|
|
107
|
+
const chainId = parseChainId(agentId);
|
|
108
|
+
return {
|
|
109
|
+
success: true,
|
|
110
|
+
agentId,
|
|
111
|
+
chain: getChainName(chainId),
|
|
112
|
+
taskId: result?.taskId ?? result?.id,
|
|
113
|
+
status: result?.status,
|
|
114
|
+
response: result?.response ?? result?.text ?? result,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
async function handleListTasks(args) {
|
|
118
|
+
const { sdk, error } = requireAuth();
|
|
119
|
+
if (error || !sdk)
|
|
120
|
+
return { error };
|
|
121
|
+
const agentId = args.agentId;
|
|
122
|
+
const agentSummary = await sdk.getAgent(agentId);
|
|
123
|
+
if (!agentSummary) {
|
|
124
|
+
return { error: `Agent ${agentId} not found` };
|
|
125
|
+
}
|
|
126
|
+
if (!agentSummary.a2a) {
|
|
127
|
+
return { error: `Agent ${agentId} does not have an A2A endpoint` };
|
|
128
|
+
}
|
|
129
|
+
const a2aClient = sdk.createA2AClient(agentSummary);
|
|
130
|
+
const tasks = await a2aClient.listTasks();
|
|
131
|
+
return {
|
|
132
|
+
agentId,
|
|
133
|
+
count: Array.isArray(tasks) ? tasks.length : 0,
|
|
134
|
+
tasks: tasks ?? [],
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
async function handleGetTask(args) {
|
|
138
|
+
const { sdk, error } = requireAuth();
|
|
139
|
+
if (error || !sdk)
|
|
140
|
+
return { error };
|
|
141
|
+
const agentId = args.agentId;
|
|
142
|
+
const taskId = args.taskId;
|
|
143
|
+
const agentSummary = await sdk.getAgent(agentId);
|
|
144
|
+
if (!agentSummary) {
|
|
145
|
+
return { error: `Agent ${agentId} not found` };
|
|
146
|
+
}
|
|
147
|
+
const a2aClient = sdk.createA2AClient(agentSummary);
|
|
148
|
+
const task = await a2aClient.loadTask(taskId);
|
|
149
|
+
return {
|
|
150
|
+
agentId,
|
|
151
|
+
taskId,
|
|
152
|
+
task: task ?? { error: "Task not found" },
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
// ============================================================================
|
|
156
|
+
// DISPATCH
|
|
157
|
+
// ============================================================================
|
|
158
|
+
export async function handleA2ATool(name, args) {
|
|
159
|
+
switch (name) {
|
|
160
|
+
case "a2a_send_message":
|
|
161
|
+
return handleSendMessage(args);
|
|
162
|
+
case "a2a_list_tasks":
|
|
163
|
+
return handleListTasks(args);
|
|
164
|
+
case "a2a_get_task":
|
|
165
|
+
return handleGetTask(args);
|
|
166
|
+
default:
|
|
167
|
+
return { error: `Unknown A2A tool: ${name}` };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=a2a.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a.js","sourceRoot":"","sources":["../../src/tools/a2a.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
import { SDK } from "agent0-sdk";
|
|
2
|
+
import { computeTrustLabel } from "../utils/trust-labels.js";
|
|
3
|
+
import { getChainName } from "../utils/chains.js";
|
|
4
|
+
// ============================================================================
|
|
5
|
+
// SDK INITIALIZATION (read-only, no private key needed)
|
|
6
|
+
// ============================================================================
|
|
7
|
+
const DEFAULT_CHAIN_ID = parseInt(process.env.AGENT0_CHAIN_ID || "11155111", 10);
|
|
8
|
+
function getReadOnlySDK(chainId) {
|
|
9
|
+
return new SDK({ chainId: chainId ?? DEFAULT_CHAIN_ID });
|
|
10
|
+
}
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// RESPONSE HELPERS
|
|
13
|
+
// ============================================================================
|
|
14
|
+
function formatAgentSummary(agent) {
|
|
15
|
+
const count = agent.feedbackCount ?? 0;
|
|
16
|
+
const avg = agent.averageValue ?? 0;
|
|
17
|
+
const trust = computeTrustLabel(count, avg);
|
|
18
|
+
return {
|
|
19
|
+
agentId: agent.agentId,
|
|
20
|
+
chainId: agent.chainId,
|
|
21
|
+
name: agent.name,
|
|
22
|
+
description: agent.description,
|
|
23
|
+
image: agent.image,
|
|
24
|
+
active: agent.active,
|
|
25
|
+
x402support: agent.x402support,
|
|
26
|
+
owners: agent.owners,
|
|
27
|
+
walletAddress: agent.walletAddress,
|
|
28
|
+
mcp: agent.mcp || null,
|
|
29
|
+
a2a: agent.a2a || null,
|
|
30
|
+
web: agent.web || null,
|
|
31
|
+
ens: agent.ens || null,
|
|
32
|
+
mcpTools: agent.mcpTools,
|
|
33
|
+
a2aSkills: agent.a2aSkills,
|
|
34
|
+
oasfSkills: agent.oasfSkills,
|
|
35
|
+
oasfDomains: agent.oasfDomains,
|
|
36
|
+
supportedTrusts: agent.supportedTrusts,
|
|
37
|
+
trust: trust.display,
|
|
38
|
+
feedbackCount: count,
|
|
39
|
+
averageValue: avg,
|
|
40
|
+
updatedAt: agent.updatedAt,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// TOOL DEFINITIONS
|
|
45
|
+
// ============================================================================
|
|
46
|
+
export const discoveryTools = [
|
|
47
|
+
{
|
|
48
|
+
name: "search_agents",
|
|
49
|
+
description: "Search for ERC-8004 registered AI agents by name, capabilities, tools, skills, or reputation. " +
|
|
50
|
+
"Returns agent summaries with trust labels. Supports multi-chain search.",
|
|
51
|
+
inputSchema: {
|
|
52
|
+
type: "object",
|
|
53
|
+
properties: {
|
|
54
|
+
name: {
|
|
55
|
+
type: "string",
|
|
56
|
+
description: "Substring match on agent name",
|
|
57
|
+
},
|
|
58
|
+
keyword: {
|
|
59
|
+
type: "string",
|
|
60
|
+
description: "Keyword search across agent metadata",
|
|
61
|
+
},
|
|
62
|
+
mcpTools: {
|
|
63
|
+
type: "array",
|
|
64
|
+
items: { type: "string" },
|
|
65
|
+
description: "Filter by MCP tool names the agent exposes",
|
|
66
|
+
},
|
|
67
|
+
a2aSkills: {
|
|
68
|
+
type: "array",
|
|
69
|
+
items: { type: "string" },
|
|
70
|
+
description: "Filter by A2A skills",
|
|
71
|
+
},
|
|
72
|
+
oasfSkills: {
|
|
73
|
+
type: "array",
|
|
74
|
+
items: { type: "string" },
|
|
75
|
+
description: "Filter by OASF taxonomy skills",
|
|
76
|
+
},
|
|
77
|
+
oasfDomains: {
|
|
78
|
+
type: "array",
|
|
79
|
+
items: { type: "string" },
|
|
80
|
+
description: "Filter by OASF taxonomy domains",
|
|
81
|
+
},
|
|
82
|
+
active: {
|
|
83
|
+
type: "boolean",
|
|
84
|
+
description: "Filter by active status (default: true)",
|
|
85
|
+
},
|
|
86
|
+
x402support: {
|
|
87
|
+
type: "boolean",
|
|
88
|
+
description: "Filter by x402 payment support",
|
|
89
|
+
},
|
|
90
|
+
hasMCP: {
|
|
91
|
+
type: "boolean",
|
|
92
|
+
description: "Only agents with an MCP endpoint",
|
|
93
|
+
},
|
|
94
|
+
hasA2A: {
|
|
95
|
+
type: "boolean",
|
|
96
|
+
description: "Only agents with an A2A endpoint",
|
|
97
|
+
},
|
|
98
|
+
chains: {
|
|
99
|
+
type: "array",
|
|
100
|
+
items: { type: "number" },
|
|
101
|
+
description: "Chain IDs to search (default: [11155111]). Use [1, 8453, 137, 11155111] for all supported chains.",
|
|
102
|
+
},
|
|
103
|
+
minFeedbackValue: {
|
|
104
|
+
type: "number",
|
|
105
|
+
description: "Minimum average feedback score (0-100)",
|
|
106
|
+
},
|
|
107
|
+
limit: {
|
|
108
|
+
type: "number",
|
|
109
|
+
description: "Max results to return (default: 20, max: 100)",
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: "get_agent",
|
|
116
|
+
description: "Get detailed information about a specific ERC-8004 agent by its ID (format: chainId:tokenId, e.g. '11155111:42'). " +
|
|
117
|
+
"Returns full agent profile with endpoints, tools, skills, trust label, and reputation summary.",
|
|
118
|
+
inputSchema: {
|
|
119
|
+
type: "object",
|
|
120
|
+
properties: {
|
|
121
|
+
agentId: {
|
|
122
|
+
type: "string",
|
|
123
|
+
description: "Agent ID in chainId:tokenId format (e.g. '11155111:42' or '1:123')",
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
required: ["agentId"],
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
name: "get_supported_chains",
|
|
131
|
+
description: "List all blockchain networks that support ERC-8004 agent registration. " +
|
|
132
|
+
"Returns chain IDs, names, registry contract addresses, and subgraph URLs.",
|
|
133
|
+
inputSchema: {
|
|
134
|
+
type: "object",
|
|
135
|
+
properties: {},
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
name: "get_platform_stats",
|
|
140
|
+
description: "Get aggregate statistics about the ERC-8004 agent ecosystem on a specific chain. " +
|
|
141
|
+
"Returns total agents, active count, agents with MCP/A2A endpoints, and x402 support count.",
|
|
142
|
+
inputSchema: {
|
|
143
|
+
type: "object",
|
|
144
|
+
properties: {
|
|
145
|
+
chainId: {
|
|
146
|
+
type: "number",
|
|
147
|
+
description: "Chain ID to query (default: 11155111 Sepolia). Use 1 for Ethereum Mainnet, 8453 for Base.",
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: "get_reputation_summary",
|
|
154
|
+
description: "Get reputation summary (feedback count and average value) for a specific agent. " +
|
|
155
|
+
"Optionally filter by tag. Returns trust label computation.",
|
|
156
|
+
inputSchema: {
|
|
157
|
+
type: "object",
|
|
158
|
+
properties: {
|
|
159
|
+
agentId: {
|
|
160
|
+
type: "string",
|
|
161
|
+
description: "Agent ID in chainId:tokenId format (e.g. '11155111:42')",
|
|
162
|
+
},
|
|
163
|
+
tag: {
|
|
164
|
+
type: "string",
|
|
165
|
+
description: "Optional tag to filter reputation by (e.g. 'enterprise', 'quality')",
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
required: ["agentId"],
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: "search_feedback",
|
|
173
|
+
description: "Search feedback/reviews for agents. Can search by agent ID, reviewer wallet, tags, " +
|
|
174
|
+
"or across multiple agents. Returns individual feedback entries with scores and metadata.",
|
|
175
|
+
inputSchema: {
|
|
176
|
+
type: "object",
|
|
177
|
+
properties: {
|
|
178
|
+
agentId: {
|
|
179
|
+
type: "string",
|
|
180
|
+
description: "Agent ID to search feedback for (chainId:tokenId format)",
|
|
181
|
+
},
|
|
182
|
+
agents: {
|
|
183
|
+
type: "array",
|
|
184
|
+
items: { type: "string" },
|
|
185
|
+
description: "Multiple agent IDs to search feedback across",
|
|
186
|
+
},
|
|
187
|
+
reviewers: {
|
|
188
|
+
type: "array",
|
|
189
|
+
items: { type: "string" },
|
|
190
|
+
description: "Filter by reviewer wallet addresses",
|
|
191
|
+
},
|
|
192
|
+
tags: {
|
|
193
|
+
type: "array",
|
|
194
|
+
items: { type: "string" },
|
|
195
|
+
description: "Filter by feedback tags",
|
|
196
|
+
},
|
|
197
|
+
minValue: {
|
|
198
|
+
type: "number",
|
|
199
|
+
description: "Minimum feedback value (0-100)",
|
|
200
|
+
},
|
|
201
|
+
maxValue: {
|
|
202
|
+
type: "number",
|
|
203
|
+
description: "Maximum feedback value (0-100)",
|
|
204
|
+
},
|
|
205
|
+
includeRevoked: {
|
|
206
|
+
type: "boolean",
|
|
207
|
+
description: "Include revoked feedback (default: false)",
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
];
|
|
213
|
+
// ============================================================================
|
|
214
|
+
// TOOL HANDLERS
|
|
215
|
+
// ============================================================================
|
|
216
|
+
async function handleSearchAgents(args) {
|
|
217
|
+
const limit = Math.min(Math.max(1, args.limit ?? 20), 100);
|
|
218
|
+
const chainId = args.chains?.[0] ?? DEFAULT_CHAIN_ID;
|
|
219
|
+
const sdk = getReadOnlySDK(chainId);
|
|
220
|
+
const filters = {};
|
|
221
|
+
if (args.name)
|
|
222
|
+
filters.name = args.name;
|
|
223
|
+
if (args.keyword)
|
|
224
|
+
filters.keyword = args.keyword;
|
|
225
|
+
if (args.mcpTools)
|
|
226
|
+
filters.mcpTools = args.mcpTools;
|
|
227
|
+
if (args.a2aSkills)
|
|
228
|
+
filters.a2aSkills = args.a2aSkills;
|
|
229
|
+
if (args.oasfSkills)
|
|
230
|
+
filters.oasfSkills = args.oasfSkills;
|
|
231
|
+
if (args.oasfDomains)
|
|
232
|
+
filters.oasfDomains = args.oasfDomains;
|
|
233
|
+
if (args.active !== undefined)
|
|
234
|
+
filters.active = args.active;
|
|
235
|
+
if (args.x402support !== undefined)
|
|
236
|
+
filters.x402support = args.x402support;
|
|
237
|
+
if (args.hasMCP !== undefined)
|
|
238
|
+
filters.hasMCP = args.hasMCP;
|
|
239
|
+
if (args.hasA2A !== undefined)
|
|
240
|
+
filters.hasA2A = args.hasA2A;
|
|
241
|
+
if (args.chains)
|
|
242
|
+
filters.chains = args.chains;
|
|
243
|
+
if (args.minFeedbackValue) {
|
|
244
|
+
filters.feedback = {
|
|
245
|
+
minValue: args.minFeedbackValue,
|
|
246
|
+
includeRevoked: false,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
const results = await sdk.searchAgents(filters, { sort: ["updatedAt:desc"] });
|
|
250
|
+
const agents = results.slice(0, limit).map((a) => formatAgentSummary(a));
|
|
251
|
+
return {
|
|
252
|
+
count: agents.length,
|
|
253
|
+
totalAvailable: results.length,
|
|
254
|
+
chainId,
|
|
255
|
+
agents,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
async function handleGetAgent(args) {
|
|
259
|
+
const agentId = args.agentId;
|
|
260
|
+
if (!agentId)
|
|
261
|
+
return { error: "agentId is required (format: chainId:tokenId)" };
|
|
262
|
+
const parts = agentId.split(":");
|
|
263
|
+
if (parts.length !== 2) {
|
|
264
|
+
return { error: "Invalid agentId format. Use chainId:tokenId (e.g. '11155111:42')" };
|
|
265
|
+
}
|
|
266
|
+
const chainId = parseInt(parts[0], 10);
|
|
267
|
+
const sdk = getReadOnlySDK(chainId);
|
|
268
|
+
const agent = await sdk.getAgent(agentId);
|
|
269
|
+
if (!agent) {
|
|
270
|
+
return { error: `Agent ${agentId} not found` };
|
|
271
|
+
}
|
|
272
|
+
// Get reputation summary
|
|
273
|
+
let reputation = { count: 0, averageValue: 0 };
|
|
274
|
+
try {
|
|
275
|
+
reputation = await sdk.getReputationSummary(agentId);
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
// Reputation may not be available for all agents
|
|
279
|
+
}
|
|
280
|
+
const trust = computeTrustLabel(reputation.count, reputation.averageValue);
|
|
281
|
+
const summary = formatAgentSummary(agent);
|
|
282
|
+
return {
|
|
283
|
+
...summary,
|
|
284
|
+
reputation: {
|
|
285
|
+
count: reputation.count,
|
|
286
|
+
averageValue: reputation.averageValue,
|
|
287
|
+
trustLabel: trust.label,
|
|
288
|
+
trustDisplay: trust.display,
|
|
289
|
+
},
|
|
290
|
+
chain: getChainName(chainId),
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
async function handleGetSupportedChains() {
|
|
294
|
+
const chains = [
|
|
295
|
+
{
|
|
296
|
+
chainId: 1,
|
|
297
|
+
name: "Ethereum Mainnet",
|
|
298
|
+
identity: "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432",
|
|
299
|
+
reputation: "0x8004BAa17C55a88189AE136b182e5fdA19dE9b63",
|
|
300
|
+
hasSubgraph: true,
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
chainId: 8453,
|
|
304
|
+
name: "Base",
|
|
305
|
+
identity: "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432",
|
|
306
|
+
reputation: "0x8004BAa17C55a88189AE136b182e5fdA19dE9b63",
|
|
307
|
+
hasSubgraph: true,
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
chainId: 137,
|
|
311
|
+
name: "Polygon Mainnet",
|
|
312
|
+
identity: "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432",
|
|
313
|
+
reputation: "0x8004BAa17C55a88189AE136b182e5fdA19dE9b63",
|
|
314
|
+
hasSubgraph: true,
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
chainId: 11155111,
|
|
318
|
+
name: "Ethereum Sepolia (Testnet)",
|
|
319
|
+
identity: "0x8004A818BFB912233c491871b3d84c89A494BD9e",
|
|
320
|
+
reputation: "0x8004B663056A597Dffe9eCcC1965A193B7388713",
|
|
321
|
+
hasSubgraph: true,
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
chainId: 84532,
|
|
325
|
+
name: "Base Sepolia (Testnet)",
|
|
326
|
+
identity: "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432",
|
|
327
|
+
reputation: "0x8004BAa17C55a88189AE136b182e5fdA19dE9b63",
|
|
328
|
+
hasSubgraph: true,
|
|
329
|
+
},
|
|
330
|
+
];
|
|
331
|
+
return {
|
|
332
|
+
count: chains.length,
|
|
333
|
+
chains,
|
|
334
|
+
note: "Use chainId:tokenId format when querying agents (e.g. '1:42' for Ethereum Mainnet agent #42)",
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
async function handleGetPlatformStats(args) {
|
|
338
|
+
const chainId = args.chainId ?? DEFAULT_CHAIN_ID;
|
|
339
|
+
const sdk = getReadOnlySDK(chainId);
|
|
340
|
+
// Fetch all agents on this chain (no filter)
|
|
341
|
+
const allAgents = await sdk.searchAgents({}, { sort: ["updatedAt:desc"] });
|
|
342
|
+
let activeCount = 0;
|
|
343
|
+
let mcpCount = 0;
|
|
344
|
+
let a2aCount = 0;
|
|
345
|
+
let x402Count = 0;
|
|
346
|
+
let withFeedback = 0;
|
|
347
|
+
let totalTools = 0;
|
|
348
|
+
let totalSkills = 0;
|
|
349
|
+
for (const agent of allAgents) {
|
|
350
|
+
if (agent.active)
|
|
351
|
+
activeCount++;
|
|
352
|
+
if (agent.mcp)
|
|
353
|
+
mcpCount++;
|
|
354
|
+
if (agent.a2a)
|
|
355
|
+
a2aCount++;
|
|
356
|
+
if (agent.x402support)
|
|
357
|
+
x402Count++;
|
|
358
|
+
if (agent.feedbackCount && agent.feedbackCount > 0)
|
|
359
|
+
withFeedback++;
|
|
360
|
+
totalTools += agent.mcpTools?.length ?? 0;
|
|
361
|
+
totalSkills += agent.a2aSkills?.length ?? 0;
|
|
362
|
+
}
|
|
363
|
+
return {
|
|
364
|
+
chainId,
|
|
365
|
+
chain: getChainName(chainId),
|
|
366
|
+
totalAgents: allAgents.length,
|
|
367
|
+
activeAgents: activeCount,
|
|
368
|
+
agentsWithMCP: mcpCount,
|
|
369
|
+
agentsWithA2A: a2aCount,
|
|
370
|
+
agentsWithX402: x402Count,
|
|
371
|
+
agentsWithFeedback: withFeedback,
|
|
372
|
+
totalMCPTools: totalTools,
|
|
373
|
+
totalA2ASkills: totalSkills,
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
async function handleGetReputationSummary(args) {
|
|
377
|
+
const agentId = args.agentId;
|
|
378
|
+
if (!agentId)
|
|
379
|
+
return { error: "agentId is required" };
|
|
380
|
+
const parts = agentId.split(":");
|
|
381
|
+
if (parts.length !== 2) {
|
|
382
|
+
return { error: "Invalid agentId format. Use chainId:tokenId" };
|
|
383
|
+
}
|
|
384
|
+
const chainId = parseInt(parts[0], 10);
|
|
385
|
+
const sdk = getReadOnlySDK(chainId);
|
|
386
|
+
const tag = args.tag;
|
|
387
|
+
const reputation = await sdk.getReputationSummary(agentId, tag);
|
|
388
|
+
const trust = computeTrustLabel(reputation.count, reputation.averageValue);
|
|
389
|
+
return {
|
|
390
|
+
agentId,
|
|
391
|
+
chain: getChainName(chainId),
|
|
392
|
+
count: reputation.count,
|
|
393
|
+
averageValue: reputation.averageValue,
|
|
394
|
+
trustLabel: trust.label,
|
|
395
|
+
trustEmoji: trust.emoji,
|
|
396
|
+
trustDisplay: trust.display,
|
|
397
|
+
tag: tag ?? null,
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
async function handleSearchFeedback(args) {
|
|
401
|
+
const agentId = args.agentId;
|
|
402
|
+
const agents = args.agents;
|
|
403
|
+
// Determine chain from first agent ID available
|
|
404
|
+
const firstId = agentId ?? agents?.[0];
|
|
405
|
+
if (!firstId) {
|
|
406
|
+
return { error: "Provide agentId or agents[] to search feedback" };
|
|
407
|
+
}
|
|
408
|
+
const parts = firstId.split(":");
|
|
409
|
+
const chainId = parts.length === 2 ? parseInt(parts[0], 10) : DEFAULT_CHAIN_ID;
|
|
410
|
+
const sdk = getReadOnlySDK(chainId);
|
|
411
|
+
const filters = {};
|
|
412
|
+
if (agentId)
|
|
413
|
+
filters.agentId = agentId;
|
|
414
|
+
if (agents)
|
|
415
|
+
filters.agents = agents;
|
|
416
|
+
if (args.reviewers)
|
|
417
|
+
filters.reviewers = args.reviewers;
|
|
418
|
+
if (args.tags)
|
|
419
|
+
filters.tags = args.tags;
|
|
420
|
+
if (args.includeRevoked !== undefined)
|
|
421
|
+
filters.includeRevoked = args.includeRevoked;
|
|
422
|
+
const options = {};
|
|
423
|
+
if (args.minValue !== undefined)
|
|
424
|
+
options.minValue = args.minValue;
|
|
425
|
+
if (args.maxValue !== undefined)
|
|
426
|
+
options.maxValue = args.maxValue;
|
|
427
|
+
const feedbacks = await sdk.searchFeedback(filters, options);
|
|
428
|
+
return {
|
|
429
|
+
count: feedbacks.length,
|
|
430
|
+
feedbacks: feedbacks.slice(0, 50).map((f) => ({
|
|
431
|
+
agentId: f.agentId,
|
|
432
|
+
reviewer: f.reviewer,
|
|
433
|
+
value: f.value,
|
|
434
|
+
tags: f.tags,
|
|
435
|
+
text: f.text,
|
|
436
|
+
endpoint: f.endpoint,
|
|
437
|
+
isRevoked: f.isRevoked,
|
|
438
|
+
createdAt: f.createdAt,
|
|
439
|
+
mcpTool: f.mcpTool,
|
|
440
|
+
a2aSkills: f.a2aSkills,
|
|
441
|
+
})),
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
// ============================================================================
|
|
445
|
+
// DISPATCH
|
|
446
|
+
// ============================================================================
|
|
447
|
+
export async function handleDiscoveryTool(name, args) {
|
|
448
|
+
switch (name) {
|
|
449
|
+
case "search_agents":
|
|
450
|
+
return handleSearchAgents(args);
|
|
451
|
+
case "get_agent":
|
|
452
|
+
return handleGetAgent(args);
|
|
453
|
+
case "get_supported_chains":
|
|
454
|
+
return handleGetSupportedChains();
|
|
455
|
+
case "get_platform_stats":
|
|
456
|
+
return handleGetPlatformStats(args);
|
|
457
|
+
case "get_reputation_summary":
|
|
458
|
+
return handleGetReputationSummary(args);
|
|
459
|
+
case "search_feedback":
|
|
460
|
+
return handleSearchFeedback(args);
|
|
461
|
+
default:
|
|
462
|
+
return { error: `Unknown discovery tool: ${name}` };
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/tools/discovery.ts"],"names":[],"mappings":"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"}
|