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.
- package/LICENSE +199 -0
- package/README.md +249 -0
- package/dist/cli/commands/admin.command.d.ts +3 -0
- package/dist/cli/commands/admin.command.d.ts.map +1 -0
- package/dist/cli/commands/admin.command.js +415 -0
- package/dist/cli/commands/admin.command.js.map +1 -0
- package/dist/cli/commands/balance.command.d.ts +3 -0
- package/dist/cli/commands/balance.command.d.ts.map +1 -0
- package/dist/cli/commands/balance.command.js +65 -0
- package/dist/cli/commands/balance.command.js.map +1 -0
- package/dist/cli/commands/deploy.command.d.ts +3 -0
- package/dist/cli/commands/deploy.command.d.ts.map +1 -0
- package/dist/cli/commands/deploy.command.js +101 -0
- package/dist/cli/commands/deploy.command.js.map +1 -0
- package/dist/cli/commands/info.command.d.ts +3 -0
- package/dist/cli/commands/info.command.d.ts.map +1 -0
- package/dist/cli/commands/info.command.js +30 -0
- package/dist/cli/commands/info.command.js.map +1 -0
- package/dist/cli/commands/init.command.d.ts +3 -0
- package/dist/cli/commands/init.command.d.ts.map +1 -0
- package/dist/cli/commands/init.command.js +364 -0
- package/dist/cli/commands/init.command.js.map +1 -0
- package/dist/cli/commands/link.command.d.ts +3 -0
- package/dist/cli/commands/link.command.d.ts.map +1 -0
- package/dist/cli/commands/link.command.js +111 -0
- package/dist/cli/commands/link.command.js.map +1 -0
- package/dist/cli/commands/login.command.d.ts +4 -0
- package/dist/cli/commands/login.command.d.ts.map +1 -0
- package/dist/cli/commands/login.command.js +149 -0
- package/dist/cli/commands/login.command.js.map +1 -0
- package/dist/cli/commands/network.command.d.ts +3 -0
- package/dist/cli/commands/network.command.d.ts.map +1 -0
- package/dist/cli/commands/network.command.js +206 -0
- package/dist/cli/commands/network.command.js.map +1 -0
- package/dist/cli/commands/proxy.command.d.ts +3 -0
- package/dist/cli/commands/proxy.command.d.ts.map +1 -0
- package/dist/cli/commands/proxy.command.js +248 -0
- package/dist/cli/commands/proxy.command.js.map +1 -0
- package/dist/cli/commands/receive.command.d.ts +3 -0
- package/dist/cli/commands/receive.command.d.ts.map +1 -0
- package/dist/cli/commands/receive.command.js +360 -0
- package/dist/cli/commands/receive.command.js.map +1 -0
- package/dist/cli/commands/send.command.d.ts +3 -0
- package/dist/cli/commands/send.command.d.ts.map +1 -0
- package/dist/cli/commands/send.command.js +83 -0
- package/dist/cli/commands/send.command.js.map +1 -0
- package/dist/cli/commands/sign.command.d.ts +3 -0
- package/dist/cli/commands/sign.command.d.ts.map +1 -0
- package/dist/cli/commands/sign.command.js +53 -0
- package/dist/cli/commands/sign.command.js.map +1 -0
- package/dist/cli/commands/status.command.d.ts +3 -0
- package/dist/cli/commands/status.command.d.ts.map +1 -0
- package/dist/cli/commands/status.command.js +109 -0
- package/dist/cli/commands/status.command.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +50 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/theme.d.ts +35 -0
- package/dist/cli/theme.d.ts.map +1 -0
- package/dist/cli/theme.js +96 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/__tests__/transfer-crypto.test.d.ts +2 -0
- package/dist/lib/__tests__/transfer-crypto.test.d.ts.map +1 -0
- package/dist/lib/__tests__/transfer-crypto.test.js +151 -0
- package/dist/lib/__tests__/transfer-crypto.test.js.map +1 -0
- package/dist/lib/authenticated-fetch.d.ts +6 -0
- package/dist/lib/authenticated-fetch.d.ts.map +1 -0
- package/dist/lib/authenticated-fetch.js +74 -0
- package/dist/lib/authenticated-fetch.js.map +1 -0
- package/dist/lib/config.d.ts +42 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +163 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/erc20-abi.d.ts +43 -0
- package/dist/lib/erc20-abi.d.ts.map +1 -0
- package/dist/lib/erc20-abi.js +34 -0
- package/dist/lib/erc20-abi.js.map +1 -0
- package/dist/lib/errors.d.ts +12 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +23 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/keychain.d.ts +11 -0
- package/dist/lib/keychain.d.ts.map +1 -0
- package/dist/lib/keychain.js +216 -0
- package/dist/lib/keychain.js.map +1 -0
- package/dist/lib/policy-conversions.d.ts +19 -0
- package/dist/lib/policy-conversions.d.ts.map +1 -0
- package/dist/lib/policy-conversions.js +62 -0
- package/dist/lib/policy-conversions.js.map +1 -0
- package/dist/lib/signer-manager.d.ts +17 -0
- package/dist/lib/signer-manager.d.ts.map +1 -0
- package/dist/lib/signer-manager.js +80 -0
- package/dist/lib/signer-manager.js.map +1 -0
- package/dist/lib/transfer-crypto.d.ts +36 -0
- package/dist/lib/transfer-crypto.d.ts.map +1 -0
- package/dist/lib/transfer-crypto.js +109 -0
- package/dist/lib/transfer-crypto.js.map +1 -0
- package/dist/lib/x402-client.d.ts +63 -0
- package/dist/lib/x402-client.d.ts.map +1 -0
- package/dist/lib/x402-client.js +236 -0
- package/dist/lib/x402-client.js.map +1 -0
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +73 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools/call-contract.d.ts +4 -0
- package/dist/mcp/tools/call-contract.d.ts.map +1 -0
- package/dist/mcp/tools/call-contract.js +68 -0
- package/dist/mcp/tools/call-contract.js.map +1 -0
- package/dist/mcp/tools/execute.d.ts +4 -0
- package/dist/mcp/tools/execute.d.ts.map +1 -0
- package/dist/mcp/tools/execute.js +59 -0
- package/dist/mcp/tools/execute.js.map +1 -0
- package/dist/mcp/tools/get-audit-log.d.ts +4 -0
- package/dist/mcp/tools/get-audit-log.d.ts.map +1 -0
- package/dist/mcp/tools/get-audit-log.js +85 -0
- package/dist/mcp/tools/get-audit-log.js.map +1 -0
- package/dist/mcp/tools/get-balances.d.ts +4 -0
- package/dist/mcp/tools/get-balances.d.ts.map +1 -0
- package/dist/mcp/tools/get-balances.js +84 -0
- package/dist/mcp/tools/get-balances.js.map +1 -0
- package/dist/mcp/tools/get-status.d.ts +4 -0
- package/dist/mcp/tools/get-status.d.ts.map +1 -0
- package/dist/mcp/tools/get-status.js +66 -0
- package/dist/mcp/tools/get-status.js.map +1 -0
- package/dist/mcp/tools/list-networks.d.ts +4 -0
- package/dist/mcp/tools/list-networks.d.ts.map +1 -0
- package/dist/mcp/tools/list-networks.js +36 -0
- package/dist/mcp/tools/list-networks.js.map +1 -0
- package/dist/mcp/tools/list-signers.d.ts +4 -0
- package/dist/mcp/tools/list-signers.d.ts.map +1 -0
- package/dist/mcp/tools/list-signers.js +36 -0
- package/dist/mcp/tools/list-signers.js.map +1 -0
- package/dist/mcp/tools/read-contract.d.ts +4 -0
- package/dist/mcp/tools/read-contract.d.ts.map +1 -0
- package/dist/mcp/tools/read-contract.js +62 -0
- package/dist/mcp/tools/read-contract.js.map +1 -0
- package/dist/mcp/tools/resolve-address.d.ts +4 -0
- package/dist/mcp/tools/resolve-address.d.ts.map +1 -0
- package/dist/mcp/tools/resolve-address.js +37 -0
- package/dist/mcp/tools/resolve-address.js.map +1 -0
- package/dist/mcp/tools/send-eth.d.ts +4 -0
- package/dist/mcp/tools/send-eth.d.ts.map +1 -0
- package/dist/mcp/tools/send-eth.js +52 -0
- package/dist/mcp/tools/send-eth.js.map +1 -0
- package/dist/mcp/tools/send-token.d.ts +4 -0
- package/dist/mcp/tools/send-token.d.ts.map +1 -0
- package/dist/mcp/tools/send-token.js +102 -0
- package/dist/mcp/tools/send-token.js.map +1 -0
- package/dist/mcp/tools/sign-message.d.ts +4 -0
- package/dist/mcp/tools/sign-message.d.ts.map +1 -0
- package/dist/mcp/tools/sign-message.js +33 -0
- package/dist/mcp/tools/sign-message.js.map +1 -0
- package/dist/mcp/tools/sign-typed-data.d.ts +4 -0
- package/dist/mcp/tools/sign-typed-data.d.ts.map +1 -0
- package/dist/mcp/tools/sign-typed-data.js +48 -0
- package/dist/mcp/tools/sign-typed-data.js.map +1 -0
- package/dist/mcp/tools/simulate.d.ts +4 -0
- package/dist/mcp/tools/simulate.d.ts.map +1 -0
- package/dist/mcp/tools/simulate.js +54 -0
- package/dist/mcp/tools/simulate.js.map +1 -0
- package/dist/mcp/tools/wallet-overview.d.ts +4 -0
- package/dist/mcp/tools/wallet-overview.d.ts.map +1 -0
- package/dist/mcp/tools/wallet-overview.js +109 -0
- package/dist/mcp/tools/wallet-overview.js.map +1 -0
- package/dist/mcp/tools/x402-check.d.ts +3 -0
- package/dist/mcp/tools/x402-check.d.ts.map +1 -0
- package/dist/mcp/tools/x402-check.js +44 -0
- package/dist/mcp/tools/x402-check.js.map +1 -0
- package/dist/mcp/tools/x402-discover.d.ts +3 -0
- package/dist/mcp/tools/x402-discover.d.ts.map +1 -0
- package/dist/mcp/tools/x402-discover.js +42 -0
- package/dist/mcp/tools/x402-discover.js.map +1 -0
- package/dist/mcp/tools/x402-fetch.d.ts +4 -0
- package/dist/mcp/tools/x402-fetch.d.ts.map +1 -0
- package/dist/mcp/tools/x402-fetch.js +45 -0
- package/dist/mcp/tools/x402-fetch.js.map +1 -0
- 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":"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"}
|
|
@@ -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
|