@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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +141 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +48 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/tools/account.d.ts +4 -0
  8. package/dist/tools/account.d.ts.map +1 -0
  9. package/dist/tools/account.js +640 -0
  10. package/dist/tools/account.js.map +1 -0
  11. package/dist/tools/agreements.d.ts +4 -0
  12. package/dist/tools/agreements.d.ts.map +1 -0
  13. package/dist/tools/agreements.js +865 -0
  14. package/dist/tools/agreements.js.map +1 -0
  15. package/dist/tools/guardian-approval.d.ts +4 -0
  16. package/dist/tools/guardian-approval.d.ts.map +1 -0
  17. package/dist/tools/guardian-approval.js +319 -0
  18. package/dist/tools/guardian-approval.js.map +1 -0
  19. package/dist/tools/guardian.d.ts +4 -0
  20. package/dist/tools/guardian.d.ts.map +1 -0
  21. package/dist/tools/guardian.js +267 -0
  22. package/dist/tools/guardian.js.map +1 -0
  23. package/dist/tools/messaging.d.ts +4 -0
  24. package/dist/tools/messaging.d.ts.map +1 -0
  25. package/dist/tools/messaging.js +353 -0
  26. package/dist/tools/messaging.js.map +1 -0
  27. package/dist/tools/payments.d.ts +14 -0
  28. package/dist/tools/payments.d.ts.map +1 -0
  29. package/dist/tools/payments.js +723 -0
  30. package/dist/tools/payments.js.map +1 -0
  31. package/dist/tools/registry.d.ts +4 -0
  32. package/dist/tools/registry.d.ts.map +1 -0
  33. package/dist/tools/registry.js +608 -0
  34. package/dist/tools/registry.js.map +1 -0
  35. package/dist/tools/reputation.d.ts +4 -0
  36. package/dist/tools/reputation.d.ts.map +1 -0
  37. package/dist/tools/reputation.js +433 -0
  38. package/dist/tools/reputation.js.map +1 -0
  39. package/dist/tools/transfer.d.ts +4 -0
  40. package/dist/tools/transfer.d.ts.map +1 -0
  41. package/dist/tools/transfer.js +181 -0
  42. package/dist/tools/transfer.js.map +1 -0
  43. package/dist/utils/client.d.ts +25 -0
  44. package/dist/utils/client.d.ts.map +1 -0
  45. package/dist/utils/client.js +100 -0
  46. package/dist/utils/client.js.map +1 -0
  47. package/dist/utils/error-selectors.d.ts +23 -0
  48. package/dist/utils/error-selectors.d.ts.map +1 -0
  49. package/dist/utils/error-selectors.js +159 -0
  50. package/dist/utils/error-selectors.js.map +1 -0
  51. package/dist/utils/rate-limit.d.ts +17 -0
  52. package/dist/utils/rate-limit.d.ts.map +1 -0
  53. package/dist/utils/rate-limit.js +75 -0
  54. package/dist/utils/rate-limit.js.map +1 -0
  55. package/dist/utils/resolve.d.ts +38 -0
  56. package/dist/utils/resolve.d.ts.map +1 -0
  57. package/dist/utils/resolve.js +308 -0
  58. package/dist/utils/resolve.js.map +1 -0
  59. package/dist/utils/response.d.ts +42 -0
  60. package/dist/utils/response.d.ts.map +1 -0
  61. package/dist/utils/response.js +257 -0
  62. package/dist/utils/response.js.map +1 -0
  63. package/package.json +62 -0
@@ -0,0 +1,608 @@
1
+ import { z } from 'zod';
2
+ import { hexToString } from 'viem';
3
+ import { discoverServicesWithFallback, getRegistryEntry } from '@azeth/sdk';
4
+ import { AZETH_CONTRACTS, ERC8004_REGISTRY, formatTokenAmount } from '@azeth/common';
5
+ import { TrustRegistryModuleAbi, ReputationModuleAbi } from '@azeth/common/abis';
6
+ import { createClient, resolveChain, resolveViemChain, validateAddress } from '../utils/client.js';
7
+ import { success, error, handleError } from '../utils/response.js';
8
+ /** Minimal ABI for ERC-8004 tokenURI (read-only) */
9
+ const ERC8004_TOKEN_URI_ABI = [
10
+ {
11
+ type: 'function',
12
+ name: 'tokenURI',
13
+ inputs: [{ name: 'tokenId', type: 'uint256', internalType: 'uint256' }],
14
+ outputs: [{ name: '', type: 'string', internalType: 'string' }],
15
+ stateMutability: 'view',
16
+ },
17
+ ];
18
+ /** Minimal ABI for ERC-721 ownerOf (read-only) */
19
+ const ERC721_OWNER_OF_ABI = [
20
+ {
21
+ type: 'function',
22
+ name: 'ownerOf',
23
+ inputs: [{ name: 'tokenId', type: 'uint256', internalType: 'uint256' }],
24
+ outputs: [{ name: '', type: 'address', internalType: 'address' }],
25
+ stateMutability: 'view',
26
+ },
27
+ ];
28
+ /** Minimal ABI for ERC-8004 getMetadata (read per-key metadata updates) */
29
+ const ERC8004_GET_METADATA_ABI = [{
30
+ type: 'function',
31
+ name: 'getMetadata',
32
+ inputs: [
33
+ { name: 'agentId', type: 'uint256', internalType: 'uint256' },
34
+ { name: 'metadataKey', type: 'string', internalType: 'string' },
35
+ ],
36
+ outputs: [{ name: '', type: 'bytes', internalType: 'bytes' }],
37
+ stateMutability: 'view',
38
+ }];
39
+ /** Metadata keys that can be updated via setMetadata and should overlay tokenURI values */
40
+ const OVERLAY_METADATA_KEYS = ['endpoint', 'description', 'name', 'entityType', 'capabilities', 'pricing', 'catalog'];
41
+ /** Overlay per-key metadata updates from getMetadata() onto a parsed registry entry.
42
+ * The ERC-8004 tokenURI is immutable after minting, but individual keys can be updated
43
+ * via setMetadata(). This reads those updates and overrides the base entry values. */
44
+ async function overlayMetadataUpdates(publicClient, registryAddr, tokenId, entry) {
45
+ await Promise.all(OVERLAY_METADATA_KEYS.map(async (key) => {
46
+ try {
47
+ const raw = await publicClient.readContract({
48
+ address: registryAddr,
49
+ abi: ERC8004_GET_METADATA_ABI,
50
+ functionName: 'getMetadata',
51
+ args: [tokenId, key],
52
+ });
53
+ if (raw && raw !== '0x') {
54
+ const decoded = hexToString(raw);
55
+ if (decoded) {
56
+ entry[key] = decoded;
57
+ }
58
+ }
59
+ }
60
+ catch { /* no metadata for this key */ }
61
+ }));
62
+ }
63
+ /** Parse a raw catalog array from metadata */
64
+ function parseCatalogFromMeta(raw) {
65
+ if (!Array.isArray(raw))
66
+ return undefined;
67
+ const entries = [];
68
+ for (const item of raw) {
69
+ if (typeof item !== 'object' || item === null)
70
+ continue;
71
+ const rec = item;
72
+ if (typeof rec.name !== 'string' || typeof rec.path !== 'string')
73
+ continue;
74
+ entries.push({
75
+ name: rec.name,
76
+ path: rec.path,
77
+ pricing: typeof rec.pricing === 'string' ? rec.pricing : undefined,
78
+ description: typeof rec.description === 'string' ? rec.description : undefined,
79
+ });
80
+ }
81
+ return entries.length > 0 ? entries : undefined;
82
+ }
83
+ /** Parse a data:application/json, URI into registry metadata */
84
+ function parseRegistryDataURI(uri) {
85
+ try {
86
+ if (!uri.startsWith('data:application/json,'))
87
+ return null;
88
+ const jsonStr = decodeURIComponent(uri.slice('data:application/json,'.length));
89
+ const meta = JSON.parse(jsonStr);
90
+ return {
91
+ name: typeof meta.name === 'string' ? meta.name : '',
92
+ description: typeof meta.description === 'string' ? meta.description : '',
93
+ entityType: typeof meta.entityType === 'string' ? meta.entityType : 'agent',
94
+ capabilities: Array.isArray(meta.capabilities)
95
+ ? meta.capabilities.filter((c) => typeof c === 'string')
96
+ : [],
97
+ endpoint: typeof meta.endpoint === 'string' ? meta.endpoint : undefined,
98
+ pricing: typeof meta.pricing === 'string' ? meta.pricing : undefined,
99
+ catalog: parseCatalogFromMeta(meta.catalog),
100
+ };
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ }
106
+ /** Register trust registry MCP tools: azeth_publish_service, azeth_discover_services, azeth_get_registry_entry, azeth_update_service */
107
+ export function registerRegistryTools(server) {
108
+ // ──────────────────────────────────────────────
109
+ // azeth_publish_service
110
+ // ──────────────────────────────────────────────
111
+ server.registerTool('azeth_publish_service', {
112
+ description: [
113
+ 'Register a service, agent, or infrastructure on the ERC-8004 trust registry with metadata and capabilities.',
114
+ '',
115
+ 'Use this when: You want to make your agent or service discoverable by other participants in the Azeth network.',
116
+ '',
117
+ 'Returns: The trust registry token ID and creation transaction hash.',
118
+ '',
119
+ 'Note: This is a state-changing on-chain operation. The token ID is your permanent identity in the trust registry.',
120
+ 'Other participants can discover you by capability, entity type, and reputation score.',
121
+ 'The account is determined by the AZETH_PRIVATE_KEY environment variable.',
122
+ '',
123
+ 'Example: { "name": "MarketOracle", "description": "Real-time market data API", "entityType": "service", "capabilities": ["price-feed", "market-data"], "endpoint": "https://api.example.com" }',
124
+ ].join('\n'),
125
+ inputSchema: z.object({
126
+ 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").'),
127
+ name: z.string().min(1).max(256).describe('Display name for this participant in the trust registry.'),
128
+ description: z.string().min(1).max(2048).describe('Human-readable description of what this participant does.'),
129
+ entityType: z.enum(['agent', 'service', 'infrastructure']).describe('Participant type: "agent" (AI agent), "service" (API/oracle), or "infrastructure" (bridge/relay).'),
130
+ capabilities: z.preprocess((val) => typeof val === 'string' ? JSON.parse(val) : val, z.array(z.string().max(128)).min(1).max(50)).describe('List of capabilities offered (e.g., ["swap", "price-feed", "translation"]).'),
131
+ endpoint: z.string().url().max(2048)
132
+ .refine(url => url.startsWith('https://') || url.startsWith('http://'), {
133
+ message: 'Endpoint must use HTTP or HTTPS protocol',
134
+ })
135
+ .optional()
136
+ .describe('Optional HTTP endpoint where this participant can be reached.'),
137
+ pricing: z.string().max(256).optional()
138
+ .describe('Listed price for this service (e.g., "$0.01/request", "Free", "$10/month"). Informational — actual x402 settlement price may differ.'),
139
+ catalog: z.preprocess((val) => typeof val === 'string' ? JSON.parse(val) : val, z.array(z.object({
140
+ name: z.string().min(1).max(256),
141
+ path: z.string().min(1).max(512),
142
+ pricing: z.string().max(256).optional(),
143
+ description: z.string().max(1024).optional(),
144
+ })).max(20).optional()).optional().describe('Service catalog for multi-service providers. Array of offerings, each with name, path (relative to base endpoint), optional pricing, and optional description.'),
145
+ }),
146
+ }, async (args) => {
147
+ let client;
148
+ try {
149
+ client = await createClient(args.chain);
150
+ // Check if the smart account is already registered to prevent silent duplicates
151
+ try {
152
+ const chainName = resolveChain(args.chain);
153
+ const trustRegAddr = AZETH_CONTRACTS[chainName].trustRegistryModule;
154
+ const smartAccount = await client.resolveSmartAccount();
155
+ const isAlreadyRegistered = await client.publicClient.readContract({
156
+ address: trustRegAddr,
157
+ abi: TrustRegistryModuleAbi,
158
+ functionName: 'isRegistered',
159
+ args: [smartAccount],
160
+ });
161
+ if (isAlreadyRegistered) {
162
+ return error('ACCOUNT_EXISTS', 'This account is already registered on the trust registry.', 'Use azeth_update_service to update your existing registration metadata.');
163
+ }
164
+ }
165
+ catch {
166
+ // Non-fatal: if the check fails (RPC error, module not deployed), proceed anyway
167
+ }
168
+ const result = await client.publishService({
169
+ name: args.name,
170
+ description: args.description,
171
+ entityType: args.entityType,
172
+ capabilities: args.capabilities,
173
+ endpoint: args.endpoint,
174
+ pricing: args.pricing,
175
+ catalog: args.catalog,
176
+ });
177
+ return success({
178
+ tokenId: result.tokenId.toString(),
179
+ txHash: result.txHash,
180
+ }, { txHash: result.txHash });
181
+ }
182
+ catch (err) {
183
+ return handleError(err);
184
+ }
185
+ finally {
186
+ try {
187
+ await client?.destroy();
188
+ }
189
+ catch (e) {
190
+ process.stderr.write(`[azeth-mcp] destroy error: ${e instanceof Error ? e.message : String(e)}\n`);
191
+ }
192
+ }
193
+ });
194
+ // ──────────────────────────────────────────────
195
+ // azeth_discover_services
196
+ // ──────────────────────────────────────────────
197
+ server.registerTool('azeth_discover_services', {
198
+ description: [
199
+ 'Find services, agents, and infrastructure on the trust registry by capability, entity type, and reputation.',
200
+ '',
201
+ 'Use this when: You need to find a participant that offers a specific capability (e.g., "swap", "price-feed"),',
202
+ 'or you want to browse available services filtered by type and minimum reputation score.',
203
+ '',
204
+ 'Returns: Array of registry entries with token ID, owner, entity type, name, capabilities, endpoint, and status.',
205
+ '',
206
+ 'Note: This queries the Azeth server API. Set AZETH_SERVER_URL env var if the server is not at the default location.',
207
+ 'Results are ranked by reputation score. No private key is required for read-only discovery.',
208
+ '',
209
+ 'Example: { "capability": "price-feed" } or { "entityType": "service", "minReputation": 50, "limit": 5 }',
210
+ ].join('\n'),
211
+ inputSchema: z.object({
212
+ 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").'),
213
+ capability: z.string().max(128).optional().describe('Filter by capability (e.g., "swap", "price-feed", "translation").'),
214
+ entityType: z.enum(['agent', 'service', 'infrastructure']).optional().describe('Filter by participant type.'),
215
+ minReputation: z.coerce.number().min(0).max(100).optional().describe('Minimum reputation score (0-100). Higher means more trusted.'),
216
+ limit: z.coerce.number().int().min(1).max(100).optional().describe('Maximum number of results. Defaults to 10.'),
217
+ offset: z.coerce.number().int().min(0).optional().describe('Number of results to skip for pagination. Defaults to 0.'),
218
+ }),
219
+ }, async (args) => {
220
+ try {
221
+ const serverUrl = process.env['AZETH_SERVER_URL'] ?? 'https://api.azeth.ai';
222
+ const chainName = resolveChain(args.chain);
223
+ // Create a public client for the on-chain fallback
224
+ const { createPublicClient, http } = await import('viem');
225
+ const chain = resolveViemChain(chainName);
226
+ const rpcUrl = process.env['AZETH_RPC_URL'];
227
+ const publicClient = createPublicClient({ chain, transport: http(rpcUrl) });
228
+ const result = await discoverServicesWithFallback(serverUrl, {
229
+ capability: args.capability,
230
+ entityType: args.entityType,
231
+ minReputation: args.minReputation,
232
+ limit: args.limit ?? 10,
233
+ offset: args.offset,
234
+ },
235
+ // Cast needed: viem's chain-specific PublicClient has extra tx types
236
+ // that are a superset of the generic Chain type the SDK expects
237
+ publicClient, chainName);
238
+ // Deduplicate entries: when the same entity appears multiple times
239
+ // (e.g., registered from both EOA and smart account), keep the entry
240
+ // with the highest tokenId (most recent) per owner+name pair.
241
+ const deduped = new Map();
242
+ for (const entry of result.entries) {
243
+ const key = `${entry.owner?.toLowerCase() ?? ''}:${entry.name?.toLowerCase() ?? ''}`;
244
+ const existing = deduped.get(key);
245
+ if (!existing || BigInt(entry.tokenId) > BigInt(existing.tokenId)) {
246
+ deduped.set(key, entry);
247
+ }
248
+ }
249
+ const uniqueEntries = [...deduped.values()];
250
+ // ── Overlay per-key metadata updates for on-chain fallback results ──
251
+ if (result.source === 'on-chain' && uniqueEntries.length <= 10) {
252
+ const overlayRegistryAddr = ERC8004_REGISTRY[chainName];
253
+ await Promise.all(uniqueEntries.map(async (entry) => {
254
+ try {
255
+ await overlayMetadataUpdates(publicClient, overlayRegistryAddr, BigInt(entry.tokenId), entry);
256
+ }
257
+ catch { /* non-fatal */ }
258
+ }));
259
+ }
260
+ // ── Optional reputation enrichment ──
261
+ // For small result sets (≤10), fetch weighted reputation for each entry.
262
+ // Non-fatal: if reputation is unavailable for any entry, it's set to null.
263
+ const reputationModuleAddr = AZETH_CONTRACTS[chainName].reputationModule;
264
+ const shouldEnrich = uniqueEntries.length <= 10
265
+ && !!reputationModuleAddr
266
+ && reputationModuleAddr !== '';
267
+ const DEFAULT_REPUTATION = { weightedValue: '0', weightedValueFormatted: '0', totalWeight: '0', totalWeightFormatted: '0', opinionCount: '0' };
268
+ const reputationMap = new Map();
269
+ if (shouldEnrich) {
270
+ await Promise.all(uniqueEntries.map(async (entry) => {
271
+ try {
272
+ const tid = BigInt(entry.tokenId);
273
+ if (tid === 0n)
274
+ return;
275
+ const rep = await publicClient.readContract({
276
+ address: reputationModuleAddr,
277
+ abi: ReputationModuleAbi,
278
+ functionName: 'getWeightedReputationAll',
279
+ args: [tid],
280
+ });
281
+ const [weightedValue, totalWeight, opinionCount] = rep;
282
+ // Format weighted value using same heuristic as reputation.ts
283
+ const absValue = weightedValue < 0n ? -weightedValue : weightedValue;
284
+ const isHighPrecision = absValue > 10n ** 15n;
285
+ const weightedValueFormatted = isHighPrecision
286
+ ? formatTokenAmount(weightedValue, 18, 4)
287
+ : weightedValue.toString();
288
+ // Format totalWeight as USD with adaptive precision
289
+ const totalWeightFormatted = formatTokenAmount(totalWeight, 12, 2);
290
+ reputationMap.set(String(entry.tokenId), {
291
+ weightedValue: weightedValue.toString(),
292
+ weightedValueFormatted,
293
+ totalWeight: totalWeight.toString(),
294
+ totalWeightFormatted,
295
+ opinionCount: opinionCount.toString(),
296
+ });
297
+ }
298
+ catch { /* reputation not available for this entry */ }
299
+ }));
300
+ }
301
+ const requestedLimit = args.limit ?? 10;
302
+ // hasMore: true if the API returned a full page (before dedup), suggesting more results exist
303
+ const hasMore = result.entries.length >= requestedLimit;
304
+ return success({
305
+ count: uniqueEntries.length,
306
+ hasMore,
307
+ source: result.source,
308
+ offset: args.offset ?? 0,
309
+ limit: requestedLimit,
310
+ ...(result.minReputationIgnored ? { warning: 'minReputation filter is not supported in on-chain fallback mode and was ignored.' } : {}),
311
+ services: uniqueEntries.map((s) => ({
312
+ tokenId: String(s.tokenId),
313
+ owner: s.owner,
314
+ entityType: s.entityType,
315
+ name: s.name,
316
+ description: s.description ?? '',
317
+ capabilities: s.capabilities,
318
+ endpoint: s.endpoint,
319
+ pricing: s.pricing,
320
+ catalog: s.catalog ?? null,
321
+ active: s.active,
322
+ reputation: reputationMap.get(String(s.tokenId)) ?? (s.reputation ?? DEFAULT_REPUTATION),
323
+ })),
324
+ });
325
+ }
326
+ catch (err) {
327
+ return handleError(err);
328
+ }
329
+ });
330
+ // ──────────────────────────────────────────────
331
+ // azeth_get_registry_entry
332
+ // ──────────────────────────────────────────────
333
+ server.registerTool('azeth_get_registry_entry', {
334
+ description: [
335
+ 'Look up a specific participant on the trust registry by token ID or smart account address.',
336
+ '',
337
+ 'Use this when: You know a specific agent/service address or token ID and want',
338
+ 'to see their registration details, capabilities, and reputation.',
339
+ '',
340
+ 'Provide EITHER tokenId OR address (at least one required).',
341
+ 'If address is provided, it is resolved to a token ID via on-chain lookup.',
342
+ '',
343
+ 'Returns: Full registry entry including name, description, entity type,',
344
+ 'capabilities, endpoint, and weighted reputation score.',
345
+ '',
346
+ 'This is read-only and safe to call at any time.',
347
+ '',
348
+ 'Example: { "address": "0x1234..." } or { "tokenId": "5" }',
349
+ ].join('\n'),
350
+ inputSchema: z.object({
351
+ 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").'),
352
+ tokenId: z.string().regex(/^\d+$/).optional().describe('ERC-8004 token ID of the participant to look up.'),
353
+ address: z.string().optional().describe('Smart account address of the participant. Resolved to tokenId on-chain.'),
354
+ }),
355
+ }, async (args) => {
356
+ try {
357
+ if (!args.tokenId && !args.address) {
358
+ return error('INVALID_INPUT', 'Provide at least one of "tokenId" or "address".');
359
+ }
360
+ const chainName = resolveChain(args.chain);
361
+ const serverUrl = process.env['AZETH_SERVER_URL'] ?? 'https://api.azeth.ai';
362
+ // Create a public client for on-chain reads
363
+ const { createPublicClient, http } = await import('viem');
364
+ const viemChain = resolveViemChain(chainName);
365
+ const rpcUrl = process.env['AZETH_RPC_URL'];
366
+ const publicClient = createPublicClient({ chain: viemChain, transport: http(rpcUrl) });
367
+ // Resolve tokenId from address if needed
368
+ let tokenId;
369
+ let resolvedAddress = args.address;
370
+ if (args.tokenId) {
371
+ tokenId = BigInt(args.tokenId);
372
+ }
373
+ else {
374
+ // Validate address format
375
+ if (!validateAddress(args.address)) {
376
+ return error('INVALID_INPUT', `Invalid address: "${args.address}". Expected 0x + 40 hex characters.`);
377
+ }
378
+ const addr = args.address.trim();
379
+ resolvedAddress = addr;
380
+ const trustRegAddr = AZETH_CONTRACTS[chainName].trustRegistryModule;
381
+ try {
382
+ tokenId = await publicClient.readContract({
383
+ address: trustRegAddr,
384
+ abi: TrustRegistryModuleAbi,
385
+ functionName: 'getTokenId',
386
+ args: [addr],
387
+ });
388
+ }
389
+ catch {
390
+ return error('ACCOUNT_NOT_FOUND', `Could not resolve token ID for address ${addr}. The address may not be registered.`);
391
+ }
392
+ if (tokenId === 0n) {
393
+ return error('ACCOUNT_NOT_FOUND', `Address ${addr} is not registered on the trust registry.`);
394
+ }
395
+ }
396
+ // Try server API first
397
+ let entry = null;
398
+ let source = 'server';
399
+ try {
400
+ const serverEntry = await getRegistryEntry(serverUrl, tokenId);
401
+ if (serverEntry) {
402
+ entry = serverEntry;
403
+ }
404
+ }
405
+ catch {
406
+ // Server unavailable — fall back to on-chain
407
+ }
408
+ // On-chain fallback via tokenURI
409
+ if (!entry) {
410
+ source = 'on-chain';
411
+ try {
412
+ const registryAddr = ERC8004_REGISTRY[chainName];
413
+ const uri = await publicClient.readContract({
414
+ address: registryAddr,
415
+ abi: ERC8004_TOKEN_URI_ABI,
416
+ functionName: 'tokenURI',
417
+ args: [tokenId],
418
+ });
419
+ const meta = parseRegistryDataURI(uri);
420
+ if (meta) {
421
+ // If no address was provided (lookup by tokenId), resolve owner via ownerOf
422
+ let ownerAddress = resolvedAddress ?? '';
423
+ if (!ownerAddress) {
424
+ try {
425
+ ownerAddress = await publicClient.readContract({
426
+ address: registryAddr,
427
+ abi: ERC721_OWNER_OF_ABI,
428
+ functionName: 'ownerOf',
429
+ args: [tokenId],
430
+ });
431
+ }
432
+ catch { /* owner resolution failed — leave empty */ }
433
+ }
434
+ entry = {
435
+ tokenId: tokenId.toString(),
436
+ owner: ownerAddress,
437
+ name: meta.name,
438
+ description: meta.description,
439
+ entityType: meta.entityType,
440
+ capabilities: meta.capabilities,
441
+ endpoint: meta.endpoint,
442
+ pricing: meta.pricing,
443
+ catalog: meta.catalog,
444
+ active: true,
445
+ };
446
+ }
447
+ }
448
+ catch {
449
+ return error('ACCOUNT_NOT_FOUND', `Token ID ${tokenId} not found on the trust registry.`);
450
+ }
451
+ }
452
+ if (!entry) {
453
+ return error('ACCOUNT_NOT_FOUND', `No registry entry found for token ID ${tokenId}.`);
454
+ }
455
+ // Overlay per-key metadata updates (from setMetadata) onto the base entry.
456
+ // This ensures fields updated via azeth_update_service are reflected in reads.
457
+ const registryAddr = ERC8004_REGISTRY[chainName];
458
+ await overlayMetadataUpdates(publicClient, registryAddr, tokenId, entry);
459
+ // Optional reputation enrichment
460
+ let reputation = { weightedValue: '0', weightedValueFormatted: '0', totalWeight: '0', totalWeightFormatted: '0', opinionCount: '0' };
461
+ try {
462
+ const repModuleAddr = AZETH_CONTRACTS[chainName].reputationModule;
463
+ if (repModuleAddr) {
464
+ const rep = await publicClient.readContract({
465
+ address: repModuleAddr,
466
+ abi: ReputationModuleAbi,
467
+ functionName: 'getWeightedReputationAll',
468
+ args: [tokenId],
469
+ });
470
+ const [wv, tw, oc] = rep;
471
+ // Format weighted value using same heuristic as reputation.ts
472
+ const absValue = wv < 0n ? -wv : wv;
473
+ const isHighPrecision = absValue > 10n ** 15n;
474
+ const weightedValueFormatted = isHighPrecision
475
+ ? formatTokenAmount(wv, 18, 4)
476
+ : wv.toString();
477
+ // Format totalWeight as USD with adaptive precision
478
+ const totalWeightFormatted = formatTokenAmount(tw, 12, 2);
479
+ reputation = {
480
+ weightedValue: wv.toString(),
481
+ weightedValueFormatted,
482
+ totalWeight: tw.toString(),
483
+ totalWeightFormatted,
484
+ opinionCount: oc.toString(),
485
+ };
486
+ }
487
+ }
488
+ catch { /* reputation not available — default zeros used */ }
489
+ return success({
490
+ tokenId: tokenId.toString(),
491
+ address: entry.owner || resolvedAddress || null,
492
+ name: entry.name,
493
+ description: entry.description,
494
+ entityType: entry.entityType,
495
+ capabilities: entry.capabilities,
496
+ endpoint: entry.endpoint ?? null,
497
+ pricing: entry.pricing ?? null,
498
+ catalog: entry.catalog ?? null,
499
+ active: entry.active,
500
+ reputation,
501
+ source,
502
+ });
503
+ }
504
+ catch (err) {
505
+ return handleError(err);
506
+ }
507
+ });
508
+ // ──────────────────────────────────────────────
509
+ // azeth_update_service
510
+ // ──────────────────────────────────────────────
511
+ server.registerTool('azeth_update_service', {
512
+ description: [
513
+ 'Update metadata for your registered service on the trust registry.',
514
+ '',
515
+ 'Use this when: You need to change your service endpoint, description, capabilities,',
516
+ 'or other metadata after initial registration with azeth_publish_service.',
517
+ '',
518
+ 'Supported metadata keys: "endpoint", "description", "capabilities", "name", "entityType", "pricing", "catalog".',
519
+ 'For capabilities, provide a JSON array string (e.g., \'["translation", "nlp"]\').',
520
+ 'For catalog, provide a JSON array of objects: \'[{"name":"Chain Data","path":"/v1/chains","pricing":"$0.001/req"}]\'.',
521
+ '',
522
+ 'Returns: Confirmation with transaction hash.',
523
+ '',
524
+ 'Note: Your account must already be registered on the trust registry.',
525
+ 'This requires a transaction (gas cost). Only the account owner can update metadata.',
526
+ '',
527
+ 'Example: { "key": "endpoint", "value": "https://api.example.com/v2" }',
528
+ ].join('\n'),
529
+ inputSchema: z.object({
530
+ 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").'),
531
+ key: z.enum(['endpoint', 'description', 'capabilities', 'name', 'entityType', 'pricing', 'catalog']).describe('Metadata key to update.'),
532
+ value: z.string().min(1).max(2048).describe('New value. For "capabilities", provide a JSON array string like \'["translation", "nlp"]\'.'),
533
+ }),
534
+ }, async (args) => {
535
+ let client;
536
+ try {
537
+ client = await createClient(args.chain);
538
+ const txHash = await client.updateServiceMetadata(args.key, args.value);
539
+ return success({
540
+ key: args.key,
541
+ value: args.value,
542
+ message: `Service metadata "${args.key}" updated successfully.`,
543
+ }, { txHash });
544
+ }
545
+ catch (err) {
546
+ return handleError(err);
547
+ }
548
+ finally {
549
+ try {
550
+ await client?.destroy();
551
+ }
552
+ catch { /* M-10 */ }
553
+ }
554
+ });
555
+ // ──────────────────────────────────────────────
556
+ // azeth_update_service_batch
557
+ // ──────────────────────────────────────────────
558
+ server.registerTool('azeth_update_service_batch', {
559
+ description: [
560
+ 'Update multiple metadata fields for your registered service in a single transaction.',
561
+ '',
562
+ 'Use this when: You need to change several metadata fields at once (e.g., endpoint + description + capabilities).',
563
+ 'This is more gas-efficient than calling azeth_update_service multiple times.',
564
+ '',
565
+ 'Supported metadata keys: "endpoint", "description", "capabilities", "name", "entityType", "pricing", "catalog".',
566
+ 'For capabilities, provide a JSON array string (e.g., \'["translation", "nlp"]\').',
567
+ 'For catalog, provide a JSON array of objects: \'[{"name":"Chain Data","path":"/v1/chains","pricing":"$0.001/req"}]\'.',
568
+ '',
569
+ 'Returns: Confirmation with a single transaction hash for all updates.',
570
+ '',
571
+ 'Note: All updates are atomic — if one fails, none are applied.',
572
+ 'Maximum 5 key-value pairs per batch.',
573
+ '',
574
+ 'Example: { "updates": [{"key": "endpoint", "value": "https://api.example.com/v2"}, {"key": "description", "value": "Updated service"}] }',
575
+ ].join('\n'),
576
+ inputSchema: z.object({
577
+ 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").'),
578
+ updates: z.preprocess((val) => typeof val === 'string' ? JSON.parse(val) : val, z.array(z.object({
579
+ key: z.enum(['endpoint', 'description', 'capabilities', 'name', 'entityType', 'pricing', 'catalog']),
580
+ value: z.string().min(1).max(2048),
581
+ })).min(1).max(5)).describe('Array of {key, value} pairs to update. Max 5 updates per batch.'),
582
+ }),
583
+ }, async (args) => {
584
+ let client;
585
+ try {
586
+ client = await createClient(args.chain);
587
+ const txHash = await client.updateServiceMetadataBatch(args.updates);
588
+ return success({
589
+ updates: args.updates.map(u => ({
590
+ key: u.key,
591
+ value: u.value,
592
+ })),
593
+ count: args.updates.length,
594
+ message: `${args.updates.length} metadata field(s) updated in a single transaction.`,
595
+ }, { txHash });
596
+ }
597
+ catch (err) {
598
+ return handleError(err);
599
+ }
600
+ finally {
601
+ try {
602
+ await client?.destroy();
603
+ }
604
+ catch { /* M-10 */ }
605
+ }
606
+ });
607
+ }
608
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}