web3-tools-mcp 1.6.0 → 2.0.1

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 (104) hide show
  1. package/CHANGELOG.md +109 -0
  2. package/README.md +328 -234
  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 -218
  17. package/dist/client.js.map +1 -1
  18. package/dist/http-server.d.ts +6 -0
  19. package/dist/http-server.d.ts.map +1 -1
  20. package/dist/http-server.js +55 -40
  21. package/dist/http-server.js.map +1 -1
  22. package/dist/index.js +50 -29
  23. package/dist/index.js.map +1 -1
  24. package/dist/oauth.d.ts +31 -0
  25. package/dist/oauth.d.ts.map +1 -0
  26. package/dist/oauth.js +227 -0
  27. package/dist/oauth.js.map +1 -0
  28. package/dist/preview.d.ts.map +1 -1
  29. package/dist/preview.js +2 -2
  30. package/dist/preview.js.map +1 -1
  31. package/dist/tools/advanced.d.ts +4 -4
  32. package/dist/tools/advanced.d.ts.map +1 -1
  33. package/dist/tools/advanced.js +228 -247
  34. package/dist/tools/advanced.js.map +1 -1
  35. package/dist/tools/balance.d.ts +1 -1
  36. package/dist/tools/balance.d.ts.map +1 -1
  37. package/dist/tools/balance.js +97 -103
  38. package/dist/tools/balance.js.map +1 -1
  39. package/dist/tools/contract-info.d.ts +3 -3
  40. package/dist/tools/contract-info.d.ts.map +1 -1
  41. package/dist/tools/contract-info.js +150 -161
  42. package/dist/tools/contract-info.js.map +1 -1
  43. package/dist/tools/contract.d.ts +4 -4
  44. package/dist/tools/contract.d.ts.map +1 -1
  45. package/dist/tools/contract.js +91 -110
  46. package/dist/tools/contract.js.map +1 -1
  47. package/dist/tools/ens.d.ts +6 -6
  48. package/dist/tools/ens.d.ts.map +1 -1
  49. package/dist/tools/ens.js +239 -297
  50. package/dist/tools/ens.js.map +1 -1
  51. package/dist/tools/gas.d.ts +4 -4
  52. package/dist/tools/gas.d.ts.map +1 -1
  53. package/dist/tools/gas.js +90 -138
  54. package/dist/tools/gas.js.map +1 -1
  55. package/dist/tools/index.d.ts +1 -1
  56. package/dist/tools/index.d.ts.map +1 -1
  57. package/dist/tools/logs.d.ts +1 -1
  58. package/dist/tools/logs.d.ts.map +1 -1
  59. package/dist/tools/logs.js +36 -37
  60. package/dist/tools/logs.js.map +1 -1
  61. package/dist/tools/signatures.d.ts.map +1 -1
  62. package/dist/tools/signatures.js +67 -89
  63. package/dist/tools/signatures.js.map +1 -1
  64. package/dist/tools/transactions.d.ts +35 -5
  65. package/dist/tools/transactions.d.ts.map +1 -1
  66. package/dist/tools/transactions.js +148 -74
  67. package/dist/tools/transactions.js.map +1 -1
  68. package/dist/types.d.ts +1 -1
  69. package/dist/types.d.ts.map +1 -1
  70. package/dist/utils.d.ts +1 -1
  71. package/dist/utils.d.ts.map +1 -1
  72. package/dist/utils.js +35 -98
  73. package/dist/utils.js.map +1 -1
  74. package/dist/wallet-client.d.ts +11 -1
  75. package/dist/wallet-client.d.ts.map +1 -1
  76. package/dist/wallet-client.js +27 -9
  77. package/dist/wallet-client.js.map +1 -1
  78. package/dist/walletconnect.d.ts +22 -1
  79. package/dist/walletconnect.d.ts.map +1 -1
  80. package/dist/walletconnect.js +106 -8
  81. package/dist/walletconnect.js.map +1 -1
  82. package/package.json +17 -9
  83. package/src/anvil.ts +15 -18
  84. package/src/chain-meta.ts +8 -4
  85. package/src/chains.ts +145 -0
  86. package/src/client.ts +39 -254
  87. package/src/http-server.ts +67 -44
  88. package/src/index.ts +77 -53
  89. package/src/oauth.ts +270 -0
  90. package/src/preview.ts +3 -12
  91. package/src/tools/advanced.ts +195 -213
  92. package/src/tools/balance.ts +103 -108
  93. package/src/tools/contract-info.ts +163 -184
  94. package/src/tools/contract.ts +123 -144
  95. package/src/tools/ens.ts +290 -345
  96. package/src/tools/gas.ts +122 -170
  97. package/src/tools/index.ts +2 -2
  98. package/src/tools/logs.ts +45 -43
  99. package/src/tools/signatures.ts +68 -86
  100. package/src/tools/transactions.ts +194 -87
  101. package/src/types.ts +1 -15
  102. package/src/utils.ts +52 -110
  103. package/src/wallet-client.ts +31 -9
  104. package/src/walletconnect.ts +124 -7
@@ -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,239 +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
- // publicnode refuses receipts and anything else it calls an archive request
19
- : 'https://mainnet.base.org',
20
- arbitrum: config.alchemyApiKey
21
- ? `https://arb-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
22
- : config.infuraApiKey
23
- ? `https://arbitrum-mainnet.infura.io/v3/${config.infuraApiKey}`
24
- : 'https://arb1.arbitrum.io/rpc',
25
- polygon: config.alchemyApiKey
26
- ? `https://polygon-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
27
- : config.infuraApiKey
28
- ? `https://polygon-mainnet.infura.io/v3/${config.infuraApiKey}`
29
- // polygon-rpc.com now answers 401 "API key disabled" to anonymous callers
30
- : 'https://polygon-bor-rpc.publicnode.com',
31
- optimism: config.alchemyApiKey
32
- ? `https://opt-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
33
- : config.infuraApiKey
34
- ? `https://optimism-mainnet.infura.io/v3/${config.infuraApiKey}`
35
- : 'https://mainnet.optimism.io',
36
- avalanche: config.alchemyApiKey
37
- ? `https://avax-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
38
- : config.infuraApiKey
39
- ? `https://avalanche-mainnet.infura.io/v3/${config.infuraApiKey}`
40
- : 'https://api.avax.network/ext/bc/C/rpc',
41
- bnb: config.alchemyApiKey
42
- ? `https://bnb-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
43
- : config.infuraApiKey
44
- ? `https://bsc-mainnet.infura.io/v3/${config.infuraApiKey}`
45
- : 'https://bsc-dataseed.bnbchain.org',
46
- gnosis: config.alchemyApiKey
47
- ? `https://gnosis-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
48
- : 'https://rpc.gnosischain.com',
49
- sonic: config.alchemyApiKey
50
- ? `https://sonic-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
51
- : 'https://rpc.soniclabs.com',
52
- zksync: config.alchemyApiKey
53
- ? `https://zksync-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
54
- : config.infuraApiKey
55
- ? `https://zksync-mainnet.infura.io/v3/${config.infuraApiKey}`
56
- : 'https://mainnet.era.zksync.io',
57
- linea: config.alchemyApiKey
58
- ? `https://linea-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
59
- : config.infuraApiKey
60
- ? `https://linea-mainnet.infura.io/v3/${config.infuraApiKey}`
61
- : 'https://rpc.linea.build',
62
- unichain: config.alchemyApiKey
63
- ? `https://unichain-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
64
- : config.infuraApiKey
65
- ? `https://unichain-mainnet.infura.io/v3/${config.infuraApiKey}`
66
- : 'https://sepolia.unichain.org',
67
- localhost: 'http://localhost:8545'
68
- };
69
- 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;
70
15
  }
71
- // Supported chains with their RPC endpoints (now dynamic)
72
- export const CHAINS = (config) => ({
73
- mainnet: {
74
- chain: mainnet,
75
- get rpc() {
76
- return getRpcUrl('mainnet', config);
77
- }
78
- },
79
- base: {
80
- chain: base,
81
- get rpc() {
82
- return getRpcUrl('base', config);
83
- }
84
- },
85
- arbitrum: {
86
- chain: arbitrum,
87
- get rpc() {
88
- return getRpcUrl('arbitrum', config);
89
- }
90
- },
91
- polygon: {
92
- chain: polygon,
93
- get rpc() {
94
- return getRpcUrl('polygon', config);
95
- }
96
- },
97
- optimism: {
98
- chain: optimism,
99
- get rpc() {
100
- return getRpcUrl('optimism', config);
101
- }
102
- },
103
- avalanche: {
104
- chain: avalanche,
105
- get rpc() {
106
- return getRpcUrl('avalanche', config);
107
- }
108
- },
109
- bnb: {
110
- chain: bsc,
111
- get rpc() {
112
- return getRpcUrl('bnb', config);
113
- }
114
- },
115
- gnosis: {
116
- chain: gnosis,
117
- get rpc() {
118
- return getRpcUrl('gnosis', config);
119
- }
120
- },
121
- sonic: {
122
- chain: sonic,
123
- get rpc() {
124
- return getRpcUrl('sonic', config);
125
- }
126
- },
127
- zksync: {
128
- chain: zksync,
129
- get rpc() {
130
- return getRpcUrl('zksync', config);
131
- }
132
- },
133
- linea: {
134
- chain: linea,
135
- get rpc() {
136
- return getRpcUrl('linea', config);
137
- }
138
- },
139
- unichain: {
140
- chain: unichain,
141
- get rpc() {
142
- return getRpcUrl('unichain', config);
143
- }
144
- },
145
- localhost: {
146
- chain: localhost,
147
- get rpc() {
148
- return getRpcUrl('localhost', config);
149
- }
150
- }
151
- });
152
- // Hypersync URLs for supported chains (localhost is not supported)
153
- export const HYPERSYNC_URLS = {
154
- mainnet: 'https://eth.hypersync.xyz', // Chain ID 1
155
- arbitrum: 'https://arbitrum.hypersync.xyz', // Chain ID 42161
156
- avalanche: 'https://avalanche.hypersync.xyz', // Chain ID 43114
157
- base: 'https://base.hypersync.xyz', // Chain ID 8453
158
- bnb: 'https://bsc.hypersync.xyz', // Chain ID 56
159
- gnosis: 'https://gnosis.hypersync.xyz', // Chain ID 100
160
- sonic: 'https://sonic.hypersync.xyz', // Chain ID 146
161
- optimism: 'https://optimism.hypersync.xyz', // Chain ID 10
162
- polygon: 'https://polygon.hypersync.xyz', // Chain ID 137
163
- zksync: 'https://zksync.hypersync.xyz', // Chain ID 324
164
- linea: 'https://linea.hypersync.xyz', // Chain ID 59144
165
- unichain: 'https://unichain.hypersync.xyz' // Chain ID 130
166
- // localhost is not supported by hypersync
167
- };
168
- export const SUPPORTED_CHAINS = [
169
- 'mainnet',
170
- 'arbitrum',
171
- 'avalanche',
172
- 'base',
173
- 'bnb',
174
- 'gnosis',
175
- 'sonic',
176
- 'optimism',
177
- 'polygon',
178
- 'zksync',
179
- 'linea',
180
- 'unichain',
181
- 'localhost'
182
- ];
183
- // Client manager
184
16
  export class ClientManager {
185
- clients = new Map();
186
17
  config;
18
+ clients = new Map();
187
19
  constructor(config) {
188
20
  this.config = config;
189
21
  }
190
22
  getClient(chainName) {
191
- if (!this.clients.has(chainName)) {
192
- const chains = CHAINS(this.config);
193
- const { chain, rpc } = chains[chainName];
194
- const client = createPublicClient({
195
- chain,
196
- transport: http(rpc)
197
- });
198
- this.clients.set(chainName, client);
199
- }
200
- const client = this.clients.get(chainName);
201
- if (!client) {
202
- throw new Error(`Failed to create client for chain: ${chainName}`);
203
- }
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);
204
32
  return client;
205
33
  }
206
34
  getConfig() {
207
35
  return this.config;
208
36
  }
209
- getEtherscanDomain(chainName) {
210
- const domains = {
211
- mainnet: 'etherscan.io',
212
- base: 'basescan.org',
213
- arbitrum: 'arbiscan.io',
214
- polygon: 'polygonscan.com',
215
- optimism: 'optimistic.etherscan.io',
216
- avalanche: 'snowtrace.io',
217
- bnb: 'bscscan.com',
218
- gnosis: 'gnosisscan.io',
219
- sonic: 'sonicscan.org',
220
- zksync: 'era.zksync.network',
221
- linea: 'lineascan.build',
222
- unichain: 'uniscan.xyz',
223
- localhost: 'etherscan.io'
224
- };
225
- return domains[chainName] || 'etherscan.io';
226
- }
227
37
  getRpcUrl(chainName) {
228
- const chains = CHAINS(this.config);
229
- return chains[chainName].rpc;
38
+ return getRpcUrl(chainName, this.config);
230
39
  }
231
40
  getChainId(chainName) {
232
- const chains = CHAINS(this.config);
233
- 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;
234
50
  }
235
51
  }
236
- // Export a global client manager instance
237
52
  let clientManager = null;
238
53
  export function initializeClientManager(config) {
239
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"}
@@ -1,12 +1,18 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { WalletRelay } from 'web3-wallet-relay';
2
3
  export interface HttpServerOptions {
3
4
  port?: number;
4
5
  host?: string;
5
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;
6
11
  createMcpServer: () => McpServer;
7
12
  }
8
13
  export declare function startHttpServer(options: HttpServerOptions): Promise<{
9
14
  url: string;
10
15
  port: number;
16
+ walletUrl?: string;
11
17
  }>;
12
18
  //# sourceMappingURL=http-server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAyBxE,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,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,CAAA;CAAE,CAAC,CA0DxG"}
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"}
@@ -1,49 +1,59 @@
1
- import { createServer } from 'node:http';
2
- import { timingSafeEqual } from 'node:crypto';
1
+ import { requireBearerAuth } from '@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js';
2
+ import { getOAuthProtectedResourceMetadataUrl, mcpAuthRouter } from '@modelcontextprotocol/sdk/server/auth/router.js';
3
3
  import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
4
+ import express from 'express';
5
+ import { SingleUserOAuthProvider } from './oauth.js';
4
6
  /**
5
7
  * Serve the MCP over HTTP instead of stdio, so the server can live somewhere other than the
6
- * machine running the agent. Only worth doing alongside WalletConnect: a hosted server has
7
- * no browser to open, so a phone wallet is the only way it can have anything signed.
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.
8
15
  *
9
16
  * Stateless — a server per request — because every tool here is a one-shot call and the
10
17
  * signing state lives in the WalletConnect session, not in the transport.
11
18
  */
12
19
  const DEFAULT_PORT = 3457;
13
- function unauthorized(res) {
14
- res.writeHead(401, { 'content-type': 'application/json', 'www-authenticate': 'Bearer' });
15
- res.end(JSON.stringify({ jsonrpc: '2.0', error: { code: -32001, message: 'Unauthorized' } }));
16
- }
17
- /** Constant-time compare, so the token cannot be guessed a character at a time. */
18
- function tokenMatches(presented, expected) {
19
- const a = Buffer.from(presented);
20
- const b = Buffer.from(expected);
21
- return a.length === b.length && timingSafeEqual(a, b);
22
- }
23
20
  export async function startHttpServer(options) {
24
21
  const port = options.port ?? Number(process.env.MCP_HTTP_PORT) ?? DEFAULT_PORT;
25
- const host = options.host ?? process.env.HOST ?? (process.env.MCP_HTTP_HOST ? process.env.MCP_HTTP_HOST : '0.0.0.0');
22
+ const host = options.host ?? process.env.MCP_HTTP_HOST ?? '0.0.0.0';
26
23
  const token = options.token ?? process.env.MCP_TOKEN;
27
24
  // A reachable MCP server with a paired phone can push signing prompts at that phone. It
28
25
  // never runs without a token.
29
26
  if (!token) {
30
27
  throw new Error('MCP_TOKEN is required to serve MCP over HTTP — anyone reaching the URL could request signatures');
31
28
  }
32
- const server = createServer(async (req, res) => {
33
- if (req.url === '/health') {
34
- res.writeHead(200, { 'content-type': 'application/json' });
35
- res.end(JSON.stringify({ status: 'ok' }));
36
- return;
37
- }
38
- if (!req.url?.startsWith('/mcp')) {
39
- res.writeHead(404).end();
40
- return;
41
- }
42
- const presented = req.headers.authorization?.replace(/^Bearer /i, '') ?? '';
43
- if (!tokenMatches(presented, token)) {
44
- unauthorized(res);
45
- return;
46
- }
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) => {
47
57
  const mcp = options.createMcpServer();
48
58
  const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined, enableJsonResponse: true });
49
59
  res.on('close', () => {
@@ -52,23 +62,28 @@ export async function startHttpServer(options) {
52
62
  });
53
63
  try {
54
64
  await mcp.connect(transport);
55
- await transport.handleRequest(req, res);
65
+ await transport.handleRequest(req, res, req.body);
56
66
  }
57
67
  catch (error) {
58
68
  console.error('[MCP] Request failed:', error);
59
69
  if (!res.headersSent) {
60
- res.writeHead(500, { 'content-type': 'application/json' });
61
- res.end(JSON.stringify({ jsonrpc: '2.0', error: { code: -32603, message: 'Internal error' } }));
70
+ res.status(500).json({ jsonrpc: '2.0', error: { code: -32603, message: 'Internal error' } });
62
71
  }
63
72
  }
64
73
  });
65
- await new Promise((resolve, reject) => {
66
- server.once('error', reject);
67
- server.listen(port, host, () => {
68
- server.removeListener('error', reject);
69
- resolve();
70
- });
74
+ const server = await new Promise((resolve, reject) => {
75
+ const listening = app.listen(port, host, () => resolve(listening));
76
+ listening.once('error', reject);
71
77
  });
72
- return { url: `http://${host}:${port}/mcp`, port };
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 };
73
88
  }
74
89
  //# sourceMappingURL=http-server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}