@ironflowsh/mcp 0.8.3 → 0.11.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/README.md +37 -23
- package/build/api.d.ts +36 -9
- package/build/api.d.ts.map +1 -1
- package/build/api.js +120 -48
- package/build/api.js.map +1 -1
- package/build/http.js +28 -5
- package/build/http.js.map +1 -1
- package/build/index.js +4 -3
- package/build/index.js.map +1 -1
- package/build/notice.d.ts +10 -0
- package/build/notice.d.ts.map +1 -0
- package/build/notice.js +82 -0
- package/build/notice.js.map +1 -0
- package/build/query.d.ts +24 -0
- package/build/query.d.ts.map +1 -0
- package/build/query.js +117 -0
- package/build/query.js.map +1 -0
- package/build/schemas.d.ts.map +1 -1
- package/build/schemas.js +62 -5
- package/build/schemas.js.map +1 -1
- package/build/server.d.ts +9 -1
- package/build/server.d.ts.map +1 -1
- package/build/server.js +29 -10
- package/build/server.js.map +1 -1
- package/build/shape.d.ts +14 -3
- package/build/shape.d.ts.map +1 -1
- package/build/shape.js +28 -12
- package/build/shape.js.map +1 -1
- package/build/tools.d.ts +1 -0
- package/build/tools.d.ts.map +1 -1
- package/build/tools.js +235 -73
- package/build/tools.js.map +1 -1
- package/build/usage.d.ts +15 -0
- package/build/usage.d.ts.map +1 -0
- package/build/usage.js +66 -0
- package/build/usage.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,37 +1,27 @@
|
|
|
1
1
|
# @ironflowsh/mcp
|
|
2
2
|
|
|
3
|
-
[](https://smithery.ai/servers/ironflow/hyperliquid)
|
|
4
4
|
|
|
5
|
-
MCP server for [Ironflow](https://ironflow.sh): read-only Hyperliquid market data and wallet analytics for Claude, Cursor and any MCP client. It covers native perps, HIP-3 builder markets, HIP-4 outcome markets and spot.
|
|
5
|
+
MCP server for [Ironflow](https://ironflow.sh): read-only Hyperliquid market data and wallet analytics for Claude, Cursor and any MCP client. It covers native perps, HIP-3 builder markets, HIP-4 outcome markets and spot. 36 tools, all read-only, including `run_query` for read-only SQL over every Hyperliquid fill, wallet, funding and liquidation table.
|
|
6
6
|
|
|
7
|
-
No API key needed to start: keyless calls get 10 requests per minute and 24 hours of history. A free key from [ironflow.sh/key](https://ironflow.sh/key) raises that to 60 requests per minute and 30 days.
|
|
7
|
+
No API key needed to start: keyless calls get 10 requests per minute, 500 per day and 24 hours of history. A free key from [ironflow.sh/key](https://ironflow.sh/key) raises that to 60 requests per minute and 30 days.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Install
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
The hosted server needs no install and no key: `https://mcp.ironflow.sh/mcp` (Streamable HTTP).
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
[](https://cursor.com/install-mcp?name=ironflow&config=eyJ1cmwiOiJodHRwczovL21jcC5pcm9uZmxvdy5zaC9tY3AifQ%3D%3D)
|
|
14
|
+
[](https://insiders.vscode.dev/redirect?url=vscode%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522ironflow%2522%252C%2522type%2522%253A%2522http%2522%252C%2522url%2522%253A%2522https%253A%252F%252Fmcp.ironflow.sh%252Fmcp%2522%257D)
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
> "Summarize this wallet's last 30 days: PnL, fees, maker share, funding paid."
|
|
18
|
-
|
|
19
|
-
## Hosted server (no install)
|
|
20
|
-
|
|
21
|
-
Connect by URL: `https://mcp.ironflow.sh/mcp` (Streamable HTTP).
|
|
16
|
+
**Claude Code**
|
|
22
17
|
|
|
23
18
|
```bash
|
|
24
|
-
# Claude Code
|
|
25
19
|
claude mcp add --transport http ironflow https://mcp.ironflow.sh/mcp
|
|
26
|
-
|
|
27
|
-
# with a free key
|
|
28
|
-
claude mcp add --transport http ironflow https://mcp.ironflow.sh/mcp \
|
|
29
|
-
--header "Authorization: Bearer if_your_api_key"
|
|
30
20
|
```
|
|
31
21
|
|
|
32
|
-
Claude
|
|
22
|
+
**Claude (claude.ai and Claude Desktop)**: open Customize → Connectors, click Add custom connector, enter the name `Ironflow` and the URL `https://mcp.ironflow.sh/mcp`, then click Add. On Team and Enterprise plans an Owner adds it under Organization settings → Connectors → Add → Custom, and members then click Connect.
|
|
33
23
|
|
|
34
|
-
Cursor
|
|
24
|
+
**Cursor**: the button above, or add this to `~/.cursor/mcp.json` (or a project's `.cursor/mcp.json`):
|
|
35
25
|
|
|
36
26
|
```json
|
|
37
27
|
{
|
|
@@ -41,7 +31,24 @@ Cursor (`~/.cursor/mcp.json` or a project's `.cursor/mcp.json`):
|
|
|
41
31
|
}
|
|
42
32
|
```
|
|
43
33
|
|
|
44
|
-
|
|
34
|
+
**VS Code**: the button above, or
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
code --add-mcp '{"name":"ironflow","type":"http","url":"https://mcp.ironflow.sh/mcp"}'
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Local server (stdio)**: `npx -y @ironflowsh/mcp`, see [Local server](#local-server).
|
|
41
|
+
|
|
42
|
+
### With a free key
|
|
43
|
+
|
|
44
|
+
Send it as `Authorization: Bearer if_your_api_key`, or as `?key=if_your_api_key` on the URL for clients that cannot set headers.
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
claude mcp add --transport http ironflow https://mcp.ironflow.sh/mcp \
|
|
48
|
+
--header "Authorization: Bearer if_your_api_key"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
In Cursor, add `"headers": { "Authorization": "Bearer if_your_api_key" }` next to `url`.
|
|
45
52
|
|
|
46
53
|
## Local server
|
|
47
54
|
|
|
@@ -69,9 +76,11 @@ To host the HTTP server yourself: `npx -y -p @ironflowsh/mcp ironflow-mcp-http`
|
|
|
69
76
|
|
|
70
77
|
## Tools
|
|
71
78
|
|
|
79
|
+
**Ask anything (SQL):** `describe_data` lists the queryable tables, columns and example queries; `run_query` runs one read-only ClickHouse SELECT over them (every fill, per-wallet daily totals, behaviour labels, funding, mark and oracle prices, open interest, liquidations, builder-code fills, transfers, vault flows); `get_wallet_behavior` returns 30-day trading-style labels per wallet. Keyless queries see the last 24 hours; a free key sees 30 days.
|
|
80
|
+
|
|
72
81
|
**Market data:** `get_price`, `get_recent_trades`, `get_candles`, `get_funding_rates`, `get_open_interest`, `get_liquidations`, `get_liquidation_summary`, `get_fills`, `get_mark_prices`, `get_vault_operations`, `list_markets`, `get_markets_snapshot`
|
|
73
82
|
|
|
74
|
-
**Market analytics:** `get_funding_stats`, `get_pnl_leaderboard`, `get_market_top_wallets`, `get_wallet_labels`, `
|
|
83
|
+
**Market analytics:** `get_funding_stats`, `get_pnl_leaderboard`, `get_market_top_wallets`, `get_wallet_labels`, `get_vault_leaderboard` and `get_liquidation_levels` (needs a Builder or Enterprise key)
|
|
75
84
|
|
|
76
85
|
**Signals:** `get_top_traders`, `get_market_leaders`, `get_early_movers`, `get_trader_profile`
|
|
77
86
|
|
|
@@ -81,7 +90,7 @@ To host the HTTP server yourself: `npx -y -p @ironflowsh/mcp ironflow-mcp-http`
|
|
|
81
90
|
|
|
82
91
|
**Status:** `get_status`, `get_status_metrics`, `get_status_history`
|
|
83
92
|
|
|
84
|
-
Fill history covers a rolling 12 months. There is no order book, order status or streaming tool.
|
|
93
|
+
Markets can be given as display symbols (`BTC-PERP`, `xyz:NVDA-PERP`, `HYPE/USDC`) or Hyperliquid names (`BTC`, `@107`, `xyz:NVDA`), and times as Unix ms, Unix seconds or ISO 8601. When the API reads a name, or serves a window that starts later than asked because of the key's history limit, the result starts with a `notice` saying so. Fill history covers a rolling 12 months. There is no order book, order status or streaming tool.
|
|
85
94
|
|
|
86
95
|
## Configuration
|
|
87
96
|
|
|
@@ -90,6 +99,11 @@ Fill history covers a rolling 12 months. There is no order book, order status or
|
|
|
90
99
|
| `IRONFLOW_API_KEY` | optional; free key at [ironflow.sh/key](https://ironflow.sh/key) |
|
|
91
100
|
| `IRONFLOW_API_URL` | `https://api.ironflow.sh` |
|
|
92
101
|
| `PORT` (HTTP server) | `8080` |
|
|
102
|
+
| `MCP_LOG_SALT` (HTTP server) | random per process; keys the caller hash in the access log |
|
|
103
|
+
|
|
104
|
+
## Usage data
|
|
105
|
+
|
|
106
|
+
Each API call carries two headers so we can see which apps and tools people use: `X-Ironflow-Client` (the MCP client's name and version, e.g. `claude-code/2.1.0`) and `X-Ironflow-Tool` (the tool name). The hosted server logs each request's method, tool arguments, client name, status, whether the tool returned an error, the API status and error code behind it, and a salted hash of the caller's IP. It never logs IPs or API keys.
|
|
93
107
|
|
|
94
108
|
## Links
|
|
95
109
|
|
package/build/api.d.ts
CHANGED
|
@@ -1,13 +1,40 @@
|
|
|
1
|
+
export interface CallContext {
|
|
2
|
+
client?: string;
|
|
3
|
+
tool?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface MarketsQuery {
|
|
6
|
+
source?: string;
|
|
7
|
+
marketClass?: string;
|
|
8
|
+
issuer?: string;
|
|
9
|
+
q?: string;
|
|
10
|
+
includeInactive?: boolean;
|
|
11
|
+
limit?: number;
|
|
12
|
+
cursor?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface UpstreamCall {
|
|
15
|
+
status: number;
|
|
16
|
+
code?: string;
|
|
17
|
+
}
|
|
1
18
|
export declare class IronflowAPI {
|
|
2
19
|
private baseUrl;
|
|
3
20
|
private apiKey?;
|
|
4
21
|
private source;
|
|
5
22
|
private userAgent;
|
|
6
23
|
private forwardedFor?;
|
|
24
|
+
private context;
|
|
25
|
+
private calls;
|
|
26
|
+
private notices;
|
|
7
27
|
constructor(baseUrl?: string, apiKey?: string, source?: string, version?: string, forwardedFor?: string);
|
|
8
28
|
private headers;
|
|
29
|
+
hasKey(): boolean;
|
|
30
|
+
upstreamCalls(): UpstreamCall[];
|
|
31
|
+
private record;
|
|
32
|
+
withContext(context: CallContext): IronflowAPI;
|
|
33
|
+
notice(): string;
|
|
34
|
+
private noteHeaders;
|
|
9
35
|
private apiError;
|
|
10
|
-
get(path: string, params?: Record<string, string
|
|
36
|
+
get(path: string, params?: Record<string, string>, keepEmpty?: readonly string[]): Promise<unknown>;
|
|
37
|
+
post(path: string, body: unknown): Promise<unknown>;
|
|
11
38
|
getPrice(market: string): Promise<string>;
|
|
12
39
|
getRecentTrades(market: string, limit?: string): Promise<unknown>;
|
|
13
40
|
getCandles(market: string, interval?: string, limit?: string): Promise<unknown>;
|
|
@@ -21,20 +48,20 @@ export declare class IronflowAPI {
|
|
|
21
48
|
getVaultLeaderboard(limit?: string): Promise<unknown>;
|
|
22
49
|
getFundingStats(market: string, interval?: string, limit?: string): Promise<unknown>;
|
|
23
50
|
getUserState(address: string): Promise<unknown>;
|
|
24
|
-
getUserFunding(address: string, market?: string, from?:
|
|
25
|
-
getUserMakerTaker(address: string, market?: string, from?:
|
|
26
|
-
getUserLedger(address: string, from?:
|
|
27
|
-
getPnLLeaderboard(from?:
|
|
28
|
-
getMarketTopWallets(market: string, from?:
|
|
51
|
+
getUserFunding(address: string, market?: string, from?: string, to?: string, bucket?: string): Promise<unknown>;
|
|
52
|
+
getUserMakerTaker(address: string, market?: string, from?: string, to?: string): Promise<unknown>;
|
|
53
|
+
getUserLedger(address: string, from?: string, to?: string, eventTypes?: string, limit?: number): Promise<unknown>;
|
|
54
|
+
getPnLLeaderboard(from?: string, to?: string, limit?: number, sortBy?: string): Promise<unknown>;
|
|
55
|
+
getMarketTopWallets(market: string, from?: string, to?: string, limit?: number, sortBy?: string): Promise<unknown>;
|
|
29
56
|
getMarketsSnapshot(marketClass?: string, issuer?: string): Promise<unknown>;
|
|
30
|
-
getUserSummary(address: string, from?:
|
|
31
|
-
getUserPnLSeries(address: string, from?:
|
|
57
|
+
getUserSummary(address: string, from?: string, to?: string): Promise<unknown>;
|
|
58
|
+
getUserPnLSeries(address: string, from?: string, to?: string, bucketMs?: number): Promise<unknown>;
|
|
32
59
|
getWalletLabels(whaleTopN?: number, smartTopN?: number): Promise<unknown>;
|
|
33
60
|
listCohorts(): Promise<unknown>;
|
|
34
61
|
getCohortAddresses(name: string): Promise<unknown>;
|
|
35
62
|
getStatus(): Promise<unknown>;
|
|
36
63
|
getStatusMetrics(): Promise<unknown>;
|
|
37
64
|
getStatusHistory(period?: string): Promise<unknown>;
|
|
38
|
-
listMarkets(
|
|
65
|
+
listMarkets(query?: MarketsQuery): Promise<unknown>;
|
|
39
66
|
}
|
|
40
67
|
//# sourceMappingURL=api.d.ts.map
|
package/build/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/build/api.js
CHANGED
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
// Ironflow REST API client. Uses native fetch — no external HTTP dependencies.
|
|
2
|
+
import { formatNotices, readNotice } from "./notice.js";
|
|
3
|
+
import { sanitizeClientApp } from "./usage.js";
|
|
2
4
|
const DEFAULT_BASE_URL = "https://api.ironflow.sh";
|
|
3
5
|
const DEFAULT_SOURCE = "hyperliquid";
|
|
6
|
+
const TOOL_PATTERN = /^[a-z0-9_]{1,48}$/;
|
|
7
|
+
const ERROR_CODE_PATTERN = /^[A-Z0-9_]{1,48}$/;
|
|
8
|
+
const MAX_NOTICES = 20;
|
|
4
9
|
export class IronflowAPI {
|
|
5
10
|
baseUrl;
|
|
6
11
|
apiKey;
|
|
7
12
|
source;
|
|
8
13
|
userAgent;
|
|
9
14
|
forwardedFor;
|
|
15
|
+
context = {};
|
|
16
|
+
// Shared by every withContext copy, so the hosted server can read what
|
|
17
|
+
// the tool calls of one request did upstream.
|
|
18
|
+
calls = [];
|
|
19
|
+
// Notice headers of this copy's responses: one withContext copy per tool
|
|
20
|
+
// call, so a tool result carries only its own notices.
|
|
21
|
+
notices = [];
|
|
10
22
|
// forwardedFor is set only by the hosted HTTP server: it passes the MCP
|
|
11
23
|
// client's IP on so keyless rate limits apply per caller, not per server.
|
|
12
24
|
constructor(baseUrl = DEFAULT_BASE_URL, apiKey, source = DEFAULT_SOURCE, version = "unknown", forwardedFor) {
|
|
@@ -27,43 +39,109 @@ export class IronflowAPI {
|
|
|
27
39
|
if (this.forwardedFor) {
|
|
28
40
|
h["X-Forwarded-For"] = this.forwardedFor;
|
|
29
41
|
}
|
|
42
|
+
const client = sanitizeClientApp(this.context.client);
|
|
43
|
+
if (client)
|
|
44
|
+
h["X-Ironflow-Client"] = client;
|
|
45
|
+
if (this.context.tool && TOOL_PATTERN.test(this.context.tool)) {
|
|
46
|
+
h["X-Ironflow-Tool"] = this.context.tool;
|
|
47
|
+
}
|
|
30
48
|
return h;
|
|
31
49
|
}
|
|
50
|
+
// hasKey reports whether requests carry an API key.
|
|
51
|
+
hasKey() {
|
|
52
|
+
return Boolean(this.apiKey);
|
|
53
|
+
}
|
|
54
|
+
// upstreamCalls returns the status (and error code) of every API request
|
|
55
|
+
// made so far through this client or its withContext copies.
|
|
56
|
+
upstreamCalls() {
|
|
57
|
+
return [...this.calls];
|
|
58
|
+
}
|
|
59
|
+
record(status, code) {
|
|
60
|
+
this.calls.push(code && ERROR_CODE_PATTERN.test(code) ? { status, code } : { status });
|
|
61
|
+
}
|
|
62
|
+
// withContext returns a copy of this client that tags its requests with
|
|
63
|
+
// the given caller context. A copy, so concurrent tool calls on a shared
|
|
64
|
+
// stdio client never see each other's tool name.
|
|
65
|
+
withContext(context) {
|
|
66
|
+
const copy = Object.create(IronflowAPI.prototype);
|
|
67
|
+
Object.assign(copy, this);
|
|
68
|
+
copy.context = { ...context };
|
|
69
|
+
copy.notices = [];
|
|
70
|
+
return copy;
|
|
71
|
+
}
|
|
72
|
+
// notice returns what the API said beside the data of this client's
|
|
73
|
+
// responses (a resolved market name, history cut short by the tier, a
|
|
74
|
+
// next step), as one line for the agent; "" when it said nothing.
|
|
75
|
+
notice() {
|
|
76
|
+
return formatNotices(this.notices);
|
|
77
|
+
}
|
|
78
|
+
noteHeaders(res, requestedMarket) {
|
|
79
|
+
const n = readNotice(res.headers, requestedMarket);
|
|
80
|
+
if (n && this.notices.length < MAX_NOTICES)
|
|
81
|
+
this.notices.push(n);
|
|
82
|
+
}
|
|
83
|
+
// apiError keeps the API's code, message and detail: the message names the
|
|
84
|
+
// next step (a free key, a narrower window), which the agent passes on.
|
|
32
85
|
async apiError(res) {
|
|
33
86
|
const text = await res.text();
|
|
87
|
+
const retry = Number(res.headers.get("retry-after"));
|
|
88
|
+
const retryNote = Number.isFinite(retry) && retry > 0 ? ` Retry after ${retry} s.` : "";
|
|
34
89
|
try {
|
|
35
90
|
const parsed = JSON.parse(text);
|
|
36
91
|
const code = parsed.error?.code;
|
|
37
92
|
const message = parsed.error?.message;
|
|
93
|
+
const detail = parsed.error?.detail ? ` (${parsed.error.detail})` : "";
|
|
94
|
+
this.record(res.status, code);
|
|
38
95
|
if (code) {
|
|
39
|
-
return new Error(`Ironflow API error ${res.status} ${code}: ${message ?? text}`);
|
|
96
|
+
return new Error(`Ironflow API error ${res.status} ${code}: ${message ?? text}${detail}${retryNote}`);
|
|
40
97
|
}
|
|
41
98
|
}
|
|
42
99
|
catch {
|
|
43
100
|
// Non-JSON response — fall through to raw text.
|
|
101
|
+
this.record(res.status);
|
|
44
102
|
}
|
|
45
|
-
return new Error(`Ironflow API error ${res.status}: ${text}`);
|
|
103
|
+
return new Error(`Ironflow API error ${res.status}: ${text}${retryNote}`);
|
|
46
104
|
}
|
|
47
|
-
|
|
105
|
+
// get sends a GET with the given query. Empty values are left out, except
|
|
106
|
+
// keys named in keepEmpty, where an empty value means something (issuer=
|
|
107
|
+
// asks /v1/markets for native markets only).
|
|
108
|
+
async get(path, params = {}, keepEmpty = []) {
|
|
48
109
|
// Always include source.
|
|
49
110
|
if (!params.source) {
|
|
50
111
|
params.source = this.source;
|
|
51
112
|
}
|
|
52
113
|
const url = new URL(path, this.baseUrl);
|
|
53
114
|
for (const [k, v] of Object.entries(params)) {
|
|
54
|
-
if (v)
|
|
115
|
+
if (v || (v === "" && keepEmpty.includes(k)))
|
|
55
116
|
url.searchParams.set(k, v);
|
|
56
117
|
}
|
|
57
118
|
const res = await fetch(url.toString(), { headers: this.headers() });
|
|
119
|
+
this.noteHeaders(res, params.market || params.coin);
|
|
58
120
|
if (!res.ok) {
|
|
59
121
|
throw await this.apiError(res);
|
|
60
122
|
}
|
|
123
|
+
this.record(res.status);
|
|
61
124
|
const ctype = res.headers.get("content-type") ?? "";
|
|
62
125
|
if (ctype.includes("application/json")) {
|
|
63
126
|
return res.json();
|
|
64
127
|
}
|
|
65
128
|
return res.text();
|
|
66
129
|
}
|
|
130
|
+
// post sends a JSON body and returns the parsed JSON response.
|
|
131
|
+
async post(path, body) {
|
|
132
|
+
const url = new URL(path, this.baseUrl);
|
|
133
|
+
const res = await fetch(url.toString(), {
|
|
134
|
+
method: "POST",
|
|
135
|
+
headers: this.headers(),
|
|
136
|
+
body: JSON.stringify(body),
|
|
137
|
+
});
|
|
138
|
+
this.noteHeaders(res);
|
|
139
|
+
if (!res.ok) {
|
|
140
|
+
throw await this.apiError(res);
|
|
141
|
+
}
|
|
142
|
+
this.record(res.status);
|
|
143
|
+
return res.json();
|
|
144
|
+
}
|
|
67
145
|
// ─── Convenience methods ──────────────────────────────────────────────
|
|
68
146
|
async getPrice(market) {
|
|
69
147
|
const resp = (await this.get("/v1/mark-prices", { market, limit: "1" }));
|
|
@@ -119,58 +197,43 @@ export class IronflowAPI {
|
|
|
119
197
|
async getUserState(address) {
|
|
120
198
|
return this.get("/v1/analytics/user-state", { address });
|
|
121
199
|
}
|
|
122
|
-
async getUserFunding(address, market = "", from =
|
|
200
|
+
async getUserFunding(address, market = "", from = "", to = "", bucket = "1d") {
|
|
123
201
|
const params = { address, bucket };
|
|
124
202
|
if (market)
|
|
125
203
|
params.market = market;
|
|
126
|
-
|
|
127
|
-
params.from = String(from);
|
|
128
|
-
if (to > 0)
|
|
129
|
-
params.to = String(to);
|
|
204
|
+
setWindow(params, from, to);
|
|
130
205
|
return this.get("/v1/analytics/user-funding", params);
|
|
131
206
|
}
|
|
132
|
-
async getUserMakerTaker(address, market = "", from =
|
|
207
|
+
async getUserMakerTaker(address, market = "", from = "", to = "") {
|
|
133
208
|
const params = { address };
|
|
134
209
|
if (market)
|
|
135
210
|
params.market = market;
|
|
136
|
-
|
|
137
|
-
params.from = String(from);
|
|
138
|
-
if (to > 0)
|
|
139
|
-
params.to = String(to);
|
|
211
|
+
setWindow(params, from, to);
|
|
140
212
|
return this.get("/v1/analytics/user-maker-taker", params);
|
|
141
213
|
}
|
|
142
|
-
async getUserLedger(address, from =
|
|
214
|
+
async getUserLedger(address, from = "", to = "", eventTypes = "", limit = 1000) {
|
|
143
215
|
const params = { address, limit: String(limit) };
|
|
144
|
-
|
|
145
|
-
params.from = String(from);
|
|
146
|
-
if (to > 0)
|
|
147
|
-
params.to = String(to);
|
|
216
|
+
setWindow(params, from, to);
|
|
148
217
|
if (eventTypes)
|
|
149
218
|
params.event_types = eventTypes;
|
|
150
219
|
return this.get("/v1/analytics/user-ledger", params);
|
|
151
220
|
}
|
|
152
221
|
// ─── Cross-wallet ranking (v0.34+) ───────────────────────────────────
|
|
153
|
-
async getPnLLeaderboard(from =
|
|
222
|
+
async getPnLLeaderboard(from = "", to = "", limit = 50, sortBy = "realized_pnl") {
|
|
154
223
|
const params = {
|
|
155
224
|
limit: String(limit),
|
|
156
225
|
sort_by: sortBy,
|
|
157
226
|
};
|
|
158
|
-
|
|
159
|
-
params.from = String(from);
|
|
160
|
-
if (to > 0)
|
|
161
|
-
params.to = String(to);
|
|
227
|
+
setWindow(params, from, to);
|
|
162
228
|
return this.get("/v1/analytics/leaderboard-pnl", params);
|
|
163
229
|
}
|
|
164
|
-
async getMarketTopWallets(market, from =
|
|
230
|
+
async getMarketTopWallets(market, from = "", to = "", limit = 25, sortBy = "volume") {
|
|
165
231
|
const params = {
|
|
166
232
|
market,
|
|
167
233
|
limit: String(limit),
|
|
168
234
|
sort_by: sortBy,
|
|
169
235
|
};
|
|
170
|
-
|
|
171
|
-
params.from = String(from);
|
|
172
|
-
if (to > 0)
|
|
173
|
-
params.to = String(to);
|
|
236
|
+
setWindow(params, from, to);
|
|
174
237
|
return this.get("/v1/analytics/market-top-wallets", params);
|
|
175
238
|
}
|
|
176
239
|
async getMarketsSnapshot(marketClass = "", issuer = "") {
|
|
@@ -185,20 +248,14 @@ export class IronflowAPI {
|
|
|
185
248
|
params.issuer = issuer;
|
|
186
249
|
return this.get("/v1/markets/snapshot", params);
|
|
187
250
|
}
|
|
188
|
-
async getUserSummary(address, from =
|
|
251
|
+
async getUserSummary(address, from = "", to = "") {
|
|
189
252
|
const params = { address };
|
|
190
|
-
|
|
191
|
-
params.from = String(from);
|
|
192
|
-
if (to > 0)
|
|
193
|
-
params.to = String(to);
|
|
253
|
+
setWindow(params, from, to);
|
|
194
254
|
return this.get("/v1/analytics/user-summary", params);
|
|
195
255
|
}
|
|
196
|
-
async getUserPnLSeries(address, from =
|
|
256
|
+
async getUserPnLSeries(address, from = "", to = "", bucketMs = 0) {
|
|
197
257
|
const params = { address };
|
|
198
|
-
|
|
199
|
-
params.from = String(from);
|
|
200
|
-
if (to > 0)
|
|
201
|
-
params.to = String(to);
|
|
258
|
+
setWindow(params, from, to);
|
|
202
259
|
if (bucketMs > 0)
|
|
203
260
|
params.bucket_ms = String(bucketMs);
|
|
204
261
|
return this.get("/v1/analytics/user-pnl-series", params);
|
|
@@ -229,16 +286,31 @@ export class IronflowAPI {
|
|
|
229
286
|
params.period = period;
|
|
230
287
|
return this.get("/v1/status/history", params);
|
|
231
288
|
}
|
|
232
|
-
async listMarkets(
|
|
289
|
+
async listMarkets(query = {}) {
|
|
233
290
|
const params = {};
|
|
234
|
-
if (source)
|
|
235
|
-
params.source = source;
|
|
236
|
-
if (
|
|
237
|
-
params.market_class =
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
291
|
+
if (query.source)
|
|
292
|
+
params.source = query.source;
|
|
293
|
+
if (query.marketClass)
|
|
294
|
+
params.market_class = query.marketClass;
|
|
295
|
+
if (query.issuer !== undefined)
|
|
296
|
+
params.issuer = query.issuer;
|
|
297
|
+
if (query.q)
|
|
298
|
+
params.q = query.q;
|
|
299
|
+
if (query.includeInactive)
|
|
300
|
+
params.include_inactive = "true";
|
|
301
|
+
if (query.limit)
|
|
302
|
+
params.limit = String(query.limit);
|
|
303
|
+
if (query.cursor)
|
|
304
|
+
params.cursor = query.cursor;
|
|
305
|
+
return this.get("/v1/markets", params, ["issuer"]);
|
|
242
306
|
}
|
|
243
307
|
}
|
|
308
|
+
// setWindow adds from and to when set. Both pass through as the caller gave
|
|
309
|
+
// them: the API reads Unix ms, Unix seconds and ISO 8601.
|
|
310
|
+
function setWindow(params, from, to) {
|
|
311
|
+
if (from)
|
|
312
|
+
params.from = from;
|
|
313
|
+
if (to)
|
|
314
|
+
params.to = to;
|
|
315
|
+
}
|
|
244
316
|
//# sourceMappingURL=api.js.map
|
package/build/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/build/http.js
CHANGED
|
@@ -15,11 +15,16 @@
|
|
|
15
15
|
// FORWARD_CLIENT_IP "true" only behind a proxy that sets X-Forwarded-For
|
|
16
16
|
// to the real client IP; the IP is passed to the API so
|
|
17
17
|
// keyless limits apply per caller
|
|
18
|
+
// MCP_LOG_SALT keys the caller-IP hash in the access log; use the
|
|
19
|
+
// API's REQUEST_LOG_SALT so a caller hashes the same in
|
|
20
|
+
// both logs (random per process when unset)
|
|
21
|
+
import { randomBytes } from "node:crypto";
|
|
18
22
|
import { createServer as createHttpServer } from "node:http";
|
|
19
23
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
20
24
|
import { IronflowAPI } from "./api.js";
|
|
21
25
|
import { clientIP, HttpError, readKey } from "./request.js";
|
|
22
26
|
import { createServer, packageVersion } from "./server.js";
|
|
27
|
+
import { callerHash, clientFromInitialize, sanitizeClientApp, summarizeArgs, toolLogFields } from "./usage.js";
|
|
23
28
|
const DEFAULT_PORT = 8080;
|
|
24
29
|
const MAX_BODY_BYTES = 1024 * 1024;
|
|
25
30
|
const MCP_PATH = "/mcp";
|
|
@@ -28,6 +33,7 @@ const port = Number(process.env.PORT) || DEFAULT_PORT;
|
|
|
28
33
|
const apiUrl = process.env.IRONFLOW_API_URL || "https://api.ironflow.sh";
|
|
29
34
|
const forwardClientIP = process.env.FORWARD_CLIENT_IP === "true";
|
|
30
35
|
const version = packageVersion();
|
|
36
|
+
const logSalt = process.env.MCP_LOG_SALT || randomBytes(32).toString("hex");
|
|
31
37
|
// setCors allows browser-based MCP clients (inspectors, web agents). No
|
|
32
38
|
// cookies are involved, so a wildcard origin is safe.
|
|
33
39
|
function setCors(res) {
|
|
@@ -61,8 +67,8 @@ async function readBody(req) {
|
|
|
61
67
|
throw new HttpError(400, "Request body is not valid JSON");
|
|
62
68
|
}
|
|
63
69
|
}
|
|
64
|
-
// describeRPC names what a request did for the access log, without keys
|
|
65
|
-
// IPs
|
|
70
|
+
// describeRPC names what a request did for the access log, without keys or
|
|
71
|
+
// IPs. Tool arguments are logged separately (args).
|
|
66
72
|
function describeRPC(body) {
|
|
67
73
|
const msgs = Array.isArray(body) ? body : [body];
|
|
68
74
|
return msgs
|
|
@@ -76,8 +82,14 @@ async function handleMCP(req, res, url) {
|
|
|
76
82
|
const started = Date.now();
|
|
77
83
|
const key = readKey(req, url);
|
|
78
84
|
const body = await readBody(req);
|
|
79
|
-
const
|
|
80
|
-
const
|
|
85
|
+
const ip = clientIP(req, forwardClientIP);
|
|
86
|
+
const userAgent = sanitizeClientApp(req.headers["user-agent"]);
|
|
87
|
+
const api = new IronflowAPI(apiUrl, key, undefined, `${version}-hosted`, ip);
|
|
88
|
+
const outcomes = [];
|
|
89
|
+
const server = createServer(api, version, {
|
|
90
|
+
fallbackClient: userAgent,
|
|
91
|
+
onToolResult: (outcome) => outcomes.push(outcome),
|
|
92
|
+
});
|
|
81
93
|
const transport = new StreamableHTTPServerTransport({
|
|
82
94
|
sessionIdGenerator: undefined,
|
|
83
95
|
enableJsonResponse: true,
|
|
@@ -85,7 +97,18 @@ async function handleMCP(req, res, url) {
|
|
|
85
97
|
res.on("close", () => {
|
|
86
98
|
void transport.close();
|
|
87
99
|
void server.close();
|
|
88
|
-
console.log(JSON.stringify({
|
|
100
|
+
console.log(JSON.stringify({
|
|
101
|
+
msg: "mcp",
|
|
102
|
+
rpc: describeRPC(body),
|
|
103
|
+
keyed: Boolean(key),
|
|
104
|
+
status: res.statusCode,
|
|
105
|
+
ms: Date.now() - started,
|
|
106
|
+
client: clientFromInitialize(body) || undefined,
|
|
107
|
+
ua: userAgent || undefined,
|
|
108
|
+
caller: callerHash(ip, logSalt) || undefined,
|
|
109
|
+
args: summarizeArgs(body) || undefined,
|
|
110
|
+
...toolLogFields(outcomes, api.upstreamCalls()),
|
|
111
|
+
}));
|
|
89
112
|
});
|
|
90
113
|
await server.connect(transport);
|
|
91
114
|
await transport.handleRequest(req, res, body);
|
package/build/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":";AAEA,oEAAoE;AACpE,2EAA2E;AAC3E,wDAAwD;AACxD,EAAE;AACF,uCAAuC;AACvC,yEAAyE;AACzE,EAAE;AACF,uEAAuE;AACvE,8DAA8D;AAC9D,EAAE;AACF,eAAe;AACf,kDAAkD;AAClD,uEAAuE;AACvE,4EAA4E;AAC5E,6EAA6E;AAC7E,uDAAuD;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|