@pineforge/codegen-mcp 0.1.0 → 0.3.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 +90 -6
- package/dist/index.js +454 -35
- package/dist/index.js.map +1 -1
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +13 -7
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 PineForge
|
|
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
CHANGED
|
@@ -8,10 +8,13 @@ machine — only the Pine source travels to the API.
|
|
|
8
8
|
|
|
9
9
|
| name | runs on | quota |
|
|
10
10
|
|---|---|---|
|
|
11
|
-
| `transpile_pine` | remote API
|
|
12
|
-
| `get_quota` | remote API
|
|
13
|
-
| `backtest_pine` | local Docker
|
|
14
|
-
| `
|
|
11
|
+
| `transpile_pine` | remote API | counts (refunded on compile error) |
|
|
12
|
+
| `get_quota` | remote API | free |
|
|
13
|
+
| `backtest_pine` | local Docker | counts 1 (the transpile call inside) |
|
|
14
|
+
| `backtest_pine_grid` | local Docker | counts 1 (transpiled once for the whole sweep) |
|
|
15
|
+
| `fetch_binance_ohlcv`| Binance public API | free |
|
|
16
|
+
| `binance_symbols` | Binance public API | free |
|
|
17
|
+
| `pull_engine_image` | local Docker | free |
|
|
15
18
|
|
|
16
19
|
## Install
|
|
17
20
|
|
|
@@ -30,7 +33,7 @@ Set env vars:
|
|
|
30
33
|
|
|
31
34
|
```bash
|
|
32
35
|
export PINEFORGE_API_KEY="pf_..."
|
|
33
|
-
export PINEFORGE_GATEWAY="https://codegen
|
|
36
|
+
export PINEFORGE_GATEWAY="https://codegen.pineforge.dev" # optional
|
|
34
37
|
```
|
|
35
38
|
|
|
36
39
|
## Client configuration
|
|
@@ -69,22 +72,103 @@ Settings → MCP → New MCP Server → paste the JSON config above.
|
|
|
69
72
|
```jsonc
|
|
70
73
|
{
|
|
71
74
|
"source": "//@version=6\nstrategy(\"sma cross\")\n...",
|
|
72
|
-
"ohlcv_csv_path": "./btcusdt_15m_7d.csv"
|
|
75
|
+
"ohlcv_csv_path": "./btcusdt_15m_7d.csv",
|
|
76
|
+
|
|
77
|
+
// Optional: override Pine input.*() values without touching the source.
|
|
78
|
+
// Keys = the second arg of input.*(...) (e.g. "Fast Length").
|
|
79
|
+
"inputs": { "Fast Length": 8, "Slow Length": 21 },
|
|
80
|
+
|
|
81
|
+
// Optional: override strategy(...) header fields.
|
|
82
|
+
"overrides": { "default_qty_value": 5, "commission_value": 0.04 }
|
|
73
83
|
}
|
|
74
84
|
```
|
|
75
85
|
|
|
86
|
+
`inputs` is forwarded as the `PINEFORGE_INPUTS` env var to the runtime image,
|
|
87
|
+
`overrides` as `PINEFORGE_OVERRIDES`. Both are JSON `{string: string}` (numbers/
|
|
88
|
+
booleans are stringified for you). Empty / unset → defaults from
|
|
89
|
+
`strategy.pine`.
|
|
90
|
+
|
|
76
91
|
Returns the same JSON schema as the standalone `pineforge-engine` Docker image:
|
|
77
92
|
|
|
78
93
|
```jsonc
|
|
79
94
|
{
|
|
80
95
|
"engine": "pineforge",
|
|
81
96
|
"summary": { "total_trades": 49, "net_pnl": -190.85, ... },
|
|
97
|
+
"applied_inputs": { "Fast Length": "8", "Slow Length": "21" },
|
|
98
|
+
"applied_overrides": { "default_qty_value": "5" },
|
|
82
99
|
"trades": [ ... ],
|
|
83
100
|
"elapsed_seconds": 0.0042,
|
|
84
101
|
"_meta": { "strategy_cpp_bytes": 5079, "image": "ghcr.io/.../pineforge-engine:latest" }
|
|
85
102
|
}
|
|
86
103
|
```
|
|
87
104
|
|
|
105
|
+
## `backtest_pine_grid` — parameter sweep
|
|
106
|
+
|
|
107
|
+
Transpiles the Pine source **once** (one quota hit) then runs the same
|
|
108
|
+
compiled binary against the cartesian product of `inputs` × `overrides`.
|
|
109
|
+
Returns a ranked list plus the top entry under `best`.
|
|
110
|
+
|
|
111
|
+
```jsonc
|
|
112
|
+
{
|
|
113
|
+
"source": "//@version=6\nstrategy(\"macd\")\n...",
|
|
114
|
+
"ohlcv_csv_path": "./btcusdt_15m_7d.csv",
|
|
115
|
+
|
|
116
|
+
// Each axis is {key: list-of-values}. All combinations are tried.
|
|
117
|
+
"inputs": {
|
|
118
|
+
"Fast Length": [8, 12, 19],
|
|
119
|
+
"Slow Length": [21, 26, 39]
|
|
120
|
+
},
|
|
121
|
+
"overrides": {
|
|
122
|
+
"default_qty_value": [1, 5],
|
|
123
|
+
"commission_value": [0.04]
|
|
124
|
+
},
|
|
125
|
+
|
|
126
|
+
// Optional knobs:
|
|
127
|
+
"fixed_inputs": { "Source": "close" }, // applied to every combo
|
|
128
|
+
"fixed_overrides": {},
|
|
129
|
+
"max_combinations": 64, // hard cap
|
|
130
|
+
"concurrency": 2, // parallel docker runs
|
|
131
|
+
"include_trades": false, // omit per-trade lists
|
|
132
|
+
"sort_by": "net_pnl" // ranking metric
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## `fetch_binance_ohlcv` — pull market data
|
|
137
|
+
|
|
138
|
+
Writes a backtest-ready CSV (header `timestamp,open,high,low,close,volume`,
|
|
139
|
+
timestamp = open time in UNIX ms UTC) from Binance's public endpoints. No
|
|
140
|
+
auth required, no PineForge quota cost. Requests > 1000 bars are paginated
|
|
141
|
+
automatically. Output path is subject to the same cwd scope as
|
|
142
|
+
`ohlcv_csv_path` (relax with `PINEFORGE_ALLOW_ANYWHERE=1`).
|
|
143
|
+
|
|
144
|
+
```jsonc
|
|
145
|
+
{
|
|
146
|
+
"symbol": "BTCUSDT",
|
|
147
|
+
"interval": "15m", // 1s, 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M
|
|
148
|
+
"market": "spot", // or "usdt_perp" for USDT-margined perpetual futures
|
|
149
|
+
"limit": 672, // total bars; > 1000 paginates
|
|
150
|
+
"output_path": "./btcusdt_15m_7d.csv"
|
|
151
|
+
// Optional: "start_time" / "end_time" in UNIX ms UTC.
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## `binance_symbols` — discover / validate symbols
|
|
156
|
+
|
|
157
|
+
Returns the list of symbols available on the Binance public API for OHLCV
|
|
158
|
+
fetching. Cached 5 min in-process. Use this to validate a symbol before
|
|
159
|
+
calling `fetch_binance_ohlcv`.
|
|
160
|
+
|
|
161
|
+
```jsonc
|
|
162
|
+
{
|
|
163
|
+
"market": "usdt_perp",
|
|
164
|
+
"query": "BTC", // case-insensitive substring match
|
|
165
|
+
"quote_asset": "USDT",
|
|
166
|
+
"status": "TRADING",
|
|
167
|
+
"contract_type": "PERPETUAL", // futures-only filter
|
|
168
|
+
"limit": 50
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
88
172
|
## Filesystem scope
|
|
89
173
|
|
|
90
174
|
By default, OHLCV paths must be inside the current working directory of the MCP
|
package/dist/index.js
CHANGED
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
* @pineforge/codegen-mcp — local stdio MCP server.
|
|
4
4
|
*
|
|
5
5
|
* Bridges an AI agent to the hosted PineForge codegen API (transpile,
|
|
6
|
-
* quota)
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* quota), to the user's local Docker daemon (backtest runner + grid
|
|
7
|
+
* sweep), and to Binance public market-data endpoints (OHLCV CSV
|
|
8
|
+
* export, symbol lookup). Runs on the user's machine so OHLCV files
|
|
9
|
+
* never leave it; only the Pine source travels to the codegen API.
|
|
9
10
|
*
|
|
10
11
|
* Auth: PINEFORGE_API_KEY env var (required).
|
|
11
12
|
* Gateway override: PINEFORGE_GATEWAY env var (default: production URL).
|
|
@@ -14,15 +15,20 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
14
15
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
15
16
|
import { z } from "zod";
|
|
16
17
|
import { spawn } from "node:child_process";
|
|
17
|
-
import { mkdtemp, writeFile, rm, stat, readFile } from "node:fs/promises";
|
|
18
|
+
import { mkdtemp, mkdir, writeFile, rm, stat, readFile } from "node:fs/promises";
|
|
18
19
|
import { tmpdir } from "node:os";
|
|
19
|
-
import { join, resolve, isAbsolute } from "node:path";
|
|
20
|
+
import { join, resolve, isAbsolute, dirname } from "node:path";
|
|
21
|
+
import { VERSION } from "./version.js";
|
|
20
22
|
// ─── Config ───────────────────────────────────────────────────────────────
|
|
21
|
-
const GATEWAY = process.env.PINEFORGE_GATEWAY ?? "https://codegen
|
|
23
|
+
const GATEWAY = process.env.PINEFORGE_GATEWAY ?? "https://codegen.pineforge.dev";
|
|
22
24
|
const API_KEY = process.env.PINEFORGE_API_KEY ?? "";
|
|
23
25
|
const DEFAULT_IMAGE = "ghcr.io/fullpass-4pass/pineforge-engine:latest";
|
|
24
26
|
const ALLOW_ANYWHERE = process.env.PINEFORGE_ALLOW_ANYWHERE === "1";
|
|
25
27
|
const DOCKER_TIMEOUT_MS = Number(process.env.PINEFORGE_DOCKER_TIMEOUT_MS ?? 120_000);
|
|
28
|
+
const BINANCE_SPOT_BASE = "https://api.binance.com";
|
|
29
|
+
const BINANCE_FAPI_BASE = "https://fapi.binance.com";
|
|
30
|
+
const BINANCE_KLINES_LIMIT = 1000;
|
|
31
|
+
const BINANCE_PAGE_DELAY_MS = 200;
|
|
26
32
|
if (!API_KEY) {
|
|
27
33
|
console.error("[pineforge-mcp] PINEFORGE_API_KEY env var is required");
|
|
28
34
|
process.exit(2);
|
|
@@ -57,31 +63,94 @@ async function callGetQuota() {
|
|
|
57
63
|
async function runBacktest(args) {
|
|
58
64
|
const csvPath = await resolveCsvPath(args.ohlcv_csv_path);
|
|
59
65
|
const image = args.image ?? DEFAULT_IMAGE;
|
|
60
|
-
// 1. transpile via remote API
|
|
61
66
|
const { cpp } = await callTranspile(args.source);
|
|
62
|
-
// 2. write strategy.cpp into a tmp dir, mount that + the user's CSV
|
|
63
67
|
const tmp = await mkdtemp(join(tmpdir(), "pineforge-bt-"));
|
|
64
68
|
const cppPath = join(tmp, "strategy.cpp");
|
|
65
69
|
await writeFile(cppPath, cpp, "utf8");
|
|
66
70
|
try {
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
report = JSON.parse(stdout);
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
throw new Error(`backtest produced non-JSON output (first 500B):\n${stdout.slice(0, 500)}`);
|
|
78
|
-
}
|
|
71
|
+
const report = await dockerBacktest({
|
|
72
|
+
image,
|
|
73
|
+
cppPath,
|
|
74
|
+
csvPath,
|
|
75
|
+
inputs: args.inputs,
|
|
76
|
+
overrides: args.overrides,
|
|
77
|
+
});
|
|
79
78
|
return { ...report, _meta: { strategy_cpp_bytes: cpp.length, image } };
|
|
80
79
|
}
|
|
81
80
|
finally {
|
|
82
81
|
rm(tmp, { recursive: true, force: true }).catch(() => undefined);
|
|
83
82
|
}
|
|
84
83
|
}
|
|
84
|
+
async function runBacktestGrid(args) {
|
|
85
|
+
const csvPath = await resolveCsvPath(args.ohlcv_csv_path);
|
|
86
|
+
const image = args.image ?? DEFAULT_IMAGE;
|
|
87
|
+
const includeTrades = args.include_trades === true;
|
|
88
|
+
const sortBy = args.sort_by ?? "net_pnl";
|
|
89
|
+
const maxCombos = args.max_combinations ?? 64;
|
|
90
|
+
const concurrency = Math.max(1, Math.min(args.concurrency ?? 1, 8));
|
|
91
|
+
const combos = buildCombinations(args.inputs, args.overrides, args.fixed_inputs, args.fixed_overrides);
|
|
92
|
+
if (combos.length === 0) {
|
|
93
|
+
throw new Error("no parameter combinations produced — provide at least one inputs/overrides axis");
|
|
94
|
+
}
|
|
95
|
+
if (combos.length > maxCombos) {
|
|
96
|
+
throw new Error(`${combos.length} combinations exceeds max_combinations=${maxCombos}. ` +
|
|
97
|
+
`Either reduce the grid or raise max_combinations.`);
|
|
98
|
+
}
|
|
99
|
+
const { cpp } = await callTranspile(args.source);
|
|
100
|
+
const tmp = await mkdtemp(join(tmpdir(), "pineforge-grid-"));
|
|
101
|
+
const cppPath = join(tmp, "strategy.cpp");
|
|
102
|
+
await writeFile(cppPath, cpp, "utf8");
|
|
103
|
+
try {
|
|
104
|
+
const rows = await pMap(combos, concurrency, async (combo) => {
|
|
105
|
+
try {
|
|
106
|
+
const report = await dockerBacktest({
|
|
107
|
+
image, cppPath, csvPath,
|
|
108
|
+
inputs: combo.inputs, overrides: combo.overrides,
|
|
109
|
+
});
|
|
110
|
+
return {
|
|
111
|
+
ok: true,
|
|
112
|
+
inputs: combo.inputs,
|
|
113
|
+
overrides: combo.overrides,
|
|
114
|
+
summary: report.summary,
|
|
115
|
+
applied_inputs: report.applied_inputs,
|
|
116
|
+
applied_overrides: report.applied_overrides,
|
|
117
|
+
elapsed_seconds: report.elapsed_seconds,
|
|
118
|
+
...(includeTrades ? { trades: report.trades } : {}),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
return {
|
|
123
|
+
ok: false,
|
|
124
|
+
inputs: combo.inputs,
|
|
125
|
+
overrides: combo.overrides,
|
|
126
|
+
error: e instanceof Error ? e.message : String(e),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
const succeeded = rows.filter(r => r.ok);
|
|
131
|
+
const failed = rows.filter(r => !r.ok);
|
|
132
|
+
const sortValue = (r) => {
|
|
133
|
+
if (!r.ok || !r.summary)
|
|
134
|
+
return -Infinity;
|
|
135
|
+
const v = r.summary[sortBy];
|
|
136
|
+
return typeof v === "number" ? v : -Infinity;
|
|
137
|
+
};
|
|
138
|
+
succeeded.sort((a, b) => sortValue(b) - sortValue(a));
|
|
139
|
+
return {
|
|
140
|
+
total_combinations: combos.length,
|
|
141
|
+
succeeded: succeeded.length,
|
|
142
|
+
failed: failed.length,
|
|
143
|
+
sort_by: sortBy,
|
|
144
|
+
image,
|
|
145
|
+
_meta: { strategy_cpp_bytes: cpp.length, concurrency },
|
|
146
|
+
best: succeeded[0] ?? null,
|
|
147
|
+
results: [...succeeded, ...failed],
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
rm(tmp, { recursive: true, force: true }).catch(() => undefined);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
85
154
|
async function pullImage(image) {
|
|
86
155
|
const child = spawn("docker", ["pull", image], { stdio: ["ignore", "pipe", "pipe"] });
|
|
87
156
|
const { stdout, stderr, code } = await collectChild(child, DOCKER_TIMEOUT_MS);
|
|
@@ -89,17 +158,73 @@ async function pullImage(image) {
|
|
|
89
158
|
throw new Error(`docker pull failed (${code}): ${stderr.slice(-1024)}`);
|
|
90
159
|
return { image, pulled: true, output: (stdout + stderr).trim().slice(-2048) };
|
|
91
160
|
}
|
|
92
|
-
// ───
|
|
93
|
-
|
|
161
|
+
// ─── Param-grid helpers ───────────────────────────────────────────────────
|
|
162
|
+
function stringifyParams(p) {
|
|
163
|
+
if (!p)
|
|
164
|
+
return {};
|
|
165
|
+
const out = {};
|
|
166
|
+
for (const [k, v] of Object.entries(p))
|
|
167
|
+
out[k] = String(v);
|
|
168
|
+
return out;
|
|
169
|
+
}
|
|
170
|
+
function cartesianProduct(grid) {
|
|
171
|
+
const keys = Object.keys(grid);
|
|
172
|
+
if (keys.length === 0)
|
|
173
|
+
return [{}];
|
|
174
|
+
let acc = [{}];
|
|
175
|
+
for (const k of keys) {
|
|
176
|
+
const values = grid[k] ?? [];
|
|
177
|
+
const next = [];
|
|
178
|
+
for (const partial of acc) {
|
|
179
|
+
for (const v of values) {
|
|
180
|
+
next.push({ ...partial, [k]: String(v) });
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
acc = next;
|
|
184
|
+
}
|
|
185
|
+
return acc;
|
|
186
|
+
}
|
|
187
|
+
function buildCombinations(inputsGrid, overridesGrid, fixedInputs, fixedOverrides) {
|
|
188
|
+
const inputCombos = cartesianProduct(inputsGrid ?? {});
|
|
189
|
+
const overrideCombos = cartesianProduct(overridesGrid ?? {});
|
|
190
|
+
const fixIn = stringifyParams(fixedInputs);
|
|
191
|
+
const fixOv = stringifyParams(fixedOverrides);
|
|
192
|
+
const out = [];
|
|
193
|
+
for (const i of inputCombos) {
|
|
194
|
+
for (const o of overrideCombos) {
|
|
195
|
+
out.push({ inputs: { ...fixIn, ...i }, overrides: { ...fixOv, ...o } });
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return out;
|
|
199
|
+
}
|
|
200
|
+
async function pMap(items, n, fn) {
|
|
201
|
+
const results = new Array(items.length);
|
|
202
|
+
let next = 0;
|
|
203
|
+
const worker = async () => {
|
|
204
|
+
while (true) {
|
|
205
|
+
const i = next++;
|
|
206
|
+
if (i >= items.length)
|
|
207
|
+
return;
|
|
208
|
+
results[i] = await fn(items[i], i);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
await Promise.all(Array.from({ length: Math.min(n, items.length) }, worker));
|
|
212
|
+
return results;
|
|
213
|
+
}
|
|
214
|
+
// ─── Path / CSV helpers ───────────────────────────────────────────────────
|
|
215
|
+
function resolveScopedPath(p, label) {
|
|
94
216
|
const abs = isAbsolute(p) ? p : resolve(process.cwd(), p);
|
|
95
217
|
if (!ALLOW_ANYWHERE && !abs.startsWith(process.cwd() + "/") && abs !== process.cwd()) {
|
|
96
|
-
throw new Error(
|
|
218
|
+
throw new Error(`${label} path '${abs}' is outside cwd '${process.cwd()}'. ` +
|
|
97
219
|
`Set PINEFORGE_ALLOW_ANYWHERE=1 to override.`);
|
|
98
220
|
}
|
|
221
|
+
return abs;
|
|
222
|
+
}
|
|
223
|
+
async function resolveCsvPath(p) {
|
|
224
|
+
const abs = resolveScopedPath(p, "OHLCV");
|
|
99
225
|
const st = await stat(abs).catch(() => null);
|
|
100
226
|
if (!st || !st.isFile())
|
|
101
227
|
throw new Error(`OHLCV file not found: ${abs}`);
|
|
102
|
-
// Sanity-check header line.
|
|
103
228
|
const head = (await readFile(abs, "utf8")).slice(0, 200).split(/\r?\n/)[0] ?? "";
|
|
104
229
|
const expected = ["timestamp", "open", "high", "low", "close", "volume"];
|
|
105
230
|
const cols = head.toLowerCase().split(",").map((s) => s.trim());
|
|
@@ -108,15 +233,32 @@ async function resolveCsvPath(p) {
|
|
|
108
233
|
}
|
|
109
234
|
return abs;
|
|
110
235
|
}
|
|
111
|
-
async function
|
|
112
|
-
const
|
|
236
|
+
async function dockerBacktest(args) {
|
|
237
|
+
const dockerArgs = [
|
|
113
238
|
"run", "--rm",
|
|
114
239
|
"--network=none",
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
240
|
+
];
|
|
241
|
+
const inputsObj = stringifyParams(args.inputs);
|
|
242
|
+
const overridesObj = stringifyParams(args.overrides);
|
|
243
|
+
if (Object.keys(inputsObj).length) {
|
|
244
|
+
dockerArgs.push("-e", `PINEFORGE_INPUTS=${JSON.stringify(inputsObj)}`);
|
|
245
|
+
}
|
|
246
|
+
if (Object.keys(overridesObj).length) {
|
|
247
|
+
dockerArgs.push("-e", `PINEFORGE_OVERRIDES=${JSON.stringify(overridesObj)}`);
|
|
248
|
+
}
|
|
249
|
+
dockerArgs.push("-v", `${args.cppPath}:/in/strategy.cpp:ro`, "-v", `${args.csvPath}:/in/ohlcv.csv:ro`, args.image);
|
|
250
|
+
const child = spawn("docker", dockerArgs, { stdio: ["ignore", "pipe", "pipe"] });
|
|
251
|
+
const { stdout, stderr, code } = await collectChild(child, DOCKER_TIMEOUT_MS);
|
|
252
|
+
if (code !== 0) {
|
|
253
|
+
throw new Error(`docker exited ${code}\n` +
|
|
254
|
+
`stderr (last 2KB):\n${stderr.slice(-2048)}`);
|
|
255
|
+
}
|
|
256
|
+
try {
|
|
257
|
+
return JSON.parse(stdout);
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
throw new Error(`backtest produced non-JSON output (first 500B):\n${stdout.slice(0, 500)}`);
|
|
261
|
+
}
|
|
120
262
|
}
|
|
121
263
|
function collectChild(child, timeoutMs) {
|
|
122
264
|
return new Promise((resolveP, rejectP) => {
|
|
@@ -134,11 +276,205 @@ function collectChild(child, timeoutMs) {
|
|
|
134
276
|
});
|
|
135
277
|
});
|
|
136
278
|
}
|
|
279
|
+
// ─── Binance public-API client ────────────────────────────────────────────
|
|
280
|
+
const BINANCE_INTERVAL_MS = {
|
|
281
|
+
"1s": 1_000,
|
|
282
|
+
"1m": 60_000, "3m": 180_000, "5m": 300_000, "15m": 900_000, "30m": 1_800_000,
|
|
283
|
+
"1h": 3_600_000, "2h": 7_200_000, "4h": 14_400_000, "6h": 21_600_000,
|
|
284
|
+
"8h": 28_800_000, "12h": 43_200_000,
|
|
285
|
+
"1d": 86_400_000, "3d": 259_200_000,
|
|
286
|
+
"1w": 604_800_000,
|
|
287
|
+
"1M": 30 * 86_400_000, // approximate
|
|
288
|
+
};
|
|
289
|
+
const BINANCE_INTERVALS = Object.keys(BINANCE_INTERVAL_MS);
|
|
290
|
+
function binanceKlinesUrl(market) {
|
|
291
|
+
return market === "spot"
|
|
292
|
+
? `${BINANCE_SPOT_BASE}/api/v3/klines`
|
|
293
|
+
: `${BINANCE_FAPI_BASE}/fapi/v1/klines`;
|
|
294
|
+
}
|
|
295
|
+
function binanceExchangeInfoUrl(market) {
|
|
296
|
+
return market === "spot"
|
|
297
|
+
? `${BINANCE_SPOT_BASE}/api/v3/exchangeInfo`
|
|
298
|
+
: `${BINANCE_FAPI_BASE}/fapi/v1/exchangeInfo`;
|
|
299
|
+
}
|
|
300
|
+
async function binanceGet(url) {
|
|
301
|
+
const resp = await fetch(url, {
|
|
302
|
+
headers: { "user-agent": `pineforge-codegen-mcp/${VERSION}` },
|
|
303
|
+
});
|
|
304
|
+
const text = await resp.text();
|
|
305
|
+
if (!resp.ok) {
|
|
306
|
+
throw new Error(`Binance ${resp.status} for ${url}: ${text.slice(0, 500)}`);
|
|
307
|
+
}
|
|
308
|
+
try {
|
|
309
|
+
return JSON.parse(text);
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
throw new Error(`Binance non-JSON response: ${text.slice(0, 200)}`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
async function fetchKlinesPage(market, symbol, interval, startTime, endTime, limit) {
|
|
316
|
+
const params = new URLSearchParams({
|
|
317
|
+
symbol: symbol.toUpperCase(),
|
|
318
|
+
interval,
|
|
319
|
+
limit: String(limit),
|
|
320
|
+
});
|
|
321
|
+
if (startTime !== undefined)
|
|
322
|
+
params.set("startTime", String(startTime));
|
|
323
|
+
if (endTime !== undefined)
|
|
324
|
+
params.set("endTime", String(endTime));
|
|
325
|
+
const url = `${binanceKlinesUrl(market)}?${params.toString()}`;
|
|
326
|
+
const data = await binanceGet(url);
|
|
327
|
+
if (!Array.isArray(data))
|
|
328
|
+
throw new Error(`Binance unexpected klines payload: ${JSON.stringify(data).slice(0, 200)}`);
|
|
329
|
+
return data;
|
|
330
|
+
}
|
|
331
|
+
async function fetchBinanceOhlcv(args) {
|
|
332
|
+
const intervalMs = BINANCE_INTERVAL_MS[args.interval];
|
|
333
|
+
if (intervalMs === undefined) {
|
|
334
|
+
throw new Error(`Unknown interval '${args.interval}'. Valid: ${Object.keys(BINANCE_INTERVAL_MS).join(", ")}`);
|
|
335
|
+
}
|
|
336
|
+
if (args.limit <= 0)
|
|
337
|
+
throw new Error("limit must be > 0");
|
|
338
|
+
if (args.limit > 100_000)
|
|
339
|
+
throw new Error("limit must be ≤ 100000 (sanity cap)");
|
|
340
|
+
const outAbs = resolveScopedPath(args.output_path, "output");
|
|
341
|
+
await mkdir(dirname(outAbs), { recursive: true });
|
|
342
|
+
const now = Date.now();
|
|
343
|
+
const endTime = args.end_time ?? now;
|
|
344
|
+
const startTime = args.start_time ?? Math.max(0, endTime - args.limit * intervalMs);
|
|
345
|
+
const collected = [];
|
|
346
|
+
let cursor = startTime;
|
|
347
|
+
let pages = 0;
|
|
348
|
+
while (collected.length < args.limit && cursor <= endTime) {
|
|
349
|
+
const remaining = args.limit - collected.length;
|
|
350
|
+
const pageLimit = Math.min(BINANCE_KLINES_LIMIT, remaining);
|
|
351
|
+
const page = await fetchKlinesPage(args.market, args.symbol, args.interval, cursor, endTime, pageLimit);
|
|
352
|
+
pages++;
|
|
353
|
+
if (page.length === 0)
|
|
354
|
+
break;
|
|
355
|
+
// Dedup against previous tail (Binance is inclusive on startTime).
|
|
356
|
+
const tail = collected[collected.length - 1];
|
|
357
|
+
const lastSeen = tail ? tail[0] : -1;
|
|
358
|
+
for (const k of page) {
|
|
359
|
+
if (k[0] > lastSeen)
|
|
360
|
+
collected.push(k);
|
|
361
|
+
}
|
|
362
|
+
if (page.length < pageLimit)
|
|
363
|
+
break;
|
|
364
|
+
const lastPage = page[page.length - 1];
|
|
365
|
+
cursor = lastPage[0] + intervalMs;
|
|
366
|
+
if (collected.length < args.limit && cursor <= endTime) {
|
|
367
|
+
await sleep(BINANCE_PAGE_DELAY_MS);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
if (collected.length === 0) {
|
|
371
|
+
throw new Error(`Binance returned 0 bars for ${args.symbol} ${args.interval} (${args.market})`);
|
|
372
|
+
}
|
|
373
|
+
const lines = ["timestamp,open,high,low,close,volume"];
|
|
374
|
+
for (const k of collected) {
|
|
375
|
+
const ts = Number(k[0]);
|
|
376
|
+
if (!Number.isFinite(ts))
|
|
377
|
+
continue;
|
|
378
|
+
const o = sanitizeNumeric(k[1]);
|
|
379
|
+
const h = sanitizeNumeric(k[2]);
|
|
380
|
+
const l = sanitizeNumeric(k[3]);
|
|
381
|
+
const c = sanitizeNumeric(k[4]);
|
|
382
|
+
const v = sanitizeNumeric(k[5]);
|
|
383
|
+
lines.push(`${ts},${o},${h},${l},${c},${v}`);
|
|
384
|
+
}
|
|
385
|
+
const csv = lines.join("\n") + "\n";
|
|
386
|
+
await writeFile(outAbs, csv, "utf8");
|
|
387
|
+
const first = collected[0];
|
|
388
|
+
const last = collected[collected.length - 1];
|
|
389
|
+
return {
|
|
390
|
+
output_path: outAbs,
|
|
391
|
+
market: args.market,
|
|
392
|
+
symbol: args.symbol.toUpperCase(),
|
|
393
|
+
interval: args.interval,
|
|
394
|
+
bars: collected.length,
|
|
395
|
+
pages,
|
|
396
|
+
first_open_time: first[0],
|
|
397
|
+
last_open_time: last[0],
|
|
398
|
+
first_open_iso: new Date(first[0]).toISOString(),
|
|
399
|
+
last_open_iso: new Date(last[0]).toISOString(),
|
|
400
|
+
bytes: Buffer.byteLength(csv, "utf8"),
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
function sanitizeNumeric(raw) {
|
|
404
|
+
// Binance returns numeric strings; we keep them as strings to avoid
|
|
405
|
+
// float round-trip loss but reject anything non-numeric so the CSV
|
|
406
|
+
// stays parseable downstream.
|
|
407
|
+
const s = String(raw);
|
|
408
|
+
if (!/^-?\d+(\.\d+)?([eE][-+]?\d+)?$/.test(s)) {
|
|
409
|
+
throw new Error(`Non-numeric kline field: ${s}`);
|
|
410
|
+
}
|
|
411
|
+
return s;
|
|
412
|
+
}
|
|
413
|
+
function sleep(ms) {
|
|
414
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
415
|
+
}
|
|
416
|
+
// Cache exchangeInfo for 5 min — symbol list rarely changes.
|
|
417
|
+
const SYMBOL_CACHE_TTL_MS = 5 * 60_000;
|
|
418
|
+
const symbolCache = new Map();
|
|
419
|
+
async function listBinanceSymbols(market) {
|
|
420
|
+
const now = Date.now();
|
|
421
|
+
const cached = symbolCache.get(market);
|
|
422
|
+
if (cached && now - cached.ts < SYMBOL_CACHE_TTL_MS)
|
|
423
|
+
return cached.symbols;
|
|
424
|
+
const data = await binanceGet(binanceExchangeInfoUrl(market));
|
|
425
|
+
if (!Array.isArray(data?.symbols)) {
|
|
426
|
+
throw new Error("Binance exchangeInfo: unexpected payload shape");
|
|
427
|
+
}
|
|
428
|
+
symbolCache.set(market, { ts: now, symbols: data.symbols });
|
|
429
|
+
return data.symbols;
|
|
430
|
+
}
|
|
431
|
+
async function binanceSymbols(args) {
|
|
432
|
+
const all = await listBinanceSymbols(args.market);
|
|
433
|
+
const limit = Math.max(1, Math.min(args.limit ?? 200, 2000));
|
|
434
|
+
const q = args.query?.toUpperCase();
|
|
435
|
+
const quote = args.quote_asset?.toUpperCase();
|
|
436
|
+
const base = args.base_asset?.toUpperCase();
|
|
437
|
+
const status = args.status?.toUpperCase();
|
|
438
|
+
const ct = args.contract_type?.toUpperCase();
|
|
439
|
+
const filtered = all.filter((s) => {
|
|
440
|
+
if (q && !s.symbol.toUpperCase().includes(q))
|
|
441
|
+
return false;
|
|
442
|
+
if (quote && s.quoteAsset?.toUpperCase() !== quote)
|
|
443
|
+
return false;
|
|
444
|
+
if (base && s.baseAsset?.toUpperCase() !== base)
|
|
445
|
+
return false;
|
|
446
|
+
if (status && s.status?.toUpperCase() !== status)
|
|
447
|
+
return false;
|
|
448
|
+
if (ct && s.contractType?.toUpperCase() !== ct)
|
|
449
|
+
return false;
|
|
450
|
+
return true;
|
|
451
|
+
});
|
|
452
|
+
const truncated = filtered.length > limit;
|
|
453
|
+
const slice = filtered.slice(0, limit).map((s) => ({
|
|
454
|
+
symbol: s.symbol,
|
|
455
|
+
base: s.baseAsset,
|
|
456
|
+
quote: s.quoteAsset,
|
|
457
|
+
status: s.status,
|
|
458
|
+
...(s.contractType ? { contract_type: s.contractType } : {}),
|
|
459
|
+
}));
|
|
460
|
+
return {
|
|
461
|
+
market: args.market,
|
|
462
|
+
total_symbols: all.length,
|
|
463
|
+
matched: filtered.length,
|
|
464
|
+
returned: slice.length,
|
|
465
|
+
truncated,
|
|
466
|
+
symbols: slice,
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
// ─── MCP server wiring ────────────────────────────────────────────────────
|
|
137
470
|
const asTextResult = (value) => ({
|
|
138
471
|
content: [{ type: "text", text: JSON.stringify(value, null, 2) }],
|
|
139
472
|
});
|
|
140
|
-
|
|
141
|
-
const
|
|
473
|
+
const ParamMapSchema = z.record(z.string(), z.union([z.string(), z.number(), z.boolean()]));
|
|
474
|
+
const ParamGridSchema = z.record(z.string(), z.array(z.union([z.string(), z.number(), z.boolean()])).min(1));
|
|
475
|
+
const MarketSchema = z.enum(["spot", "usdt_perp"]);
|
|
476
|
+
const IntervalSchema = z.enum(BINANCE_INTERVALS);
|
|
477
|
+
const server = new McpServer({ name: "pineforge-codegen-mcp", version: VERSION }, { capabilities: { tools: {} } });
|
|
142
478
|
server.registerTool("transpile_pine", {
|
|
143
479
|
description: "Transpile PineScript v6 source to a C++ translation unit using the hosted " +
|
|
144
480
|
"PineForge codegen API. Compile failures DO NOT consume the monthly quota — " +
|
|
@@ -157,14 +493,97 @@ server.registerTool("backtest_pine", {
|
|
|
157
493
|
description: "Transpile a PineScript v6 strategy and run it against an OHLCV CSV via the " +
|
|
158
494
|
"pineforge-engine Docker image on the user's local machine. The OHLCV file " +
|
|
159
495
|
"stays on the user's box; only the Pine source travels over the network. " +
|
|
160
|
-
"
|
|
496
|
+
"Optional `inputs` overrides input.*() named values from the Pine source " +
|
|
497
|
+
"(keys = the second arg of input.*(...) calls, e.g. 'Fast Length'). " +
|
|
498
|
+
"Optional `overrides` overrides strategy(...) header fields " +
|
|
499
|
+
"(initial_capital, commission_value, default_qty_value, pyramiding, " +
|
|
500
|
+
"slippage, default_qty_type, commission_type, process_orders_on_close). " +
|
|
501
|
+
"Returns the parsed JSON report (summary, trades, applied_inputs, " +
|
|
502
|
+
"applied_overrides, elapsed_seconds). Use backtest_pine_grid for sweeps.",
|
|
161
503
|
inputSchema: {
|
|
162
504
|
source: z.string().describe("PineScript v6 source."),
|
|
163
505
|
ohlcv_csv_path: z.string().describe("Absolute or cwd-relative path to OHLCV CSV with header " +
|
|
164
506
|
"'timestamp,open,high,low,close,volume' (timestamp = UNIX ms UTC)."),
|
|
165
507
|
image: z.string().optional().describe(`Docker image override. Defaults to ${DEFAULT_IMAGE}.`),
|
|
508
|
+
inputs: ParamMapSchema.optional().describe("Map of Pine input.*() names → value (string/number/bool). " +
|
|
509
|
+
"Sent as PINEFORGE_INPUTS env var to the runtime."),
|
|
510
|
+
overrides: ParamMapSchema.optional().describe("Map of strategy(...) header overrides. " +
|
|
511
|
+
"Sent as PINEFORGE_OVERRIDES env var to the runtime."),
|
|
512
|
+
},
|
|
513
|
+
}, async ({ source, ohlcv_csv_path, image, inputs, overrides }) => asTextResult(await runBacktest({ source, ohlcv_csv_path, image, inputs, overrides })));
|
|
514
|
+
server.registerTool("backtest_pine_grid", {
|
|
515
|
+
description: "Run a parameter sweep: transpile the Pine source ONCE (single quota hit), " +
|
|
516
|
+
"then re-run the same compiled strategy against the OHLCV CSV across the " +
|
|
517
|
+
"cartesian product of `inputs` × `overrides` grids. Returns a ranked list " +
|
|
518
|
+
"of {inputs, overrides, summary, elapsed_seconds} entries sorted by `sort_by` " +
|
|
519
|
+
"descending, plus the top entry under `best`. Cap: max_combinations (default " +
|
|
520
|
+
"64). Set concurrency > 1 to run docker containers in parallel — each " +
|
|
521
|
+
"container has its own startup overhead, so 2-4 is usually plenty.",
|
|
522
|
+
inputSchema: {
|
|
523
|
+
source: z.string().describe("PineScript v6 source."),
|
|
524
|
+
ohlcv_csv_path: z.string().describe("Path to OHLCV CSV (same format as backtest_pine)."),
|
|
525
|
+
image: z.string().optional().describe(`Docker image override. Defaults to ${DEFAULT_IMAGE}.`),
|
|
526
|
+
inputs: ParamGridSchema.optional().describe("Grid of input.*() names → list of values to sweep. " +
|
|
527
|
+
"Example: {\"Fast Length\": [8, 12, 19], \"Slow Length\": [21, 26, 39]}"),
|
|
528
|
+
overrides: ParamGridSchema.optional().describe("Grid of strategy() header fields → list of values. " +
|
|
529
|
+
"Example: {\"default_qty_value\": [1, 5], \"commission_value\": [0.04]}"),
|
|
530
|
+
fixed_inputs: ParamMapSchema.optional().describe("Inputs applied to every combo (overridden by per-combo `inputs` keys)."),
|
|
531
|
+
fixed_overrides: ParamMapSchema.optional().describe("Overrides applied to every combo (overridden by per-combo `overrides` keys)."),
|
|
532
|
+
max_combinations: z.number().int().min(1).max(1024).optional()
|
|
533
|
+
.describe("Hard cap on combinations. Default 64."),
|
|
534
|
+
concurrency: z.number().int().min(1).max(8).optional()
|
|
535
|
+
.describe("Parallel docker runs. Default 1."),
|
|
536
|
+
include_trades: z.boolean().optional()
|
|
537
|
+
.describe("Include the per-trade list in each result. Default false (saves tokens)."),
|
|
538
|
+
sort_by: z.enum(["net_pnl", "win_rate_pct", "max_drawdown", "total_trades"])
|
|
539
|
+
.optional().describe("summary.* field to rank by, descending. Default net_pnl."),
|
|
540
|
+
},
|
|
541
|
+
}, async (args) => asTextResult(await runBacktestGrid(args)));
|
|
542
|
+
server.registerTool("fetch_binance_ohlcv", {
|
|
543
|
+
description: "Fetch OHLCV candles from Binance public API and write a backtest-ready " +
|
|
544
|
+
"CSV (header: timestamp,open,high,low,close,volume; timestamp = open time " +
|
|
545
|
+
"in UNIX ms UTC). Supports `spot` and `usdt_perp` (USDT-margined " +
|
|
546
|
+
"perpetual futures). Requests larger than 1000 bars are paginated " +
|
|
547
|
+
"automatically. Free — no PineForge quota cost. The output path must " +
|
|
548
|
+
"live inside the MCP cwd unless PINEFORGE_ALLOW_ANYWHERE=1.",
|
|
549
|
+
inputSchema: {
|
|
550
|
+
symbol: z.string().min(2).describe("Binance symbol, e.g. 'BTCUSDT'. Use binance_symbols to validate."),
|
|
551
|
+
interval: IntervalSchema.describe("Kline interval. Spot supports 1s + 1m..1M; usdt_perp supports 1m..1M (no 1s)."),
|
|
552
|
+
market: MarketSchema.optional().describe("'spot' (default) or 'usdt_perp'."),
|
|
553
|
+
limit: z.number().int().min(1).max(100_000).optional()
|
|
554
|
+
.describe("Total bars to fetch. Default 1000. Paginated above 1000."),
|
|
555
|
+
start_time: z.number().int().nonnegative().optional()
|
|
556
|
+
.describe("UNIX ms UTC. If unset, derived from end_time/now and limit."),
|
|
557
|
+
end_time: z.number().int().nonnegative().optional()
|
|
558
|
+
.describe("UNIX ms UTC. Defaults to now."),
|
|
559
|
+
output_path: z.string().describe("Path to write the CSV (will create parent dirs as needed)."),
|
|
560
|
+
},
|
|
561
|
+
}, async ({ symbol, interval, market, limit, start_time, end_time, output_path }) => asTextResult(await fetchBinanceOhlcv({
|
|
562
|
+
symbol,
|
|
563
|
+
interval,
|
|
564
|
+
market: market ?? "spot",
|
|
565
|
+
limit: limit ?? 1000,
|
|
566
|
+
start_time,
|
|
567
|
+
end_time,
|
|
568
|
+
output_path,
|
|
569
|
+
})));
|
|
570
|
+
server.registerTool("binance_symbols", {
|
|
571
|
+
description: "List/validate symbols available on the Binance public API for OHLCV " +
|
|
572
|
+
"fetching. Filters: `query` (substring of the symbol), `quote_asset` " +
|
|
573
|
+
"(e.g. 'USDT'), `base_asset` (e.g. 'BTC'), `status` (e.g. 'TRADING'), " +
|
|
574
|
+
"`contract_type` (futures only, e.g. 'PERPETUAL'). Results are " +
|
|
575
|
+
"cached 5 min in process. Free.",
|
|
576
|
+
inputSchema: {
|
|
577
|
+
market: MarketSchema.describe("'spot' or 'usdt_perp'."),
|
|
578
|
+
query: z.string().optional().describe("Case-insensitive substring of the symbol."),
|
|
579
|
+
quote_asset: z.string().optional().describe("Filter by quote asset (e.g. 'USDT')."),
|
|
580
|
+
base_asset: z.string().optional().describe("Filter by base asset (e.g. 'BTC')."),
|
|
581
|
+
status: z.string().optional().describe("Filter by status. 'TRADING' returns active only."),
|
|
582
|
+
contract_type: z.string().optional().describe("Futures only. 'PERPETUAL' for usdt_perp swaps."),
|
|
583
|
+
limit: z.number().int().min(1).max(2000).optional()
|
|
584
|
+
.describe("Max symbols to return. Default 200."),
|
|
166
585
|
},
|
|
167
|
-
}, async (
|
|
586
|
+
}, async (args) => asTextResult(await binanceSymbols(args)));
|
|
168
587
|
server.registerTool("pull_engine_image", {
|
|
169
588
|
description: "Run `docker pull` for the pineforge-engine runtime image on the user's " +
|
|
170
589
|
"machine. Does not consume API quota. Useful before the first backtest_pine " +
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pineforge/codegen-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Local MCP server: PineScript v6 → C++ via the PineForge codegen API + local Docker backtest runner.",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Local MCP server: PineScript v6 → C++ via the PineForge codegen API + local Docker backtest runner with parameter sweeps + Binance OHLCV exporter.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"pineforge-codegen-mcp": "dist/index.js"
|
|
@@ -9,13 +9,17 @@
|
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"files": [
|
|
11
11
|
"dist",
|
|
12
|
-
"README.md"
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
13
14
|
],
|
|
14
15
|
"engines": {
|
|
15
16
|
"node": ">=20"
|
|
16
17
|
},
|
|
17
18
|
"scripts": {
|
|
19
|
+
"sync-version": "node scripts/sync-version.mjs",
|
|
20
|
+
"prebuild": "npm run sync-version",
|
|
18
21
|
"build": "tsc",
|
|
22
|
+
"predev": "npm run sync-version",
|
|
19
23
|
"dev": "tsx src/index.ts",
|
|
20
24
|
"prepublishOnly": "npm run build"
|
|
21
25
|
},
|
|
@@ -36,11 +40,13 @@
|
|
|
36
40
|
"backtest",
|
|
37
41
|
"trading"
|
|
38
42
|
],
|
|
39
|
-
"homepage": "https://github.com/fullpass-4pass/pineforge-codegen",
|
|
43
|
+
"homepage": "https://github.com/fullpass-4pass/pineforge-codegen-mcp",
|
|
40
44
|
"repository": {
|
|
41
45
|
"type": "git",
|
|
42
|
-
"url": "git+https://github.com/fullpass-4pass/pineforge-codegen.git"
|
|
43
|
-
"directory": "cloud/mcp-local"
|
|
46
|
+
"url": "git+https://github.com/fullpass-4pass/pineforge-codegen-mcp.git"
|
|
44
47
|
},
|
|
45
|
-
"
|
|
48
|
+
"bugs": {
|
|
49
|
+
"url": "https://github.com/fullpass-4pass/pineforge-codegen-mcp/issues"
|
|
50
|
+
},
|
|
51
|
+
"license": "MIT"
|
|
46
52
|
}
|