@one-source/api-mcp 1.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/LICENSE +21 -0
- package/README.md +147 -0
- package/dist/analytics.d.ts +53 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.fix-verification.test.d.ts +11 -0
- package/dist/analytics.fix-verification.test.d.ts.map +1 -0
- package/dist/analytics.fix-verification.test.js +146 -0
- package/dist/analytics.fix-verification.test.js.map +1 -0
- package/dist/analytics.js +126 -0
- package/dist/analytics.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +144 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +52 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +126 -0
- package/dist/client.js.map +1 -0
- package/dist/create-server.d.ts +28 -0
- package/dist/create-server.d.ts.map +1 -0
- package/dist/create-server.js +133 -0
- package/dist/create-server.js.map +1 -0
- package/dist/tools/chain/contract-code.d.ts +6 -0
- package/dist/tools/chain/contract-code.d.ts.map +1 -0
- package/dist/tools/chain/contract-code.js +19 -0
- package/dist/tools/chain/contract-code.js.map +1 -0
- package/dist/tools/chain/ens-resolve.d.ts +3 -0
- package/dist/tools/chain/ens-resolve.d.ts.map +1 -0
- package/dist/tools/chain/ens-resolve.js +25 -0
- package/dist/tools/chain/ens-resolve.js.map +1 -0
- package/dist/tools/chain/estimate-gas.d.ts +6 -0
- package/dist/tools/chain/estimate-gas.d.ts.map +1 -0
- package/dist/tools/chain/estimate-gas.js +31 -0
- package/dist/tools/chain/estimate-gas.js.map +1 -0
- package/dist/tools/chain/network-info.d.ts +6 -0
- package/dist/tools/chain/network-info.d.ts.map +1 -0
- package/dist/tools/chain/network-info.js +18 -0
- package/dist/tools/chain/network-info.js.map +1 -0
- package/dist/tools/chain/nonce.d.ts +6 -0
- package/dist/tools/chain/nonce.d.ts.map +1 -0
- package/dist/tools/chain/nonce.js +19 -0
- package/dist/tools/chain/nonce.js.map +1 -0
- package/dist/tools/chain/pending-block.d.ts +6 -0
- package/dist/tools/chain/pending-block.d.ts.map +1 -0
- package/dist/tools/chain/pending-block.js +18 -0
- package/dist/tools/chain/pending-block.js.map +1 -0
- package/dist/tools/chain/proxy-detect.d.ts +6 -0
- package/dist/tools/chain/proxy-detect.d.ts.map +1 -0
- package/dist/tools/chain/proxy-detect.js +19 -0
- package/dist/tools/chain/proxy-detect.js.map +1 -0
- package/dist/tools/chain/simulate-call.d.ts +6 -0
- package/dist/tools/chain/simulate-call.d.ts.map +1 -0
- package/dist/tools/chain/simulate-call.js +33 -0
- package/dist/tools/chain/simulate-call.js.map +1 -0
- package/dist/tools/chain/storage-read.d.ts +3 -0
- package/dist/tools/chain/storage-read.d.ts.map +1 -0
- package/dist/tools/chain/storage-read.js +22 -0
- package/dist/tools/chain/storage-read.js.map +1 -0
- package/dist/tools/chain/tx-receipt.d.ts +6 -0
- package/dist/tools/chain/tx-receipt.d.ts.map +1 -0
- package/dist/tools/chain/tx-receipt.js +18 -0
- package/dist/tools/chain/tx-receipt.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +77 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/indexed/address-txs.d.ts +6 -0
- package/dist/tools/indexed/address-txs.d.ts.map +1 -0
- package/dist/tools/indexed/address-txs.js +25 -0
- package/dist/tools/indexed/address-txs.js.map +1 -0
- package/dist/tools/indexed/block.d.ts +3 -0
- package/dist/tools/indexed/block.d.ts.map +1 -0
- package/dist/tools/indexed/block.js +23 -0
- package/dist/tools/indexed/block.js.map +1 -0
- package/dist/tools/indexed/contract-info.d.ts +6 -0
- package/dist/tools/indexed/contract-info.d.ts.map +1 -0
- package/dist/tools/indexed/contract-info.js +18 -0
- package/dist/tools/indexed/contract-info.js.map +1 -0
- package/dist/tools/indexed/erc1155-balance.d.ts +6 -0
- package/dist/tools/indexed/erc1155-balance.d.ts.map +1 -0
- package/dist/tools/indexed/erc1155-balance.js +24 -0
- package/dist/tools/indexed/erc1155-balance.js.map +1 -0
- package/dist/tools/indexed/erc20-balance.d.ts +6 -0
- package/dist/tools/indexed/erc20-balance.d.ts.map +1 -0
- package/dist/tools/indexed/erc20-balance.js +22 -0
- package/dist/tools/indexed/erc20-balance.js.map +1 -0
- package/dist/tools/indexed/erc20-transfers.d.ts +6 -0
- package/dist/tools/indexed/erc20-transfers.d.ts.map +1 -0
- package/dist/tools/indexed/erc20-transfers.js +24 -0
- package/dist/tools/indexed/erc20-transfers.js.map +1 -0
- package/dist/tools/indexed/events.d.ts +3 -0
- package/dist/tools/indexed/events.d.ts.map +1 -0
- package/dist/tools/indexed/events.js +32 -0
- package/dist/tools/indexed/events.js.map +1 -0
- package/dist/tools/indexed/nft-media.d.ts +6 -0
- package/dist/tools/indexed/nft-media.d.ts.map +1 -0
- package/dist/tools/indexed/nft-media.js +22 -0
- package/dist/tools/indexed/nft-media.js.map +1 -0
- package/dist/tools/indexed/nft-metadata.d.ts +6 -0
- package/dist/tools/indexed/nft-metadata.d.ts.map +1 -0
- package/dist/tools/indexed/nft-metadata.js +22 -0
- package/dist/tools/indexed/nft-metadata.js.map +1 -0
- package/dist/tools/indexed/nft-owner.d.ts +6 -0
- package/dist/tools/indexed/nft-owner.d.ts.map +1 -0
- package/dist/tools/indexed/nft-owner.js +22 -0
- package/dist/tools/indexed/nft-owner.js.map +1 -0
- package/dist/tools/indexed/tx-details.d.ts +6 -0
- package/dist/tools/indexed/tx-details.d.ts.map +1 -0
- package/dist/tools/indexed/tx-details.js +19 -0
- package/dist/tools/indexed/tx-details.js.map +1 -0
- package/dist/tools/indexed/wallet-nfts.d.ts +6 -0
- package/dist/tools/indexed/wallet-nfts.d.ts.map +1 -0
- package/dist/tools/indexed/wallet-nfts.js +22 -0
- package/dist/tools/indexed/wallet-nfts.js.map +1 -0
- package/dist/tools/live/allowance.d.ts +6 -0
- package/dist/tools/live/allowance.d.ts.map +1 -0
- package/dist/tools/live/allowance.js +24 -0
- package/dist/tools/live/allowance.js.map +1 -0
- package/dist/tools/live/contract-info.d.ts +6 -0
- package/dist/tools/live/contract-info.d.ts.map +1 -0
- package/dist/tools/live/contract-info.js +19 -0
- package/dist/tools/live/contract-info.js.map +1 -0
- package/dist/tools/live/erc1155-balance.d.ts +6 -0
- package/dist/tools/live/erc1155-balance.d.ts.map +1 -0
- package/dist/tools/live/erc1155-balance.js +24 -0
- package/dist/tools/live/erc1155-balance.js.map +1 -0
- package/dist/tools/live/erc20-balance.d.ts +6 -0
- package/dist/tools/live/erc20-balance.d.ts.map +1 -0
- package/dist/tools/live/erc20-balance.js +22 -0
- package/dist/tools/live/erc20-balance.js.map +1 -0
- package/dist/tools/live/erc20-transfers.d.ts +3 -0
- package/dist/tools/live/erc20-transfers.d.ts.map +1 -0
- package/dist/tools/live/erc20-transfers.js +26 -0
- package/dist/tools/live/erc20-transfers.js.map +1 -0
- package/dist/tools/live/erc721-tokens.d.ts +6 -0
- package/dist/tools/live/erc721-tokens.d.ts.map +1 -0
- package/dist/tools/live/erc721-tokens.js +22 -0
- package/dist/tools/live/erc721-tokens.js.map +1 -0
- package/dist/tools/live/events.d.ts +3 -0
- package/dist/tools/live/events.d.ts.map +1 -0
- package/dist/tools/live/events.js +26 -0
- package/dist/tools/live/events.js.map +1 -0
- package/dist/tools/live/multi-balance.d.ts +3 -0
- package/dist/tools/live/multi-balance.d.ts.map +1 -0
- package/dist/tools/live/multi-balance.js +26 -0
- package/dist/tools/live/multi-balance.js.map +1 -0
- package/dist/tools/live/nft-metadata.d.ts +6 -0
- package/dist/tools/live/nft-metadata.d.ts.map +1 -0
- package/dist/tools/live/nft-metadata.js +22 -0
- package/dist/tools/live/nft-metadata.js.map +1 -0
- package/dist/tools/live/nft-owner.d.ts +6 -0
- package/dist/tools/live/nft-owner.d.ts.map +1 -0
- package/dist/tools/live/nft-owner.js +22 -0
- package/dist/tools/live/nft-owner.js.map +1 -0
- package/dist/tools/live/total-supply.d.ts +6 -0
- package/dist/tools/live/total-supply.d.ts.map +1 -0
- package/dist/tools/live/total-supply.js +20 -0
- package/dist/tools/live/total-supply.js.map +1 -0
- package/dist/tools/live/tx-details.d.ts +6 -0
- package/dist/tools/live/tx-details.d.ts.map +1 -0
- package/dist/tools/live/tx-details.js +19 -0
- package/dist/tools/live/tx-details.js.map +1 -0
- package/dist/types.d.ts +74 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +86 -0
- package/dist/types.js.map +1 -0
- package/package.json +64 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI entry point for onesource-api-mcp.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* npx onesource-api-mcp # stdio mode (default)
|
|
7
|
+
* npx onesource-api-mcp --http # HTTP server on port 3002
|
|
8
|
+
* npx onesource-api-mcp --http --port=8080
|
|
9
|
+
*/
|
|
10
|
+
import { createMcpServer, VERSION } from './create-server.js';
|
|
11
|
+
import { createClientFromEnv } from './client.js';
|
|
12
|
+
import { createAnalytics } from './analytics.js';
|
|
13
|
+
const args = process.argv.slice(2);
|
|
14
|
+
if (args.includes('--http')) {
|
|
15
|
+
// Parse --port=N or --port N
|
|
16
|
+
const portArgIdx = args.findIndex((a) => a === '--port' || a.startsWith('--port='));
|
|
17
|
+
let port = 3002;
|
|
18
|
+
if (portArgIdx !== -1) {
|
|
19
|
+
const arg = args[portArgIdx];
|
|
20
|
+
const portStr = arg.startsWith('--port=')
|
|
21
|
+
? arg.split('=')[1]
|
|
22
|
+
: args[portArgIdx + 1];
|
|
23
|
+
const parsed = parseInt(portStr ?? '', 10);
|
|
24
|
+
if (!portStr || isNaN(parsed) || parsed < 1 || parsed > 65535) {
|
|
25
|
+
console.error(`Error: Invalid port "${portStr ?? ''}". Must be between 1 and 65535.`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
port = parsed;
|
|
29
|
+
}
|
|
30
|
+
const { StreamableHTTPServerTransport } = await import('@modelcontextprotocol/sdk/server/streamableHttp.js');
|
|
31
|
+
const { createServer } = await import('node:http');
|
|
32
|
+
// Shared client + analytics — reused across requests
|
|
33
|
+
const sharedClient = createClientFromEnv();
|
|
34
|
+
const sharedAnalytics = createAnalytics();
|
|
35
|
+
const httpServer = createServer(async (req, res) => {
|
|
36
|
+
if (req.url === '/mcp' && req.method === 'POST') {
|
|
37
|
+
// Fresh server per request (SDK stateless pattern), shared client + analytics
|
|
38
|
+
const { server } = createMcpServer({ client: sharedClient, analytics: sharedAnalytics, transport: 'http' });
|
|
39
|
+
const httpTransport = new StreamableHTTPServerTransport({
|
|
40
|
+
sessionIdGenerator: undefined,
|
|
41
|
+
});
|
|
42
|
+
try {
|
|
43
|
+
await server.connect(httpTransport);
|
|
44
|
+
await httpTransport.handleRequest(req, res);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
if (!res.headersSent) {
|
|
48
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
49
|
+
res.end(JSON.stringify({
|
|
50
|
+
jsonrpc: '2.0',
|
|
51
|
+
error: { code: -32603, message: 'Internal server error' },
|
|
52
|
+
id: null,
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Cleanup when response stream closes
|
|
57
|
+
res.on('close', () => {
|
|
58
|
+
httpTransport.close();
|
|
59
|
+
server.close();
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
else if (req.url === '/mcp' && (req.method === 'GET' || req.method === 'DELETE')) {
|
|
63
|
+
// MCP protocol: 405 for non-POST in stateless mode
|
|
64
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
65
|
+
res.end(JSON.stringify({
|
|
66
|
+
jsonrpc: '2.0',
|
|
67
|
+
error: { code: -32000, message: 'Method not allowed in stateless mode' },
|
|
68
|
+
id: null,
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
else if (req.url === '/health') {
|
|
72
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
73
|
+
res.end('{"status":"ok"}');
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
res.writeHead(404);
|
|
77
|
+
res.end('Not found');
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// Bind to localhost by default (don't expose to network)
|
|
81
|
+
httpServer.listen(port, '127.0.0.1', () => {
|
|
82
|
+
console.error(`[onesource-api] HTTP server listening on http://127.0.0.1:${port}`);
|
|
83
|
+
console.error(`[onesource-api] MCP endpoint: http://127.0.0.1:${port}/mcp`);
|
|
84
|
+
});
|
|
85
|
+
sharedAnalytics.trackService({
|
|
86
|
+
type: 'service_start',
|
|
87
|
+
service: 'onesource-api',
|
|
88
|
+
timestamp: new Date().toISOString(),
|
|
89
|
+
version: VERSION,
|
|
90
|
+
details: `http:${port}`,
|
|
91
|
+
});
|
|
92
|
+
// Graceful shutdown — flush analytics before exit
|
|
93
|
+
process.once('SIGINT', async () => {
|
|
94
|
+
sharedAnalytics.trackService({
|
|
95
|
+
type: 'service_stop',
|
|
96
|
+
service: 'onesource-api',
|
|
97
|
+
timestamp: new Date().toISOString(),
|
|
98
|
+
version: VERSION,
|
|
99
|
+
});
|
|
100
|
+
sharedAnalytics.stop();
|
|
101
|
+
await Promise.race([
|
|
102
|
+
(async () => {
|
|
103
|
+
await sharedAnalytics.flush();
|
|
104
|
+
await new Promise((resolve) => httpServer.close(() => resolve()));
|
|
105
|
+
})(),
|
|
106
|
+
new Promise((resolve) => setTimeout(resolve, 5_000)),
|
|
107
|
+
]);
|
|
108
|
+
process.exit(0);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js');
|
|
113
|
+
const { server, analytics } = createMcpServer({ transport: 'stdio' });
|
|
114
|
+
const stdioTransport = new StdioServerTransport();
|
|
115
|
+
await server.connect(stdioTransport);
|
|
116
|
+
console.error('[onesource-api] Server connected via stdio');
|
|
117
|
+
analytics.trackService({
|
|
118
|
+
type: 'service_start',
|
|
119
|
+
service: 'onesource-api',
|
|
120
|
+
timestamp: new Date().toISOString(),
|
|
121
|
+
version: VERSION,
|
|
122
|
+
details: 'stdio',
|
|
123
|
+
});
|
|
124
|
+
// Graceful shutdown
|
|
125
|
+
process.once('SIGINT', async () => {
|
|
126
|
+
analytics.trackService({
|
|
127
|
+
type: 'service_stop',
|
|
128
|
+
service: 'onesource-api',
|
|
129
|
+
timestamp: new Date().toISOString(),
|
|
130
|
+
version: VERSION,
|
|
131
|
+
});
|
|
132
|
+
analytics.stop();
|
|
133
|
+
await Promise.race([
|
|
134
|
+
(async () => {
|
|
135
|
+
await analytics.flush();
|
|
136
|
+
stdioTransport.close();
|
|
137
|
+
await server.close();
|
|
138
|
+
})(),
|
|
139
|
+
new Promise((resolve) => setTimeout(resolve, 5_000)),
|
|
140
|
+
]);
|
|
141
|
+
process.exit(0);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for the OneSource Skills REST API.
|
|
3
|
+
*
|
|
4
|
+
* All 34 MCP tools delegate to this client, which handles:
|
|
5
|
+
* - Base URL configuration
|
|
6
|
+
* - x402 payment flow (402 → sign → retry)
|
|
7
|
+
* - Response envelope unwrapping
|
|
8
|
+
*/
|
|
9
|
+
export type { ApiResponse } from './types.js';
|
|
10
|
+
import type { ApiResponse } from './types.js';
|
|
11
|
+
export interface ClientOptions {
|
|
12
|
+
baseUrl: string;
|
|
13
|
+
}
|
|
14
|
+
export interface HttpEventData {
|
|
15
|
+
tool: string;
|
|
16
|
+
http_status: number;
|
|
17
|
+
backend_latency_ms: number;
|
|
18
|
+
x402_required: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface CallContext {
|
|
21
|
+
tool: string;
|
|
22
|
+
}
|
|
23
|
+
export declare class OneSourceClient {
|
|
24
|
+
private baseUrl;
|
|
25
|
+
private _context;
|
|
26
|
+
/** Set by create-server.ts to receive HTTP-level metrics. */
|
|
27
|
+
onHttpEvent?: (event: HttpEventData) => void;
|
|
28
|
+
constructor(opts: ClientOptions);
|
|
29
|
+
/**
|
|
30
|
+
* Create a child client with call context (e.g. tool name).
|
|
31
|
+
* The child shares the same baseUrl and onHttpEvent but has its own context.
|
|
32
|
+
* Safe for concurrent use — each tool call gets its own child.
|
|
33
|
+
*/
|
|
34
|
+
withContext(ctx: CallContext): OneSourceClient;
|
|
35
|
+
/**
|
|
36
|
+
* GET request to the Skills API.
|
|
37
|
+
*/
|
|
38
|
+
get<T = unknown>(path: string, params?: Record<string, string | number | undefined>): Promise<ApiResponse<T>>;
|
|
39
|
+
/**
|
|
40
|
+
* POST request to the Skills API.
|
|
41
|
+
*/
|
|
42
|
+
post<T = unknown>(path: string, body: Record<string, unknown>, params?: Record<string, string | number | undefined>): Promise<ApiResponse<T>>;
|
|
43
|
+
private fetchWithMetrics;
|
|
44
|
+
private buildUrl;
|
|
45
|
+
private headers;
|
|
46
|
+
private handleResponse;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create a client from environment variables.
|
|
50
|
+
*/
|
|
51
|
+
export declare function createClientFromEnv(): OneSourceClient;
|
|
52
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAA6B;IAE7C,6DAA6D;IAC7D,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;gBAEjC,IAAI,EAAE,aAAa;IAK/B;;;;OAIG;IACH,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,eAAe;IAM9C;;OAEG;IACG,GAAG,CAAC,CAAC,GAAG,OAAO,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GACnD,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAS1B;;OAEG;IACG,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GACnD,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAUZ,gBAAgB;IAoB9B,OAAO,CAAC,QAAQ;IAehB,OAAO,CAAC,OAAO;YAID,cAAc;CA4C7B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,eAAe,CAQrD"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
export class OneSourceClient {
|
|
2
|
+
baseUrl;
|
|
3
|
+
_context = { tool: '' };
|
|
4
|
+
/** Set by create-server.ts to receive HTTP-level metrics. */
|
|
5
|
+
onHttpEvent;
|
|
6
|
+
constructor(opts) {
|
|
7
|
+
// Strip trailing slash
|
|
8
|
+
this.baseUrl = opts.baseUrl.replace(/\/+$/, '');
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create a child client with call context (e.g. tool name).
|
|
12
|
+
* The child shares the same baseUrl and onHttpEvent but has its own context.
|
|
13
|
+
* Safe for concurrent use — each tool call gets its own child.
|
|
14
|
+
*/
|
|
15
|
+
withContext(ctx) {
|
|
16
|
+
const child = Object.create(this);
|
|
17
|
+
child._context = ctx;
|
|
18
|
+
return child;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* GET request to the Skills API.
|
|
22
|
+
*/
|
|
23
|
+
async get(path, params) {
|
|
24
|
+
const url = this.buildUrl(path, params);
|
|
25
|
+
const { res, latencyMs } = await this.fetchWithMetrics(url.toString(), {
|
|
26
|
+
method: 'GET',
|
|
27
|
+
headers: this.headers(),
|
|
28
|
+
});
|
|
29
|
+
return this.handleResponse(res, latencyMs);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* POST request to the Skills API.
|
|
33
|
+
*/
|
|
34
|
+
async post(path, body, params) {
|
|
35
|
+
const url = this.buildUrl(path, params);
|
|
36
|
+
const { res, latencyMs } = await this.fetchWithMetrics(url.toString(), {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
headers: { ...this.headers(), 'Content-Type': 'application/json' },
|
|
39
|
+
body: JSON.stringify(body),
|
|
40
|
+
});
|
|
41
|
+
return this.handleResponse(res, latencyMs);
|
|
42
|
+
}
|
|
43
|
+
async fetchWithMetrics(url, init) {
|
|
44
|
+
const start = performance.now();
|
|
45
|
+
try {
|
|
46
|
+
const res = await fetch(url, init);
|
|
47
|
+
return { res, latencyMs: Math.round(performance.now() - start) };
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
const latencyMs = Math.round(performance.now() - start);
|
|
51
|
+
this.onHttpEvent?.({
|
|
52
|
+
tool: this._context.tool,
|
|
53
|
+
http_status: 0,
|
|
54
|
+
backend_latency_ms: latencyMs,
|
|
55
|
+
x402_required: false,
|
|
56
|
+
});
|
|
57
|
+
throw err;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
buildUrl(path, params) {
|
|
61
|
+
const url = new URL(path, this.baseUrl);
|
|
62
|
+
if (params) {
|
|
63
|
+
for (const [key, value] of Object.entries(params)) {
|
|
64
|
+
if (value !== undefined && value !== '') {
|
|
65
|
+
url.searchParams.set(key, String(value));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return url;
|
|
70
|
+
}
|
|
71
|
+
headers() {
|
|
72
|
+
return { 'User-Agent': 'onesource-api-mcp' };
|
|
73
|
+
}
|
|
74
|
+
async handleResponse(res, latencyMs) {
|
|
75
|
+
// Fire HTTP analytics callback
|
|
76
|
+
this.onHttpEvent?.({
|
|
77
|
+
tool: this._context.tool,
|
|
78
|
+
http_status: res.status,
|
|
79
|
+
backend_latency_ms: latencyMs,
|
|
80
|
+
x402_required: res.status === 402,
|
|
81
|
+
});
|
|
82
|
+
// x402 payment required — return a helpful message instead of crashing
|
|
83
|
+
if (res.status === 402) {
|
|
84
|
+
const paymentHeader = res.headers.get('Payment-Required');
|
|
85
|
+
const details = paymentHeader ? ` Details: ${paymentHeader.slice(0, 200)}` : '';
|
|
86
|
+
return {
|
|
87
|
+
error: `Payment required (402). This endpoint requires x402 payment.${details}`,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Parse response body safely — upstream may return HTML error pages or empty bodies
|
|
91
|
+
let body;
|
|
92
|
+
try {
|
|
93
|
+
const text = await res.text();
|
|
94
|
+
body = JSON.parse(text);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return {
|
|
98
|
+
error: `Failed to parse response (HTTP ${res.status}): body was not valid JSON`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (body === null || typeof body !== 'object') {
|
|
102
|
+
return {
|
|
103
|
+
error: `Unexpected response shape (HTTP ${res.status})`,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (!res.ok) {
|
|
107
|
+
return {
|
|
108
|
+
error: body.error ?? `HTTP ${res.status}: ${res.statusText}`,
|
|
109
|
+
meta: body.meta,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
return body;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Create a client from environment variables.
|
|
117
|
+
*/
|
|
118
|
+
export function createClientFromEnv() {
|
|
119
|
+
const baseUrl = process.env.ONESOURCE_BASE_URL ?? 'https://skills.onesource.io';
|
|
120
|
+
const parsed = new URL(baseUrl);
|
|
121
|
+
if (!['https:', 'http:'].includes(parsed.protocol)) {
|
|
122
|
+
throw new Error('ONESOURCE_BASE_URL must use http or https');
|
|
123
|
+
}
|
|
124
|
+
return new OneSourceClient({ baseUrl });
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates a configured McpServer with all OneSource API tools.
|
|
5
|
+
* Shared by stdio (cli.ts) and HTTP modes.
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import { OneSourceClient } from './client.js';
|
|
9
|
+
import { type Analytics } from './analytics.js';
|
|
10
|
+
export declare const VERSION: string;
|
|
11
|
+
export interface CreateServerOptions {
|
|
12
|
+
/** Override the default client (useful for testing). */
|
|
13
|
+
client?: OneSourceClient;
|
|
14
|
+
/** Override the default analytics (useful for testing). */
|
|
15
|
+
analytics?: Analytics;
|
|
16
|
+
/** Transport mode — passed through to analytics events. */
|
|
17
|
+
transport?: 'stdio' | 'http';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a configured MCP server with all OneSource API tools.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createMcpServer(opts?: CreateServerOptions): {
|
|
23
|
+
server: McpServer;
|
|
24
|
+
analytics: Analytics;
|
|
25
|
+
};
|
|
26
|
+
export type CreateServerResult = ReturnType<typeof createMcpServer>;
|
|
27
|
+
export { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
28
|
+
//# sourceMappingURL=create-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAuB,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGjE,eAAO,MAAM,OAAO,EAAE,MAA2C,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC9B;AAOD;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,CAwHvG;AAED,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAGpE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates a configured McpServer with all OneSource API tools.
|
|
5
|
+
* Shared by stdio (cli.ts) and HTTP modes.
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
import { createRequire } from 'node:module';
|
|
10
|
+
import { createClientFromEnv } from './client.js';
|
|
11
|
+
import { allTools } from './tools/index.js';
|
|
12
|
+
import { createAnalytics } from './analytics.js';
|
|
13
|
+
const require = createRequire(import.meta.url);
|
|
14
|
+
export const VERSION = require('../package.json').version;
|
|
15
|
+
function hashSession(sessionId) {
|
|
16
|
+
if (!sessionId)
|
|
17
|
+
return undefined;
|
|
18
|
+
return createHash('sha256').update(sessionId).digest('hex').slice(0, 16);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create a configured MCP server with all OneSource API tools.
|
|
22
|
+
*/
|
|
23
|
+
export function createMcpServer(opts) {
|
|
24
|
+
const client = opts?.client ?? createClientFromEnv();
|
|
25
|
+
const analytics = opts?.analytics ?? createAnalytics();
|
|
26
|
+
const transport = opts?.transport;
|
|
27
|
+
// Wire HTTP-level analytics from client (default handler for non-overridden calls)
|
|
28
|
+
client.onHttpEvent = (event) => {
|
|
29
|
+
analytics.trackHttp({
|
|
30
|
+
type: 'http_call',
|
|
31
|
+
service: 'onesource-api',
|
|
32
|
+
tool: event.tool,
|
|
33
|
+
http_status: event.http_status,
|
|
34
|
+
backend_latency_ms: event.backend_latency_ms,
|
|
35
|
+
x402_required: event.x402_required,
|
|
36
|
+
timestamp: new Date().toISOString(),
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
const server = new McpServer({
|
|
40
|
+
name: 'onesource-api',
|
|
41
|
+
version: VERSION,
|
|
42
|
+
});
|
|
43
|
+
// Register all tools with analytics instrumentation
|
|
44
|
+
for (const tool of allTools) {
|
|
45
|
+
server.registerTool(tool.name, {
|
|
46
|
+
description: tool.description,
|
|
47
|
+
inputSchema: tool.schema,
|
|
48
|
+
}, async (input, extra) => {
|
|
49
|
+
const start = performance.now();
|
|
50
|
+
const inputRecord = input;
|
|
51
|
+
const inputKeys = Object.keys(inputRecord);
|
|
52
|
+
const network = inputRecord.network;
|
|
53
|
+
const sessionHash = hashSession(extra.sessionId);
|
|
54
|
+
const clientInfo = server.server.getClientVersion();
|
|
55
|
+
// Create a per-call client with tool context (avoids race condition on shared client)
|
|
56
|
+
const toolClient = client.withContext({ tool: tool.name });
|
|
57
|
+
// Track x402 status per-call via closure — no shared mutable state
|
|
58
|
+
let x402Seen = false;
|
|
59
|
+
toolClient.onHttpEvent = (event) => {
|
|
60
|
+
if (event.x402_required)
|
|
61
|
+
x402Seen = true;
|
|
62
|
+
analytics.trackHttp({
|
|
63
|
+
type: 'http_call',
|
|
64
|
+
service: 'onesource-api',
|
|
65
|
+
tool: event.tool,
|
|
66
|
+
http_status: event.http_status,
|
|
67
|
+
backend_latency_ms: event.backend_latency_ms,
|
|
68
|
+
x402_required: event.x402_required,
|
|
69
|
+
timestamp: new Date().toISOString(),
|
|
70
|
+
session_id: sessionHash,
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
try {
|
|
74
|
+
const text = await tool.handler(inputRecord, toolClient);
|
|
75
|
+
const durationMs = Math.round(performance.now() - start);
|
|
76
|
+
analytics.trackTool({
|
|
77
|
+
type: 'tool_call',
|
|
78
|
+
service: 'onesource-api',
|
|
79
|
+
tool: tool.name,
|
|
80
|
+
category: tool.category,
|
|
81
|
+
timestamp: new Date().toISOString(),
|
|
82
|
+
duration_ms: durationMs,
|
|
83
|
+
success: true,
|
|
84
|
+
network,
|
|
85
|
+
input_params: inputKeys,
|
|
86
|
+
response_size: text.length,
|
|
87
|
+
version: VERSION,
|
|
88
|
+
auth_method: x402Seen ? 'x402' : 'none',
|
|
89
|
+
client_name: clientInfo?.name,
|
|
90
|
+
client_version: clientInfo?.version,
|
|
91
|
+
session_id: sessionHash,
|
|
92
|
+
transport,
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
content: [{ type: 'text', text }],
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
const durationMs = Math.round(performance.now() - start);
|
|
100
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
101
|
+
analytics.trackTool({
|
|
102
|
+
type: 'tool_call',
|
|
103
|
+
service: 'onesource-api',
|
|
104
|
+
tool: tool.name,
|
|
105
|
+
category: tool.category,
|
|
106
|
+
timestamp: new Date().toISOString(),
|
|
107
|
+
duration_ms: durationMs,
|
|
108
|
+
success: false,
|
|
109
|
+
error_category: message.slice(0, 100).replace(/0x[a-fA-F0-9]+/g, '0x***'),
|
|
110
|
+
network,
|
|
111
|
+
input_params: inputKeys,
|
|
112
|
+
response_size: 0,
|
|
113
|
+
version: VERSION,
|
|
114
|
+
auth_method: x402Seen ? 'x402' : 'none',
|
|
115
|
+
client_name: clientInfo?.name,
|
|
116
|
+
client_version: clientInfo?.version,
|
|
117
|
+
session_id: sessionHash,
|
|
118
|
+
transport,
|
|
119
|
+
});
|
|
120
|
+
return {
|
|
121
|
+
isError: true,
|
|
122
|
+
content: [
|
|
123
|
+
{ type: 'text', text: `Tool error: ${message.slice(0, 500)}` },
|
|
124
|
+
],
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return { server, analytics };
|
|
130
|
+
}
|
|
131
|
+
// Re-export for consumers that need transports
|
|
132
|
+
export { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
133
|
+
//# sourceMappingURL=create-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-server.js","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-code.d.ts","sourceRoot":"","sources":["../../../src/tools/chain/contract-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C,eAAO,MAAM,IAAI,EAAE,OAiBlB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { networkParam, addressParam, formatResponse, safePath } from '../../types.js';
|
|
2
|
+
export const tool = {
|
|
3
|
+
name: '1s_contract_code',
|
|
4
|
+
description: 'Get the deployed bytecode of a contract via eth_getCode. ' +
|
|
5
|
+
"Returns '0x' for EOA (non-contract) addresses. " +
|
|
6
|
+
'Use this to verify whether an address is a contract before interacting with it.',
|
|
7
|
+
category: 'chain',
|
|
8
|
+
schema: {
|
|
9
|
+
address: addressParam,
|
|
10
|
+
network: networkParam,
|
|
11
|
+
},
|
|
12
|
+
handler: async (input, client) => {
|
|
13
|
+
const res = await client.get(`/api/chain/code/${safePath(input.address)}`, {
|
|
14
|
+
network: input.network,
|
|
15
|
+
});
|
|
16
|
+
return formatResponse(res);
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=contract-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-code.js","sourceRoot":"","sources":["../../../src/tools/chain/contract-code.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEtF,MAAM,CAAC,MAAM,IAAI,GAAY;IAC3B,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,2DAA2D;QAC3D,iDAAiD;QACjD,iFAAiF;IACnF,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE;QACN,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,YAAY;KACtB;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC/B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,mBAAmB,QAAQ,CAAC,KAAK,CAAC,OAAiB,CAAC,EAAE,EAAE;YACnF,OAAO,EAAE,KAAK,CAAC,OAA6B;SAC7C,CAAC,CAAC;QACH,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ens-resolve.d.ts","sourceRoot":"","sources":["../../../src/tools/chain/ens-resolve.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C,eAAO,MAAM,IAAI,EAAE,OAsBlB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 1s_ens_resolve — Resolve ENS names to addresses or addresses to ENS names.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { networkParam, formatResponse, safePath } from '../../types.js';
|
|
6
|
+
export const tool = {
|
|
7
|
+
name: '1s_ens_resolve',
|
|
8
|
+
description: 'Resolve ENS names to addresses (forward) or addresses to ENS names (reverse). ' +
|
|
9
|
+
"Accepts either a .eth name or a 0x address. " +
|
|
10
|
+
'Only works on networks with ENS registry deployed (mainnet, sepolia).',
|
|
11
|
+
category: 'chain',
|
|
12
|
+
schema: {
|
|
13
|
+
input: z.string()
|
|
14
|
+
.regex(/^(0x[a-fA-F0-9]{40}|[a-zA-Z0-9]([a-zA-Z0-9._-]*[a-zA-Z0-9])?)$/, 'Must be an ENS name (e.g. vitalik.eth) or 0x address')
|
|
15
|
+
.describe("ENS name (e.g. 'vitalik.eth') or address (0x...) for reverse lookup"),
|
|
16
|
+
network: networkParam,
|
|
17
|
+
},
|
|
18
|
+
handler: async (input, client) => {
|
|
19
|
+
const res = await client.get(`/api/chain/ens/${safePath(input.input)}`, {
|
|
20
|
+
network: input.network,
|
|
21
|
+
});
|
|
22
|
+
return formatResponse(res);
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=ens-resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ens-resolve.js","sourceRoot":"","sources":["../../../src/tools/chain/ens-resolve.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAExE,MAAM,CAAC,MAAM,IAAI,GAAY;IAC3B,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,gFAAgF;QAChF,8CAA8C;QAC9C,uEAAuE;IACzE,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE;QACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;aACd,KAAK,CACJ,gEAAgE,EAChE,sDAAsD,CACvD;aACA,QAAQ,CAAC,qEAAqE,CAAC;QAClF,OAAO,EAAE,YAAY;KACtB;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC/B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,kBAAkB,QAAQ,CAAC,KAAK,CAAC,KAAe,CAAC,EAAE,EAAE;YAChF,OAAO,EAAE,KAAK,CAAC,OAA6B;SAC7C,CAAC,CAAC;QACH,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"estimate-gas.d.ts","sourceRoot":"","sources":["../../../src/tools/chain/estimate-gas.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C,eAAO,MAAM,IAAI,EAAE,OA2BlB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { networkParam, addressParam, formatResponse, optionalHexParam } from '../../types.js';
|
|
2
|
+
export const tool = {
|
|
3
|
+
name: '1s_estimate_gas',
|
|
4
|
+
description: 'Estimate gas required for a transaction via eth_estimateGas. ' +
|
|
5
|
+
'Use this before sending transactions to set appropriate gas limits. ' +
|
|
6
|
+
'Returns the estimated gas as a hex value; reverts return the revert reason.',
|
|
7
|
+
category: 'chain',
|
|
8
|
+
schema: {
|
|
9
|
+
to: addressParam,
|
|
10
|
+
data: optionalHexParam.describe('ABI-encoded call data (hex)'),
|
|
11
|
+
from: addressParam.optional().describe('Sender address'),
|
|
12
|
+
value: optionalHexParam.describe('ETH value in wei (hex)'),
|
|
13
|
+
network: networkParam,
|
|
14
|
+
},
|
|
15
|
+
handler: async (input, client) => {
|
|
16
|
+
const body = {
|
|
17
|
+
to: input.to,
|
|
18
|
+
};
|
|
19
|
+
if (input.data !== undefined)
|
|
20
|
+
body.data = input.data;
|
|
21
|
+
if (input.from !== undefined)
|
|
22
|
+
body.from = input.from;
|
|
23
|
+
if (input.value !== undefined)
|
|
24
|
+
body.value = input.value;
|
|
25
|
+
const res = await client.post('/api/chain/estimate-gas', body, {
|
|
26
|
+
network: input.network,
|
|
27
|
+
});
|
|
28
|
+
return formatResponse(res);
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=estimate-gas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"estimate-gas.js","sourceRoot":"","sources":["../../../src/tools/chain/estimate-gas.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE9F,MAAM,CAAC,MAAM,IAAI,GAAY;IAC3B,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,+DAA+D;QAC/D,sEAAsE;QACtE,6EAA6E;IAC/E,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE;QACN,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,gBAAgB,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC9D,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACxD,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC1D,OAAO,EAAE,YAAY;KACtB;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC/B,MAAM,IAAI,GAA4B;YACpC,EAAE,EAAE,KAAK,CAAC,EAAE;SACb,CAAC;QACF,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACrD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACrD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAExD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,IAAI,EAAE;YAC7D,OAAO,EAAE,KAAK,CAAC,OAA6B;SAC7C,CAAC,CAAC;QACH,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC"}
|