@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.
Files changed (70) hide show
  1. package/.env.example +17 -0
  2. package/Dockerfile +25 -0
  3. package/README.md +85 -0
  4. package/dist/auth/sdk-client.d.ts +47 -0
  5. package/dist/auth/sdk-client.js +142 -0
  6. package/dist/auth/sdk-client.js.map +1 -0
  7. package/dist/auth/token.d.ts +5 -0
  8. package/dist/auth/token.js +6 -0
  9. package/dist/auth/token.js.map +1 -0
  10. package/dist/auth/wallet-derivation.d.ts +26 -0
  11. package/dist/auth/wallet-derivation.js +76 -0
  12. package/dist/auth/wallet-derivation.js.map +1 -0
  13. package/dist/index.d.ts +1 -0
  14. package/dist/index.js +140 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/tools/a2a.d.ts +3 -0
  17. package/dist/tools/a2a.js +170 -0
  18. package/dist/tools/a2a.js.map +1 -0
  19. package/dist/tools/discovery.d.ts +3 -0
  20. package/dist/tools/discovery.js +465 -0
  21. package/dist/tools/discovery.js.map +1 -0
  22. package/dist/tools/index.d.ts +3 -0
  23. package/dist/tools/index.js +38 -0
  24. package/dist/tools/index.js.map +1 -0
  25. package/dist/tools/payments.d.ts +3 -0
  26. package/dist/tools/payments.js +124 -0
  27. package/dist/tools/payments.js.map +1 -0
  28. package/dist/tools/registration.d.ts +3 -0
  29. package/dist/tools/registration.js +324 -0
  30. package/dist/tools/registration.js.map +1 -0
  31. package/dist/tools/reputation.d.ts +3 -0
  32. package/dist/tools/reputation.js +147 -0
  33. package/dist/tools/reputation.js.map +1 -0
  34. package/dist/utils/chains.d.ts +10 -0
  35. package/dist/utils/chains.js +33 -0
  36. package/dist/utils/chains.js.map +1 -0
  37. package/dist/utils/trust-labels.d.ts +10 -0
  38. package/dist/utils/trust-labels.js +48 -0
  39. package/dist/utils/trust-labels.js.map +1 -0
  40. package/dist/utils/validation.d.ts +12 -0
  41. package/dist/utils/validation.js +19 -0
  42. package/dist/utils/validation.js.map +1 -0
  43. package/package.json +32 -0
  44. package/src/auth/sdk-client.ts +171 -0
  45. package/src/auth/token.ts +19 -0
  46. package/src/auth/wallet-derivation.ts +91 -0
  47. package/src/index.ts +184 -0
  48. package/src/tools/a2a.ts +205 -0
  49. package/src/tools/discovery.ts +517 -0
  50. package/src/tools/index.ts +45 -0
  51. package/src/tools/payments.ts +146 -0
  52. package/src/tools/registration.ts +389 -0
  53. package/src/tools/reputation.ts +183 -0
  54. package/src/utils/chains.ts +42 -0
  55. package/src/utils/trust-labels.ts +53 -0
  56. package/src/utils/validation.ts +20 -0
  57. package/tests/a2a.test.ts +234 -0
  58. package/tests/chains.test.ts +57 -0
  59. package/tests/discovery.test.ts +455 -0
  60. package/tests/e2e.test.ts +234 -0
  61. package/tests/payments.test.ts +148 -0
  62. package/tests/registration.test.ts +313 -0
  63. package/tests/reputation.test.ts +231 -0
  64. package/tests/sdk-client.test.ts +143 -0
  65. package/tests/tool-router.test.ts +28 -0
  66. package/tests/trust-labels.test.ts +229 -0
  67. package/tests/validation.test.ts +132 -0
  68. package/tests/wallet-derivation.test.ts +109 -0
  69. package/tsconfig.json +8 -0
  70. package/vitest.config.ts +8 -0
@@ -0,0 +1,38 @@
1
+ import { discoveryTools, handleDiscoveryTool } from "./discovery.js";
2
+ import { reputationTools, handleReputationTool } from "./reputation.js";
3
+ import { registrationTools, handleRegistrationTool } from "./registration.js";
4
+ import { paymentsTools, handlePaymentsTool } from "./payments.js";
5
+ import { a2aTools, handleA2ATool } from "./a2a.js";
6
+ // Aggregate all tool definitions
7
+ export const TOOLS = [
8
+ ...discoveryTools,
9
+ ...reputationTools,
10
+ ...registrationTools,
11
+ ...paymentsTools,
12
+ ...a2aTools,
13
+ ];
14
+ // Tool name -> handler routing map
15
+ const TOOL_HANDLERS = {};
16
+ for (const tool of discoveryTools) {
17
+ TOOL_HANDLERS[tool.name] = (args) => handleDiscoveryTool(tool.name, args);
18
+ }
19
+ for (const tool of reputationTools) {
20
+ TOOL_HANDLERS[tool.name] = (args) => handleReputationTool(tool.name, args);
21
+ }
22
+ for (const tool of registrationTools) {
23
+ TOOL_HANDLERS[tool.name] = (args) => handleRegistrationTool(tool.name, args);
24
+ }
25
+ for (const tool of paymentsTools) {
26
+ TOOL_HANDLERS[tool.name] = (args) => handlePaymentsTool(tool.name, args);
27
+ }
28
+ for (const tool of a2aTools) {
29
+ TOOL_HANDLERS[tool.name] = (args) => handleA2ATool(tool.name, args);
30
+ }
31
+ export async function handleToolCall(name, args) {
32
+ const handler = TOOL_HANDLERS[name];
33
+ if (!handler) {
34
+ return { error: `Unknown tool: ${name}` };
35
+ }
36
+ return handler(args);
37
+ }
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEnD,iCAAiC;AACjC,MAAM,CAAC,MAAM,KAAK,GAAW;IAC3B,GAAG,cAAc;IACjB,GAAG,eAAe;IAClB,GAAG,iBAAiB;IACpB,GAAG,aAAa;IAChB,GAAG,QAAQ;CACZ,CAAC;AAEF,mCAAmC;AACnC,MAAM,aAAa,GAAwE,EAAE,CAAC;AAE9F,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;IAClC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC5E,CAAC;AACD,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;IACnC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC7E,CAAC;AACD,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAAC;IACrC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC/E,CAAC;AACD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;IACjC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC3E,CAAC;AACD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;IAC5B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAY,EACZ,IAA6B;IAE7B,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const paymentsTools: Tool[];
3
+ export declare function handlePaymentsTool(name: string, args: Record<string, unknown>): Promise<unknown>;
@@ -0,0 +1,124 @@
1
+ import { isX402Required } from "agent0-sdk";
2
+ import { getAuthenticatedSDK, hasAuthentication, } from "../auth/sdk-client.js";
3
+ export const paymentsTools = [
4
+ {
5
+ name: "x402_request",
6
+ description: "Make an HTTP request with built-in x402 payment handling. " +
7
+ "If the server returns 402 Payment Required, inspects payment requirements and optionally pays. " +
8
+ "Requires configured wallet with funds on the appropriate chain.",
9
+ inputSchema: {
10
+ type: "object",
11
+ properties: {
12
+ url: {
13
+ type: "string",
14
+ description: "The URL to request",
15
+ },
16
+ method: {
17
+ type: "string",
18
+ enum: ["GET", "POST", "PUT", "DELETE"],
19
+ description: "HTTP method (default: GET)",
20
+ },
21
+ headers: {
22
+ type: "object",
23
+ description: "Additional request headers (key-value pairs)",
24
+ },
25
+ body: {
26
+ type: "string",
27
+ description: "Request body (for POST/PUT)",
28
+ },
29
+ autoPay: {
30
+ type: "boolean",
31
+ description: "Automatically pay and retry on 402 (default: false). " +
32
+ "When false, returns payment requirements for inspection.",
33
+ },
34
+ maxPaymentUsd: {
35
+ type: "number",
36
+ description: "Maximum payment amount in USD (safety limit, default: 1.00)",
37
+ },
38
+ },
39
+ required: ["url"],
40
+ },
41
+ },
42
+ ];
43
+ // ============================================================================
44
+ // HANDLERS
45
+ // ============================================================================
46
+ async function handleX402Request(args) {
47
+ if (!hasAuthentication()) {
48
+ return {
49
+ error: "No wallet configured. Call configure_wallet first. x402 requires a signing key for payments.",
50
+ };
51
+ }
52
+ const sdk = getAuthenticatedSDK();
53
+ if (!sdk)
54
+ return { error: "Failed to initialize authenticated SDK." };
55
+ const url = args.url;
56
+ const method = (args.method ?? "GET").toUpperCase();
57
+ const autoPay = args.autoPay ?? false;
58
+ const maxPaymentUsd = args.maxPaymentUsd ?? 1.0;
59
+ const headers = args.headers ?? {};
60
+ const body = args.body;
61
+ const fetchOptions = {
62
+ method,
63
+ headers: { ...headers },
64
+ };
65
+ if (body && (method === "POST" || method === "PUT")) {
66
+ fetchOptions.body = body;
67
+ if (!headers["Content-Type"]) {
68
+ fetchOptions.headers["Content-Type"] = "application/json";
69
+ }
70
+ }
71
+ const result = await sdk.request({
72
+ url,
73
+ method: method,
74
+ headers,
75
+ body: body ? JSON.parse(body) : undefined,
76
+ });
77
+ if (isX402Required(result)) {
78
+ const payment = result.x402Payment;
79
+ if (!autoPay) {
80
+ return {
81
+ status: "payment_required",
82
+ x402: true,
83
+ paymentDetails: {
84
+ note: "Server requires x402 payment. Set autoPay: true to pay automatically.",
85
+ },
86
+ };
87
+ }
88
+ // Auto-pay: execute payment and retry
89
+ try {
90
+ const paidResult = await payment.pay();
91
+ return {
92
+ status: "paid",
93
+ x402: true,
94
+ result: paidResult,
95
+ };
96
+ }
97
+ catch (payError) {
98
+ const msg = payError instanceof Error ? payError.message : String(payError);
99
+ return {
100
+ status: "payment_failed",
101
+ x402: true,
102
+ error: msg,
103
+ };
104
+ }
105
+ }
106
+ // Successful response (no 402)
107
+ return {
108
+ status: "ok",
109
+ x402: false,
110
+ result: result,
111
+ };
112
+ }
113
+ // ============================================================================
114
+ // DISPATCH
115
+ // ============================================================================
116
+ export async function handlePaymentsTool(name, args) {
117
+ switch (name) {
118
+ case "x402_request":
119
+ return handleX402Request(args);
120
+ default:
121
+ return { error: `Unknown payments tool: ${name}` };
122
+ }
123
+ }
124
+ //# sourceMappingURL=payments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payments.js","sourceRoot":"","sources":["../../src/tools/payments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const registrationTools: Tool[];
3
+ export declare function handleRegistrationTool(name: string, args: Record<string, unknown>): Promise<unknown>;
@@ -0,0 +1,324 @@
1
+ import { getAuthenticatedSDK, hasAuthentication, getAuthStatus, setDerivedKey, setChainId, } from "../auth/sdk-client.js";
2
+ import { getDerivationMessage, deriveWalletFromSignature, verifyDerivationSignature, } from "../auth/wallet-derivation.js";
3
+ import { getChainName } from "../utils/chains.js";
4
+ export const registrationTools = [
5
+ {
6
+ name: "configure_wallet",
7
+ description: "Configure wallet for ERC-8004 write operations (register, feedback, etc.). " +
8
+ "Provide either a private key directly OR a wallet signature for key derivation. " +
9
+ "Also sets the target chain. Must be called before any write operation.",
10
+ inputSchema: {
11
+ type: "object",
12
+ properties: {
13
+ privateKey: {
14
+ type: "string",
15
+ description: "Hex private key (0x-prefixed). Use this if you have a dedicated agent key.",
16
+ },
17
+ signature: {
18
+ type: "string",
19
+ description: "Wallet signature of the derivation message (from personal_sign). " +
20
+ "Use get_derivation_message first, then sign it with your wallet.",
21
+ },
22
+ signerAddress: {
23
+ type: "string",
24
+ description: "The wallet address that produced the signature (for verification).",
25
+ },
26
+ chainId: {
27
+ type: "number",
28
+ description: "Target chain ID (default: 11155111 Sepolia). Use 1 for Ethereum Mainnet, 8453 for Base.",
29
+ },
30
+ },
31
+ },
32
+ },
33
+ {
34
+ name: "get_derivation_message",
35
+ description: "Get the message that must be signed with your wallet to derive an ERC-8004 agent key. " +
36
+ "Sign this message with personal_sign, then pass the signature to configure_wallet.",
37
+ inputSchema: {
38
+ type: "object",
39
+ properties: {},
40
+ },
41
+ },
42
+ {
43
+ name: "get_auth_status",
44
+ description: "Check if a wallet is configured for write operations. " +
45
+ "Shows key source, chain ID, and whether the SDK is in read-only mode.",
46
+ inputSchema: {
47
+ type: "object",
48
+ properties: {},
49
+ },
50
+ },
51
+ {
52
+ name: "register_agent",
53
+ description: "Register a new AI agent on-chain via ERC-8004. Requires configured wallet. " +
54
+ "Creates the agent with name, description, endpoints, and capabilities. " +
55
+ "Returns the on-chain agent ID and URI.",
56
+ inputSchema: {
57
+ type: "object",
58
+ properties: {
59
+ name: {
60
+ type: "string",
61
+ description: "Agent name",
62
+ },
63
+ description: {
64
+ type: "string",
65
+ description: "Agent description",
66
+ },
67
+ image: {
68
+ type: "string",
69
+ description: "Agent image URL (optional)",
70
+ },
71
+ mcpEndpoint: {
72
+ type: "string",
73
+ description: "MCP server endpoint URL (optional)",
74
+ },
75
+ a2aEndpoint: {
76
+ type: "string",
77
+ description: "A2A agent card URL (optional)",
78
+ },
79
+ active: {
80
+ type: "boolean",
81
+ description: "Set agent as active (default: true)",
82
+ },
83
+ x402support: {
84
+ type: "boolean",
85
+ description: "Agent supports x402 payments (default: false)",
86
+ },
87
+ trustReputation: {
88
+ type: "boolean",
89
+ description: "Enable reputation trust model (default: true)",
90
+ },
91
+ trustCryptoEconomic: {
92
+ type: "boolean",
93
+ description: "Enable crypto-economic trust model (default: false)",
94
+ },
95
+ trustTEE: {
96
+ type: "boolean",
97
+ description: "Enable TEE attestation trust model (default: false)",
98
+ },
99
+ metadata: {
100
+ type: "object",
101
+ description: "Additional metadata key-value pairs",
102
+ },
103
+ registrationMethod: {
104
+ type: "string",
105
+ enum: ["ipfs", "onchain"],
106
+ description: "Registration method: 'ipfs' (default, stores on IPFS) or 'onchain' (data URI, higher gas)",
107
+ },
108
+ },
109
+ required: ["name", "description"],
110
+ },
111
+ },
112
+ {
113
+ name: "update_agent",
114
+ description: "Update an existing agent's properties (description, endpoints, metadata). " +
115
+ "Requires configured wallet and agent ownership.",
116
+ inputSchema: {
117
+ type: "object",
118
+ properties: {
119
+ agentId: {
120
+ type: "string",
121
+ description: "Agent ID in chainId:tokenId format",
122
+ },
123
+ description: {
124
+ type: "string",
125
+ description: "Updated description",
126
+ },
127
+ image: {
128
+ type: "string",
129
+ description: "Updated image URL",
130
+ },
131
+ mcpEndpoint: {
132
+ type: "string",
133
+ description: "Updated MCP endpoint",
134
+ },
135
+ a2aEndpoint: {
136
+ type: "string",
137
+ description: "Updated A2A endpoint",
138
+ },
139
+ active: {
140
+ type: "boolean",
141
+ description: "Set agent active/inactive",
142
+ },
143
+ metadata: {
144
+ type: "object",
145
+ description: "Metadata to merge (key-value pairs)",
146
+ },
147
+ },
148
+ required: ["agentId"],
149
+ },
150
+ },
151
+ ];
152
+ // ============================================================================
153
+ // HANDLERS
154
+ // ============================================================================
155
+ function requireAuth() {
156
+ if (!hasAuthentication()) {
157
+ return {
158
+ sdk: null,
159
+ error: "No wallet configured. Call configure_wallet first with a private key or signature.",
160
+ };
161
+ }
162
+ const sdk = getAuthenticatedSDK();
163
+ if (!sdk) {
164
+ return { sdk: null, error: "Failed to initialize authenticated SDK." };
165
+ }
166
+ return { sdk };
167
+ }
168
+ async function handleConfigureWallet(args) {
169
+ // Set chain if provided
170
+ if (args.chainId) {
171
+ setChainId(args.chainId);
172
+ }
173
+ if (args.privateKey) {
174
+ // Direct private key
175
+ const key = args.privateKey;
176
+ if (!key.startsWith("0x") || key.length !== 66) {
177
+ return { error: "Invalid private key format. Must be 0x-prefixed 32-byte hex." };
178
+ }
179
+ setDerivedKey(key);
180
+ const status = getAuthStatus();
181
+ return {
182
+ success: true,
183
+ method: "direct_key",
184
+ chainId: status.chainId,
185
+ chain: getChainName(status.chainId),
186
+ };
187
+ }
188
+ if (args.signature) {
189
+ const signature = args.signature;
190
+ const signerAddress = args.signerAddress;
191
+ // Verify signature if address provided
192
+ if (signerAddress) {
193
+ const valid = verifyDerivationSignature(signature, signerAddress);
194
+ if (!valid) {
195
+ return {
196
+ error: `Signature verification failed. The signature was not produced by ${signerAddress}.`,
197
+ };
198
+ }
199
+ }
200
+ // Derive key from signature
201
+ const derived = deriveWalletFromSignature(signature);
202
+ setDerivedKey(derived.privateKey);
203
+ const status = getAuthStatus();
204
+ return {
205
+ success: true,
206
+ method: "derived_from_signature",
207
+ derivedAddress: derived.address,
208
+ chainId: status.chainId,
209
+ chain: getChainName(status.chainId),
210
+ note: "Derived address is your ERC-8004 agent identity. It is deterministic from your wallet signature.",
211
+ };
212
+ }
213
+ // No key or signature — just set chain
214
+ if (args.chainId) {
215
+ return {
216
+ success: true,
217
+ method: "chain_only",
218
+ chainId: args.chainId,
219
+ chain: getChainName(args.chainId),
220
+ note: "Chain updated. No signing key configured — read-only mode.",
221
+ };
222
+ }
223
+ return {
224
+ error: "Provide either privateKey or signature. Use get_derivation_message to get the message to sign.",
225
+ };
226
+ }
227
+ async function handleRegisterAgent(args) {
228
+ const { sdk, error } = requireAuth();
229
+ if (error || !sdk)
230
+ return { error };
231
+ const agent = sdk.createAgent(args.name, args.description, args.image ?? undefined);
232
+ // Configure endpoints
233
+ if (args.mcpEndpoint) {
234
+ await agent.setMCP(args.mcpEndpoint);
235
+ }
236
+ if (args.a2aEndpoint) {
237
+ await agent.setA2A(args.a2aEndpoint);
238
+ }
239
+ // Trust models
240
+ agent.setTrust(args.trustReputation ?? true, args.trustCryptoEconomic ?? false, args.trustTEE ?? false);
241
+ // Active status
242
+ agent.setActive(args.active ?? true);
243
+ // Metadata
244
+ if (args.metadata) {
245
+ agent.setMetadata(args.metadata);
246
+ }
247
+ // Register
248
+ const method = args.registrationMethod ?? "ipfs";
249
+ const tx = method === "onchain"
250
+ ? await agent.registerOnChain()
251
+ : await agent.registerIPFS();
252
+ const mined = await tx.waitConfirmed({ timeoutMs: 180_000 });
253
+ const regFile = mined.result;
254
+ return {
255
+ success: true,
256
+ agentId: regFile.agentId,
257
+ agentURI: regFile.agentURI,
258
+ txHash: mined.receipt.transactionHash,
259
+ method,
260
+ chain: getChainName(await sdk.chainId()),
261
+ };
262
+ }
263
+ async function handleUpdateAgent(args) {
264
+ const { sdk, error } = requireAuth();
265
+ if (error || !sdk)
266
+ return { error };
267
+ const agentId = args.agentId;
268
+ if (!agentId)
269
+ return { error: "agentId is required" };
270
+ const agent = await sdk.loadAgent(agentId);
271
+ if (args.description !== undefined) {
272
+ agent.updateInfo(undefined, args.description, undefined);
273
+ }
274
+ if (args.image !== undefined) {
275
+ agent.updateInfo(undefined, undefined, args.image);
276
+ }
277
+ if (args.mcpEndpoint) {
278
+ await agent.setMCP(args.mcpEndpoint);
279
+ }
280
+ if (args.a2aEndpoint) {
281
+ await agent.setA2A(args.a2aEndpoint);
282
+ }
283
+ if (args.active !== undefined) {
284
+ agent.setActive(args.active);
285
+ }
286
+ if (args.metadata) {
287
+ agent.setMetadata(args.metadata);
288
+ }
289
+ // Re-register to update
290
+ const tx = await agent.registerIPFS();
291
+ const mined = await tx.waitConfirmed({ timeoutMs: 180_000 });
292
+ const regFile = mined.result;
293
+ return {
294
+ success: true,
295
+ agentId,
296
+ agentURI: regFile.agentURI,
297
+ txHash: mined.receipt.transactionHash,
298
+ chain: getChainName(await sdk.chainId()),
299
+ };
300
+ }
301
+ // ============================================================================
302
+ // DISPATCH
303
+ // ============================================================================
304
+ export async function handleRegistrationTool(name, args) {
305
+ switch (name) {
306
+ case "configure_wallet":
307
+ return handleConfigureWallet(args);
308
+ case "get_derivation_message":
309
+ return {
310
+ message: getDerivationMessage(),
311
+ instructions: "Sign this message with personal_sign using your wallet, " +
312
+ "then pass the signature to configure_wallet.",
313
+ };
314
+ case "get_auth_status":
315
+ return getAuthStatus();
316
+ case "register_agent":
317
+ return handleRegisterAgent(args);
318
+ case "update_agent":
319
+ return handleUpdateAgent(args);
320
+ default:
321
+ return { error: `Unknown registration tool: ${name}` };
322
+ }
323
+ }
324
+ //# sourceMappingURL=registration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration.js","sourceRoot":"","sources":["../../src/tools/registration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const reputationTools: Tool[];
3
+ export declare function handleReputationTool(name: string, args: Record<string, unknown>): Promise<unknown>;
@@ -0,0 +1,147 @@
1
+ import { getAuthenticatedSDK, hasAuthentication, } from "../auth/sdk-client.js";
2
+ import { getChainName } from "../utils/chains.js";
3
+ export const reputationTools = [
4
+ {
5
+ name: "give_feedback",
6
+ description: "Submit on-chain feedback/review for an ERC-8004 agent. Requires configured wallet. " +
7
+ "Creates a permanent, verifiable review with a score (0-100), tags, and optional text.",
8
+ inputSchema: {
9
+ type: "object",
10
+ properties: {
11
+ agentId: {
12
+ type: "string",
13
+ description: "Agent ID in chainId:tokenId format (e.g. '11155111:42')",
14
+ },
15
+ value: {
16
+ type: "number",
17
+ description: "Feedback score from 0 (worst) to 100 (best)",
18
+ },
19
+ tag1: {
20
+ type: "string",
21
+ description: "Primary tag (e.g. 'quality', 'reliability', 'enterprise')",
22
+ },
23
+ tag2: {
24
+ type: "string",
25
+ description: "Secondary tag (optional)",
26
+ },
27
+ endpoint: {
28
+ type: "string",
29
+ description: "Specific endpoint being reviewed (optional)",
30
+ },
31
+ text: {
32
+ type: "string",
33
+ description: "Free-text review content (stored off-chain via IPFS)",
34
+ },
35
+ mcpTool: {
36
+ type: "string",
37
+ description: "Specific MCP tool being reviewed (optional)",
38
+ },
39
+ a2aSkills: {
40
+ type: "array",
41
+ items: { type: "string" },
42
+ description: "A2A skills being reviewed (optional)",
43
+ },
44
+ },
45
+ required: ["agentId", "value"],
46
+ },
47
+ },
48
+ {
49
+ name: "revoke_feedback",
50
+ description: "Revoke previously submitted feedback. Only the original reviewer can revoke. " +
51
+ "Requires configured wallet.",
52
+ inputSchema: {
53
+ type: "object",
54
+ properties: {
55
+ agentId: {
56
+ type: "string",
57
+ description: "Agent ID in chainId:tokenId format",
58
+ },
59
+ feedbackIndex: {
60
+ type: "number",
61
+ description: "The feedback index to revoke (from the reviewer's feedback list)",
62
+ },
63
+ },
64
+ required: ["agentId", "feedbackIndex"],
65
+ },
66
+ },
67
+ ];
68
+ // ============================================================================
69
+ // HANDLERS
70
+ // ============================================================================
71
+ function requireAuth() {
72
+ if (!hasAuthentication()) {
73
+ return {
74
+ sdk: null,
75
+ error: "No wallet configured. Call configure_wallet first.",
76
+ };
77
+ }
78
+ const sdk = getAuthenticatedSDK();
79
+ if (!sdk) {
80
+ return { sdk: null, error: "Failed to initialize authenticated SDK." };
81
+ }
82
+ return { sdk, error: undefined };
83
+ }
84
+ async function handleGiveFeedback(args) {
85
+ const { sdk, error } = requireAuth();
86
+ if (error || !sdk)
87
+ return { error };
88
+ const agentId = args.agentId;
89
+ const value = args.value;
90
+ if (value < 0 || value > 100) {
91
+ return { error: "Feedback value must be between 0 and 100" };
92
+ }
93
+ // Build off-chain feedback file if rich fields provided
94
+ let feedbackFile;
95
+ if (args.text || args.mcpTool || args.a2aSkills) {
96
+ feedbackFile = sdk.prepareFeedbackFile({
97
+ text: args.text,
98
+ mcpTool: args.mcpTool,
99
+ a2aSkills: args.a2aSkills,
100
+ });
101
+ }
102
+ const tx = await sdk.giveFeedback(agentId, value, args.tag1 ?? undefined, args.tag2 ?? undefined, args.endpoint ?? undefined, feedbackFile);
103
+ const mined = await tx.waitConfirmed({ timeoutMs: 120_000 });
104
+ const parts = agentId.split(":");
105
+ const chainId = parts.length === 2 ? parseInt(parts[0], 10) : await sdk.chainId();
106
+ return {
107
+ success: true,
108
+ agentId,
109
+ value,
110
+ tags: [args.tag1, args.tag2].filter(Boolean),
111
+ txHash: mined.receipt.transactionHash,
112
+ chain: getChainName(chainId),
113
+ };
114
+ }
115
+ async function handleRevokeFeedback(args) {
116
+ const { sdk, error } = requireAuth();
117
+ if (error || !sdk)
118
+ return { error };
119
+ const agentId = args.agentId;
120
+ const feedbackIndex = args.feedbackIndex;
121
+ const tx = await sdk.revokeFeedback(agentId, feedbackIndex);
122
+ const mined = await tx.waitConfirmed({ timeoutMs: 120_000 });
123
+ const parts = agentId.split(":");
124
+ const chainId = parts.length === 2 ? parseInt(parts[0], 10) : await sdk.chainId();
125
+ return {
126
+ success: true,
127
+ agentId,
128
+ feedbackIndex,
129
+ txHash: mined.receipt.transactionHash,
130
+ isRevoked: true,
131
+ chain: getChainName(chainId),
132
+ };
133
+ }
134
+ // ============================================================================
135
+ // DISPATCH
136
+ // ============================================================================
137
+ export async function handleReputationTool(name, args) {
138
+ switch (name) {
139
+ case "give_feedback":
140
+ return handleGiveFeedback(args);
141
+ case "revoke_feedback":
142
+ return handleRevokeFeedback(args);
143
+ default:
144
+ return { error: `Unknown reputation tool: ${name}` };
145
+ }
146
+ }
147
+ //# sourceMappingURL=reputation.js.map