@azeth/mcp-server 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +141 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/account.d.ts +4 -0
- package/dist/tools/account.d.ts.map +1 -0
- package/dist/tools/account.js +640 -0
- package/dist/tools/account.js.map +1 -0
- package/dist/tools/agreements.d.ts +4 -0
- package/dist/tools/agreements.d.ts.map +1 -0
- package/dist/tools/agreements.js +865 -0
- package/dist/tools/agreements.js.map +1 -0
- package/dist/tools/guardian-approval.d.ts +4 -0
- package/dist/tools/guardian-approval.d.ts.map +1 -0
- package/dist/tools/guardian-approval.js +319 -0
- package/dist/tools/guardian-approval.js.map +1 -0
- package/dist/tools/guardian.d.ts +4 -0
- package/dist/tools/guardian.d.ts.map +1 -0
- package/dist/tools/guardian.js +267 -0
- package/dist/tools/guardian.js.map +1 -0
- package/dist/tools/messaging.d.ts +4 -0
- package/dist/tools/messaging.d.ts.map +1 -0
- package/dist/tools/messaging.js +353 -0
- package/dist/tools/messaging.js.map +1 -0
- package/dist/tools/payments.d.ts +14 -0
- package/dist/tools/payments.d.ts.map +1 -0
- package/dist/tools/payments.js +723 -0
- package/dist/tools/payments.js.map +1 -0
- package/dist/tools/registry.d.ts +4 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +608 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/reputation.d.ts +4 -0
- package/dist/tools/reputation.d.ts.map +1 -0
- package/dist/tools/reputation.js +433 -0
- package/dist/tools/reputation.js.map +1 -0
- package/dist/tools/transfer.d.ts +4 -0
- package/dist/tools/transfer.d.ts.map +1 -0
- package/dist/tools/transfer.js +181 -0
- package/dist/tools/transfer.js.map +1 -0
- package/dist/utils/client.d.ts +25 -0
- package/dist/utils/client.d.ts.map +1 -0
- package/dist/utils/client.js +100 -0
- package/dist/utils/client.js.map +1 -0
- package/dist/utils/error-selectors.d.ts +23 -0
- package/dist/utils/error-selectors.d.ts.map +1 -0
- package/dist/utils/error-selectors.js +159 -0
- package/dist/utils/error-selectors.js.map +1 -0
- package/dist/utils/rate-limit.d.ts +17 -0
- package/dist/utils/rate-limit.d.ts.map +1 -0
- package/dist/utils/rate-limit.js +75 -0
- package/dist/utils/rate-limit.js.map +1 -0
- package/dist/utils/resolve.d.ts +38 -0
- package/dist/utils/resolve.d.ts.map +1 -0
- package/dist/utils/resolve.js +308 -0
- package/dist/utils/resolve.js.map +1 -0
- package/dist/utils/response.d.ts +42 -0
- package/dist/utils/response.d.ts.map +1 -0
- package/dist/utils/response.js +257 -0
- package/dist/utils/response.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
/** Register reputation MCP tools: azeth_submit_opinion, azeth_get_weighted_reputation, azeth_get_net_paid */
|
|
3
|
+
export declare function registerReputationTools(server: McpServer): void;
|
|
4
|
+
//# sourceMappingURL=reputation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reputation.d.ts","sourceRoot":"","sources":["../../src/tools/reputation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsBzE,6GAA6G;AAC7G,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAub/D"}
|
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { createClient, resolveChain, resolveViemChain, validateAddress } from '../utils/client.js';
|
|
3
|
+
import { success, error, handleError } from '../utils/response.js';
|
|
4
|
+
import { ReputationModuleAbi, TrustRegistryModuleAbi } from '@azeth/common/abis';
|
|
5
|
+
import { AzethError, AZETH_CONTRACTS, formatTokenAmount } from '@azeth/common';
|
|
6
|
+
/** Maximum uint256 value for on-chain IDs */
|
|
7
|
+
const MAX_UINT256 = (1n << 256n) - 1n;
|
|
8
|
+
/** Validate that a numeric string fits within uint256 range.
|
|
9
|
+
* L-19 fix (Audit #8): Wrap BigInt() in try/catch for defense-in-depth. */
|
|
10
|
+
function validateUint256(value, fieldName) {
|
|
11
|
+
try {
|
|
12
|
+
const n = BigInt(value);
|
|
13
|
+
if (n < 0n || n > MAX_UINT256) {
|
|
14
|
+
return { valid: false, fieldName };
|
|
15
|
+
}
|
|
16
|
+
return { valid: true, bigint: n };
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return { valid: false, fieldName };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Register reputation MCP tools: azeth_submit_opinion, azeth_get_weighted_reputation, azeth_get_net_paid */
|
|
23
|
+
export function registerReputationTools(server) {
|
|
24
|
+
// ──────────────────────────────────────────────
|
|
25
|
+
// azeth_submit_opinion
|
|
26
|
+
// ──────────────────────────────────────────────
|
|
27
|
+
server.registerTool('azeth_submit_opinion', {
|
|
28
|
+
description: [
|
|
29
|
+
'Submit payment-gated reputation opinion for an agent or service on the ERC-8004 Reputation Registry.',
|
|
30
|
+
'',
|
|
31
|
+
'Use this when: You have interacted with an agent/service and want to rate their performance.',
|
|
32
|
+
'Opinion weight is determined by how much you have paid the target in USD (payment-gated).',
|
|
33
|
+
'If you update your opinion for the same agent, the previous entry is automatically revoked.',
|
|
34
|
+
'',
|
|
35
|
+
'Returns: The transaction hash of the opinion submission.',
|
|
36
|
+
'',
|
|
37
|
+
'Note: This is a state-changing on-chain operation via the Azeth ReputationModule.',
|
|
38
|
+
'The rating field is a number from -100 to 100 (supports decimals like 85.5).',
|
|
39
|
+
'Stored on-chain in WAD format (18-decimal) for consistent aggregation.',
|
|
40
|
+
'You must have a minimum USD payment to the target (payment-gated).',
|
|
41
|
+
'Tags allow categorization (e.g., tag1="quality", tag2="x402").',
|
|
42
|
+
'The submitter account is determined by the AZETH_PRIVATE_KEY environment variable.',
|
|
43
|
+
'',
|
|
44
|
+
'Example: { "agentId": "1024", "rating": 85, "tag1": "quality", "tag2": "x402" }',
|
|
45
|
+
'Example (negative): { "agentId": "1024", "rating": -50, "tag1": "reliability", "tag2": "downtime" }',
|
|
46
|
+
].join('\n'),
|
|
47
|
+
inputSchema: z.object({
|
|
48
|
+
chain: z.string().optional().describe('Target chain. Defaults to AZETH_CHAIN env var or "baseSepolia". Accepts "base", "baseSepolia", "ethereumSepolia", "ethereum" (and aliases like "base-sepolia", "eth-sepolia", "sepolia", "eth", "mainnet").'),
|
|
49
|
+
agentId: z.string().regex(/^\d+$/, 'Must be a non-negative integer string').describe('Target agent\'s ERC-8004 token ID (numeric string).'),
|
|
50
|
+
rating: z.number().min(-100).max(100).describe('Rating from -100 to 100 (supports decimals like 85.5). Stored on-chain in WAD (18-decimal) format.'),
|
|
51
|
+
tag1: z.string().max(64).regex(/^[\x20-\x7E]*$/, 'ASCII printable characters only').default('quality').describe('Primary categorization tag (e.g., "quality", "uptime", "speed"). Default: "quality".'),
|
|
52
|
+
tag2: z.string().max(64).regex(/^[\x20-\x7E]*$/, 'ASCII printable characters only').default('').describe('Secondary categorization tag (e.g., "x402", "rpc", "swap").'),
|
|
53
|
+
endpoint: z.string().max(2048).default('').describe('Service endpoint being rated (optional).'),
|
|
54
|
+
opinionURI: z.string().max(2048).default('').describe('URI containing detailed opinion data (optional).'),
|
|
55
|
+
opinionHash: z.string()
|
|
56
|
+
.regex(/^0x[0-9a-fA-F]{64}$/, 'Must be a valid bytes32 hex string (0x + 64 hex chars)')
|
|
57
|
+
.default('0x0000000000000000000000000000000000000000000000000000000000000000')
|
|
58
|
+
.describe('Hash of the opinion data for integrity verification (optional, 0x-prefixed bytes32).'),
|
|
59
|
+
}),
|
|
60
|
+
}, async (args) => {
|
|
61
|
+
const agentIdCheck = validateUint256(args.agentId, 'agentId');
|
|
62
|
+
if (!agentIdCheck.valid) {
|
|
63
|
+
return error('INVALID_INPUT', `${agentIdCheck.fieldName} exceeds maximum uint256 value`);
|
|
64
|
+
}
|
|
65
|
+
// Convert rating (-100 to 100, supports decimals) to WAD (18-decimal) on-chain value
|
|
66
|
+
// e.g., rating=85 → value=85e18, rating=85.5 → value=85.5e18
|
|
67
|
+
const wadValue = BigInt(Math.round(args.rating * 1e18));
|
|
68
|
+
let client;
|
|
69
|
+
try {
|
|
70
|
+
client = await createClient(args.chain);
|
|
71
|
+
const txHash = await client.submitOpinion({
|
|
72
|
+
agentId: agentIdCheck.bigint,
|
|
73
|
+
value: wadValue,
|
|
74
|
+
valueDecimals: 18, // Always WAD
|
|
75
|
+
tag1: args.tag1,
|
|
76
|
+
tag2: args.tag2,
|
|
77
|
+
endpoint: args.endpoint,
|
|
78
|
+
opinionURI: args.opinionURI,
|
|
79
|
+
opinionHash: args.opinionHash,
|
|
80
|
+
});
|
|
81
|
+
return success({
|
|
82
|
+
txHash,
|
|
83
|
+
agentId: args.agentId,
|
|
84
|
+
rating: args.rating,
|
|
85
|
+
ratingScale: '[-100, 100]',
|
|
86
|
+
tag1: args.tag1,
|
|
87
|
+
tag2: args.tag2,
|
|
88
|
+
onChainEncoding: {
|
|
89
|
+
value: wadValue.toString(),
|
|
90
|
+
valueDecimals: 18,
|
|
91
|
+
format: 'WAD (18-decimal)',
|
|
92
|
+
},
|
|
93
|
+
}, { txHash });
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
return handleError(err);
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
try {
|
|
100
|
+
await client?.destroy();
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
process.stderr.write(`[azeth-mcp] destroy error: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
// ──────────────────────────────────────────────
|
|
108
|
+
// azeth_get_weighted_reputation
|
|
109
|
+
// ──────────────────────────────────────────────
|
|
110
|
+
server.registerTool('azeth_get_weighted_reputation', {
|
|
111
|
+
description: [
|
|
112
|
+
'Get USD-weighted reputation for an agent from the on-chain ReputationModule.',
|
|
113
|
+
'',
|
|
114
|
+
'Use this when: You want to check the reputation of an agent or service before interacting.',
|
|
115
|
+
'Returns a weighted average where each rater\'s influence is proportional to their USD payment to the agent.',
|
|
116
|
+
'',
|
|
117
|
+
'Returns: Weighted reputation with weightedValue (int256), totalWeight, and opinionCount.',
|
|
118
|
+
'',
|
|
119
|
+
'Note: This is a read-only on-chain query. No private key or gas is required.',
|
|
120
|
+
'Leave raters empty to aggregate across all raters who have submitted opinions.',
|
|
121
|
+
'',
|
|
122
|
+
'Example: { "agentId": "1024" } or { "agentId": "1024", "raters": ["0x1234...abcd"] }',
|
|
123
|
+
].join('\n'),
|
|
124
|
+
inputSchema: z.object({
|
|
125
|
+
chain: z.string().optional().describe('Target chain. Defaults to AZETH_CHAIN env var or "baseSepolia". Accepts "base", "baseSepolia", "ethereumSepolia", "ethereum" (and aliases like "base-sepolia", "eth-sepolia", "sepolia", "eth", "mainnet").'),
|
|
126
|
+
agentId: z.string().regex(/^\d+$/, 'Must be a non-negative integer string').describe('Target agent\'s ERC-8004 token ID (numeric string).'),
|
|
127
|
+
raters: z.preprocess((val) => typeof val === 'string' ? JSON.parse(val) : val, z.array(z.string().regex(/^0x[0-9a-fA-F]{40}$/, 'Each rater must be a valid Ethereum address')).default([])).describe('Specific rater addresses to include (optional). Empty = all raters.'),
|
|
128
|
+
}),
|
|
129
|
+
}, async (args) => {
|
|
130
|
+
const agentIdCheck = validateUint256(args.agentId, 'agentId');
|
|
131
|
+
if (!agentIdCheck.valid) {
|
|
132
|
+
return error('INVALID_INPUT', `${agentIdCheck.fieldName} exceeds maximum uint256 value`);
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
const { createPublicClient, http } = await import('viem');
|
|
136
|
+
const resolved = resolveChain(args.chain);
|
|
137
|
+
const chain = resolveViemChain(resolved);
|
|
138
|
+
const rpcUrl = process.env['AZETH_RPC_URL'];
|
|
139
|
+
const publicClient = createPublicClient({
|
|
140
|
+
chain,
|
|
141
|
+
transport: http(rpcUrl),
|
|
142
|
+
});
|
|
143
|
+
const moduleAddress = AZETH_CONTRACTS[resolved].reputationModule;
|
|
144
|
+
if (!moduleAddress || moduleAddress === '') {
|
|
145
|
+
return error('NETWORK_ERROR', `ReputationModule not deployed on ${resolved}.`, 'Deploy the ReputationModule first or switch to baseSepolia.');
|
|
146
|
+
}
|
|
147
|
+
// Check if the token ID exists on the trust registry before querying reputation
|
|
148
|
+
const trustRegistryAddr = AZETH_CONTRACTS[resolved].trustRegistryModule;
|
|
149
|
+
if (trustRegistryAddr && trustRegistryAddr !== '') {
|
|
150
|
+
try {
|
|
151
|
+
const accountAddr = await publicClient.readContract({
|
|
152
|
+
address: trustRegistryAddr,
|
|
153
|
+
abi: TrustRegistryModuleAbi,
|
|
154
|
+
functionName: 'getAccountByTokenId',
|
|
155
|
+
args: [agentIdCheck.bigint],
|
|
156
|
+
});
|
|
157
|
+
if (accountAddr === '0x0000000000000000000000000000000000000000') {
|
|
158
|
+
return success({
|
|
159
|
+
agentId: args.agentId,
|
|
160
|
+
weightedValue: '0',
|
|
161
|
+
totalWeight: '0',
|
|
162
|
+
opinionCount: '0',
|
|
163
|
+
warning: `No agent registered with token ID ${args.agentId}. The returned zeros indicate no registration, not a zero reputation.`,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// getAccountByTokenId may not exist on older deployments — proceed with query
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const raterAddrs = args.raters
|
|
172
|
+
.filter((a) => /^0x[0-9a-fA-F]{40}$/.test(a));
|
|
173
|
+
let result;
|
|
174
|
+
if (raterAddrs.length > 0) {
|
|
175
|
+
result = await publicClient.readContract({
|
|
176
|
+
address: moduleAddress,
|
|
177
|
+
abi: ReputationModuleAbi,
|
|
178
|
+
functionName: 'getWeightedReputation',
|
|
179
|
+
args: [agentIdCheck.bigint, raterAddrs],
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
result = await publicClient.readContract({
|
|
184
|
+
address: moduleAddress,
|
|
185
|
+
abi: ReputationModuleAbi,
|
|
186
|
+
functionName: 'getWeightedReputationAll',
|
|
187
|
+
args: [agentIdCheck.bigint],
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
const [weightedValue, totalWeight, opinionCount] = result;
|
|
191
|
+
// Format weighted value: the contract returns values in the same decimal precision
|
|
192
|
+
// as the submitted opinions. For the default MCP submission (valueDecimals=0), this
|
|
193
|
+
// is an integer. For SDK submissions with 18 decimals, format accordingly.
|
|
194
|
+
// Heuristic: if |value| > 10^15, it's likely 18-decimal; otherwise treat as integer.
|
|
195
|
+
const absValue = weightedValue < 0n ? -weightedValue : weightedValue;
|
|
196
|
+
const isHighPrecision = absValue > 10n ** 15n;
|
|
197
|
+
const weightedValueFormatted = isHighPrecision
|
|
198
|
+
? formatTokenAmount(weightedValue, 18, 4)
|
|
199
|
+
: weightedValue.toString();
|
|
200
|
+
// totalWeight is a dampened dimensionless value: sum of pow2over3(netPaidUSD) across raters.
|
|
201
|
+
// It is NOT USD — do not format as currency. Display as a plain number.
|
|
202
|
+
const totalWeightFormatted = formatTokenAmount(totalWeight, 12, 2);
|
|
203
|
+
return success({
|
|
204
|
+
agentId: args.agentId,
|
|
205
|
+
weightedValue: weightedValue.toString(),
|
|
206
|
+
weightedValueFormatted,
|
|
207
|
+
totalWeight: totalWeight.toString(),
|
|
208
|
+
totalWeightFormatted,
|
|
209
|
+
totalWeightDescription: 'Aggregate economic skin-in-the-game (higher = more payments behind opinions)',
|
|
210
|
+
opinionCount: opinionCount.toString(),
|
|
211
|
+
ratersFilter: raterAddrs.length > 0 ? raterAddrs : '(all raters)',
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
return handleError(err);
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
// ──────────────────────────────────────────────
|
|
219
|
+
// azeth_get_net_paid
|
|
220
|
+
// ──────────────────────────────────────────────
|
|
221
|
+
server.registerTool('azeth_get_net_paid', {
|
|
222
|
+
description: [
|
|
223
|
+
'Check how much one account has paid another — either total USD or per-token.',
|
|
224
|
+
'',
|
|
225
|
+
'Use this when: You want to verify payment history between two accounts,',
|
|
226
|
+
'which determines feedback weight in the payment-gated reputation system.',
|
|
227
|
+
'',
|
|
228
|
+
'Two modes:',
|
|
229
|
+
' • No token (default): Returns total net paid in 18-decimal USD, aggregated',
|
|
230
|
+
' across all tokens via the on-chain oracle. Always >= 0.',
|
|
231
|
+
' • With token: Returns the signed per-token delta. Positive = "from" paid more,',
|
|
232
|
+
' negative = "to" paid more. Use 0x0...0 for native ETH.',
|
|
233
|
+
'',
|
|
234
|
+
'"from" defaults to your own address ("me") if omitted. "to" accepts a name, address, or "me".',
|
|
235
|
+
'',
|
|
236
|
+
'Note: This is a read-only on-chain query. No private key or gas is required',
|
|
237
|
+
'(unless "me" or a name is used for resolution).',
|
|
238
|
+
'',
|
|
239
|
+
'Example: { "to": "Alice" } or { "from": "#1", "to": "Bob", "token": "0x036CbD53842c5426634e7929541eC2318f3dCF7e" }',
|
|
240
|
+
].join('\n'),
|
|
241
|
+
inputSchema: z.object({
|
|
242
|
+
chain: z.string().optional().describe('Target chain. Defaults to AZETH_CHAIN env var or "baseSepolia". Accepts "base", "baseSepolia", "ethereumSepolia", "ethereum" (and aliases like "base-sepolia", "eth-sepolia", "sepolia", "eth", "mainnet").'),
|
|
243
|
+
from: z.string().optional().describe('Payer address, name, "me", or "#N" (account index). Defaults to "me" (your first smart account).'),
|
|
244
|
+
to: z.string().describe('Payee address, name, "me", or "#N" (account index).'),
|
|
245
|
+
token: z.string().regex(/^0x[0-9a-fA-F]{40}$/, 'Must be a valid Ethereum address (0x + 40 hex chars)').optional().describe('Token address for per-token delta. Omit for total USD across all tokens. Use "0x0000000000000000000000000000000000000000" for native ETH.'),
|
|
246
|
+
}),
|
|
247
|
+
}, async (args) => {
|
|
248
|
+
try {
|
|
249
|
+
const { createPublicClient, http } = await import('viem');
|
|
250
|
+
const resolved = resolveChain(args.chain);
|
|
251
|
+
const chain = resolveViemChain(resolved);
|
|
252
|
+
const rpcUrl = process.env['AZETH_RPC_URL'];
|
|
253
|
+
const publicClient = createPublicClient({
|
|
254
|
+
chain,
|
|
255
|
+
transport: http(rpcUrl),
|
|
256
|
+
});
|
|
257
|
+
const moduleAddress = AZETH_CONTRACTS[resolved].reputationModule;
|
|
258
|
+
if (!moduleAddress || moduleAddress === '') {
|
|
259
|
+
return error('NETWORK_ERROR', `ReputationModule not deployed on ${resolved}.`, 'Deploy the ReputationModule first or switch to baseSepolia.');
|
|
260
|
+
}
|
|
261
|
+
// Resolve "from" and "to" — support names, "me", "#N"
|
|
262
|
+
const { resolveAddress } = await import('../utils/resolve.js');
|
|
263
|
+
const needsClient = !args.from || !validateAddress(args.from) || !validateAddress(args.to);
|
|
264
|
+
let client;
|
|
265
|
+
if (needsClient) {
|
|
266
|
+
try {
|
|
267
|
+
client = await createClient(resolved);
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
// Client creation may fail if no private key; only needed for "me"/name resolution
|
|
271
|
+
if (!args.from || args.from === 'me' || !validateAddress(args.from)) {
|
|
272
|
+
return error('UNAUTHORIZED', '"from" defaults to "me" which requires AZETH_PRIVATE_KEY. Provide an explicit address instead.');
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
let fromAddr;
|
|
277
|
+
let toAddr;
|
|
278
|
+
let resolvedFromInfo;
|
|
279
|
+
let resolvedToInfo;
|
|
280
|
+
try {
|
|
281
|
+
const fromInput = args.from ?? 'me';
|
|
282
|
+
const fromResult = await resolveAddress(fromInput, client, 'account');
|
|
283
|
+
fromAddr = fromResult.address;
|
|
284
|
+
if (fromResult.resolvedFrom)
|
|
285
|
+
resolvedFromInfo = `"${fromResult.resolvedFrom}" → ${fromResult.address}`;
|
|
286
|
+
const toResult = await resolveAddress(args.to, client, 'account');
|
|
287
|
+
toAddr = toResult.address;
|
|
288
|
+
if (toResult.resolvedFrom)
|
|
289
|
+
resolvedToInfo = `"${toResult.resolvedFrom}" → ${toResult.address}`;
|
|
290
|
+
}
|
|
291
|
+
catch (resolveErr) {
|
|
292
|
+
// Fallback: if name resolution fails due to server being down,
|
|
293
|
+
// provide a clear message suggesting explicit addresses.
|
|
294
|
+
if (resolveErr instanceof AzethError && resolveErr.code === 'NETWORK_ERROR') {
|
|
295
|
+
return error('SERVER_UNAVAILABLE', `Name resolution failed (server unreachable). Provide explicit addresses instead of names.`, 'Use azeth_discover_services or azeth_accounts to find addresses, then pass them directly.');
|
|
296
|
+
}
|
|
297
|
+
return handleError(resolveErr);
|
|
298
|
+
}
|
|
299
|
+
finally {
|
|
300
|
+
try {
|
|
301
|
+
await client?.destroy();
|
|
302
|
+
}
|
|
303
|
+
catch (e) {
|
|
304
|
+
process.stderr.write(`[azeth-mcp] destroy error: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (args.token) {
|
|
308
|
+
// Per-token mode: signed delta
|
|
309
|
+
const netPaid = await publicClient.readContract({
|
|
310
|
+
address: moduleAddress,
|
|
311
|
+
abi: ReputationModuleAbi,
|
|
312
|
+
functionName: 'getNetPaid',
|
|
313
|
+
args: [fromAddr, toAddr, args.token],
|
|
314
|
+
});
|
|
315
|
+
// Format per-token amount
|
|
316
|
+
const { formatTokenAmount } = await import('@azeth/common');
|
|
317
|
+
const { TOKENS } = await import('@azeth/common');
|
|
318
|
+
const tokens = TOKENS[resolved];
|
|
319
|
+
const tokenLower = args.token.toLowerCase();
|
|
320
|
+
let netPaidFormatted;
|
|
321
|
+
let symbol;
|
|
322
|
+
if (tokenLower === tokens.USDC.toLowerCase()) {
|
|
323
|
+
netPaidFormatted = formatTokenAmount(netPaid, 6, 2);
|
|
324
|
+
symbol = 'USDC';
|
|
325
|
+
}
|
|
326
|
+
else if (tokenLower === tokens.WETH.toLowerCase() || args.token === '0x0000000000000000000000000000000000000000') {
|
|
327
|
+
netPaidFormatted = formatTokenAmount(netPaid, 18, 6);
|
|
328
|
+
symbol = args.token === '0x0000000000000000000000000000000000000000' ? 'ETH' : 'WETH';
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
netPaidFormatted = netPaid.toString();
|
|
332
|
+
symbol = 'unknown';
|
|
333
|
+
}
|
|
334
|
+
return success({
|
|
335
|
+
mode: 'perToken',
|
|
336
|
+
from: fromAddr,
|
|
337
|
+
to: toAddr,
|
|
338
|
+
...(resolvedFromInfo ? { resolvedFrom: resolvedFromInfo } : {}),
|
|
339
|
+
...(resolvedToInfo ? { resolvedTo: resolvedToInfo } : {}),
|
|
340
|
+
token: args.token,
|
|
341
|
+
netPaid: netPaid.toString(),
|
|
342
|
+
netPaidFormatted: `${netPaidFormatted} ${symbol}`,
|
|
343
|
+
description: `Signed per-token delta. Positive = "${fromAddr}" paid more.`,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
// Total USD mode: aggregated across all tokens
|
|
348
|
+
const totalUSD = await publicClient.readContract({
|
|
349
|
+
address: moduleAddress,
|
|
350
|
+
abi: ReputationModuleAbi,
|
|
351
|
+
functionName: 'getTotalNetPaidUSD',
|
|
352
|
+
args: [fromAddr, toAddr],
|
|
353
|
+
});
|
|
354
|
+
const { formatTokenAmount } = await import('@azeth/common');
|
|
355
|
+
const totalNetPaidUSDFormatted = '$' + formatTokenAmount(totalUSD, 18, 2);
|
|
356
|
+
return success({
|
|
357
|
+
mode: 'totalUSD',
|
|
358
|
+
from: fromAddr,
|
|
359
|
+
to: toAddr,
|
|
360
|
+
...(resolvedFromInfo ? { resolvedFrom: resolvedFromInfo } : {}),
|
|
361
|
+
...(resolvedToInfo ? { resolvedTo: resolvedToInfo } : {}),
|
|
362
|
+
totalNetPaidUSD: totalUSD.toString(),
|
|
363
|
+
totalNetPaidUSDFormatted,
|
|
364
|
+
description: 'Total net paid in 18-decimal USD, aggregated across all tokens.',
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
catch (err) {
|
|
369
|
+
return handleError(err);
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
// ──────────────────────────────────────────────
|
|
373
|
+
// azeth_get_active_opinion
|
|
374
|
+
// ──────────────────────────────────────────────
|
|
375
|
+
server.registerTool('azeth_get_active_opinion', {
|
|
376
|
+
description: [
|
|
377
|
+
'Check if you have an active reputation opinion for a specific agent.',
|
|
378
|
+
'',
|
|
379
|
+
'Use this when: You want to verify whether you have already submitted a reputation',
|
|
380
|
+
'opinion for an agent before submitting a new one (which would overwrite the existing one).',
|
|
381
|
+
'',
|
|
382
|
+
'The agentId is the ERC-8004 token ID of the agent you want to check.',
|
|
383
|
+
'Use azeth_discover_services or azeth_get_registry_entry to find token IDs.',
|
|
384
|
+
'',
|
|
385
|
+
'Returns: Whether an active opinion exists and its opinion index on the reputation registry.',
|
|
386
|
+
'',
|
|
387
|
+
'This is read-only and safe to call at any time.',
|
|
388
|
+
'',
|
|
389
|
+
'Example: { "agentId": "3" }',
|
|
390
|
+
].join('\n'),
|
|
391
|
+
inputSchema: z.object({
|
|
392
|
+
chain: z.string().optional().describe('Target chain. Defaults to AZETH_CHAIN env var or "baseSepolia". Accepts "base", "baseSepolia", "ethereumSepolia", "ethereum" (and aliases like "base-sepolia", "eth-sepolia", "sepolia", "eth", "mainnet").'),
|
|
393
|
+
agentId: z.string().regex(/^\d+$/).describe('The ERC-8004 token ID of the agent to check your opinion for.'),
|
|
394
|
+
}),
|
|
395
|
+
}, async (args) => {
|
|
396
|
+
let client;
|
|
397
|
+
try {
|
|
398
|
+
client = await createClient(args.chain);
|
|
399
|
+
// Validate agentId as uint256
|
|
400
|
+
let agentIdBigInt;
|
|
401
|
+
try {
|
|
402
|
+
agentIdBigInt = BigInt(args.agentId);
|
|
403
|
+
if (agentIdBigInt < 0n)
|
|
404
|
+
throw new Error('negative');
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
return error('INVALID_INPUT', `Invalid agentId "${args.agentId}". Must be a non-negative integer.`);
|
|
408
|
+
}
|
|
409
|
+
// Resolve smart account address — the on-chain mapping is keyed by
|
|
410
|
+
// smart account (msg.sender in the UserOp), not the EOA.
|
|
411
|
+
const account = await client.resolveSmartAccount();
|
|
412
|
+
const result = await client.getActiveOpinion(agentIdBigInt, account);
|
|
413
|
+
return success({
|
|
414
|
+
agentId: args.agentId,
|
|
415
|
+
hasActiveOpinion: result.exists,
|
|
416
|
+
opinionIndex: result.exists ? result.opinionIndex.toString() : null,
|
|
417
|
+
message: result.exists
|
|
418
|
+
? `You have an active opinion (index ${result.opinionIndex}) for agent #${args.agentId}. Submitting a new opinion will overwrite it.`
|
|
419
|
+
: `No active opinion found for agent #${args.agentId}. You can submit one with azeth_submit_opinion.`,
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
catch (err) {
|
|
423
|
+
return handleError(err);
|
|
424
|
+
}
|
|
425
|
+
finally {
|
|
426
|
+
try {
|
|
427
|
+
await client?.destroy();
|
|
428
|
+
}
|
|
429
|
+
catch { /* M-10 */ }
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=reputation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reputation.js","sourceRoot":"","sources":["../../src/tools/reputation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/tools/transfer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,2CAA2C;AAC3C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6L7D"}
|