web3-tools-mcp 1.6.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.
- package/CHANGELOG.md +95 -0
- package/README.md +328 -234
- package/dist/anvil.d.ts +1 -1
- package/dist/anvil.d.ts.map +1 -1
- package/dist/anvil.js +11 -9
- package/dist/anvil.js.map +1 -1
- package/dist/chain-meta.d.ts.map +1 -1
- package/dist/chain-meta.js +7 -3
- package/dist/chain-meta.js.map +1 -1
- package/dist/chains.d.ts +960 -0
- package/dist/chains.d.ts.map +1 -0
- package/dist/chains.js +108 -0
- package/dist/chains.js.map +1 -0
- package/dist/client.d.ts +10 -1717
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +33 -218
- package/dist/client.js.map +1 -1
- package/dist/http-server.d.ts +6 -0
- package/dist/http-server.d.ts.map +1 -1
- package/dist/http-server.js +55 -40
- package/dist/http-server.js.map +1 -1
- package/dist/index.js +50 -29
- package/dist/index.js.map +1 -1
- package/dist/oauth.d.ts +31 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +227 -0
- package/dist/oauth.js.map +1 -0
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +2 -2
- package/dist/preview.js.map +1 -1
- package/dist/tools/advanced.d.ts +4 -4
- package/dist/tools/advanced.d.ts.map +1 -1
- package/dist/tools/advanced.js +228 -247
- package/dist/tools/advanced.js.map +1 -1
- package/dist/tools/balance.d.ts +1 -1
- package/dist/tools/balance.d.ts.map +1 -1
- package/dist/tools/balance.js +97 -103
- package/dist/tools/balance.js.map +1 -1
- package/dist/tools/contract-info.d.ts +3 -3
- package/dist/tools/contract-info.d.ts.map +1 -1
- package/dist/tools/contract-info.js +150 -161
- package/dist/tools/contract-info.js.map +1 -1
- package/dist/tools/contract.d.ts +4 -4
- package/dist/tools/contract.d.ts.map +1 -1
- package/dist/tools/contract.js +91 -110
- package/dist/tools/contract.js.map +1 -1
- package/dist/tools/ens.d.ts +6 -6
- package/dist/tools/ens.d.ts.map +1 -1
- package/dist/tools/ens.js +239 -297
- package/dist/tools/ens.js.map +1 -1
- package/dist/tools/gas.d.ts +4 -4
- package/dist/tools/gas.d.ts.map +1 -1
- package/dist/tools/gas.js +90 -138
- package/dist/tools/gas.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/logs.d.ts +1 -1
- package/dist/tools/logs.d.ts.map +1 -1
- package/dist/tools/logs.js +36 -37
- package/dist/tools/logs.js.map +1 -1
- package/dist/tools/signatures.d.ts.map +1 -1
- package/dist/tools/signatures.js +67 -89
- package/dist/tools/signatures.js.map +1 -1
- package/dist/tools/transactions.d.ts +35 -5
- package/dist/tools/transactions.d.ts.map +1 -1
- package/dist/tools/transactions.js +148 -74
- package/dist/tools/transactions.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +35 -98
- package/dist/utils.js.map +1 -1
- package/dist/wallet-client.d.ts +11 -1
- package/dist/wallet-client.d.ts.map +1 -1
- package/dist/wallet-client.js +27 -9
- package/dist/wallet-client.js.map +1 -1
- package/dist/walletconnect.d.ts +22 -1
- package/dist/walletconnect.d.ts.map +1 -1
- package/dist/walletconnect.js +101 -8
- package/dist/walletconnect.js.map +1 -1
- package/package.json +17 -9
- package/src/anvil.ts +15 -18
- package/src/chain-meta.ts +8 -4
- package/src/chains.ts +145 -0
- package/src/client.ts +39 -254
- package/src/http-server.ts +67 -44
- package/src/index.ts +77 -53
- package/src/oauth.ts +270 -0
- package/src/preview.ts +3 -12
- package/src/tools/advanced.ts +195 -213
- package/src/tools/balance.ts +103 -108
- package/src/tools/contract-info.ts +163 -184
- package/src/tools/contract.ts +123 -144
- package/src/tools/ens.ts +290 -345
- package/src/tools/gas.ts +122 -170
- package/src/tools/index.ts +2 -2
- package/src/tools/logs.ts +45 -43
- package/src/tools/signatures.ts +68 -86
- package/src/tools/transactions.ts +194 -87
- package/src/types.ts +1 -15
- package/src/utils.ts +52 -110
- package/src/wallet-client.ts +31 -9
- package/src/walletconnect.ts +119 -7
package/dist/index.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
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';
|
|
10
11
|
// Parse configuration
|
|
11
12
|
const config = parseCommandLineArgs();
|
|
12
13
|
// Show help if requested
|
|
@@ -35,15 +36,17 @@ ENVIRONMENT VARIABLES:
|
|
|
35
36
|
INFURA_API_KEY Alternative to --infura-api-key
|
|
36
37
|
HYPERSYNC_API_KEY Alternative to --hypersync-api-key
|
|
37
38
|
WALLETCONNECT_PROJECT_ID Alternative to --walletconnect-project-id
|
|
39
|
+
CUSTOM_RPC Alternative to --custom-rpc
|
|
38
40
|
MCP_HTTP_PORT Serve MCP over HTTP on this port instead of stdio
|
|
39
41
|
MCP_TOKEN Bearer token required by the HTTP transport
|
|
42
|
+
MCP_PUBLIC_URL Public URL of this server, advertised in OAuth metadata
|
|
40
43
|
UPSTASH_REDIS_REST_URL Keep WalletConnect sessions in Redis, not on disk
|
|
41
44
|
UPSTASH_REDIS_REST_TOKEN
|
|
42
45
|
WALLET_SERVER_URL URL of a hosted wallet relay (omit to run one locally)
|
|
43
46
|
WALLET_TOKEN Shared pairing token for the wallet relay
|
|
44
47
|
|
|
45
48
|
SUPPORTED CHAINS:
|
|
46
|
-
|
|
49
|
+
${SUPPORTED_CHAINS.join(', ')}
|
|
47
50
|
|
|
48
51
|
EXAMPLES:
|
|
49
52
|
# Use with npx (recommended)
|
|
@@ -66,39 +69,51 @@ For MCP client configuration, see the README.md file.
|
|
|
66
69
|
}
|
|
67
70
|
// Log configuration info
|
|
68
71
|
if (config.etherscanApiKey) {
|
|
69
|
-
console.error(
|
|
72
|
+
console.error('[MCP] Etherscan API key configured');
|
|
70
73
|
}
|
|
71
74
|
if (config.alchemyApiKey) {
|
|
72
|
-
console.error(
|
|
75
|
+
console.error('[MCP] Alchemy API key configured');
|
|
73
76
|
}
|
|
74
77
|
if (config.infuraApiKey) {
|
|
75
|
-
console.error(
|
|
78
|
+
console.error('[MCP] Infura API key configured');
|
|
76
79
|
}
|
|
77
80
|
if (config.walletConnectProjectId) {
|
|
78
|
-
console.error(
|
|
81
|
+
console.error('[MCP] WalletConnect project id configured — phone signing available');
|
|
79
82
|
}
|
|
80
83
|
if (config.customRpcUrls) {
|
|
81
|
-
console.error(
|
|
84
|
+
console.error('[MCP] Custom RPC URLs:', Object.keys(config.customRpcUrls));
|
|
82
85
|
}
|
|
83
86
|
// Initialize client manager
|
|
84
87
|
initializeClientManager(config);
|
|
85
88
|
function createMcpServer() {
|
|
86
89
|
const server = new McpServer({
|
|
87
|
-
name:
|
|
88
|
-
version: packageJson.version
|
|
90
|
+
name: 'web3-tools-mcp',
|
|
91
|
+
version: packageJson.version
|
|
89
92
|
});
|
|
90
93
|
registerAllTools(server);
|
|
91
94
|
return server;
|
|
92
95
|
}
|
|
93
|
-
// Serving over HTTP means there is no browser on this machine to open, so the wallet relay
|
|
94
|
-
// is skipped and signing goes to a paired phone over WalletConnect.
|
|
95
96
|
const httpMode = Boolean(process.env.MCP_HTTP_PORT);
|
|
96
|
-
const
|
|
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.
|
|
97
112
|
const walletReady = httpMode
|
|
98
113
|
? Promise.resolve()
|
|
99
114
|
: wallet.connect().catch((error) => {
|
|
100
|
-
console.error(
|
|
101
|
-
console.error(
|
|
115
|
+
console.error('[MCP] Wallet relay unavailable:', error.message);
|
|
116
|
+
console.error('[MCP] Transaction signing features will not be available');
|
|
102
117
|
});
|
|
103
118
|
// The wallet relay's listening socket keeps the event loop alive, so this process would
|
|
104
119
|
// outlive the client that spawned it and go on holding its port. Leave when the client does.
|
|
@@ -111,29 +126,35 @@ async function shutdown(reason) {
|
|
|
111
126
|
await wallet.stop().catch(() => { });
|
|
112
127
|
process.exit(0);
|
|
113
128
|
}
|
|
114
|
-
process.stdin.on(
|
|
115
|
-
process.stdin.on(
|
|
116
|
-
process.on(
|
|
117
|
-
process.on(
|
|
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'));
|
|
118
133
|
// Start server
|
|
119
134
|
async function main() {
|
|
120
135
|
if (httpMode) {
|
|
121
|
-
const { url } = await startHttpServer({ createMcpServer });
|
|
136
|
+
const { url, walletUrl } = await startHttpServer({ createMcpServer, walletRelay: hostedRelay });
|
|
122
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}`);
|
|
123
144
|
if (!config.walletConnectProjectId) {
|
|
124
|
-
console.error(
|
|
145
|
+
console.error('[MCP] No WalletConnect project id — phone signing is unavailable on this server');
|
|
125
146
|
}
|
|
126
147
|
return;
|
|
127
148
|
}
|
|
128
149
|
const transport = new StdioServerTransport();
|
|
129
150
|
await createMcpServer().connect(transport);
|
|
130
|
-
console.error(
|
|
151
|
+
console.error('Web3 Tools MCP Server running on stdio');
|
|
131
152
|
// The relay may still be picking a free port, and its URL carries the pairing token.
|
|
132
153
|
await walletReady;
|
|
133
154
|
console.error(`Wallet interface available at ${wallet.getUrl()}`);
|
|
134
155
|
}
|
|
135
156
|
main().catch((error) => {
|
|
136
|
-
console.error(
|
|
157
|
+
console.error('Fatal error:', error);
|
|
137
158
|
process.exit(1);
|
|
138
159
|
});
|
|
139
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":";AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { OAuthRegisteredClientsStore } from '@modelcontextprotocol/sdk/server/auth/clients.js';
|
|
2
|
+
import type { AuthorizationParams, OAuthServerProvider } from '@modelcontextprotocol/sdk/server/auth/provider.js';
|
|
3
|
+
import type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';
|
|
4
|
+
import type { OAuthClientInformationFull, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js';
|
|
5
|
+
import type { Response } from 'express';
|
|
6
|
+
export declare class SingleUserOAuthProvider implements OAuthServerProvider {
|
|
7
|
+
private accessToken;
|
|
8
|
+
private store;
|
|
9
|
+
constructor(accessToken: string);
|
|
10
|
+
get clientsStore(): OAuthRegisteredClientsStore;
|
|
11
|
+
/**
|
|
12
|
+
* GET renders the token prompt; POST checks it and redirects back with a code. Handling
|
|
13
|
+
* both here keeps the whole login inside the SDK's authorize route.
|
|
14
|
+
*/
|
|
15
|
+
authorize(client: OAuthClientInformationFull, params: AuthorizationParams, res: Response): Promise<void>;
|
|
16
|
+
challengeForAuthorizationCode(_client: OAuthClientInformationFull, authorizationCode: string): Promise<string>;
|
|
17
|
+
exchangeAuthorizationCode(client: OAuthClientInformationFull, authorizationCode: string): Promise<OAuthTokens>;
|
|
18
|
+
exchangeRefreshToken(client: OAuthClientInformationFull, refreshToken: string, scopes?: string[]): Promise<OAuthTokens>;
|
|
19
|
+
private issue;
|
|
20
|
+
/** Accepts an issued token, or MCP_TOKEN itself so a client that can send a header still works. */
|
|
21
|
+
verifyAccessToken(token: string): Promise<AuthInfo>;
|
|
22
|
+
revokeToken(_client: OAuthClientInformationFull, request: {
|
|
23
|
+
token: string;
|
|
24
|
+
}): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
/** PKCE helper, used by the tests to drive the flow the way a real client would. */
|
|
27
|
+
export declare function pkce(): {
|
|
28
|
+
verifier: string;
|
|
29
|
+
challenge: string;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kDAAkD,CAAA;AAEnG,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mDAAmD,CAAA;AACjH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAA;AAC9E,OAAO,KAAK,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAA;AACvG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAsHvC,qBAAa,uBAAwB,YAAW,mBAAmB;IAGrD,OAAO,CAAC,WAAW;IAF/B,OAAO,CAAC,KAAK,CAAc;gBAEP,WAAW,EAAE,MAAM;IAEvC,IAAI,YAAY,IAAI,2BAA2B,CAkB9C;IAED;;;OAGG;IACG,SAAS,CAAC,MAAM,EAAE,0BAA0B,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAyCxG,6BAA6B,CAAC,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM9G,yBAAyB,CAAC,MAAM,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAU9G,oBAAoB,CAAC,MAAM,EAAE,0BAA0B,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;YAS/G,KAAK;IAiBnB,mGAAmG;IAC7F,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAkBnD,WAAW,CAAC,OAAO,EAAE,0BAA0B,EAAE,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAIlG;AAED,oFAAoF;AACpF,wBAAgB,IAAI,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAI9D"}
|
package/dist/oauth.js
ADDED
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { createHash, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { InvalidTokenError } from '@modelcontextprotocol/sdk/server/auth/errors.js';
|
|
6
|
+
import { getKeyValueStorage } from './kv-storage.js';
|
|
7
|
+
/**
|
|
8
|
+
* OAuth for clients that will not send a static bearer token — claude.ai connectors, and
|
|
9
|
+
* so anything driving them from a browser or phone, only speak the OAuth flow the MCP spec
|
|
10
|
+
* defines.
|
|
11
|
+
*
|
|
12
|
+
* There are no user accounts here: the single credential is MCP_TOKEN, the same one this
|
|
13
|
+
* server already requires. The authorize step is a one-field page that asks for it, so a
|
|
14
|
+
* self-hoster needs no identity provider and no extra configuration.
|
|
15
|
+
*/
|
|
16
|
+
const CODE_TTL = 10 * 60 * 1000;
|
|
17
|
+
const TOKEN_TTL = 30 * 24 * 60 * 60;
|
|
18
|
+
/** Redis where configured, a JSON file otherwise — issued tokens must outlive a restart. */
|
|
19
|
+
class Store {
|
|
20
|
+
redis;
|
|
21
|
+
file;
|
|
22
|
+
cache;
|
|
23
|
+
constructor() {
|
|
24
|
+
this.redis = getKeyValueStorage();
|
|
25
|
+
const dir = join(process.env.XDG_CONFIG_HOME ?? join(homedir(), '.config'), 'web3-tools-mcp');
|
|
26
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
27
|
+
this.file = join(dir, 'oauth.json');
|
|
28
|
+
}
|
|
29
|
+
read() {
|
|
30
|
+
if (!this.cache) {
|
|
31
|
+
try {
|
|
32
|
+
this.cache = JSON.parse(readFileSync(this.file, 'utf8'));
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
this.cache = {};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return this.cache;
|
|
39
|
+
}
|
|
40
|
+
async get(key) {
|
|
41
|
+
if (this.redis)
|
|
42
|
+
return this.redis.getItem(`oauth:${key}`);
|
|
43
|
+
return this.read()[key];
|
|
44
|
+
}
|
|
45
|
+
async set(key, value) {
|
|
46
|
+
if (this.redis)
|
|
47
|
+
return this.redis.setItem(`oauth:${key}`, value);
|
|
48
|
+
const data = this.read();
|
|
49
|
+
data[key] = value;
|
|
50
|
+
writeFileSync(this.file, JSON.stringify(data), { mode: 0o600 });
|
|
51
|
+
}
|
|
52
|
+
async remove(key) {
|
|
53
|
+
if (this.redis)
|
|
54
|
+
return this.redis.removeItem(`oauth:${key}`);
|
|
55
|
+
const data = this.read();
|
|
56
|
+
delete data[key];
|
|
57
|
+
writeFileSync(this.file, JSON.stringify(data), { mode: 0o600 });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function escapeHtml(value) {
|
|
61
|
+
return value.replace(/[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[c]);
|
|
62
|
+
}
|
|
63
|
+
function constantTimeEquals(a, b) {
|
|
64
|
+
const left = Buffer.from(a);
|
|
65
|
+
const right = Buffer.from(b);
|
|
66
|
+
return left.length === right.length && timingSafeEqual(left, right);
|
|
67
|
+
}
|
|
68
|
+
function loginPage(params) {
|
|
69
|
+
// The SDK's authorize handler reads its parameters from the body on POST, so the form
|
|
70
|
+
// has to carry the whole authorization request back, not just the token.
|
|
71
|
+
const hidden = Object.entries(params.fields)
|
|
72
|
+
.map(([name, value]) => `<input type="hidden" name="${escapeHtml(name)}" value="${escapeHtml(value)}">`)
|
|
73
|
+
.join('\n ');
|
|
74
|
+
return `<!doctype html>
|
|
75
|
+
<meta charset="utf-8">
|
|
76
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
77
|
+
<title>Connect to web3-tools-mcp</title>
|
|
78
|
+
<style>
|
|
79
|
+
:root { color-scheme: light dark; }
|
|
80
|
+
body { font: 15px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; max-width: 26rem;
|
|
81
|
+
margin: 12vh auto; padding: 0 1.25rem; }
|
|
82
|
+
h1 { font-size: 1.15rem; margin-bottom: .25rem; }
|
|
83
|
+
p { color: #667; margin-top: 0; }
|
|
84
|
+
input, button { font: inherit; width: 100%; padding: .7rem .8rem; border-radius: .5rem;
|
|
85
|
+
box-sizing: border-box; }
|
|
86
|
+
input { border: 1px solid #ccd; font-family: ui-monospace, monospace; }
|
|
87
|
+
button { margin-top: .75rem; border: 0; background: #3856d6; color: #fff; font-weight: 600; }
|
|
88
|
+
.error { color: #b3251d; font-weight: 600; }
|
|
89
|
+
</style>
|
|
90
|
+
<h1>Connect to web3-tools-mcp</h1>
|
|
91
|
+
<p>Paste this server's access token to authorise the client.</p>
|
|
92
|
+
${params.error ? `<p class="error">${params.error}</p>` : ''}
|
|
93
|
+
<form method="post">
|
|
94
|
+
${hidden}
|
|
95
|
+
<input name="token" type="password" placeholder="MCP_TOKEN" autocomplete="off" autofocus>
|
|
96
|
+
<button type="submit">Authorise</button>
|
|
97
|
+
</form>`;
|
|
98
|
+
}
|
|
99
|
+
export class SingleUserOAuthProvider {
|
|
100
|
+
accessToken;
|
|
101
|
+
store = new Store();
|
|
102
|
+
constructor(accessToken) {
|
|
103
|
+
this.accessToken = accessToken;
|
|
104
|
+
}
|
|
105
|
+
get clientsStore() {
|
|
106
|
+
const store = this.store;
|
|
107
|
+
return {
|
|
108
|
+
async getClient(clientId) {
|
|
109
|
+
return store.get(`client:${clientId}`);
|
|
110
|
+
},
|
|
111
|
+
// Registration is open because MCP clients register themselves before anyone can
|
|
112
|
+
// log in; holding MCP_TOKEN is what actually grants access.
|
|
113
|
+
async registerClient(client) {
|
|
114
|
+
const registered = {
|
|
115
|
+
...client,
|
|
116
|
+
client_id: randomBytes(16).toString('hex'),
|
|
117
|
+
client_id_issued_at: Math.floor(Date.now() / 1000)
|
|
118
|
+
};
|
|
119
|
+
await store.set(`client:${registered.client_id}`, registered);
|
|
120
|
+
return registered;
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* GET renders the token prompt; POST checks it and redirects back with a code. Handling
|
|
126
|
+
* both here keeps the whole login inside the SDK's authorize route.
|
|
127
|
+
*/
|
|
128
|
+
async authorize(client, params, res) {
|
|
129
|
+
const request = res.req;
|
|
130
|
+
const submitted = request.body?.token ?? '';
|
|
131
|
+
// Everything except the token itself is replayed into the form, so the handler sees a
|
|
132
|
+
// complete authorization request when the form posts back.
|
|
133
|
+
const fields = Object.fromEntries(Object.entries({ ...request.query, ...request.body }).filter(([name, value]) => name !== 'token' && typeof value === 'string'));
|
|
134
|
+
if (request.method !== 'POST') {
|
|
135
|
+
res.setHeader('content-type', 'text/html; charset=utf-8').send(loginPage({ fields }));
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (!constantTimeEquals(submitted, this.accessToken)) {
|
|
139
|
+
res
|
|
140
|
+
.status(401)
|
|
141
|
+
.setHeader('content-type', 'text/html; charset=utf-8')
|
|
142
|
+
.send(loginPage({ fields, error: 'That token was not accepted.' }));
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const code = randomBytes(24).toString('hex');
|
|
146
|
+
await this.store.set(`code:${code}`, {
|
|
147
|
+
clientId: client.client_id,
|
|
148
|
+
codeChallenge: params.codeChallenge,
|
|
149
|
+
redirectUri: params.redirectUri,
|
|
150
|
+
resource: params.resource?.href,
|
|
151
|
+
scopes: params.scopes ?? [],
|
|
152
|
+
expiresAt: Date.now() + CODE_TTL
|
|
153
|
+
});
|
|
154
|
+
const redirect = new URL(params.redirectUri);
|
|
155
|
+
redirect.searchParams.set('code', code);
|
|
156
|
+
if (params.state)
|
|
157
|
+
redirect.searchParams.set('state', params.state);
|
|
158
|
+
res.redirect(redirect.href);
|
|
159
|
+
}
|
|
160
|
+
async challengeForAuthorizationCode(_client, authorizationCode) {
|
|
161
|
+
const stored = await this.store.get(`code:${authorizationCode}`);
|
|
162
|
+
if (!stored || stored.expiresAt < Date.now())
|
|
163
|
+
throw new Error('Authorization code is invalid or expired');
|
|
164
|
+
return stored.codeChallenge;
|
|
165
|
+
}
|
|
166
|
+
async exchangeAuthorizationCode(client, authorizationCode) {
|
|
167
|
+
const stored = await this.store.get(`code:${authorizationCode}`);
|
|
168
|
+
if (!stored || stored.expiresAt < Date.now())
|
|
169
|
+
throw new Error('Authorization code is invalid or expired');
|
|
170
|
+
if (stored.clientId !== client.client_id)
|
|
171
|
+
throw new Error('Authorization code was issued to a different client');
|
|
172
|
+
// One use only: a replayed code must not mint a second token.
|
|
173
|
+
await this.store.remove(`code:${authorizationCode}`);
|
|
174
|
+
return this.issue(client.client_id, stored.scopes);
|
|
175
|
+
}
|
|
176
|
+
async exchangeRefreshToken(client, refreshToken, scopes) {
|
|
177
|
+
const stored = await this.store.get(`refresh:${refreshToken}`);
|
|
178
|
+
if (!stored)
|
|
179
|
+
throw new Error('Refresh token is invalid');
|
|
180
|
+
if (stored.clientId !== client.client_id)
|
|
181
|
+
throw new Error('Refresh token was issued to a different client');
|
|
182
|
+
await this.store.remove(`refresh:${refreshToken}`);
|
|
183
|
+
return this.issue(client.client_id, scopes ?? stored.scopes);
|
|
184
|
+
}
|
|
185
|
+
async issue(clientId, scopes) {
|
|
186
|
+
const accessToken = randomBytes(32).toString('hex');
|
|
187
|
+
const refreshToken = randomBytes(32).toString('hex');
|
|
188
|
+
const expiresAt = Math.floor(Date.now() / 1000) + TOKEN_TTL;
|
|
189
|
+
await this.store.set(`token:${accessToken}`, { clientId, scopes, expiresAt });
|
|
190
|
+
await this.store.set(`refresh:${refreshToken}`, { clientId, scopes, expiresAt });
|
|
191
|
+
return {
|
|
192
|
+
access_token: accessToken,
|
|
193
|
+
token_type: 'Bearer',
|
|
194
|
+
expires_in: TOKEN_TTL,
|
|
195
|
+
refresh_token: refreshToken,
|
|
196
|
+
scope: scopes.join(' ')
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/** Accepts an issued token, or MCP_TOKEN itself so a client that can send a header still works. */
|
|
200
|
+
async verifyAccessToken(token) {
|
|
201
|
+
if (constantTimeEquals(token, this.accessToken)) {
|
|
202
|
+
// requireBearerAuth refuses a token with no expiry, and this one never expires.
|
|
203
|
+
return { token, clientId: 'static', scopes: [], expiresAt: Math.floor(Date.now() / 1000) + TOKEN_TTL };
|
|
204
|
+
}
|
|
205
|
+
// Must be InvalidTokenError specifically: the SDK turns anything else into a 500, and
|
|
206
|
+
// a client needs the 401 to know it should authenticate again.
|
|
207
|
+
const stored = await this.store.get(`token:${token}`);
|
|
208
|
+
if (!stored)
|
|
209
|
+
throw new InvalidTokenError('Invalid access token');
|
|
210
|
+
if (stored.expiresAt * 1000 < Date.now()) {
|
|
211
|
+
await this.store.remove(`token:${token}`);
|
|
212
|
+
throw new InvalidTokenError('Access token has expired');
|
|
213
|
+
}
|
|
214
|
+
return { token, clientId: stored.clientId, scopes: stored.scopes, expiresAt: stored.expiresAt };
|
|
215
|
+
}
|
|
216
|
+
async revokeToken(_client, request) {
|
|
217
|
+
await this.store.remove(`token:${request.token}`);
|
|
218
|
+
await this.store.remove(`refresh:${request.token}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/** PKCE helper, used by the tests to drive the flow the way a real client would. */
|
|
222
|
+
export function pkce() {
|
|
223
|
+
const verifier = randomBytes(32).toString('base64url');
|
|
224
|
+
const challenge = createHash('sha256').update(verifier).digest('base64url');
|
|
225
|
+
return { verifier, challenge };
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
package/dist/preview.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,EAAE,MAAM,CAAA;IACV,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE;QACR,YAAY,EAAE,MAAM,CAAA;QACpB,SAAS,EAAE,MAAM,CAAA;QACjB,MAAM,EAAE,YAAY,EAAE,CAAA;QACtB,kFAAkF;QAClF,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,wFAAwF;QACxF,MAAM,EAAE,UAAU,GAAG,SAAS,CAAA;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;IACD,UAAU,CAAC,EAAE;QACX,OAAO,EAAE,OAAO,CAAA;QAChB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,YAAY,EAAE,WAAW,EAAE,CAAA;KAC5B,CAAA;CACF;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAyKD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAgCnG"}
|
package/dist/preview.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { decodeFunctionData, formatEther, formatUnits, toFunctionSelector } from 'viem';
|
|
2
2
|
import { simulateBlocks } from 'viem/actions';
|
|
3
|
-
import { getClientManager } from './client.js';
|
|
4
3
|
import { addressLabel, loadAbi, tokenMeta, UNLIMITED_THRESHOLD } from './chain-meta.js';
|
|
5
4
|
import { lookupContract, protocolLabel, resolveClearSigning } from './clear-signing.js';
|
|
5
|
+
import { getClientManager } from './client.js';
|
|
6
6
|
const TRANSFER_TOPIC = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
|
|
7
7
|
// Selectors whose amount argument is denominated in the token at tx.to.
|
|
8
8
|
const ERC20_AMOUNT_ARGS = {
|
|
@@ -182,7 +182,7 @@ export async function buildTxPreview(chain, tx, from) {
|
|
|
182
182
|
chain,
|
|
183
183
|
to: tx.to,
|
|
184
184
|
toLabel,
|
|
185
|
-
explorer:
|
|
185
|
+
explorer: getClientManager().explorerUrl(chain),
|
|
186
186
|
value,
|
|
187
187
|
valueFormatted: value && value !== '0' ? formatEther(BigInt(value)) : undefined,
|
|
188
188
|
decoded,
|
package/dist/preview.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/advanced.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ declare const _default: {
|
|
|
4
4
|
title: string;
|
|
5
5
|
description: string;
|
|
6
6
|
schema: z.ZodObject<{
|
|
7
|
-
chain: z.ZodEnum<["mainnet", "arbitrum"
|
|
7
|
+
chain: z.ZodEnum<["arbitrum" | "mainnet" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost", ...("arbitrum" | "mainnet" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost")[]]>;
|
|
8
8
|
address: z.ZodString;
|
|
9
9
|
slot: z.ZodString;
|
|
10
10
|
abiType: z.ZodString;
|
|
@@ -34,7 +34,7 @@ declare const _default: {
|
|
|
34
34
|
title: string;
|
|
35
35
|
description: string;
|
|
36
36
|
schema: z.ZodObject<{
|
|
37
|
-
chain: z.ZodEnum<["mainnet", "arbitrum"
|
|
37
|
+
chain: z.ZodEnum<["arbitrum" | "mainnet" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost", ...("arbitrum" | "mainnet" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost")[]]>;
|
|
38
38
|
blockNumber: z.ZodOptional<z.ZodString>;
|
|
39
39
|
}, "strip", z.ZodTypeAny, {
|
|
40
40
|
chain: "arbitrum" | "mainnet" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost";
|
|
@@ -52,7 +52,7 @@ declare const _default: {
|
|
|
52
52
|
title: string;
|
|
53
53
|
description: string;
|
|
54
54
|
schema: z.ZodObject<{
|
|
55
|
-
chain: z.ZodEnum<["mainnet", "arbitrum"
|
|
55
|
+
chain: z.ZodEnum<["arbitrum" | "mainnet" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost", ...("arbitrum" | "mainnet" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost")[]]>;
|
|
56
56
|
transactionHash: z.ZodString;
|
|
57
57
|
traceType: z.ZodDefault<z.ZodOptional<z.ZodEnum<["trace", "vmTrace", "stateDiff"]>>>;
|
|
58
58
|
useAnvil: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
@@ -82,7 +82,7 @@ declare const _default: {
|
|
|
82
82
|
title: string;
|
|
83
83
|
description: string;
|
|
84
84
|
schema: z.ZodObject<{
|
|
85
|
-
chain: z.ZodEnum<["mainnet", "arbitrum"
|
|
85
|
+
chain: z.ZodEnum<["arbitrum" | "mainnet" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost", ...("arbitrum" | "mainnet" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost")[]]>;
|
|
86
86
|
to: z.ZodString;
|
|
87
87
|
data: z.ZodOptional<z.ZodString>;
|
|
88
88
|
functionAbi: z.ZodOptional<z.ZodString>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advanced.d.ts","sourceRoot":"","sources":["../../src/tools/advanced.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"advanced.d.ts","sourceRoot":"","sources":["../../src/tools/advanced.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMvB,wBAqZC"}
|