web3-tools-mcp 1.5.0 → 2.0.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 (109) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/README.md +346 -164
  3. package/dist/anvil.d.ts +1 -1
  4. package/dist/anvil.d.ts.map +1 -1
  5. package/dist/anvil.js +11 -9
  6. package/dist/anvil.js.map +1 -1
  7. package/dist/chain-meta.d.ts.map +1 -1
  8. package/dist/chain-meta.js +7 -3
  9. package/dist/chain-meta.js.map +1 -1
  10. package/dist/chains.d.ts +960 -0
  11. package/dist/chains.d.ts.map +1 -0
  12. package/dist/chains.js +108 -0
  13. package/dist/chains.js.map +1 -0
  14. package/dist/client.d.ts +10 -1717
  15. package/dist/client.d.ts.map +1 -1
  16. package/dist/client.js +33 -216
  17. package/dist/client.js.map +1 -1
  18. package/dist/http-server.d.ts +18 -0
  19. package/dist/http-server.d.ts.map +1 -0
  20. package/dist/http-server.js +89 -0
  21. package/dist/http-server.js.map +1 -0
  22. package/dist/index.js +77 -32
  23. package/dist/index.js.map +1 -1
  24. package/dist/kv-storage.d.ts +23 -0
  25. package/dist/kv-storage.d.ts.map +1 -0
  26. package/dist/kv-storage.js +69 -0
  27. package/dist/kv-storage.js.map +1 -0
  28. package/dist/oauth.d.ts +31 -0
  29. package/dist/oauth.d.ts.map +1 -0
  30. package/dist/oauth.js +227 -0
  31. package/dist/oauth.js.map +1 -0
  32. package/dist/preview.d.ts.map +1 -1
  33. package/dist/preview.js +14 -4
  34. package/dist/preview.js.map +1 -1
  35. package/dist/tools/advanced.d.ts +4 -4
  36. package/dist/tools/advanced.d.ts.map +1 -1
  37. package/dist/tools/advanced.js +228 -247
  38. package/dist/tools/advanced.js.map +1 -1
  39. package/dist/tools/balance.d.ts +1 -1
  40. package/dist/tools/balance.d.ts.map +1 -1
  41. package/dist/tools/balance.js +97 -103
  42. package/dist/tools/balance.js.map +1 -1
  43. package/dist/tools/contract-info.d.ts +3 -3
  44. package/dist/tools/contract-info.d.ts.map +1 -1
  45. package/dist/tools/contract-info.js +150 -161
  46. package/dist/tools/contract-info.js.map +1 -1
  47. package/dist/tools/contract.d.ts +4 -4
  48. package/dist/tools/contract.d.ts.map +1 -1
  49. package/dist/tools/contract.js +91 -110
  50. package/dist/tools/contract.js.map +1 -1
  51. package/dist/tools/ens.d.ts +6 -6
  52. package/dist/tools/ens.d.ts.map +1 -1
  53. package/dist/tools/ens.js +239 -297
  54. package/dist/tools/ens.js.map +1 -1
  55. package/dist/tools/gas.d.ts +4 -4
  56. package/dist/tools/gas.d.ts.map +1 -1
  57. package/dist/tools/gas.js +90 -138
  58. package/dist/tools/gas.js.map +1 -1
  59. package/dist/tools/index.d.ts +1 -1
  60. package/dist/tools/index.d.ts.map +1 -1
  61. package/dist/tools/logs.d.ts +1 -1
  62. package/dist/tools/logs.d.ts.map +1 -1
  63. package/dist/tools/logs.js +36 -37
  64. package/dist/tools/logs.js.map +1 -1
  65. package/dist/tools/signatures.d.ts.map +1 -1
  66. package/dist/tools/signatures.js +67 -89
  67. package/dist/tools/signatures.js.map +1 -1
  68. package/dist/tools/transactions.d.ts +48 -4
  69. package/dist/tools/transactions.d.ts.map +1 -1
  70. package/dist/tools/transactions.js +228 -44
  71. package/dist/tools/transactions.js.map +1 -1
  72. package/dist/types.d.ts +2 -1
  73. package/dist/types.d.ts.map +1 -1
  74. package/dist/utils.d.ts +3 -8
  75. package/dist/utils.d.ts.map +1 -1
  76. package/dist/utils.js +36 -98
  77. package/dist/utils.js.map +1 -1
  78. package/dist/wallet-client.d.ts +11 -1
  79. package/dist/wallet-client.d.ts.map +1 -1
  80. package/dist/wallet-client.js +27 -9
  81. package/dist/wallet-client.js.map +1 -1
  82. package/dist/walletconnect.d.ts +52 -0
  83. package/dist/walletconnect.d.ts.map +1 -0
  84. package/dist/walletconnect.js +221 -0
  85. package/dist/walletconnect.js.map +1 -0
  86. package/package.json +21 -9
  87. package/src/anvil.ts +15 -18
  88. package/src/chain-meta.ts +8 -4
  89. package/src/chains.ts +145 -0
  90. package/src/client.ts +39 -252
  91. package/src/http-server.ts +117 -0
  92. package/src/index.ts +98 -49
  93. package/src/kv-storage.ts +83 -0
  94. package/src/oauth.ts +270 -0
  95. package/src/preview.ts +15 -14
  96. package/src/tools/advanced.ts +195 -213
  97. package/src/tools/balance.ts +103 -108
  98. package/src/tools/contract-info.ts +163 -184
  99. package/src/tools/contract.ts +123 -144
  100. package/src/tools/ens.ts +290 -345
  101. package/src/tools/gas.ts +122 -170
  102. package/src/tools/index.ts +2 -2
  103. package/src/tools/logs.ts +45 -43
  104. package/src/tools/signatures.ts +68 -86
  105. package/src/tools/transactions.ts +283 -50
  106. package/src/types.ts +2 -15
  107. package/src/utils.ts +56 -127
  108. package/src/wallet-client.ts +31 -9
  109. package/src/walletconnect.ts +269 -0
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAQ,MAAM,MAAM,CAAA;AAC/C,OAAO,EAAU,KAAK,SAAS,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAa9C,6FAA6F;AAC7F,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEzD,qBAAa,aAAa;IAGZ,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,OAAO,CAAqC;gBAEhC,MAAM,EAAE,MAAM;IAElC,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY;IAc7C,SAAS,IAAI,MAAM;IAInB,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM;IAIvC,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM;IAIxC,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS;IAIzD,yEAAyE;IACzE,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,SAAK,GAAG,MAAM,GAAG,SAAS;CAIjE;AAID,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAGrE;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAKhD"}
package/dist/client.js CHANGED
@@ -1,237 +1,54 @@
1
- import { http, createPublicClient } from 'viem';
2
- import { arbitrum, avalanche, base, bsc, gnosis, linea, localhost, mainnet, optimism, polygon, sonic, unichain, zksync } from 'viem/chains';
3
- // Enhanced RPC configuration with API keys
1
+ import { createPublicClient, http } from 'viem';
2
+ import { CHAINS } from './chains.js';
3
+ export { SUPPORTED_CHAINS } from './chains.js';
4
+ /** Custom URL first, then whichever provider key is configured, then the public endpoint. */
4
5
  function getRpcUrl(chainName, config) {
5
- // Check for custom RPC URLs first
6
- if (config.customRpcUrls?.[chainName]) {
7
- return config.customRpcUrls[chainName];
8
- }
9
- // Enhanced RPC URLs with API keys
10
- const enhancedRpcs = {
11
- mainnet: config.alchemyApiKey
12
- ? `https://eth-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
13
- : config.infuraApiKey
14
- ? `https://mainnet.infura.io/v3/${config.infuraApiKey}`
15
- : 'https://ethereum-rpc.publicnode.com',
16
- base: config.alchemyApiKey
17
- ? `https://base-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
18
- : 'https://base-rpc.publicnode.com',
19
- arbitrum: config.alchemyApiKey
20
- ? `https://arb-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
21
- : config.infuraApiKey
22
- ? `https://arbitrum-mainnet.infura.io/v3/${config.infuraApiKey}`
23
- : 'https://arb1.arbitrum.io/rpc',
24
- polygon: config.alchemyApiKey
25
- ? `https://polygon-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
26
- : config.infuraApiKey
27
- ? `https://polygon-mainnet.infura.io/v3/${config.infuraApiKey}`
28
- : 'https://polygon-rpc.com',
29
- optimism: config.alchemyApiKey
30
- ? `https://opt-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
31
- : config.infuraApiKey
32
- ? `https://optimism-mainnet.infura.io/v3/${config.infuraApiKey}`
33
- : 'https://mainnet.optimism.io',
34
- avalanche: config.alchemyApiKey
35
- ? `https://avax-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
36
- : config.infuraApiKey
37
- ? `https://avalanche-mainnet.infura.io/v3/${config.infuraApiKey}`
38
- : 'https://api.avax.network/ext/bc/C/rpc',
39
- bnb: config.alchemyApiKey
40
- ? `https://bnb-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
41
- : config.infuraApiKey
42
- ? `https://bsc-mainnet.infura.io/v3/${config.infuraApiKey}`
43
- : 'https://bsc-dataseed.bnbchain.org',
44
- gnosis: config.alchemyApiKey
45
- ? `https://gnosis-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
46
- : 'https://rpc.gnosischain.com',
47
- sonic: config.alchemyApiKey
48
- ? `https://sonic-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
49
- : 'https://rpc.soniclabs.com',
50
- zksync: config.alchemyApiKey
51
- ? `https://zksync-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
52
- : config.infuraApiKey
53
- ? `https://zksync-mainnet.infura.io/v3/${config.infuraApiKey}`
54
- : 'https://mainnet.era.zksync.io',
55
- linea: config.alchemyApiKey
56
- ? `https://linea-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
57
- : config.infuraApiKey
58
- ? `https://linea-mainnet.infura.io/v3/${config.infuraApiKey}`
59
- : 'https://rpc.linea.build',
60
- unichain: config.alchemyApiKey
61
- ? `https://unichain-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
62
- : config.infuraApiKey
63
- ? `https://unichain-mainnet.infura.io/v3/${config.infuraApiKey}`
64
- : 'https://sepolia.unichain.org',
65
- localhost: 'http://localhost:8545'
66
- };
67
- return enhancedRpcs[chainName] ?? 'https://eth.llamarpc.com';
6
+ const custom = config.customRpcUrls?.[chainName];
7
+ if (custom)
8
+ return custom;
9
+ const { alchemy, infura, fallback } = CHAINS[chainName];
10
+ if (alchemy && config.alchemyApiKey)
11
+ return `https://${alchemy}.g.alchemy.com/v2/${config.alchemyApiKey}`;
12
+ if (infura && config.infuraApiKey)
13
+ return `https://${infura}.infura.io/v3/${config.infuraApiKey}`;
14
+ return fallback;
68
15
  }
69
- // Supported chains with their RPC endpoints (now dynamic)
70
- export const CHAINS = (config) => ({
71
- mainnet: {
72
- chain: mainnet,
73
- get rpc() {
74
- return getRpcUrl('mainnet', config);
75
- }
76
- },
77
- base: {
78
- chain: base,
79
- get rpc() {
80
- return getRpcUrl('base', config);
81
- }
82
- },
83
- arbitrum: {
84
- chain: arbitrum,
85
- get rpc() {
86
- return getRpcUrl('arbitrum', config);
87
- }
88
- },
89
- polygon: {
90
- chain: polygon,
91
- get rpc() {
92
- return getRpcUrl('polygon', config);
93
- }
94
- },
95
- optimism: {
96
- chain: optimism,
97
- get rpc() {
98
- return getRpcUrl('optimism', config);
99
- }
100
- },
101
- avalanche: {
102
- chain: avalanche,
103
- get rpc() {
104
- return getRpcUrl('avalanche', config);
105
- }
106
- },
107
- bnb: {
108
- chain: bsc,
109
- get rpc() {
110
- return getRpcUrl('bnb', config);
111
- }
112
- },
113
- gnosis: {
114
- chain: gnosis,
115
- get rpc() {
116
- return getRpcUrl('gnosis', config);
117
- }
118
- },
119
- sonic: {
120
- chain: sonic,
121
- get rpc() {
122
- return getRpcUrl('sonic', config);
123
- }
124
- },
125
- zksync: {
126
- chain: zksync,
127
- get rpc() {
128
- return getRpcUrl('zksync', config);
129
- }
130
- },
131
- linea: {
132
- chain: linea,
133
- get rpc() {
134
- return getRpcUrl('linea', config);
135
- }
136
- },
137
- unichain: {
138
- chain: unichain,
139
- get rpc() {
140
- return getRpcUrl('unichain', config);
141
- }
142
- },
143
- localhost: {
144
- chain: localhost,
145
- get rpc() {
146
- return getRpcUrl('localhost', config);
147
- }
148
- }
149
- });
150
- // Hypersync URLs for supported chains (localhost is not supported)
151
- export const HYPERSYNC_URLS = {
152
- mainnet: 'https://eth.hypersync.xyz', // Chain ID 1
153
- arbitrum: 'https://arbitrum.hypersync.xyz', // Chain ID 42161
154
- avalanche: 'https://avalanche.hypersync.xyz', // Chain ID 43114
155
- base: 'https://base.hypersync.xyz', // Chain ID 8453
156
- bnb: 'https://bsc.hypersync.xyz', // Chain ID 56
157
- gnosis: 'https://gnosis.hypersync.xyz', // Chain ID 100
158
- sonic: 'https://sonic.hypersync.xyz', // Chain ID 146
159
- optimism: 'https://optimism.hypersync.xyz', // Chain ID 10
160
- polygon: 'https://polygon.hypersync.xyz', // Chain ID 137
161
- zksync: 'https://zksync.hypersync.xyz', // Chain ID 324
162
- linea: 'https://linea.hypersync.xyz', // Chain ID 59144
163
- unichain: 'https://unichain.hypersync.xyz' // Chain ID 130
164
- // localhost is not supported by hypersync
165
- };
166
- export const SUPPORTED_CHAINS = [
167
- 'mainnet',
168
- 'arbitrum',
169
- 'avalanche',
170
- 'base',
171
- 'bnb',
172
- 'gnosis',
173
- 'sonic',
174
- 'optimism',
175
- 'polygon',
176
- 'zksync',
177
- 'linea',
178
- 'unichain',
179
- 'localhost'
180
- ];
181
- // Client manager
182
16
  export class ClientManager {
183
- clients = new Map();
184
17
  config;
18
+ clients = new Map();
185
19
  constructor(config) {
186
20
  this.config = config;
187
21
  }
188
22
  getClient(chainName) {
189
- if (!this.clients.has(chainName)) {
190
- const chains = CHAINS(this.config);
191
- const { chain, rpc } = chains[chainName];
192
- const client = createPublicClient({
193
- chain,
194
- transport: http(rpc)
195
- });
196
- this.clients.set(chainName, client);
197
- }
198
- const client = this.clients.get(chainName);
199
- if (!client) {
200
- throw new Error(`Failed to create client for chain: ${chainName}`);
201
- }
23
+ const cached = this.clients.get(chainName);
24
+ if (cached)
25
+ return cached;
26
+ // Cast because a client built for a concrete chain is not assignable to the generic one.
27
+ const client = createPublicClient({
28
+ chain: CHAINS[chainName].chain,
29
+ transport: http(this.getRpcUrl(chainName))
30
+ });
31
+ this.clients.set(chainName, client);
202
32
  return client;
203
33
  }
204
34
  getConfig() {
205
35
  return this.config;
206
36
  }
207
- getEtherscanDomain(chainName) {
208
- const domains = {
209
- mainnet: 'etherscan.io',
210
- base: 'basescan.org',
211
- arbitrum: 'arbiscan.io',
212
- polygon: 'polygonscan.com',
213
- optimism: 'optimistic.etherscan.io',
214
- avalanche: 'snowtrace.io',
215
- bnb: 'bscscan.com',
216
- gnosis: 'gnosisscan.io',
217
- sonic: 'sonicscan.org',
218
- zksync: 'era.zksync.network',
219
- linea: 'lineascan.build',
220
- unichain: 'uniscan.xyz',
221
- localhost: 'etherscan.io'
222
- };
223
- return domains[chainName] || 'etherscan.io';
224
- }
225
37
  getRpcUrl(chainName) {
226
- const chains = CHAINS(this.config);
227
- return chains[chainName].rpc;
38
+ return getRpcUrl(chainName, this.config);
228
39
  }
229
40
  getChainId(chainName) {
230
- const chains = CHAINS(this.config);
231
- return chains[chainName].chain.id;
41
+ return CHAINS[chainName].chain.id;
42
+ }
43
+ getHypersyncUrl(chainName) {
44
+ return CHAINS[chainName].hypersync;
45
+ }
46
+ /** Undefined where the chain has no explorer — a local node, for one. */
47
+ explorerUrl(chainName, path = '') {
48
+ const domain = CHAINS[chainName].explorer;
49
+ return domain ? `https://${domain}${path}` : undefined;
232
50
  }
233
51
  }
234
- // Export a global client manager instance
235
52
  let clientManager = null;
236
53
  export function initializeClientManager(config) {
237
54
  clientManager = new ClientManager(config);
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAkB,MAAM,aAAa,CAAA;AAGpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C,6FAA6F;AAC7F,SAAS,SAAS,CAAC,SAAoB,EAAE,MAAc;IACrD,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,CAAA;IAChD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAA;IACvD,IAAI,OAAO,IAAI,MAAM,CAAC,aAAa;QAAE,OAAO,WAAW,OAAO,qBAAqB,MAAM,CAAC,aAAa,EAAE,CAAA;IACzG,IAAI,MAAM,IAAI,MAAM,CAAC,YAAY;QAAE,OAAO,WAAW,MAAM,iBAAiB,MAAM,CAAC,YAAY,EAAE,CAAA;IACjG,OAAO,QAAQ,CAAA;AACjB,CAAC;AAKD,MAAM,OAAO,aAAa;IAGJ;IAFZ,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAA;IAEpD,YAAoB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAEtC,SAAS,CAAC,SAAoB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC1C,IAAI,MAAM;YAAE,OAAO,MAAM,CAAA;QAEzB,yFAAyF;QACzF,MAAM,MAAM,GAAG,kBAAkB,CAAC;YAChC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK;YAC9B,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;SAC3C,CAAiB,CAAA;QAElB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QACnC,OAAO,MAAM,CAAA;IACf,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,SAAS,CAAC,SAAoB;QAC5B,OAAO,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC;IAED,UAAU,CAAC,SAAoB;QAC7B,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,EAAE,CAAA;IACnC,CAAC;IAED,eAAe,CAAC,SAAoB;QAClC,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAA;IACpC,CAAC;IAED,yEAAyE;IACzE,WAAW,CAAC,SAAoB,EAAE,IAAI,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAA;QACzC,OAAO,MAAM,CAAC,CAAC,CAAC,WAAW,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IACxD,CAAC;CACF;AAED,IAAI,aAAa,GAAyB,IAAI,CAAA;AAE9C,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAA;IACzC,OAAO,aAAa,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACnD,CAAC;IACD,OAAO,aAAa,CAAA;AACtB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { WalletRelay } from 'web3-wallet-relay';
3
+ export interface HttpServerOptions {
4
+ port?: number;
5
+ host?: string;
6
+ token?: string;
7
+ /** Public URL clients reach this server on; OAuth metadata must advertise it. */
8
+ publicUrl?: string;
9
+ /** Serve the signing page on this same server, so browser signing works when hosted. */
10
+ walletRelay?: WalletRelay;
11
+ createMcpServer: () => McpServer;
12
+ }
13
+ export declare function startHttpServer(options: HttpServerOptions): Promise<{
14
+ url: string;
15
+ port: number;
16
+ walletUrl?: string;
17
+ }>;
18
+ //# sourceMappingURL=http-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAmBpD,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wFAAwF;IACxF,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,eAAe,EAAE,MAAM,SAAS,CAAA;CACjC;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiF5H"}
@@ -0,0 +1,89 @@
1
+ import { requireBearerAuth } from '@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js';
2
+ import { getOAuthProtectedResourceMetadataUrl, mcpAuthRouter } from '@modelcontextprotocol/sdk/server/auth/router.js';
3
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
4
+ import express from 'express';
5
+ import { SingleUserOAuthProvider } from './oauth.js';
6
+ /**
7
+ * Serve the MCP over HTTP instead of stdio, so the server can live somewhere other than the
8
+ * machine running the agent. Signing still reaches you: a paired phone over WalletConnect,
9
+ * or the signing page, which is mounted on this same server so one platform port carries
10
+ * both it and /mcp.
11
+ *
12
+ * Two ways in, because clients differ: a static `Authorization: Bearer <MCP_TOKEN>` header
13
+ * (Claude Code), and the OAuth flow the MCP spec defines (claude.ai connectors, which offer
14
+ * no way to send a header). Both end up at the same single credential.
15
+ *
16
+ * Stateless — a server per request — because every tool here is a one-shot call and the
17
+ * signing state lives in the WalletConnect session, not in the transport.
18
+ */
19
+ const DEFAULT_PORT = 3457;
20
+ export async function startHttpServer(options) {
21
+ const port = options.port ?? Number(process.env.MCP_HTTP_PORT) ?? DEFAULT_PORT;
22
+ const host = options.host ?? process.env.MCP_HTTP_HOST ?? '0.0.0.0';
23
+ const token = options.token ?? process.env.MCP_TOKEN;
24
+ // A reachable MCP server with a paired phone can push signing prompts at that phone. It
25
+ // never runs without a token.
26
+ if (!token) {
27
+ throw new Error('MCP_TOKEN is required to serve MCP over HTTP — anyone reaching the URL could request signatures');
28
+ }
29
+ const publicUrl = options.publicUrl ?? process.env.MCP_PUBLIC_URL ?? `http://localhost:${port}`;
30
+ const issuer = new URL(publicUrl);
31
+ const provider = new SingleUserOAuthProvider(token);
32
+ const app = express();
33
+ app.use(express.json());
34
+ // The login form posts a token, so the authorize route needs form bodies too.
35
+ app.use(express.urlencoded({ extended: false }));
36
+ app.get('/health', (_req, res) => {
37
+ res.json({ status: 'ok' });
38
+ });
39
+ // /authorize, /token, /register, /revoke and the metadata documents a client discovers
40
+ // after a 401.
41
+ app.use(mcpAuthRouter({
42
+ provider,
43
+ issuerUrl: issuer,
44
+ baseUrl: issuer,
45
+ resourceServerUrl: new URL('/mcp', issuer),
46
+ resourceName: 'web3-tools-mcp',
47
+ scopesSupported: []
48
+ }));
49
+ // The metadata document is mounted under the resource path, so the 401 has to advertise
50
+ // that exact URL — a bare /.well-known/oauth-protected-resource 404s, and a client that
51
+ // follows it gives up right where discovery should have started.
52
+ const authenticate = requireBearerAuth({
53
+ verifier: provider,
54
+ resourceMetadataUrl: getOAuthProtectedResourceMetadataUrl(new URL('/mcp', issuer))
55
+ });
56
+ app.all('/mcp', authenticate, async (req, res) => {
57
+ const mcp = options.createMcpServer();
58
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined, enableJsonResponse: true });
59
+ res.on('close', () => {
60
+ transport.close().catch(() => { });
61
+ mcp.close().catch(() => { });
62
+ });
63
+ try {
64
+ await mcp.connect(transport);
65
+ await transport.handleRequest(req, res, req.body);
66
+ }
67
+ catch (error) {
68
+ console.error('[MCP] Request failed:', error);
69
+ if (!res.headersSent) {
70
+ res.status(500).json({ jsonrpc: '2.0', error: { code: -32603, message: 'Internal error' } });
71
+ }
72
+ }
73
+ });
74
+ const server = await new Promise((resolve, reject) => {
75
+ const listening = app.listen(port, host, () => resolve(listening));
76
+ listening.once('error', reject);
77
+ });
78
+ // The signing page rides on this same server, so a hosted deployment can offer browser
79
+ // signing without a second service: one platform port serves both /mcp and the page.
80
+ // Mounted last, so the routes above keep their paths — the relay only claims what is
81
+ // left, which is the static page at the root.
82
+ let walletUrl;
83
+ if (options.walletRelay) {
84
+ options.walletRelay.attach(server, (relayApp) => app.use(relayApp));
85
+ walletUrl = `${publicUrl.replace(/\/$/, '')}/#t=${options.walletRelay.token}`;
86
+ }
87
+ return { url: `${publicUrl.replace(/\/$/, '')}/mcp`, port: server.address().port, walletUrl };
88
+ }
89
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,11 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import packageJson from "../package.json" with { type: "json" };
3
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
- import { initializeClientManager } from "./client.js";
6
- import { registerAllTools } from "./tools/index.js";
7
- import { parseCommandLineArgs } from "./utils.js";
8
- import { getWalletClient } from "./wallet-client.js";
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { WalletRelay } from 'web3-wallet-relay';
5
+ import packageJson from '../package.json' with { type: 'json' };
6
+ import { initializeClientManager, SUPPORTED_CHAINS } from './client.js';
7
+ import { startHttpServer } from './http-server.js';
8
+ import { registerAllTools } from './tools/index.js';
9
+ import { parseCommandLineArgs } from './utils.js';
10
+ import { getWalletClient } from './wallet-client.js';
9
11
  // Parse configuration
10
12
  const config = parseCommandLineArgs();
11
13
  // Show help if requested
@@ -23,6 +25,8 @@ OPTIONS:
23
25
  --alchemy-api-key <key> Alchemy API key (for enhanced RPC)
24
26
  --infura-api-key <key> Infura API key (for alternative RPC)
25
27
  --hypersync-api-key <key> Hypersync API key (for fast event queries)
28
+ --walletconnect-project-id <id>
29
+ WalletConnect project id, to sign from a phone
26
30
  --custom-rpc <json> Custom RPC URLs as JSON object
27
31
  Example: '{"mainnet":"https://...", "base":"https://..."}'
28
32
 
@@ -31,11 +35,18 @@ ENVIRONMENT VARIABLES:
31
35
  ALCHEMY_API_KEY Alternative to --alchemy-api-key
32
36
  INFURA_API_KEY Alternative to --infura-api-key
33
37
  HYPERSYNC_API_KEY Alternative to --hypersync-api-key
38
+ WALLETCONNECT_PROJECT_ID Alternative to --walletconnect-project-id
39
+ CUSTOM_RPC Alternative to --custom-rpc
40
+ MCP_HTTP_PORT Serve MCP over HTTP on this port instead of stdio
41
+ MCP_TOKEN Bearer token required by the HTTP transport
42
+ MCP_PUBLIC_URL Public URL of this server, advertised in OAuth metadata
43
+ UPSTASH_REDIS_REST_URL Keep WalletConnect sessions in Redis, not on disk
44
+ UPSTASH_REDIS_REST_TOKEN
34
45
  WALLET_SERVER_URL URL of a hosted wallet relay (omit to run one locally)
35
46
  WALLET_TOKEN Shared pairing token for the wallet relay
36
47
 
37
48
  SUPPORTED CHAINS:
38
- mainnet, arbitrum, avalanche, base, bnb, gnosis, sonic, optimism, polygon, zksync, linea, unichain, localhost
49
+ ${SUPPORTED_CHAINS.join(', ')}
39
50
 
40
51
  EXAMPLES:
41
52
  # Use with npx (recommended)
@@ -58,32 +69,52 @@ For MCP client configuration, see the README.md file.
58
69
  }
59
70
  // Log configuration info
60
71
  if (config.etherscanApiKey) {
61
- console.error("[MCP] Etherscan API key configured");
72
+ console.error('[MCP] Etherscan API key configured');
62
73
  }
63
74
  if (config.alchemyApiKey) {
64
- console.error("[MCP] Alchemy API key configured");
75
+ console.error('[MCP] Alchemy API key configured');
65
76
  }
66
77
  if (config.infuraApiKey) {
67
- console.error("[MCP] Infura API key configured");
78
+ console.error('[MCP] Infura API key configured');
79
+ }
80
+ if (config.walletConnectProjectId) {
81
+ console.error('[MCP] WalletConnect project id configured — phone signing available');
68
82
  }
69
83
  if (config.customRpcUrls) {
70
- console.error("[MCP] Custom RPC URLs:", Object.keys(config.customRpcUrls));
84
+ console.error('[MCP] Custom RPC URLs:', Object.keys(config.customRpcUrls));
71
85
  }
72
86
  // Initialize client manager
73
87
  initializeClientManager(config);
74
- // Create MCP server instance
75
- const server = new McpServer({
76
- name: "web3-tools-mcp",
77
- version: packageJson.version,
78
- });
79
- // Register all tools
80
- registerAllTools(server);
81
- // Connect to the wallet relay (hosted when WALLET_SERVER_URL is set, embedded otherwise)
82
- const wallet = getWalletClient();
83
- const walletReady = wallet.connect().catch((error) => {
84
- console.error("[MCP] Wallet relay unavailable:", error.message);
85
- console.error("[MCP] Transaction signing features will not be available");
86
- });
88
+ function createMcpServer() {
89
+ const server = new McpServer({
90
+ name: 'web3-tools-mcp',
91
+ version: packageJson.version
92
+ });
93
+ registerAllTools(server);
94
+ return server;
95
+ }
96
+ const httpMode = Boolean(process.env.MCP_HTTP_PORT);
97
+ const httpPort = Number(process.env.MCP_HTTP_PORT);
98
+ /**
99
+ * Hosted, the signing page rides on the same port as /mcp, so a browser wallet works from
100
+ * a deployment too — the platform gives one port and both fit on it.
101
+ *
102
+ * Its token is minted per boot rather than persisted. A hosted relay is reachable from
103
+ * anywhere, and the pairing URL is fetched through wallet_status, which already needs
104
+ * MCP_TOKEN — so nobody types this token, and a short-lived one costs nothing. Locally the
105
+ * token stays on disk, because several editor sessions have to find the same relay.
106
+ */
107
+ const hostedRelay = httpMode
108
+ ? new WalletRelay({ token: process.env.WALLET_TOKEN, publicUrl: process.env.MCP_PUBLIC_URL })
109
+ : undefined;
110
+ const wallet = getWalletClient(hostedRelay ? { port: httpPort, token: hostedRelay.token } : undefined);
111
+ // Hosted, the relay is attached to the HTTP server, so connect only once that is listening.
112
+ const walletReady = httpMode
113
+ ? Promise.resolve()
114
+ : wallet.connect().catch((error) => {
115
+ console.error('[MCP] Wallet relay unavailable:', error.message);
116
+ console.error('[MCP] Transaction signing features will not be available');
117
+ });
87
118
  // The wallet relay's listening socket keeps the event loop alive, so this process would
88
119
  // outlive the client that spawned it and go on holding its port. Leave when the client does.
89
120
  let shuttingDown = false;
@@ -95,21 +126,35 @@ async function shutdown(reason) {
95
126
  await wallet.stop().catch(() => { });
96
127
  process.exit(0);
97
128
  }
98
- process.stdin.on("end", () => shutdown("client disconnected"));
99
- process.stdin.on("close", () => shutdown("client disconnected"));
100
- process.on("SIGTERM", () => shutdown("SIGTERM"));
101
- process.on("SIGINT", () => shutdown("SIGINT"));
129
+ process.stdin.on('end', () => shutdown('client disconnected'));
130
+ process.stdin.on('close', () => shutdown('client disconnected'));
131
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
132
+ process.on('SIGINT', () => shutdown('SIGINT'));
102
133
  // Start server
103
134
  async function main() {
135
+ if (httpMode) {
136
+ const { url, walletUrl } = await startHttpServer({ createMcpServer, walletRelay: hostedRelay });
137
+ console.error(`Web3 Tools MCP Server listening on ${url}`);
138
+ // Join the relay now that it is listening, so browser signing is available here too.
139
+ await wallet.connect().catch((error) => {
140
+ console.error('[MCP] Could not join the wallet relay:', error.message);
141
+ });
142
+ if (walletUrl)
143
+ console.error(`Wallet interface available at ${walletUrl}`);
144
+ if (!config.walletConnectProjectId) {
145
+ console.error('[MCP] No WalletConnect project id — phone signing is unavailable on this server');
146
+ }
147
+ return;
148
+ }
104
149
  const transport = new StdioServerTransport();
105
- await server.connect(transport);
106
- console.error("Web3 Tools MCP Server running on stdio");
150
+ await createMcpServer().connect(transport);
151
+ console.error('Web3 Tools MCP Server running on stdio');
107
152
  // The relay may still be picking a free port, and its URL carries the pairing token.
108
153
  await walletReady;
109
154
  console.error(`Wallet interface available at ${wallet.getUrl()}`);
110
155
  }
111
156
  main().catch((error) => {
112
- console.error("Fatal error:", error);
157
+ console.error('Fatal error:', error);
113
158
  process.exit(1);
114
159
  });
115
160
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}