agentaos 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 (183) hide show
  1. package/LICENSE +199 -0
  2. package/README.md +249 -0
  3. package/dist/cli/commands/admin.command.d.ts +3 -0
  4. package/dist/cli/commands/admin.command.d.ts.map +1 -0
  5. package/dist/cli/commands/admin.command.js +415 -0
  6. package/dist/cli/commands/admin.command.js.map +1 -0
  7. package/dist/cli/commands/balance.command.d.ts +3 -0
  8. package/dist/cli/commands/balance.command.d.ts.map +1 -0
  9. package/dist/cli/commands/balance.command.js +65 -0
  10. package/dist/cli/commands/balance.command.js.map +1 -0
  11. package/dist/cli/commands/deploy.command.d.ts +3 -0
  12. package/dist/cli/commands/deploy.command.d.ts.map +1 -0
  13. package/dist/cli/commands/deploy.command.js +101 -0
  14. package/dist/cli/commands/deploy.command.js.map +1 -0
  15. package/dist/cli/commands/info.command.d.ts +3 -0
  16. package/dist/cli/commands/info.command.d.ts.map +1 -0
  17. package/dist/cli/commands/info.command.js +30 -0
  18. package/dist/cli/commands/info.command.js.map +1 -0
  19. package/dist/cli/commands/init.command.d.ts +3 -0
  20. package/dist/cli/commands/init.command.d.ts.map +1 -0
  21. package/dist/cli/commands/init.command.js +364 -0
  22. package/dist/cli/commands/init.command.js.map +1 -0
  23. package/dist/cli/commands/link.command.d.ts +3 -0
  24. package/dist/cli/commands/link.command.d.ts.map +1 -0
  25. package/dist/cli/commands/link.command.js +111 -0
  26. package/dist/cli/commands/link.command.js.map +1 -0
  27. package/dist/cli/commands/login.command.d.ts +4 -0
  28. package/dist/cli/commands/login.command.d.ts.map +1 -0
  29. package/dist/cli/commands/login.command.js +149 -0
  30. package/dist/cli/commands/login.command.js.map +1 -0
  31. package/dist/cli/commands/network.command.d.ts +3 -0
  32. package/dist/cli/commands/network.command.d.ts.map +1 -0
  33. package/dist/cli/commands/network.command.js +206 -0
  34. package/dist/cli/commands/network.command.js.map +1 -0
  35. package/dist/cli/commands/proxy.command.d.ts +3 -0
  36. package/dist/cli/commands/proxy.command.d.ts.map +1 -0
  37. package/dist/cli/commands/proxy.command.js +248 -0
  38. package/dist/cli/commands/proxy.command.js.map +1 -0
  39. package/dist/cli/commands/receive.command.d.ts +3 -0
  40. package/dist/cli/commands/receive.command.d.ts.map +1 -0
  41. package/dist/cli/commands/receive.command.js +360 -0
  42. package/dist/cli/commands/receive.command.js.map +1 -0
  43. package/dist/cli/commands/send.command.d.ts +3 -0
  44. package/dist/cli/commands/send.command.d.ts.map +1 -0
  45. package/dist/cli/commands/send.command.js +83 -0
  46. package/dist/cli/commands/send.command.js.map +1 -0
  47. package/dist/cli/commands/sign.command.d.ts +3 -0
  48. package/dist/cli/commands/sign.command.d.ts.map +1 -0
  49. package/dist/cli/commands/sign.command.js +53 -0
  50. package/dist/cli/commands/sign.command.js.map +1 -0
  51. package/dist/cli/commands/status.command.d.ts +3 -0
  52. package/dist/cli/commands/status.command.d.ts.map +1 -0
  53. package/dist/cli/commands/status.command.js +109 -0
  54. package/dist/cli/commands/status.command.js.map +1 -0
  55. package/dist/cli/index.d.ts +2 -0
  56. package/dist/cli/index.d.ts.map +1 -0
  57. package/dist/cli/index.js +50 -0
  58. package/dist/cli/index.js.map +1 -0
  59. package/dist/cli/theme.d.ts +35 -0
  60. package/dist/cli/theme.d.ts.map +1 -0
  61. package/dist/cli/theme.js +96 -0
  62. package/dist/cli/theme.js.map +1 -0
  63. package/dist/index.d.ts +3 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +20 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/lib/__tests__/transfer-crypto.test.d.ts +2 -0
  68. package/dist/lib/__tests__/transfer-crypto.test.d.ts.map +1 -0
  69. package/dist/lib/__tests__/transfer-crypto.test.js +151 -0
  70. package/dist/lib/__tests__/transfer-crypto.test.js.map +1 -0
  71. package/dist/lib/authenticated-fetch.d.ts +6 -0
  72. package/dist/lib/authenticated-fetch.d.ts.map +1 -0
  73. package/dist/lib/authenticated-fetch.js +74 -0
  74. package/dist/lib/authenticated-fetch.js.map +1 -0
  75. package/dist/lib/config.d.ts +42 -0
  76. package/dist/lib/config.d.ts.map +1 -0
  77. package/dist/lib/config.js +163 -0
  78. package/dist/lib/config.js.map +1 -0
  79. package/dist/lib/erc20-abi.d.ts +43 -0
  80. package/dist/lib/erc20-abi.d.ts.map +1 -0
  81. package/dist/lib/erc20-abi.js +34 -0
  82. package/dist/lib/erc20-abi.js.map +1 -0
  83. package/dist/lib/errors.d.ts +12 -0
  84. package/dist/lib/errors.d.ts.map +1 -0
  85. package/dist/lib/errors.js +23 -0
  86. package/dist/lib/errors.js.map +1 -0
  87. package/dist/lib/keychain.d.ts +11 -0
  88. package/dist/lib/keychain.d.ts.map +1 -0
  89. package/dist/lib/keychain.js +216 -0
  90. package/dist/lib/keychain.js.map +1 -0
  91. package/dist/lib/policy-conversions.d.ts +19 -0
  92. package/dist/lib/policy-conversions.d.ts.map +1 -0
  93. package/dist/lib/policy-conversions.js +62 -0
  94. package/dist/lib/policy-conversions.js.map +1 -0
  95. package/dist/lib/signer-manager.d.ts +17 -0
  96. package/dist/lib/signer-manager.d.ts.map +1 -0
  97. package/dist/lib/signer-manager.js +80 -0
  98. package/dist/lib/signer-manager.js.map +1 -0
  99. package/dist/lib/transfer-crypto.d.ts +36 -0
  100. package/dist/lib/transfer-crypto.d.ts.map +1 -0
  101. package/dist/lib/transfer-crypto.js +109 -0
  102. package/dist/lib/transfer-crypto.js.map +1 -0
  103. package/dist/lib/x402-client.d.ts +63 -0
  104. package/dist/lib/x402-client.d.ts.map +1 -0
  105. package/dist/lib/x402-client.js +236 -0
  106. package/dist/lib/x402-client.js.map +1 -0
  107. package/dist/mcp/index.d.ts +6 -0
  108. package/dist/mcp/index.d.ts.map +1 -0
  109. package/dist/mcp/index.js +73 -0
  110. package/dist/mcp/index.js.map +1 -0
  111. package/dist/mcp/tools/call-contract.d.ts +4 -0
  112. package/dist/mcp/tools/call-contract.d.ts.map +1 -0
  113. package/dist/mcp/tools/call-contract.js +68 -0
  114. package/dist/mcp/tools/call-contract.js.map +1 -0
  115. package/dist/mcp/tools/execute.d.ts +4 -0
  116. package/dist/mcp/tools/execute.d.ts.map +1 -0
  117. package/dist/mcp/tools/execute.js +59 -0
  118. package/dist/mcp/tools/execute.js.map +1 -0
  119. package/dist/mcp/tools/get-audit-log.d.ts +4 -0
  120. package/dist/mcp/tools/get-audit-log.d.ts.map +1 -0
  121. package/dist/mcp/tools/get-audit-log.js +85 -0
  122. package/dist/mcp/tools/get-audit-log.js.map +1 -0
  123. package/dist/mcp/tools/get-balances.d.ts +4 -0
  124. package/dist/mcp/tools/get-balances.d.ts.map +1 -0
  125. package/dist/mcp/tools/get-balances.js +84 -0
  126. package/dist/mcp/tools/get-balances.js.map +1 -0
  127. package/dist/mcp/tools/get-status.d.ts +4 -0
  128. package/dist/mcp/tools/get-status.d.ts.map +1 -0
  129. package/dist/mcp/tools/get-status.js +66 -0
  130. package/dist/mcp/tools/get-status.js.map +1 -0
  131. package/dist/mcp/tools/list-networks.d.ts +4 -0
  132. package/dist/mcp/tools/list-networks.d.ts.map +1 -0
  133. package/dist/mcp/tools/list-networks.js +36 -0
  134. package/dist/mcp/tools/list-networks.js.map +1 -0
  135. package/dist/mcp/tools/list-signers.d.ts +4 -0
  136. package/dist/mcp/tools/list-signers.d.ts.map +1 -0
  137. package/dist/mcp/tools/list-signers.js +36 -0
  138. package/dist/mcp/tools/list-signers.js.map +1 -0
  139. package/dist/mcp/tools/read-contract.d.ts +4 -0
  140. package/dist/mcp/tools/read-contract.d.ts.map +1 -0
  141. package/dist/mcp/tools/read-contract.js +62 -0
  142. package/dist/mcp/tools/read-contract.js.map +1 -0
  143. package/dist/mcp/tools/resolve-address.d.ts +4 -0
  144. package/dist/mcp/tools/resolve-address.d.ts.map +1 -0
  145. package/dist/mcp/tools/resolve-address.js +37 -0
  146. package/dist/mcp/tools/resolve-address.js.map +1 -0
  147. package/dist/mcp/tools/send-eth.d.ts +4 -0
  148. package/dist/mcp/tools/send-eth.d.ts.map +1 -0
  149. package/dist/mcp/tools/send-eth.js +52 -0
  150. package/dist/mcp/tools/send-eth.js.map +1 -0
  151. package/dist/mcp/tools/send-token.d.ts +4 -0
  152. package/dist/mcp/tools/send-token.d.ts.map +1 -0
  153. package/dist/mcp/tools/send-token.js +102 -0
  154. package/dist/mcp/tools/send-token.js.map +1 -0
  155. package/dist/mcp/tools/sign-message.d.ts +4 -0
  156. package/dist/mcp/tools/sign-message.d.ts.map +1 -0
  157. package/dist/mcp/tools/sign-message.js +33 -0
  158. package/dist/mcp/tools/sign-message.js.map +1 -0
  159. package/dist/mcp/tools/sign-typed-data.d.ts +4 -0
  160. package/dist/mcp/tools/sign-typed-data.d.ts.map +1 -0
  161. package/dist/mcp/tools/sign-typed-data.js +48 -0
  162. package/dist/mcp/tools/sign-typed-data.js.map +1 -0
  163. package/dist/mcp/tools/simulate.d.ts +4 -0
  164. package/dist/mcp/tools/simulate.d.ts.map +1 -0
  165. package/dist/mcp/tools/simulate.js +54 -0
  166. package/dist/mcp/tools/simulate.js.map +1 -0
  167. package/dist/mcp/tools/wallet-overview.d.ts +4 -0
  168. package/dist/mcp/tools/wallet-overview.d.ts.map +1 -0
  169. package/dist/mcp/tools/wallet-overview.js +109 -0
  170. package/dist/mcp/tools/wallet-overview.js.map +1 -0
  171. package/dist/mcp/tools/x402-check.d.ts +3 -0
  172. package/dist/mcp/tools/x402-check.d.ts.map +1 -0
  173. package/dist/mcp/tools/x402-check.js +44 -0
  174. package/dist/mcp/tools/x402-check.js.map +1 -0
  175. package/dist/mcp/tools/x402-discover.d.ts +3 -0
  176. package/dist/mcp/tools/x402-discover.d.ts.map +1 -0
  177. package/dist/mcp/tools/x402-discover.js +42 -0
  178. package/dist/mcp/tools/x402-discover.js.map +1 -0
  179. package/dist/mcp/tools/x402-fetch.d.ts +4 -0
  180. package/dist/mcp/tools/x402-fetch.d.ts.map +1 -0
  181. package/dist/mcp/tools/x402-fetch.js +45 -0
  182. package/dist/mcp/tools/x402-fetch.js.map +1 -0
  183. package/package.json +68 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-signers.js","sourceRoot":"","sources":["../../../src/mcp/tools/list-signers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,aAA4B;IAClF,MAAM,CAAC,YAAY,CAClB,qBAAqB,EACrB;QACC,WAAW,EACV,4GAA4G;KAC7G,EACD,KAAK,IAAI,EAAE;QACV,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;QAEnC,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YAExC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACrB,OAAO;oBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;iBAChE,CAAC;YACH,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/B;gBACC,GAAG,CAAC,CAAC,IAAI,IAAI,SAAS,KAAK,CAAC,CAAC,MAAM,IAAI,SAAS,GAAG;gBACnD,SAAS,CAAC,CAAC,EAAE,EAAE;gBACf,cAAc,CAAC,CAAC,UAAU,EAAE;gBAC5B,YAAY,CAAC,CAAC,KAAK,IAAI,UAAU,EAAE;gBACnC,cAAc,CAAC,CAAC,OAAO,IAAI,SAAS,EAAE;gBACtC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE;aACpD,CAAC,IAAI,CAAC,IAAI,CAAC,CACZ,CAAC;YAEF,OAAO;gBACN,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,mBAAmB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;qBAC9D;iBACD;aACD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;QACrD,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { SignerManager } from '../../lib/signer-manager.js';
3
+ export declare function registerReadContract(server: McpServer, signerManager: SignerManager): void;
4
+ //# sourceMappingURL=read-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-contract.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/read-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAMjE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,QA8DnF"}
@@ -0,0 +1,62 @@
1
+ import { http, createPublicClient } from 'viem';
2
+ import { z } from 'zod';
3
+ import { formatError } from '../../lib/errors.js';
4
+ function bigIntReplacer(_key, value) {
5
+ return typeof value === 'bigint' ? value.toString() : value;
6
+ }
7
+ export function registerReadContract(server, signerManager) {
8
+ server.registerTool('agenta_read_contract', {
9
+ description: 'Read data from a smart contract (view/pure functions). No gas spent, no signing needed. Use this for checking balances, prices, allowances, or any on-chain state.',
10
+ inputSchema: {
11
+ contractAddress: z
12
+ .string()
13
+ .regex(/^0x[0-9a-fA-F]{40}$/)
14
+ .describe('Contract address (0x...)'),
15
+ abi: z
16
+ .array(z.record(z.unknown()))
17
+ .describe('Contract ABI (JSON array). Can be just the relevant function fragment.'),
18
+ functionName: z
19
+ .string()
20
+ .describe('Name of the view/pure function to call (e.g. "balanceOf", "totalSupply")'),
21
+ args: z
22
+ .array(z.unknown())
23
+ .optional()
24
+ .default([])
25
+ .describe('Function arguments as an ordered array'),
26
+ network: z
27
+ .string()
28
+ .optional()
29
+ .describe('Network name from agenta_list_networks (e.g. "base-sepolia", "mainnet", "arbitrum"). Required — call agenta_list_networks first if unknown.'),
30
+ },
31
+ }, async ({ contractAddress, abi, functionName, args, network }) => {
32
+ const api = signerManager.getApi();
33
+ const targetNetwork = signerManager.requireNetwork(network);
34
+ const rpcUrl = await api.getRpcUrl(targetNetwork);
35
+ const client = createPublicClient({ transport: http(rpcUrl) });
36
+ try {
37
+ const result = await client.readContract({
38
+ address: contractAddress,
39
+ abi,
40
+ functionName,
41
+ args,
42
+ });
43
+ return {
44
+ content: [
45
+ {
46
+ type: 'text',
47
+ text: [
48
+ 'Contract read successful.',
49
+ `Function: ${functionName}`,
50
+ `Contract: ${contractAddress}`,
51
+ `Result: ${JSON.stringify(result, bigIntReplacer)}`,
52
+ ].join('\n'),
53
+ },
54
+ ],
55
+ };
56
+ }
57
+ catch (error) {
58
+ return formatError(error, 'Read failed');
59
+ }
60
+ });
61
+ }
62
+ //# sourceMappingURL=read-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-contract.js","sourceRoot":"","sources":["../../../src/mcp/tools/read-contract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,SAAS,cAAc,CAAC,IAAY,EAAE,KAAc;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,aAA4B;IACnF,MAAM,CAAC,YAAY,CAClB,sBAAsB,EACtB;QACC,WAAW,EACV,oKAAoK;QACrK,WAAW,EAAE;YACZ,eAAe,EAAE,CAAC;iBAChB,MAAM,EAAE;iBACR,KAAK,CAAC,qBAAqB,CAAC;iBAC5B,QAAQ,CAAC,0BAA0B,CAAC;YACtC,GAAG,EAAE,CAAC;iBACJ,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;iBAC5B,QAAQ,CAAC,wEAAwE,CAAC;YACpF,YAAY,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,QAAQ,CAAC,0EAA0E,CAAC;YACtF,IAAI,EAAE,CAAC;iBACL,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;iBAClB,QAAQ,EAAE;iBACV,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,wCAAwC,CAAC;YACpD,OAAO,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACR,6IAA6I,CAC7I;SACF;KACD,EACD,KAAK,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QAC/D,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,aAAa,GAAG,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE/D,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;gBACxC,OAAO,EAAE,eAAgC;gBACzC,GAAG;gBACH,YAAY;gBACZ,IAAI;aACJ,CAAC,CAAC;YAEH,OAAO;gBACN,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACL,2BAA2B;4BAC3B,aAAa,YAAY,EAAE;4BAC3B,aAAa,eAAe,EAAE;4BAC9B,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE;yBACnD,CAAC,IAAI,CAAC,IAAI,CAAC;qBACZ;iBACD;aACD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAC1C,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { SignerManager } from '../../lib/signer-manager.js';
3
+ export declare function registerResolveAddress(server: McpServer, signerManager: SignerManager): void;
4
+ //# sourceMappingURL=resolve-address.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-address.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/resolve-address.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,QAwCrF"}
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod';
2
+ import { formatError } from '../../lib/errors.js';
3
+ export function registerResolveAddress(server, signerManager) {
4
+ server.registerTool('agenta_resolve_address', {
5
+ description: 'Resolve an ENS name (e.g. "vitalik.eth") to an Ethereum address. Useful before sending transactions to human-readable names.',
6
+ inputSchema: {
7
+ addressOrEns: z.string().describe('ENS name (e.g. "vitalik.eth") or 0x address to resolve'),
8
+ },
9
+ }, async ({ addressOrEns }) => {
10
+ const api = signerManager.getApi();
11
+ try {
12
+ const result = await api.resolveAddress(addressOrEns);
13
+ if (result.isEns) {
14
+ return {
15
+ content: [
16
+ {
17
+ type: 'text',
18
+ text: `${result.ensName} → ${result.address}`,
19
+ },
20
+ ],
21
+ };
22
+ }
23
+ return {
24
+ content: [
25
+ {
26
+ type: 'text',
27
+ text: `${result.address} (already a valid address)`,
28
+ },
29
+ ],
30
+ };
31
+ }
32
+ catch (error) {
33
+ return formatError(error, 'Address resolution failed');
34
+ }
35
+ });
36
+ }
37
+ //# sourceMappingURL=resolve-address.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-address.js","sourceRoot":"","sources":["../../../src/mcp/tools/resolve-address.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,aAA4B;IACrF,MAAM,CAAC,YAAY,CAClB,wBAAwB,EACxB;QACC,WAAW,EACV,8HAA8H;QAC/H,WAAW,EAAE;YACZ,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;SAC3F;KACD,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;QAEnC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YAEtD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO;oBACN,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,GAAG,MAAM,CAAC,OAAO,MAAM,MAAM,CAAC,OAAO,EAAE;yBAC7C;qBACD;iBACD,CAAC;YACH,CAAC;YAED,OAAO;gBACN,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,GAAG,MAAM,CAAC,OAAO,4BAA4B;qBACnD;iBACD;aACD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;QACxD,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { SignerManager } from '../../lib/signer-manager.js';
3
+ export declare function registerSendEth(server: McpServer, signerManager: SignerManager): void;
4
+ //# sourceMappingURL=send-eth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-eth.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/send-eth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,QAyD9E"}
@@ -0,0 +1,52 @@
1
+ import { parseEther } from 'viem';
2
+ import { z } from 'zod';
3
+ import { formatError } from '../../lib/errors.js';
4
+ export function registerSendEth(server, signerManager) {
5
+ server.registerTool('agenta_send_eth', {
6
+ description: 'Send ETH to any address or ENS name (e.g. "vitalik.eth"). Uses AgentaOS threshold signing — the full private key never exists. Policy-enforced by the server.',
7
+ inputSchema: {
8
+ to: z.string().describe('Recipient — 0x address or ENS name (e.g. "vitalik.eth")'),
9
+ value: z.string().describe('Amount in ETH (e.g. "0.01", "1.5")'),
10
+ network: z
11
+ .string()
12
+ .optional()
13
+ .describe('Network name from agenta_list_networks (e.g. "base-sepolia", "mainnet", "arbitrum"). Required — call agenta_list_networks first if unknown.'),
14
+ },
15
+ }, async ({ to, value, network }) => {
16
+ const api = signerManager.getApi();
17
+ const signer = await signerManager.getSigner();
18
+ const targetNetwork = signerManager.requireNetwork(network);
19
+ try {
20
+ const resolved = await api.resolveAddress(to);
21
+ const result = await signer.signTransaction({
22
+ to: resolved.address,
23
+ value: parseEther(value).toString(),
24
+ network: targetNetwork,
25
+ });
26
+ const explorer = await api.getExplorerTxUrl(targetNetwork, result.txHash);
27
+ const recipientDisplay = resolved.isEns
28
+ ? `${resolved.ensName} (${resolved.address})`
29
+ : resolved.address;
30
+ return {
31
+ content: [
32
+ {
33
+ type: 'text',
34
+ text: [
35
+ `Sent ${value} ETH successfully.`,
36
+ `To: ${recipientDisplay}`,
37
+ `Tx Hash: ${result.txHash}`,
38
+ `Network: ${targetNetwork}`,
39
+ explorer ? `Explorer: ${explorer}` : '',
40
+ ]
41
+ .filter(Boolean)
42
+ .join('\n'),
43
+ },
44
+ ],
45
+ };
46
+ }
47
+ catch (error) {
48
+ return formatError(error, 'ETH send failed');
49
+ }
50
+ });
51
+ }
52
+ //# sourceMappingURL=send-eth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-eth.js","sourceRoot":"","sources":["../../../src/mcp/tools/send-eth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,aAA4B;IAC9E,MAAM,CAAC,YAAY,CAClB,iBAAiB,EACjB;QACC,WAAW,EACV,+JAA+J;QAChK,WAAW,EAAE;YACZ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;YAClF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YAChE,OAAO,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACR,6IAA6I,CAC7I;SACF;KACD,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;QAChC,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;QAC/C,MAAM,aAAa,GAAG,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAE5D,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAE9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;gBAC3C,EAAE,EAAE,QAAQ,CAAC,OAAO;gBACpB,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;gBACnC,OAAO,EAAE,aAAa;aACtB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1E,MAAM,gBAAgB,GAAG,QAAQ,CAAC,KAAK;gBACtC,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,GAAG;gBAC7C,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YAEpB,OAAO;gBACN,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACL,QAAQ,KAAK,oBAAoB;4BACjC,OAAO,gBAAgB,EAAE;4BACzB,YAAY,MAAM,CAAC,MAAM,EAAE;4BAC3B,YAAY,aAAa,EAAE;4BAC3B,QAAQ,CAAC,CAAC,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;yBACvC;6BACC,MAAM,CAAC,OAAO,CAAC;6BACf,IAAI,CAAC,IAAI,CAAC;qBACZ;iBACD;aACD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAC9C,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { SignerManager } from '../../lib/signer-manager.js';
3
+ export declare function registerSendToken(server: McpServer, signerManager: SignerManager): void;
4
+ //# sourceMappingURL=send-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-token.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/send-token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,QAkHhF"}
@@ -0,0 +1,102 @@
1
+ import { http, createPublicClient, encodeFunctionData, parseUnits } from 'viem';
2
+ import { z } from 'zod';
3
+ import { ERC20_ABI } from '../../lib/erc20-abi.js';
4
+ import { formatError } from '../../lib/errors.js';
5
+ export function registerSendToken(server, signerManager) {
6
+ server.registerTool('agenta_send_token', {
7
+ description: 'Send ERC-20 tokens by symbol (e.g. "USDC", "WETH") or contract address. Supports ENS names for recipients. Automatically handles decimal conversion. The full private key never exists.',
8
+ inputSchema: {
9
+ token: z
10
+ .string()
11
+ .describe('Token symbol (e.g. "USDC", "WETH") or contract address (0x...). Symbols are resolved from the server\'s tracked token list.'),
12
+ to: z.string().describe('Recipient — 0x address or ENS name (e.g. "vitalik.eth")'),
13
+ amount: z
14
+ .string()
15
+ .describe('Amount in human-readable units (e.g. "100" for 100 USDC, "0.5" for 0.5 WETH)'),
16
+ network: z
17
+ .string()
18
+ .optional()
19
+ .describe('Network name from agenta_list_networks (e.g. "base-sepolia", "mainnet", "arbitrum"). Required — call agenta_list_networks first if unknown.'),
20
+ },
21
+ }, async ({ token, to, amount, network }) => {
22
+ const api = signerManager.getApi();
23
+ const signer = await signerManager.getSigner();
24
+ const targetNetwork = signerManager.requireNetwork(network);
25
+ try {
26
+ // Resolve recipient (ENS or 0x)
27
+ const resolved = await api.resolveAddress(to);
28
+ // Get default signer for token resolution
29
+ const defaultSigner = await api.getDefaultSigner();
30
+ // Get chainId for this network
31
+ const chainId = await api.getChainId(targetNetwork);
32
+ let tokenAddress;
33
+ let symbol;
34
+ let decimals;
35
+ const tokenResolved = await api.resolveToken(token, defaultSigner.id, chainId);
36
+ tokenAddress = tokenResolved.address;
37
+ if (tokenResolved.resolvedBySymbol) {
38
+ // Got everything from server registry
39
+ symbol = tokenResolved.symbol;
40
+ decimals = tokenResolved.decimals;
41
+ }
42
+ else {
43
+ // Raw address — read decimals & symbol from chain
44
+ const rpcUrl = await api.getRpcUrl(targetNetwork);
45
+ const publicClient = createPublicClient({
46
+ transport: http(rpcUrl),
47
+ });
48
+ [decimals, symbol] = await Promise.all([
49
+ publicClient.readContract({
50
+ address: tokenAddress,
51
+ abi: ERC20_ABI,
52
+ functionName: 'decimals',
53
+ }),
54
+ publicClient
55
+ .readContract({
56
+ address: tokenAddress,
57
+ abi: ERC20_ABI,
58
+ functionName: 'symbol',
59
+ })
60
+ .catch(() => 'TOKEN'),
61
+ ]);
62
+ }
63
+ const rawAmount = parseUnits(amount, decimals);
64
+ const data = encodeFunctionData({
65
+ abi: ERC20_ABI,
66
+ functionName: 'transfer',
67
+ args: [resolved.address, rawAmount],
68
+ });
69
+ const result = await signer.signTransaction({
70
+ to: tokenAddress,
71
+ data,
72
+ value: '0',
73
+ network: targetNetwork,
74
+ });
75
+ const explorer = await api.getExplorerTxUrl(targetNetwork, result.txHash);
76
+ const recipientDisplay = resolved.isEns
77
+ ? `${resolved.ensName} (${resolved.address})`
78
+ : resolved.address;
79
+ return {
80
+ content: [
81
+ {
82
+ type: 'text',
83
+ text: [
84
+ `Sent ${amount} ${symbol} successfully.`,
85
+ `To: ${recipientDisplay}`,
86
+ `Token: ${symbol} (${tokenAddress})`,
87
+ `Tx Hash: ${result.txHash}`,
88
+ `Network: ${targetNetwork}`,
89
+ explorer ? `Explorer: ${explorer}` : '',
90
+ ]
91
+ .filter(Boolean)
92
+ .join('\n'),
93
+ },
94
+ ],
95
+ };
96
+ }
97
+ catch (error) {
98
+ return formatError(error, 'Token send failed');
99
+ }
100
+ });
101
+ }
102
+ //# sourceMappingURL=send-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-token.js","sourceRoot":"","sources":["../../../src/mcp/tools/send-token.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAChF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,aAA4B;IAChF,MAAM,CAAC,YAAY,CAClB,mBAAmB,EACnB;QACC,WAAW,EACV,yLAAyL;QAC1L,WAAW,EAAE;YACZ,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,CACR,6HAA6H,CAC7H;YACF,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;YAClF,MAAM,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,CAAC,8EAA8E,CAAC;YAC1F,OAAO,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACR,6IAA6I,CAC7I;SACF;KACD,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QACxC,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;QAC/C,MAAM,aAAa,GAAG,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAE5D,IAAI,CAAC;YACJ,gCAAgC;YAChC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAE9C,0CAA0C;YAC1C,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAEnD,+BAA+B;YAC/B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YAEpD,IAAI,YAA2B,CAAC;YAChC,IAAI,MAAc,CAAC;YACnB,IAAI,QAAgB,CAAC;YAErB,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC/E,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC;YAErC,IAAI,aAAa,CAAC,gBAAgB,EAAE,CAAC;gBACpC,sCAAsC;gBACtC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;gBAC9B,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACP,kDAAkD;gBAClD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;gBAClD,MAAM,YAAY,GAAG,kBAAkB,CAAC;oBACvC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;iBACvB,CAAC,CAAC;gBAEH,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBACtC,YAAY,CAAC,YAAY,CAAC;wBACzB,OAAO,EAAE,YAAY;wBACrB,GAAG,EAAE,SAAS;wBACd,YAAY,EAAE,UAAU;qBACxB,CAAC;oBACF,YAAY;yBACV,YAAY,CAAC;wBACb,OAAO,EAAE,YAAY;wBACrB,GAAG,EAAE,SAAS;wBACd,YAAY,EAAE,QAAQ;qBACtB,CAAC;yBACD,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;iBACtB,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,kBAAkB,CAAC;gBAC/B,GAAG,EAAE,SAAS;gBACd,YAAY,EAAE,UAAU;gBACxB,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;aACnC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;gBAC3C,EAAE,EAAE,YAAY;gBAChB,IAAI;gBACJ,KAAK,EAAE,GAAG;gBACV,OAAO,EAAE,aAAa;aACtB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1E,MAAM,gBAAgB,GAAG,QAAQ,CAAC,KAAK;gBACtC,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,GAAG;gBAC7C,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YAEpB,OAAO;gBACN,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACL,QAAQ,MAAM,IAAI,MAAM,gBAAgB;4BACxC,OAAO,gBAAgB,EAAE;4BACzB,UAAU,MAAM,KAAK,YAAY,GAAG;4BACpC,YAAY,MAAM,CAAC,MAAM,EAAE;4BAC3B,YAAY,aAAa,EAAE;4BAC3B,QAAQ,CAAC,CAAC,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;yBACvC;6BACC,MAAM,CAAC,OAAO,CAAC;6BACf,IAAI,CAAC,IAAI,CAAC;qBACZ;iBACD;aACD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;QAChD,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { SignerManager } from '../../lib/signer-manager.js';
3
+ export declare function registerSignMessage(server: McpServer, signerManager: SignerManager): void;
4
+ //# sourceMappingURL=sign-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-message.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/sign-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,QAiClF"}
@@ -0,0 +1,33 @@
1
+ import { z } from 'zod';
2
+ import { formatError } from '../../lib/errors.js';
3
+ export function registerSignMessage(server, signerManager) {
4
+ server.registerTool('agenta_sign_message', {
5
+ description: 'Sign an arbitrary message using AgentaOS threshold signing (2-of-3 MPC). Returns an EIP-191 personal signature. No gas is spent.',
6
+ inputSchema: {
7
+ message: z.string().min(1).describe('The message to sign (plain text string)'),
8
+ },
9
+ }, async ({ message }) => {
10
+ const signer = await signerManager.getSigner();
11
+ try {
12
+ const result = await signer.signMessage(message);
13
+ const preview = message.length > 100 ? `${message.slice(0, 100)}...` : message;
14
+ return {
15
+ content: [
16
+ {
17
+ type: 'text',
18
+ text: [
19
+ 'Message signed successfully.',
20
+ `Message: "${preview}"`,
21
+ `Signature: ${result.signature}`,
22
+ `v: ${result.v} r: ${result.r} s: ${result.s}`,
23
+ ].join('\n'),
24
+ },
25
+ ],
26
+ };
27
+ }
28
+ catch (error) {
29
+ return formatError(error, 'Message signing failed');
30
+ }
31
+ });
32
+ }
33
+ //# sourceMappingURL=sign-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-message.js","sourceRoot":"","sources":["../../../src/mcp/tools/sign-message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,aAA4B;IAClF,MAAM,CAAC,YAAY,CAClB,qBAAqB,EACrB;QACC,WAAW,EACV,kIAAkI;QACnI,WAAW,EAAE;YACZ,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;SAC9E;KACD,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;QAC/C,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/E,OAAO;gBACN,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACL,8BAA8B;4BAC9B,aAAa,OAAO,GAAG;4BACvB,cAAc,MAAM,CAAC,SAAS,EAAE;4BAChC,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE;yBAChD,CAAC,IAAI,CAAC,IAAI,CAAC;qBACZ;iBACD;aACD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;QACrD,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { SignerManager } from '../../lib/signer-manager.js';
3
+ export declare function registerSignTypedData(server: McpServer, signerManager: SignerManager): void;
4
+ //# sourceMappingURL=sign-typed-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-typed-data.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/sign-typed-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,QAkDpF"}
@@ -0,0 +1,48 @@
1
+ import { z } from 'zod';
2
+ import { formatError } from '../../lib/errors.js';
3
+ export function registerSignTypedData(server, signerManager) {
4
+ server.registerTool('agenta_sign_typed_data', {
5
+ description: 'Sign EIP-712 typed data using AgentaOS threshold signing. Used for x402 payments, Permit2 approvals, ERC-3009 transfers, and off-chain structured signatures. No gas is spent.',
6
+ inputSchema: {
7
+ domain: z
8
+ .record(z.unknown())
9
+ .describe('EIP-712 domain (e.g. { name: "USD Coin", version: "2", chainId: 84532, verifyingContract: "0x..." })'),
10
+ types: z
11
+ .record(z.array(z.object({ name: z.string(), type: z.string() })))
12
+ .describe('EIP-712 type definitions'),
13
+ primaryType: z
14
+ .string()
15
+ .describe('Primary type name (e.g. "ReceiveWithAuthorization", "PermitTransferFrom")'),
16
+ message: z.record(z.unknown()).describe('The structured message data to sign'),
17
+ },
18
+ }, async ({ domain, types, primaryType, message }) => {
19
+ const signer = await signerManager.getSigner();
20
+ try {
21
+ const result = await signer.signMessage({
22
+ domain,
23
+ types,
24
+ primaryType,
25
+ message,
26
+ });
27
+ const domainName = typeof domain.name === 'string' ? domain.name : 'unnamed';
28
+ return {
29
+ content: [
30
+ {
31
+ type: 'text',
32
+ text: [
33
+ 'Typed data signed successfully.',
34
+ `Primary type: ${primaryType}`,
35
+ `Domain: ${domainName}`,
36
+ `Signature: ${result.signature}`,
37
+ `v: ${result.v} r: ${result.r} s: ${result.s}`,
38
+ ].join('\n'),
39
+ },
40
+ ],
41
+ };
42
+ }
43
+ catch (error) {
44
+ return formatError(error, 'Typed data signing failed');
45
+ }
46
+ });
47
+ }
48
+ //# sourceMappingURL=sign-typed-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-typed-data.js","sourceRoot":"","sources":["../../../src/mcp/tools/sign-typed-data.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,aAA4B;IACpF,MAAM,CAAC,YAAY,CAClB,wBAAwB,EACxB;QACC,WAAW,EACV,gLAAgL;QACjL,WAAW,EAAE;YACZ,MAAM,EAAE,CAAC;iBACP,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;iBACnB,QAAQ,CACR,sGAAsG,CACtG;YACF,KAAK,EAAE,CAAC;iBACN,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;iBACjE,QAAQ,CAAC,0BAA0B,CAAC;YACtC,WAAW,EAAE,CAAC;iBACZ,MAAM,EAAE;iBACR,QAAQ,CAAC,2EAA2E,CAAC;YACvF,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,qCAAqC,CAAC;SAC9E;KACD,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;QACjD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;QAC/C,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;gBACvC,MAAM;gBACN,KAAK;gBACL,WAAW;gBACX,OAAO;aACP,CAAC,CAAC;YACH,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7E,OAAO;gBACN,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACL,iCAAiC;4BACjC,iBAAiB,WAAW,EAAE;4BAC9B,WAAW,UAAU,EAAE;4BACvB,cAAc,MAAM,CAAC,SAAS,EAAE;4BAChC,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE;yBAChD,CAAC,IAAI,CAAC,IAAI,CAAC;qBACZ;iBACD;aACD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;QACxD,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { SignerManager } from '../../lib/signer-manager.js';
3
+ export declare function registerSimulate(server: McpServer, signerManager: SignerManager): void;
4
+ //# sourceMappingURL=simulate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/simulate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,QA6D/E"}
@@ -0,0 +1,54 @@
1
+ import { z } from 'zod';
2
+ import { formatError } from '../../lib/errors.js';
3
+ export function registerSimulate(server, signerManager) {
4
+ server.registerTool('agenta_simulate', {
5
+ description: 'Simulate a transaction to estimate gas cost before sending. No signing, no broadcast. Use this before agenta_send_eth or agenta_call_contract to verify the transaction will succeed and see gas estimates. Note: policy evaluation only happens during actual signing.',
6
+ inputSchema: {
7
+ to: z
8
+ .string()
9
+ .regex(/^0x[0-9a-fA-F]{40}$/)
10
+ .describe('Target address (0x...)'),
11
+ value: z
12
+ .string()
13
+ .optional()
14
+ .describe('ETH value in ETH units (e.g. "0.1"). Defaults to "0".'),
15
+ data: z
16
+ .string()
17
+ .optional()
18
+ .describe('Calldata as hex string (0x...). Omit for simple ETH transfers.'),
19
+ network: z
20
+ .string()
21
+ .optional()
22
+ .describe('Network name from agenta_list_networks (e.g. "base-sepolia", "mainnet", "arbitrum"). Required — call agenta_list_networks first if unknown.'),
23
+ },
24
+ }, async ({ to, value, data, network }) => {
25
+ const api = signerManager.getApi();
26
+ const targetNetwork = signerManager.requireNetwork(network);
27
+ try {
28
+ const defaultSigner = await api.getDefaultSigner();
29
+ const result = await api.simulate(defaultSigner.id, {
30
+ to,
31
+ value: value || '0',
32
+ data: data || '0x',
33
+ network: targetNetwork,
34
+ });
35
+ const lines = [
36
+ 'Simulation result:',
37
+ ` Would succeed: ${result.success ? 'yes' : 'no'}`,
38
+ ` Estimated gas: ${result.estimatedGas}`,
39
+ ` Gas cost: ~${result.gasCostEth} ETH`,
40
+ ` Network: ${targetNetwork}`,
41
+ ];
42
+ if (!result.success && result.error) {
43
+ lines.push(` Error: ${result.error}`);
44
+ }
45
+ return {
46
+ content: [{ type: 'text', text: lines.join('\n') }],
47
+ };
48
+ }
49
+ catch (error) {
50
+ return formatError(error, 'Simulation failed');
51
+ }
52
+ });
53
+ }
54
+ //# sourceMappingURL=simulate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate.js","sourceRoot":"","sources":["../../../src/mcp/tools/simulate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,aAA4B;IAC/E,MAAM,CAAC,YAAY,CAClB,iBAAiB,EACjB;QACC,WAAW,EACV,yQAAyQ;QAC1Q,WAAW,EAAE;YACZ,EAAE,EAAE,CAAC;iBACH,MAAM,EAAE;iBACR,KAAK,CAAC,qBAAqB,CAAC;iBAC5B,QAAQ,CAAC,wBAAwB,CAAC;YACpC,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,uDAAuD,CAAC;YACnE,IAAI,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,gEAAgE,CAAC;YAC5E,OAAO,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACR,6IAA6I,CAC7I;SACF;KACD,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QACtC,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,aAAa,GAAG,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAE5D,IAAI,CAAC;YACJ,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAEnD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,EAAE;gBACnD,EAAE;gBACF,KAAK,EAAE,KAAK,IAAI,GAAG;gBACnB,IAAI,EAAE,IAAI,IAAI,IAAI;gBAClB,OAAO,EAAE,aAAa;aACtB,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG;gBACb,oBAAoB;gBACpB,oBAAoB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;gBACnD,oBAAoB,MAAM,CAAC,YAAY,EAAE;gBACzC,gBAAgB,MAAM,CAAC,UAAU,MAAM;gBACvC,cAAc,aAAa,EAAE;aAC7B,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACxC,CAAC;YAED,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;aAC5D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;QAChD,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { SignerManager } from '../../lib/signer-manager.js';
3
+ export declare function registerWalletOverview(server: McpServer, signerManager: SignerManager): void;
4
+ //# sourceMappingURL=wallet-overview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet-overview.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/wallet-overview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,QA2HrF"}
@@ -0,0 +1,109 @@
1
+ import { formatUnits } from 'viem';
2
+ import { z } from 'zod';
3
+ import { formatError } from '../../lib/errors.js';
4
+ export function registerWalletOverview(server, signerManager) {
5
+ server.registerTool('agenta_wallet_overview', {
6
+ description: 'Get a complete overview of the AgentaOS wallet — address, balances, tracked token balances, and recent transactions. This is the best starting tool for any conversation about the wallet. Requires a network to show balances.',
7
+ inputSchema: {
8
+ network: z
9
+ .string()
10
+ .optional()
11
+ .describe('Network name from agenta_list_networks (e.g. "base-sepolia", "mainnet", "arbitrum"). Required to show balances — call agenta_list_networks first if unknown.'),
12
+ },
13
+ }, async ({ network }) => {
14
+ const api = signerManager.getApi();
15
+ const lines = [];
16
+ try {
17
+ // Fetch signer info
18
+ const signers = await api.listSigners();
19
+ if (!signers.length) {
20
+ return {
21
+ content: [
22
+ {
23
+ type: 'text',
24
+ text: 'No wallet found. Create an account first in AgentaOS.',
25
+ },
26
+ ],
27
+ };
28
+ }
29
+ // Safe — guarded by !signers.length above
30
+ const signer = signers[0];
31
+ lines.push(`Wallet: ${signer.name || 'AgentaOS'}`);
32
+ lines.push(`Address: ${signer.ethAddress}`);
33
+ lines.push(`Status: ${signer.status || 'active'}`);
34
+ // If no network specified and no env default, list available networks
35
+ const targetNetwork = network || signerManager.getNetwork();
36
+ if (!targetNetwork) {
37
+ lines.push('');
38
+ lines.push('No network specified — call agenta_list_networks to see available networks, then pass "network" to see balances.');
39
+ return {
40
+ content: [{ type: 'text', text: lines.join('\n') }],
41
+ };
42
+ }
43
+ const chainId = await api.getChainId(targetNetwork);
44
+ lines.push(chainId ? `Network: ${targetNetwork} (eip155:${chainId})` : `Network: ${targetNetwork}`);
45
+ lines.push('');
46
+ // ETH balance
47
+ try {
48
+ const balance = await api.getBalance(signer.id, targetNetwork);
49
+ for (const nb of balance.balances) {
50
+ if (nb.rpcError) {
51
+ lines.push('ETH: RPC error');
52
+ }
53
+ else {
54
+ lines.push(`ETH: ${formatUnits(BigInt(nb.balance), 18)}`);
55
+ }
56
+ }
57
+ }
58
+ catch {
59
+ lines.push('ETH: unable to fetch');
60
+ }
61
+ // Token balances from server's tracked tokens
62
+ try {
63
+ if (chainId) {
64
+ const tokenBalances = await api.getTokenBalances(signer.id, chainId);
65
+ for (const tb of tokenBalances) {
66
+ const formatted = formatUnits(BigInt(tb.balance), tb.decimals);
67
+ if (formatted !== '0') {
68
+ lines.push(`${tb.symbol}: ${formatted}`);
69
+ }
70
+ }
71
+ if (!tokenBalances.length) {
72
+ lines.push('No tracked tokens. Add tokens in AgentaOS or use agenta_call_contract.');
73
+ }
74
+ }
75
+ }
76
+ catch {
77
+ // Token balances not available — skip silently
78
+ }
79
+ // Recent activity (last 5)
80
+ lines.push('');
81
+ lines.push('Recent activity:');
82
+ try {
83
+ const audit = await api.getAuditLog({ limit: 5 });
84
+ const entries = audit.entries;
85
+ if (!entries.length) {
86
+ lines.push(' No transactions yet.');
87
+ }
88
+ else {
89
+ for (const e of entries) {
90
+ const status = e.status === 'completed' ? 'OK' : e.status.toUpperCase();
91
+ const action = e.decodedAction || e.requestType || 'tx';
92
+ const to = e.toAddress ? ` → ${e.toAddress.slice(0, 10)}...` : '';
93
+ lines.push(` [${status}] ${action}${to}`);
94
+ }
95
+ }
96
+ }
97
+ catch {
98
+ lines.push(' Unable to fetch activity.');
99
+ }
100
+ return {
101
+ content: [{ type: 'text', text: lines.join('\n') }],
102
+ };
103
+ }
104
+ catch (error) {
105
+ return formatError(error, 'Wallet overview failed');
106
+ }
107
+ });
108
+ }
109
+ //# sourceMappingURL=wallet-overview.js.map