@ironflowsh/mcp 0.1.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 +74 -0
- package/build/api.d.ts +33 -0
- package/build/api.d.ts.map +1 -0
- package/build/api.js +155 -0
- package/build/api.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +69 -0
- package/build/index.js.map +1 -0
- package/build/tools.d.ts +17 -0
- package/build/tools.d.ts.map +1 -0
- package/build/tools.js +457 -0
- package/build/tools.js.map +1 -0
- package/package.json +50 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ironflow
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# @ironflowsh/mcp
|
|
2
|
+
|
|
3
|
+
Model Context Protocol (MCP) server for [Ironflow](https://ironflow.sh) — real-time and historical market data for on-chain derivatives, designed for AI agents.
|
|
4
|
+
|
|
5
|
+
Exposes 24 tools for market data, analytics, triggers, cohorts, and bulk export. Works with Claude Desktop, Cursor, any MCP-compatible client.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Run directly (no install)
|
|
11
|
+
npx @ironflowsh/mcp
|
|
12
|
+
|
|
13
|
+
# Or install globally
|
|
14
|
+
npm install -g @ironflowsh/mcp
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Requires Node.js 18+.
|
|
18
|
+
|
|
19
|
+
## Use with Claude Desktop
|
|
20
|
+
|
|
21
|
+
Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%/Claude/claude_desktop_config.json` (Windows):
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"mcpServers": {
|
|
26
|
+
"ironflow": {
|
|
27
|
+
"command": "npx",
|
|
28
|
+
"args": ["-y", "@ironflowsh/mcp"],
|
|
29
|
+
"env": {
|
|
30
|
+
"IRONFLOW_API_KEY": "if_your_api_key"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Restart Claude Desktop.
|
|
38
|
+
|
|
39
|
+
## Authentication
|
|
40
|
+
|
|
41
|
+
Without an API key: 10 req/min, 24h history, REST only. Sign up at [ironflow.sh](https://ironflow.sh/dashboard/login) for higher limits.
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
IRONFLOW_API_KEY=if_xxx npx @ironflowsh/mcp
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Tools
|
|
48
|
+
|
|
49
|
+
**Market data** — `get_price`, `get_orderbook`, `get_recent_trades`, `get_candles`, `get_funding_rates`, `get_open_interest`, `get_liquidations`, `get_fills`, `get_mark_prices`, `get_deposits`, `get_withdrawals`, `get_order_statuses`, `get_vault_operations`
|
|
50
|
+
|
|
51
|
+
**Analytics** (Builder+) — `get_net_flows`, `get_liquidation_levels`, `get_order_flow`, `get_vault_leaderboard`, `get_funding_stats`
|
|
52
|
+
|
|
53
|
+
**Export** (Builder+) — `export_data`
|
|
54
|
+
|
|
55
|
+
**Triggers** — `list_triggers`, `create_trigger`, `test_trigger`
|
|
56
|
+
|
|
57
|
+
**Cohorts** — `list_cohorts`, `get_cohort_addresses`
|
|
58
|
+
|
|
59
|
+
## Configuration
|
|
60
|
+
|
|
61
|
+
| Env var | Default |
|
|
62
|
+
|---|---|
|
|
63
|
+
| `IRONFLOW_API_KEY` | — |
|
|
64
|
+
| `IRONFLOW_API_URL` | `https://api.ironflow.sh` |
|
|
65
|
+
|
|
66
|
+
## Links
|
|
67
|
+
|
|
68
|
+
- Dashboard: [ironflow.sh/dashboard](https://ironflow.sh/dashboard)
|
|
69
|
+
- Docs: [docs.ironflow.sh](https://docs.ironflow.sh)
|
|
70
|
+
- API reference: [docs.ironflow.sh/api-reference](https://docs.ironflow.sh/api-reference)
|
|
71
|
+
|
|
72
|
+
## License
|
|
73
|
+
|
|
74
|
+
MIT
|
package/build/api.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare class IronflowAPI {
|
|
2
|
+
private baseUrl;
|
|
3
|
+
private apiKey?;
|
|
4
|
+
private source;
|
|
5
|
+
constructor(baseUrl?: string, apiKey?: string, source?: string);
|
|
6
|
+
private headers;
|
|
7
|
+
get(path: string, params?: Record<string, string>): Promise<unknown>;
|
|
8
|
+
post(path: string, body: unknown): Promise<unknown>;
|
|
9
|
+
getPrice(market: string): Promise<string>;
|
|
10
|
+
getOrderbook(market: string): Promise<unknown>;
|
|
11
|
+
getRecentTrades(market: string, limit?: string): Promise<unknown>;
|
|
12
|
+
getCandles(market: string, interval?: string, limit?: string): Promise<unknown>;
|
|
13
|
+
getFundingRates(market: string, limit?: string): Promise<unknown>;
|
|
14
|
+
getOpenInterest(market: string): Promise<unknown>;
|
|
15
|
+
getLiquidations(market: string, limit?: string): Promise<unknown>;
|
|
16
|
+
getFills(address: string, market?: string, limit?: string): Promise<unknown>;
|
|
17
|
+
getMarkPrices(market: string): Promise<unknown>;
|
|
18
|
+
getDeposits(address?: string, limit?: string): Promise<unknown>;
|
|
19
|
+
getWithdrawals(address?: string, limit?: string): Promise<unknown>;
|
|
20
|
+
getOrderStatuses(address: string, market?: string, limit?: string): Promise<unknown>;
|
|
21
|
+
getVaultOperations(vault?: string, address?: string, limit?: string): Promise<unknown>;
|
|
22
|
+
getNetFlows(interval?: string, limit?: string): Promise<unknown>;
|
|
23
|
+
getLiquidationLevels(market: string, bucket_size?: string): Promise<unknown>;
|
|
24
|
+
getOrderFlow(market?: string): Promise<unknown>;
|
|
25
|
+
getVaultLeaderboard(limit?: string): Promise<unknown>;
|
|
26
|
+
getFundingStats(market: string, interval?: string, limit?: string): Promise<unknown>;
|
|
27
|
+
listTriggers(): Promise<unknown>;
|
|
28
|
+
createTrigger(body: unknown): Promise<unknown>;
|
|
29
|
+
testTrigger(body: unknown): Promise<unknown>;
|
|
30
|
+
listCohorts(): Promise<unknown>;
|
|
31
|
+
getCohortAddresses(name: string): Promise<unknown>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAKA,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAGrB,OAAO,SAAmB,EAC1B,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,SAAiB;IAOzB,OAAO,CAAC,OAAO;IAWT,GAAG,CACP,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAClC,OAAO,CAAC,OAAO,CAAC;IAqBb,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBnD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAazC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI9C,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAa,GACnB,OAAO,CAAC,OAAO,CAAC;IAIb,UAAU,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAAa,EACvB,KAAK,GAAE,MAAa,GACnB,OAAO,CAAC,OAAO,CAAC;IAIb,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAa,GACnB,OAAO,CAAC,OAAO,CAAC;IAIb,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIjD,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAa,GACnB,OAAO,CAAC,OAAO,CAAC;IAIb,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,EAAE,KAAK,GAAE,MAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtF,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/C,WAAW,CAAC,OAAO,GAAE,MAAW,EAAE,KAAK,GAAE,MAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAMzE,cAAc,CAAC,OAAO,GAAE,MAAW,EAAE,KAAK,GAAE,MAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAM5E,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,EAAE,KAAK,GAAE,MAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAM9F,kBAAkB,CAAC,KAAK,GAAE,MAAW,EAAE,OAAO,GAAE,MAAW,EAAE,KAAK,GAAE,MAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IASpG,WAAW,CAAC,QAAQ,GAAE,MAAa,EAAE,KAAK,GAAE,MAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAI3E,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,GAAE,MAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAInF,YAAY,CAAC,MAAM,GAAE,MAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAMnD,mBAAmB,CAAC,KAAK,GAAE,MAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAI3D,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAa,EAAE,KAAK,GAAE,MAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAM/F,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAI9C,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAM5C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAGzD"}
|
package/build/api.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// Ironflow REST API client. Uses native fetch — no external HTTP dependencies.
|
|
2
|
+
const DEFAULT_BASE_URL = "https://api.ironflow.sh";
|
|
3
|
+
const DEFAULT_SOURCE = "hyperliquid";
|
|
4
|
+
export class IronflowAPI {
|
|
5
|
+
baseUrl;
|
|
6
|
+
apiKey;
|
|
7
|
+
source;
|
|
8
|
+
constructor(baseUrl = DEFAULT_BASE_URL, apiKey, source = DEFAULT_SOURCE) {
|
|
9
|
+
this.baseUrl = baseUrl.replace(/\/$/, "");
|
|
10
|
+
this.apiKey = apiKey;
|
|
11
|
+
this.source = source;
|
|
12
|
+
}
|
|
13
|
+
headers() {
|
|
14
|
+
const h = {
|
|
15
|
+
"Content-Type": "application/json",
|
|
16
|
+
"User-Agent": "ironflow-mcp/0.1.0",
|
|
17
|
+
};
|
|
18
|
+
if (this.apiKey) {
|
|
19
|
+
h["Authorization"] = `Bearer ${this.apiKey}`;
|
|
20
|
+
}
|
|
21
|
+
return h;
|
|
22
|
+
}
|
|
23
|
+
async get(path, params = {}) {
|
|
24
|
+
// Always include source.
|
|
25
|
+
if (!params.source) {
|
|
26
|
+
params.source = this.source;
|
|
27
|
+
}
|
|
28
|
+
const url = new URL(path, this.baseUrl);
|
|
29
|
+
for (const [k, v] of Object.entries(params)) {
|
|
30
|
+
if (v)
|
|
31
|
+
url.searchParams.set(k, v);
|
|
32
|
+
}
|
|
33
|
+
const res = await fetch(url.toString(), { headers: this.headers() });
|
|
34
|
+
if (!res.ok) {
|
|
35
|
+
const text = await res.text();
|
|
36
|
+
throw new Error(`Ironflow API error ${res.status}: ${text}`);
|
|
37
|
+
}
|
|
38
|
+
return res.json();
|
|
39
|
+
}
|
|
40
|
+
async post(path, body) {
|
|
41
|
+
const url = new URL(path, this.baseUrl);
|
|
42
|
+
const res = await fetch(url.toString(), {
|
|
43
|
+
method: "POST",
|
|
44
|
+
headers: this.headers(),
|
|
45
|
+
body: JSON.stringify(body),
|
|
46
|
+
});
|
|
47
|
+
if (!res.ok) {
|
|
48
|
+
const text = await res.text();
|
|
49
|
+
throw new Error(`Ironflow API error ${res.status}: ${text}`);
|
|
50
|
+
}
|
|
51
|
+
return res.json();
|
|
52
|
+
}
|
|
53
|
+
// ─── Convenience methods ──────────────────────────────────────────────
|
|
54
|
+
async getPrice(market) {
|
|
55
|
+
const data = (await this.post("/v1/info", {
|
|
56
|
+
type: "allMids",
|
|
57
|
+
}));
|
|
58
|
+
// allMids returns {"BTC-PERP": "67123.5", "ETH-PERP": "3456.7", ...}
|
|
59
|
+
const price = data[market];
|
|
60
|
+
if (!price) {
|
|
61
|
+
throw new Error(`Market ${market} not found`);
|
|
62
|
+
}
|
|
63
|
+
return price;
|
|
64
|
+
}
|
|
65
|
+
async getOrderbook(market) {
|
|
66
|
+
return this.get("/v1/book", { market });
|
|
67
|
+
}
|
|
68
|
+
async getRecentTrades(market, limit = "20") {
|
|
69
|
+
return this.get("/v1/trades", { market, limit });
|
|
70
|
+
}
|
|
71
|
+
async getCandles(market, interval = "1h", limit = "24") {
|
|
72
|
+
return this.get("/v1/candles", { market, interval, limit });
|
|
73
|
+
}
|
|
74
|
+
async getFundingRates(market, limit = "10") {
|
|
75
|
+
return this.get("/v1/funding", { market, limit });
|
|
76
|
+
}
|
|
77
|
+
async getOpenInterest(market) {
|
|
78
|
+
return this.get("/v1/open-interest", { market, limit: "1" });
|
|
79
|
+
}
|
|
80
|
+
async getLiquidations(market, limit = "20") {
|
|
81
|
+
return this.get("/v1/liquidations", { market, limit });
|
|
82
|
+
}
|
|
83
|
+
async getFills(address, market = "", limit = "20") {
|
|
84
|
+
const params = { address, limit };
|
|
85
|
+
if (market)
|
|
86
|
+
params.market = market;
|
|
87
|
+
return this.get("/v1/fills", params);
|
|
88
|
+
}
|
|
89
|
+
async getMarkPrices(market) {
|
|
90
|
+
return this.get("/v1/mark-prices", { market, limit: "1" });
|
|
91
|
+
}
|
|
92
|
+
async getDeposits(address = "", limit = "20") {
|
|
93
|
+
const params = { limit };
|
|
94
|
+
if (address)
|
|
95
|
+
params.address = address;
|
|
96
|
+
return this.get("/v1/deposits", params);
|
|
97
|
+
}
|
|
98
|
+
async getWithdrawals(address = "", limit = "20") {
|
|
99
|
+
const params = { limit };
|
|
100
|
+
if (address)
|
|
101
|
+
params.address = address;
|
|
102
|
+
return this.get("/v1/withdrawals", params);
|
|
103
|
+
}
|
|
104
|
+
async getOrderStatuses(address, market = "", limit = "20") {
|
|
105
|
+
const params = { address, limit };
|
|
106
|
+
if (market)
|
|
107
|
+
params.market = market;
|
|
108
|
+
return this.get("/v1/order-statuses", params);
|
|
109
|
+
}
|
|
110
|
+
async getVaultOperations(vault = "", address = "", limit = "20") {
|
|
111
|
+
const params = { limit };
|
|
112
|
+
if (vault)
|
|
113
|
+
params.vault = vault;
|
|
114
|
+
if (address)
|
|
115
|
+
params.address = address;
|
|
116
|
+
return this.get("/v1/vault-operations", params);
|
|
117
|
+
}
|
|
118
|
+
// ─── Analytics ────────────────────────────────────────────────────────
|
|
119
|
+
async getNetFlows(interval = "1d", limit = "7") {
|
|
120
|
+
return this.get("/v1/analytics/net-flows", { interval, limit });
|
|
121
|
+
}
|
|
122
|
+
async getLiquidationLevels(market, bucket_size = "100") {
|
|
123
|
+
return this.get("/v1/analytics/liquidation-levels", { market, bucket_size });
|
|
124
|
+
}
|
|
125
|
+
async getOrderFlow(market = "") {
|
|
126
|
+
const params = {};
|
|
127
|
+
if (market)
|
|
128
|
+
params.market = market;
|
|
129
|
+
return this.get("/v1/analytics/order-flow", params);
|
|
130
|
+
}
|
|
131
|
+
async getVaultLeaderboard(limit = "10") {
|
|
132
|
+
return this.get("/v1/analytics/vault-leaderboard", { limit });
|
|
133
|
+
}
|
|
134
|
+
async getFundingStats(market, interval = "1d", limit = "7") {
|
|
135
|
+
return this.get("/v1/analytics/funding-stats", { market, interval, limit });
|
|
136
|
+
}
|
|
137
|
+
// ─── Triggers ─────────────────────────────────────────────────────────
|
|
138
|
+
async listTriggers() {
|
|
139
|
+
return this.get("/v1/triggers");
|
|
140
|
+
}
|
|
141
|
+
async createTrigger(body) {
|
|
142
|
+
return this.post("/v1/triggers", body);
|
|
143
|
+
}
|
|
144
|
+
async testTrigger(body) {
|
|
145
|
+
return this.post("/v1/triggers/test", body);
|
|
146
|
+
}
|
|
147
|
+
// ─── Cohorts ──────────────────────────────────────────────────────────
|
|
148
|
+
async listCohorts() {
|
|
149
|
+
return this.get("/v1/cohorts");
|
|
150
|
+
}
|
|
151
|
+
async getCohortAddresses(name) {
|
|
152
|
+
return this.get(`/v1/cohorts/${encodeURIComponent(name)}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=api.js.map
|
package/build/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/build/index.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Ironflow MCP Server — market data for AI agents.
|
|
3
|
+
//
|
|
4
|
+
// Usage:
|
|
5
|
+
// npx @ironflowsh/mcp # keyless, 30 req/min
|
|
6
|
+
// IRONFLOW_API_KEY=if_xxx npx @ironflowsh/mcp # with API key
|
|
7
|
+
//
|
|
8
|
+
// Claude Desktop config (~/.claude/claude_desktop_config.json):
|
|
9
|
+
// {
|
|
10
|
+
// "mcpServers": {
|
|
11
|
+
// "ironflow": {
|
|
12
|
+
// "command": "npx",
|
|
13
|
+
// "args": ["-y", "@ironflowsh/mcp"]
|
|
14
|
+
// }
|
|
15
|
+
// }
|
|
16
|
+
// }
|
|
17
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
18
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
19
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
20
|
+
import { IronflowAPI } from "./api.js";
|
|
21
|
+
import { tools } from "./tools.js";
|
|
22
|
+
const apiUrl = process.env.IRONFLOW_API_URL || "https://api.ironflow.sh";
|
|
23
|
+
const apiKey = process.env.IRONFLOW_API_KEY;
|
|
24
|
+
const api = new IronflowAPI(apiUrl, apiKey);
|
|
25
|
+
const server = new Server({
|
|
26
|
+
name: "ironflow",
|
|
27
|
+
version: "0.1.0",
|
|
28
|
+
}, {
|
|
29
|
+
capabilities: {
|
|
30
|
+
tools: {},
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
// List all available tools.
|
|
34
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
35
|
+
return {
|
|
36
|
+
tools: tools.map((t) => ({
|
|
37
|
+
name: t.name,
|
|
38
|
+
description: t.description,
|
|
39
|
+
inputSchema: t.inputSchema,
|
|
40
|
+
})),
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
// Handle tool calls.
|
|
44
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
45
|
+
const { name, arguments: args } = request.params;
|
|
46
|
+
const tool = tools.find((t) => t.name === name);
|
|
47
|
+
if (!tool) {
|
|
48
|
+
return {
|
|
49
|
+
content: [{ type: "text", text: `Unknown tool: ${name}` }],
|
|
50
|
+
isError: true,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const result = await tool.handler(args ?? {}, api);
|
|
55
|
+
return {
|
|
56
|
+
content: [{ type: "text", text: result }],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
61
|
+
return {
|
|
62
|
+
content: [{ type: "text", text: `Error: ${message}` }],
|
|
63
|
+
isError: true,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
const transport = new StdioServerTransport();
|
|
68
|
+
await server.connect(transport);
|
|
69
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,mDAAmD;AACnD,EAAE;AACF,SAAS;AACT,2EAA2E;AAC3E,qEAAqE;AACrE,EAAE;AACF,gEAAgE;AAChE,MAAM;AACN,sBAAsB;AACtB,sBAAsB;AACtB,4BAA4B;AAC5B,4CAA4C;AAC5C,UAAU;AACV,QAAQ;AACR,MAAM;AAEN,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,yBAAyB,CAAC;AACzE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAE5C,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE5C,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,4BAA4B;AAC5B,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,qBAAqB;AACrB,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAEjD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;YAC1D,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;QACnD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SAC1C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;YACtD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|
package/build/tools.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { IronflowAPI } from "./api.js";
|
|
2
|
+
export interface ToolDef {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object";
|
|
7
|
+
properties: Record<string, {
|
|
8
|
+
type: string;
|
|
9
|
+
description: string;
|
|
10
|
+
enum?: string[];
|
|
11
|
+
}>;
|
|
12
|
+
required: string[];
|
|
13
|
+
};
|
|
14
|
+
handler: (args: Record<string, unknown>, api: IronflowAPI) => Promise<string>;
|
|
15
|
+
}
|
|
16
|
+
export declare const tools: ToolDef[];
|
|
17
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAC;QACnF,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/E;AAiCD,eAAO,MAAM,KAAK,EAAE,OAAO,EAmb1B,CAAC"}
|
package/build/tools.js
ADDED
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
// MCP tool definitions for Ironflow market data.
|
|
2
|
+
// ─── Arg validation helpers ──────────────────────────────────────────────────
|
|
3
|
+
function requireString(args, key) {
|
|
4
|
+
const val = args[key];
|
|
5
|
+
if (typeof val !== "string" || val.trim() === "") {
|
|
6
|
+
throw new Error(`"${key}" is required and must be a non-empty string`);
|
|
7
|
+
}
|
|
8
|
+
return val;
|
|
9
|
+
}
|
|
10
|
+
function optionalNumber(args, key, defaultVal) {
|
|
11
|
+
const val = args[key];
|
|
12
|
+
if (val === undefined || val === null)
|
|
13
|
+
return defaultVal;
|
|
14
|
+
const n = Number(val);
|
|
15
|
+
if (!Number.isFinite(n) || n <= 0) {
|
|
16
|
+
throw new Error(`"${key}" must be a positive number`);
|
|
17
|
+
}
|
|
18
|
+
return Math.floor(n);
|
|
19
|
+
}
|
|
20
|
+
function optionalString(args, key, defaultVal) {
|
|
21
|
+
const val = args[key];
|
|
22
|
+
if (val === undefined || val === null)
|
|
23
|
+
return defaultVal;
|
|
24
|
+
if (typeof val !== "string") {
|
|
25
|
+
throw new Error(`"${key}" must be a string`);
|
|
26
|
+
}
|
|
27
|
+
return val;
|
|
28
|
+
}
|
|
29
|
+
// ─── Tools ──────────────────────────────────────────────────────────────────
|
|
30
|
+
export const tools = [
|
|
31
|
+
{
|
|
32
|
+
name: "get_price",
|
|
33
|
+
description: "Get the latest mid-market price for a perpetual futures market on Hyperliquid",
|
|
34
|
+
inputSchema: {
|
|
35
|
+
type: "object",
|
|
36
|
+
properties: {
|
|
37
|
+
market: { type: "string", description: 'Market symbol (e.g. "BTC-PERP", "ETH-PERP")' },
|
|
38
|
+
},
|
|
39
|
+
required: ["market"],
|
|
40
|
+
},
|
|
41
|
+
handler: async (args, api) => {
|
|
42
|
+
const market = requireString(args, "market");
|
|
43
|
+
const price = await api.getPrice(market);
|
|
44
|
+
return `${market}: $${price}`;
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: "get_orderbook",
|
|
49
|
+
description: "Get the current L2 order book snapshot for a market, showing bid and ask price levels",
|
|
50
|
+
inputSchema: {
|
|
51
|
+
type: "object",
|
|
52
|
+
properties: {
|
|
53
|
+
market: { type: "string", description: 'Market symbol (e.g. "BTC-PERP", "ETH-PERP")' },
|
|
54
|
+
},
|
|
55
|
+
required: ["market"],
|
|
56
|
+
},
|
|
57
|
+
handler: async (args, api) => {
|
|
58
|
+
const market = requireString(args, "market");
|
|
59
|
+
const data = await api.getOrderbook(market);
|
|
60
|
+
return JSON.stringify(data, null, 2);
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: "get_recent_trades",
|
|
65
|
+
description: "Get recent tick-level trades for a market including price, size, side, and timestamp",
|
|
66
|
+
inputSchema: {
|
|
67
|
+
type: "object",
|
|
68
|
+
properties: {
|
|
69
|
+
market: { type: "string", description: 'Market symbol (e.g. "BTC-PERP", "ETH-PERP")' },
|
|
70
|
+
limit: { type: "number", description: "Number of trades to return (1-100, default 20)" },
|
|
71
|
+
},
|
|
72
|
+
required: ["market"],
|
|
73
|
+
},
|
|
74
|
+
handler: async (args, api) => {
|
|
75
|
+
const market = requireString(args, "market");
|
|
76
|
+
const limit = optionalNumber(args, "limit", 20);
|
|
77
|
+
const data = await api.getRecentTrades(market, String(limit));
|
|
78
|
+
return JSON.stringify(data, null, 2);
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: "get_candles",
|
|
83
|
+
description: "Get OHLCV candlestick data for a market. Useful for price analysis and charting",
|
|
84
|
+
inputSchema: {
|
|
85
|
+
type: "object",
|
|
86
|
+
properties: {
|
|
87
|
+
market: { type: "string", description: 'Market symbol (e.g. "BTC-PERP", "ETH-PERP")' },
|
|
88
|
+
interval: { type: "string", description: "Candle interval (1m, 5m, 15m, 1h, 4h, 1d). Default: 1h", enum: ["1m", "5m", "15m", "1h", "4h", "1d"] },
|
|
89
|
+
limit: { type: "number", description: "Number of candles to return (1-500, default 24)" },
|
|
90
|
+
},
|
|
91
|
+
required: ["market"],
|
|
92
|
+
},
|
|
93
|
+
handler: async (args, api) => {
|
|
94
|
+
const market = requireString(args, "market");
|
|
95
|
+
const interval = optionalString(args, "interval", "1h");
|
|
96
|
+
const limit = optionalNumber(args, "limit", 24);
|
|
97
|
+
const data = await api.getCandles(market, interval, String(limit));
|
|
98
|
+
return JSON.stringify(data, null, 2);
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: "get_funding_rates",
|
|
103
|
+
description: "Get funding rate history for a perpetual futures market. Rates are paid hourly on Hyperliquid",
|
|
104
|
+
inputSchema: {
|
|
105
|
+
type: "object",
|
|
106
|
+
properties: {
|
|
107
|
+
market: { type: "string", description: 'Market symbol (e.g. "BTC-PERP", "ETH-PERP")' },
|
|
108
|
+
limit: { type: "number", description: "Number of funding rate entries (1-100, default 10)" },
|
|
109
|
+
},
|
|
110
|
+
required: ["market"],
|
|
111
|
+
},
|
|
112
|
+
handler: async (args, api) => {
|
|
113
|
+
const market = requireString(args, "market");
|
|
114
|
+
const limit = optionalNumber(args, "limit", 10);
|
|
115
|
+
const data = await api.getFundingRates(market, String(limit));
|
|
116
|
+
return JSON.stringify(data, null, 2);
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: "get_open_interest",
|
|
121
|
+
description: "Get the current open interest and 24h trading volume for a perpetual futures market",
|
|
122
|
+
inputSchema: {
|
|
123
|
+
type: "object",
|
|
124
|
+
properties: {
|
|
125
|
+
market: { type: "string", description: 'Market symbol (e.g. "BTC-PERP", "ETH-PERP")' },
|
|
126
|
+
},
|
|
127
|
+
required: ["market"],
|
|
128
|
+
},
|
|
129
|
+
handler: async (args, api) => {
|
|
130
|
+
const market = requireString(args, "market");
|
|
131
|
+
const data = await api.getOpenInterest(market);
|
|
132
|
+
return JSON.stringify(data, null, 2);
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: "get_liquidations",
|
|
137
|
+
description: "Get recent liquidation events for a market showing forced position closures with price, size, and address",
|
|
138
|
+
inputSchema: {
|
|
139
|
+
type: "object",
|
|
140
|
+
properties: {
|
|
141
|
+
market: { type: "string", description: 'Market symbol (e.g. "BTC-PERP", "ETH-PERP")' },
|
|
142
|
+
limit: { type: "number", description: "Number of liquidation events (1-100, default 20)" },
|
|
143
|
+
},
|
|
144
|
+
required: ["market"],
|
|
145
|
+
},
|
|
146
|
+
handler: async (args, api) => {
|
|
147
|
+
const market = requireString(args, "market");
|
|
148
|
+
const limit = optionalNumber(args, "limit", 20);
|
|
149
|
+
const data = await api.getLiquidations(market, String(limit));
|
|
150
|
+
return JSON.stringify(data, null, 2);
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
// ─── Additional Market Data ──────────────────────────────────────────
|
|
154
|
+
{
|
|
155
|
+
name: "get_fills",
|
|
156
|
+
description: "Get trade fills for a specific wallet address, optionally filtered by market",
|
|
157
|
+
inputSchema: {
|
|
158
|
+
type: "object",
|
|
159
|
+
properties: {
|
|
160
|
+
address: { type: "string", description: "Wallet address (e.g. 0x...)" },
|
|
161
|
+
market: { type: "string", description: "Optional market filter (e.g. BTC-PERP)" },
|
|
162
|
+
limit: { type: "number", description: "Number of fills (1-100, default 20)" },
|
|
163
|
+
},
|
|
164
|
+
required: ["address"],
|
|
165
|
+
},
|
|
166
|
+
handler: async (args, api) => {
|
|
167
|
+
const address = requireString(args, "address");
|
|
168
|
+
const market = optionalString(args, "market", "");
|
|
169
|
+
const limit = optionalNumber(args, "limit", 20);
|
|
170
|
+
const data = await api.getFills(address, market, String(limit));
|
|
171
|
+
return JSON.stringify(data, null, 2);
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: "get_mark_prices",
|
|
176
|
+
description: "Get the current mark price, oracle price, and funding rate for a market",
|
|
177
|
+
inputSchema: {
|
|
178
|
+
type: "object",
|
|
179
|
+
properties: {
|
|
180
|
+
market: { type: "string", description: 'Market symbol (e.g. "BTC-PERP")' },
|
|
181
|
+
},
|
|
182
|
+
required: ["market"],
|
|
183
|
+
},
|
|
184
|
+
handler: async (args, api) => {
|
|
185
|
+
const market = requireString(args, "market");
|
|
186
|
+
const data = await api.getMarkPrices(market);
|
|
187
|
+
return JSON.stringify(data, null, 2);
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
name: "get_deposits",
|
|
192
|
+
description: "Get recent deposit events, optionally filtered by address",
|
|
193
|
+
inputSchema: {
|
|
194
|
+
type: "object",
|
|
195
|
+
properties: {
|
|
196
|
+
address: { type: "string", description: "Optional wallet address filter" },
|
|
197
|
+
limit: { type: "number", description: "Number of deposits (1-100, default 20)" },
|
|
198
|
+
},
|
|
199
|
+
required: [],
|
|
200
|
+
},
|
|
201
|
+
handler: async (args, api) => {
|
|
202
|
+
const address = optionalString(args, "address", "");
|
|
203
|
+
const limit = optionalNumber(args, "limit", 20);
|
|
204
|
+
const data = await api.getDeposits(address, String(limit));
|
|
205
|
+
return JSON.stringify(data, null, 2);
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
name: "get_withdrawals",
|
|
210
|
+
description: "Get recent withdrawal events, optionally filtered by address",
|
|
211
|
+
inputSchema: {
|
|
212
|
+
type: "object",
|
|
213
|
+
properties: {
|
|
214
|
+
address: { type: "string", description: "Optional wallet address filter" },
|
|
215
|
+
limit: { type: "number", description: "Number of withdrawals (1-100, default 20)" },
|
|
216
|
+
},
|
|
217
|
+
required: [],
|
|
218
|
+
},
|
|
219
|
+
handler: async (args, api) => {
|
|
220
|
+
const address = optionalString(args, "address", "");
|
|
221
|
+
const limit = optionalNumber(args, "limit", 20);
|
|
222
|
+
const data = await api.getWithdrawals(address, String(limit));
|
|
223
|
+
return JSON.stringify(data, null, 2);
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
name: "get_order_statuses",
|
|
228
|
+
description: "Get order status history for a wallet address (placed, filled, cancelled, triggered)",
|
|
229
|
+
inputSchema: {
|
|
230
|
+
type: "object",
|
|
231
|
+
properties: {
|
|
232
|
+
address: { type: "string", description: "Wallet address (e.g. 0x...)" },
|
|
233
|
+
market: { type: "string", description: "Optional market filter" },
|
|
234
|
+
limit: { type: "number", description: "Number of statuses (1-100, default 20)" },
|
|
235
|
+
},
|
|
236
|
+
required: ["address"],
|
|
237
|
+
},
|
|
238
|
+
handler: async (args, api) => {
|
|
239
|
+
const address = requireString(args, "address");
|
|
240
|
+
const market = optionalString(args, "market", "");
|
|
241
|
+
const limit = optionalNumber(args, "limit", 20);
|
|
242
|
+
const data = await api.getOrderStatuses(address, market, String(limit));
|
|
243
|
+
return JSON.stringify(data, null, 2);
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
name: "get_vault_operations",
|
|
248
|
+
description: "Get vault deposit and withdrawal events, filterable by vault address or user address",
|
|
249
|
+
inputSchema: {
|
|
250
|
+
type: "object",
|
|
251
|
+
properties: {
|
|
252
|
+
vault: { type: "string", description: "Vault address" },
|
|
253
|
+
address: { type: "string", description: "User address" },
|
|
254
|
+
limit: { type: "number", description: "Number of events (1-100, default 20)" },
|
|
255
|
+
},
|
|
256
|
+
required: [],
|
|
257
|
+
},
|
|
258
|
+
handler: async (args, api) => {
|
|
259
|
+
const vault = optionalString(args, "vault", "");
|
|
260
|
+
const address = optionalString(args, "address", "");
|
|
261
|
+
const limit = optionalNumber(args, "limit", 20);
|
|
262
|
+
const data = await api.getVaultOperations(vault, address, String(limit));
|
|
263
|
+
return JSON.stringify(data, null, 2);
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
// ─── Analytics (Builder+ tier) ───────────────────────────────────────
|
|
267
|
+
{
|
|
268
|
+
name: "get_net_flows",
|
|
269
|
+
description: "Get net deposit/withdrawal flows over time — shows capital inflows and outflows (Builder+ tier)",
|
|
270
|
+
inputSchema: {
|
|
271
|
+
type: "object",
|
|
272
|
+
properties: {
|
|
273
|
+
interval: { type: "string", description: "Time interval (1h, 4h, 8h, 1d, 7d). Default: 1d", enum: ["1h", "4h", "8h", "1d", "7d"] },
|
|
274
|
+
limit: { type: "number", description: "Number of data points (default 7)" },
|
|
275
|
+
},
|
|
276
|
+
required: [],
|
|
277
|
+
},
|
|
278
|
+
handler: async (args, api) => {
|
|
279
|
+
const interval = optionalString(args, "interval", "1d");
|
|
280
|
+
const limit = optionalNumber(args, "limit", 7);
|
|
281
|
+
const data = await api.getNetFlows(interval, String(limit));
|
|
282
|
+
return JSON.stringify(data, null, 2);
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
name: "get_liquidation_levels",
|
|
287
|
+
description: "Get liquidations bucketed by price level — useful for heatmap visualization (Builder+ tier)",
|
|
288
|
+
inputSchema: {
|
|
289
|
+
type: "object",
|
|
290
|
+
properties: {
|
|
291
|
+
market: { type: "string", description: 'Market symbol (e.g. "BTC-PERP")' },
|
|
292
|
+
bucket_size: { type: "string", description: "Price bucket size (1, 5, 10, 50, 100, 500, 1000, 5000). Default: 100" },
|
|
293
|
+
},
|
|
294
|
+
required: ["market"],
|
|
295
|
+
},
|
|
296
|
+
handler: async (args, api) => {
|
|
297
|
+
const market = requireString(args, "market");
|
|
298
|
+
const bucket = optionalString(args, "bucket_size", "100");
|
|
299
|
+
const data = await api.getLiquidationLevels(market, bucket);
|
|
300
|
+
return JSON.stringify(data, null, 2);
|
|
301
|
+
},
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
name: "get_order_flow",
|
|
305
|
+
description: "Get fill and cancel rates per market — shows execution quality (Builder+ tier)",
|
|
306
|
+
inputSchema: {
|
|
307
|
+
type: "object",
|
|
308
|
+
properties: {
|
|
309
|
+
market: { type: "string", description: "Optional market filter" },
|
|
310
|
+
},
|
|
311
|
+
required: [],
|
|
312
|
+
},
|
|
313
|
+
handler: async (args, api) => {
|
|
314
|
+
const market = optionalString(args, "market", "");
|
|
315
|
+
const data = await api.getOrderFlow(market);
|
|
316
|
+
return JSON.stringify(data, null, 2);
|
|
317
|
+
},
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
name: "get_vault_leaderboard",
|
|
321
|
+
description: "Get vaults ranked by net deposits — shows which vaults are attracting capital (Builder+ tier)",
|
|
322
|
+
inputSchema: {
|
|
323
|
+
type: "object",
|
|
324
|
+
properties: {
|
|
325
|
+
limit: { type: "number", description: "Number of vaults (default 10)" },
|
|
326
|
+
},
|
|
327
|
+
required: [],
|
|
328
|
+
},
|
|
329
|
+
handler: async (args, api) => {
|
|
330
|
+
const limit = optionalNumber(args, "limit", 10);
|
|
331
|
+
const data = await api.getVaultLeaderboard(String(limit));
|
|
332
|
+
return JSON.stringify(data, null, 2);
|
|
333
|
+
},
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
name: "get_funding_stats",
|
|
337
|
+
description: "Get funding rate statistics over time including annualized rates (Builder+ tier)",
|
|
338
|
+
inputSchema: {
|
|
339
|
+
type: "object",
|
|
340
|
+
properties: {
|
|
341
|
+
market: { type: "string", description: 'Market symbol (e.g. "BTC-PERP")' },
|
|
342
|
+
interval: { type: "string", description: "Time interval (1h, 4h, 8h, 1d, 7d). Default: 1d", enum: ["1h", "4h", "8h", "1d", "7d"] },
|
|
343
|
+
limit: { type: "number", description: "Number of data points (default 7)" },
|
|
344
|
+
},
|
|
345
|
+
required: ["market"],
|
|
346
|
+
},
|
|
347
|
+
handler: async (args, api) => {
|
|
348
|
+
const market = requireString(args, "market");
|
|
349
|
+
const interval = optionalString(args, "interval", "1d");
|
|
350
|
+
const limit = optionalNumber(args, "limit", 7);
|
|
351
|
+
const data = await api.getFundingStats(market, interval, String(limit));
|
|
352
|
+
return JSON.stringify(data, null, 2);
|
|
353
|
+
},
|
|
354
|
+
},
|
|
355
|
+
// ─── Export ───────────────────────────────────────────────────────────
|
|
356
|
+
{
|
|
357
|
+
name: "export_data",
|
|
358
|
+
description: "Export historical data as CSV (Builder+ tier). Returns the download URL or raw data for a given event type and time range",
|
|
359
|
+
inputSchema: {
|
|
360
|
+
type: "object",
|
|
361
|
+
properties: {
|
|
362
|
+
event_type: { type: "string", description: "Data type to export (trades, fills, liquidations, funding_rates, book_snapshots, order_statuses, deposits, withdrawals)" },
|
|
363
|
+
market: { type: "string", description: "Optional market filter (e.g. BTC-PERP)" },
|
|
364
|
+
format: { type: "string", description: "Output format: csv or parquet. Default: csv", enum: ["csv", "parquet"] },
|
|
365
|
+
},
|
|
366
|
+
required: ["event_type"],
|
|
367
|
+
},
|
|
368
|
+
handler: async (args, api) => {
|
|
369
|
+
const eventType = requireString(args, "event_type");
|
|
370
|
+
const market = optionalString(args, "market", "");
|
|
371
|
+
const format = optionalString(args, "format", "csv");
|
|
372
|
+
const params = { event_type: eventType, format };
|
|
373
|
+
if (market)
|
|
374
|
+
params.market = market;
|
|
375
|
+
const data = await api.get("/v1/export", params);
|
|
376
|
+
return typeof data === "string" ? data : JSON.stringify(data, null, 2);
|
|
377
|
+
},
|
|
378
|
+
},
|
|
379
|
+
// ─── Triggers ────────────────────────────────────────────────────────
|
|
380
|
+
{
|
|
381
|
+
name: "list_triggers",
|
|
382
|
+
description: "List all webhook triggers configured for the authenticated user",
|
|
383
|
+
inputSchema: { type: "object", properties: {}, required: [] },
|
|
384
|
+
handler: async (_args, api) => {
|
|
385
|
+
const data = await api.listTriggers();
|
|
386
|
+
return JSON.stringify(data, null, 2);
|
|
387
|
+
},
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
name: "create_trigger",
|
|
391
|
+
description: "Create a rule-based webhook trigger that fires when market events match conditions (e.g. BTC price > 100000)",
|
|
392
|
+
inputSchema: {
|
|
393
|
+
type: "object",
|
|
394
|
+
properties: {
|
|
395
|
+
name: { type: "string", description: "Human-readable trigger name" },
|
|
396
|
+
channel: { type: "string", description: "Event channel to monitor (trades, fills, liquidations, funding_rates, etc.)" },
|
|
397
|
+
webhook_url: { type: "string", description: "HTTPS URL to receive webhook POST when trigger fires" },
|
|
398
|
+
rule: { type: "string", description: 'Rule as JSON string, e.g. {"condition":{"field":"data.price","op":"gt","value":"100000"}}' },
|
|
399
|
+
},
|
|
400
|
+
required: ["name", "channel", "webhook_url", "rule"],
|
|
401
|
+
},
|
|
402
|
+
handler: async (args, api) => {
|
|
403
|
+
const name = requireString(args, "name");
|
|
404
|
+
const channel = requireString(args, "channel");
|
|
405
|
+
const webhook_url = requireString(args, "webhook_url");
|
|
406
|
+
const ruleStr = requireString(args, "rule");
|
|
407
|
+
const rule = JSON.parse(ruleStr);
|
|
408
|
+
const data = await api.createTrigger({ name, channel, rule, webhook_url });
|
|
409
|
+
return JSON.stringify(data, null, 2);
|
|
410
|
+
},
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
name: "test_trigger",
|
|
414
|
+
description: "Test a trigger rule against a sample event without creating it — dry run evaluation",
|
|
415
|
+
inputSchema: {
|
|
416
|
+
type: "object",
|
|
417
|
+
properties: {
|
|
418
|
+
rule: { type: "string", description: "Rule as JSON string" },
|
|
419
|
+
event: { type: "string", description: "Sample event as JSON string to test against" },
|
|
420
|
+
},
|
|
421
|
+
required: ["rule", "event"],
|
|
422
|
+
},
|
|
423
|
+
handler: async (args, api) => {
|
|
424
|
+
const rule = JSON.parse(requireString(args, "rule"));
|
|
425
|
+
const event = JSON.parse(requireString(args, "event"));
|
|
426
|
+
const data = await api.testTrigger({ rule, event });
|
|
427
|
+
return JSON.stringify(data, null, 2);
|
|
428
|
+
},
|
|
429
|
+
},
|
|
430
|
+
// ─── Cohorts ─────────────────────────────────────────────────────────
|
|
431
|
+
{
|
|
432
|
+
name: "list_cohorts",
|
|
433
|
+
description: "List available address cohorts (predefined groups like top traders, market makers, plus custom cohorts)",
|
|
434
|
+
inputSchema: { type: "object", properties: {}, required: [] },
|
|
435
|
+
handler: async (_args, api) => {
|
|
436
|
+
const data = await api.listCohorts();
|
|
437
|
+
return JSON.stringify(data, null, 2);
|
|
438
|
+
},
|
|
439
|
+
},
|
|
440
|
+
{
|
|
441
|
+
name: "get_cohort_addresses",
|
|
442
|
+
description: "Get the wallet addresses in a specific cohort",
|
|
443
|
+
inputSchema: {
|
|
444
|
+
type: "object",
|
|
445
|
+
properties: {
|
|
446
|
+
name: { type: "string", description: "Cohort name (e.g. top_traders, market_makers, or a custom cohort name)" },
|
|
447
|
+
},
|
|
448
|
+
required: ["name"],
|
|
449
|
+
},
|
|
450
|
+
handler: async (args, api) => {
|
|
451
|
+
const name = requireString(args, "name");
|
|
452
|
+
const data = await api.getCohortAddresses(name);
|
|
453
|
+
return JSON.stringify(data, null, 2);
|
|
454
|
+
},
|
|
455
|
+
},
|
|
456
|
+
];
|
|
457
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ironflowsh/mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for Ironflow market data — real-time and historical on-chain derivatives data for AI agents",
|
|
5
|
+
"author": "Ironflow <hello@ironflow.sh>",
|
|
6
|
+
"homepage": "https://docs.ironflow.sh/guides/ai-agents",
|
|
7
|
+
"bugs": {
|
|
8
|
+
"email": "support@ironflow.sh",
|
|
9
|
+
"url": "https://docs.ironflow.sh"
|
|
10
|
+
},
|
|
11
|
+
"type": "module",
|
|
12
|
+
"bin": {
|
|
13
|
+
"ironflow-mcp": "./build/index.js"
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc && chmod 755 build/index.js",
|
|
17
|
+
"dev": "tsc --watch",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"prepublishOnly": "rm -rf build && npm run build"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"build",
|
|
23
|
+
"!build/**/*.test.js",
|
|
24
|
+
"!build/**/*.test.d.ts",
|
|
25
|
+
"!build/**/*.test.js.map",
|
|
26
|
+
"!build/**/*.test.d.ts.map",
|
|
27
|
+
"README.md",
|
|
28
|
+
"LICENSE"
|
|
29
|
+
],
|
|
30
|
+
"keywords": [
|
|
31
|
+
"mcp",
|
|
32
|
+
"model-context-protocol",
|
|
33
|
+
"ironflow",
|
|
34
|
+
"market-data",
|
|
35
|
+
"crypto",
|
|
36
|
+
"defi",
|
|
37
|
+
"perpetuals",
|
|
38
|
+
"hyperliquid",
|
|
39
|
+
"ai-agents"
|
|
40
|
+
],
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@modelcontextprotocol/sdk": "^1.12.0"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^22",
|
|
47
|
+
"typescript": "^5.8",
|
|
48
|
+
"vitest": "^4.1.0"
|
|
49
|
+
}
|
|
50
|
+
}
|