@battlegrid/mcp-server 32.0.30 → 32.0.31

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/dist/index.d.ts CHANGED
@@ -47,7 +47,7 @@ import { Client, StreamableHTTPClientTransport } from '@modelcontextprotocol/cli
47
47
  * being asked. Move it for a change to THIS package — a proxy fix, a dependency bump, a docs
48
48
  * correction. Never move it to track the server.
49
49
  */
50
- export declare const PACKAGE_VERSION = "32.0.30";
50
+ export declare const PACKAGE_VERSION = "32.0.31";
51
51
  export declare const DEFAULT_URL = "https://mcp.battlegrid.trade/mcp";
52
52
  export interface EnvConfig {
53
53
  apiKeys: string[];
package/dist/index.js CHANGED
@@ -49,7 +49,7 @@ import { Client, SdkHttpError, StreamableHTTPClientTransport } from '@modelconte
49
49
  * being asked. Move it for a change to THIS package — a proxy fix, a dependency bump, a docs
50
50
  * correction. Never move it to track the server.
51
51
  */
52
- export const PACKAGE_VERSION = '32.0.30';
52
+ export const PACKAGE_VERSION = '32.0.31';
53
53
  export const DEFAULT_URL = 'https://mcp.battlegrid.trade/mcp';
54
54
  const MAX_RETRIES = 3;
55
55
  const RETRY_DELAYS_MS = [2000, 4000, 8000];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@battlegrid/mcp-server",
3
- "version": "32.0.30",
3
+ "version": "32.0.31",
4
4
  "description": "BattleGrid MCP server — play crypto prediction games from AI agents",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "generator": "battlegrid-app/server/scripts/export-mcp-skills.mjs",
3
- "contractVersion": "134.0.0",
3
+ "contractVersion": "135.0.0",
4
4
  "files": {
5
5
  "battlegrid-agent-management/SKILL.md": "91d1be4de1e33d54e1852c970af66ad176068fd16c30b4326e49053b7a35eb32",
6
6
  "battlegrid-agent-management/references/agent-stage-examples.md": "dffcc353d61dfc7b5bb6a2b3077fc6bf8c760a34c287cafb3b59b99306f24195",
@@ -12,13 +12,13 @@
12
12
  "battlegrid-radar-deployment/SKILL.md": "42900772033d799ce8eeeea9a433d76dd54fb5b153c83951753f73859dcfc021",
13
13
  "battlegrid-radar-deployment/references/arena-stage-examples.md": "d27cfed1f4663f267c4a7ecebe4a6e65a450fc74bd14ce8987fb61af5bbf2ca5",
14
14
  "battlegrid-radar-deployment/references/radar-stage-examples.md": "13fc3f55d91d3da9754e1ed7fb27493b7b7ba4d40a6a7e8d1ee0365f90ea10de",
15
- "battlegrid-strategy-authoring/SKILL.md": "39cfa46b1f640e6800edb7e85a8f2c4b6b8786cddf71bb8244d172a44fc11d75",
15
+ "battlegrid-strategy-authoring/SKILL.md": "e2422b0e02de6d240bbab261ed1181b32d175bf877f499d7df556eca31ce5133",
16
16
  "battlegrid-strategy-authoring/references/strategy-stage-examples.md": "f10ecdc91f3660a708eee7a7bacefce2acbb46c9cf7e0ac1454bd54f839f39fd",
17
17
  "battlegrid-strategy-doctor/SKILL.md": "24c2208cf6832f1fc34e1b1c52acd8dae10f56b9860aaf27b450a62a9fb74634",
18
- "battlegrid-strategy-examples/SKILL.md": "8b86ab1bbc4fbd743ef56c0fbcb0134d4238f9a72641e5eb66dfbf20cfc139ed",
18
+ "battlegrid-strategy-examples/SKILL.md": "0f652d0944b67bc8798d72779e98549ebbf5a3f183b16f1a79a549e6bb96e174",
19
19
  "battlegrid-strategy-examples/references/playbooks.md": "59996c37eea08e7ce398e49304171939e55c968400a1603597d6737faf9e1771",
20
- "battlegrid-strategy-examples/references/recipes.md": "806aae0b4842408f6e6ed3e108293073f4f31d1c27fa419ad57df9e1134f23e7",
21
- "battlegrid-strategy-examples/references/tradingview-ports.md": "c62ce72b741abe5a92e1dec6615f26b19a54959aa1d29542518cd9a189390b98",
20
+ "battlegrid-strategy-examples/references/recipes.md": "95966649a68ec488a232b150328d94e9f80c45eff30be4da92caf305fba20fb0",
21
+ "battlegrid-strategy-examples/references/tradingview-ports.md": "de7be328c5cfada8fde700793b0c1c095a6660d9bf240cb57fe0026fcb56fea8",
22
22
  "battlegrid-trade-analysis/SKILL.md": "140d847f24e98845736d4f0c2e72b318a4d235413f72f072d2fe6d0daa5f64db",
23
23
  "battlegrid-trade-proposal/SKILL.md": "bf8f3794478cdecc989020bd775c3c91744f72b440b1a90f88f6700c9a61ca24"
24
24
  }
@@ -171,9 +171,13 @@ question you would otherwise guess — and a refusal you would otherwise earn:
171
171
  transform (and a chained transform) reads its series: the read shape, the window's unit, the price
172
172
  basis and what an absent bar does. `seriesHome` says where the metric's series is kept — `candle`,
173
173
  `history`, or `null` when the metric has no series, which is why a series transform does not
174
- compose on it. Window and offset carry a declared `minimum` and a served `maximum` on each metric's
175
- transform entry — the largest value whose read size fits the lookback cap, or `null` when none
176
- does. Stage at most that maximum.
174
+ compose on it. Window and offset carry a declared `minimum` and a served `maximum` on the transform
175
+ entry — the largest value whose read size fits the lookback cap, or `null` when none does. For a
176
+ chained column the outer's declaration is `chainOuterParameters[outer]` (served beside `metric`)
177
+ and its bound is `chainedOuters[outer].windowMaximum`. The window carries a `unit`
178
+ (`seriesElements`, `seriesChanges` for `efficiency`, which reads one bar more than its window, or
179
+ `priorElements` for `pctl`). Stage at most that maximum. A chained column's operands come from
180
+ `chainedOuters[outer].operands`, never from the metric's full `spreadOperands`.
177
181
  - `get_metric_construction_hints` → `rankOrderings`. Present only when rank is composable on that
178
182
  metric, already range-gated server-side — read the offered set rather than deriving one from
179
183
  the metric's native output.
@@ -38,8 +38,13 @@ Before committing a CREATE, every "no" here is a decision to state, not an omiss
38
38
  | `spread` | `<base>_<operand>_spread` | `mark_oracle_spread` |
39
39
  | `aggregate` wN | `<code>_mean<N>` | `rate_mean24` |
40
40
  | `rank` | `<code>_rank_<hi\|lo\|far\|near>` — ordinal, `lte N` = top-N | `bbWidthPct_rank_lo` |
41
- | `efficiency` wN | `<code>_er` (1 straight, ~0 chop) | `close_ltf_er` |
41
+ | `efficiency` wN | `<code>_er` (1 straight, ~0 chop) — N changes, reading N + 1 bars | `close_ltf_er` |
42
42
  | `maxShare` wN | `<code>_maxShare` | `volBase_ltf_maxShare` |
43
+ | `zscore` wN | `<code>_z<N>` (population σ; bands ±1, ±2) | `RSI14_z20` |
44
+ | `stddev` wN | `<code>_sd<N>` (population σ, the input's units) | `close_sd20` |
45
+ | `linregSlope` wN | `<code>_slope<N>` (least-squares slope per bar) | `EMA20_slope20` |
46
+ | `pctl` wN | `<code>_pctl<N>` (0–100 against the N prior bars) | `RSI14_pctl20` |
47
+ | `rollingMin` / `rollingMax` wN | `<code>_min<N>` / `<code>_max<N>` | `low_min20`, `high_max20` |
43
48
  | `classifyZone` / `classifyState` | `<code>_zone` / `<code>_state` | `RSI14_zone`, `ADX14_state` |
44
49
  | `levelInteraction` | `<code>_lvl`, `<code>_lvl_b<N>` at a buffer of N bps | `bbUpper20_lvl`, `bbUpper20_lvl_b25` |
45
50
  | any, stored `"bars": "all"` | `<code>_dev`, then the transform's suffix | `RSI14_dev_t1` |
@@ -502,7 +507,8 @@ its side replaces it.
502
507
  clause over it reads FALSE.
503
508
  - **A swing level does not remember a broken level.** Two to four bars after a break the level steps
504
509
  to the next swing, so a retest of the BROKEN level is not a swing-level read.
505
- - **The two levels take** `distance`, `spread`, `aggregate`, `trajectory`, `efficiency` and
510
+ - **The two levels take** `distance`, `spread`, `aggregate`, `trajectory`, `efficiency`, the
511
+ statistics (`zscore`, `stddev`, `linregSlope`, `pctl`, `rollingMin`, `rollingMax`) and
506
512
  `levelInteraction`, and both rank across the board
507
513
  (`dist_fractalHi_rank_near`: the coins closest to their own last swing high).
508
514
  - **The break is the crossing toward the level.** `dist_fractalHi crossesAbove 0` is a close through the
@@ -30,7 +30,7 @@ rather than events all live there. This document assumes them.
30
30
  | Closed-bar-only trajectory | add `"bars": "closed"` to any trajectory | same, drawn from closed bars |
31
31
  | Extension from trend | `{ "metric": "SMA50", "transformId": "distance", "timeframe": { "rel": "anchor" } }` | `dist_SMA50` (signed %) |
32
32
  | Funding paid over a day | `{ "metric": "FUNDING_RATE", "transformId": "aggregate", "timeframe": { "rel": "anchor" }, "window": 24 }` | `rate_mean24` |
33
- | Chop filter on the entry rung | `{ "metric": "CLOSE", "transformId": "efficiency", "timeframe": { "rel": "lower" }, "window": 5, "bars": "closed" }` | `close_ltf_er` (≥0.6 directional) |
33
+ | Chop filter on the entry rung | `{ "metric": "CLOSE", "transformId": "efficiency", "timeframe": { "rel": "lower" }, "window": 4, "bars": "closed" }` | `close_ltf_er` (≥0.6 directional; 4 changes, the last 5 closes) |
34
34
  | One-bar volume concentration | `{ "metric": "VOLUME", "transformId": "maxShare", "timeframe": { "rel": "lower" }, "window": 4, "bars": "closed" }` | `volBase_ltf_maxShare` |
35
35
  | Room to structure | `{ "metric": "STRUCT_ZONES", "transformId": "nearestZoneDist", "timeframe": { "rel": "regime" }, "side": "resistance" }` | `zones_htf_resist_dist` |
36
36
  | Last **closed** daily read | `{ "metric": "RSI14", "transformId": "value", "timeframe": { "abs": "1d" }, "bars": "closed" }` | `RSI14_1d` — the newest completed daily bar |
@@ -15,6 +15,7 @@ engine) and names its substitutions where the catalog lacks a primitive.
15
15
  - Pivot highs / lows, HH-HL structure and break of structure
16
16
  - Chaikin Money Flow
17
17
  - Now native, formerly substituted
18
+ - Statistics over a series' own history
18
19
 
19
20
  ## TradingView ports — familiar processes, studio vocabulary
20
21
 
@@ -115,3 +116,20 @@ rules about the columns themselves, not about porting — they live in the skill
115
116
  `PRIOR_SWING_FRACTAL_HIGH`/`PRIOR_SWING_FRACTAL_LOW` and their ages
116
117
  `SWING_FRACTAL_HIGH_BARS_AGO`/`SWING_FRACTAL_LOW_BARS_AGO`), and Chaikin Money Flow (`CMF20`). Port
117
118
  these directly — do not offer a substitute for a primitive the catalog serves.
119
+ - **Statistics over a series' own history** — the windowed transforms port the common Pine idioms
120
+ one for one, over any metric with a series and over a `distance` or `spread`:
121
+ - the `er` function of the common Pine libraries, `math.abs(x - x[n]) / math.sum(math.abs(x - x[1]), n)`,
122
+ is `x × efficiency` at window `n` — the window counts CHANGES, so `er(close, 10)` is window 10 and
123
+ reads 11 bars;
124
+ - the z-score idiom `(x - ta.sma(x, n)) / ta.stdev(x, n)` is `x × zscore` at window `n`
125
+ (`RSI14_z20`), population σ as `ta.stdev` defaults to, banded at ±1 and ±2;
126
+ - `ta.stdev(x, n)` is `x × stddev` (`close_sd20`, in the input's own units);
127
+ - `ta.percentrank(x, n)` is `x × pctl` at window `n` — the `n` bars BEFORE the newest, ties at or below;
128
+ - `ta.highest(x, n)` / `ta.lowest(x, n)` are `x × rollingMax` / `x × rollingMin` (`high_max20`
129
+ is `DONCHIAN_UPPER`'s same-bar rail);
130
+ - a linear-regression slope over `n` bars (TA-Lib's `LINEARREG_SLOPE`) is `x × linregSlope`, the
131
+ least-squares slope per bar — not Pine's `ta.linreg(x, n, 0) - ta.linreg(x, n, 1)`, which differs
132
+ two fits.
133
+
134
+ Each reads null where its newest or oldest bar holds no value, or where fewer bars exist than the
135
+ window reads.