@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,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,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,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,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
|