@battlegrid/mcp-server 31.2.1 → 31.2.3

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
@@ -49,7 +49,7 @@ import { type Implementation, type Prompt, type Resource } from '@modelcontextpr
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 declare const PACKAGE_VERSION = "31.2.1";
52
+ export declare const PACKAGE_VERSION = "31.2.3";
53
53
  export declare const DEFAULT_URL = "https://mcp.battlegrid.trade/mcp";
54
54
  export interface EnvConfig {
55
55
  apiKeys: string[];
package/dist/index.js CHANGED
@@ -52,7 +52,7 @@ import { ListToolsRequestSchema, CallToolRequestSchema, ListPromptsRequestSchema
52
52
  * being asked. Move it for a change to THIS package — a proxy fix, a dependency bump, a docs
53
53
  * correction. Never move it to track the server.
54
54
  */
55
- export const PACKAGE_VERSION = '31.2.1';
55
+ export const PACKAGE_VERSION = '31.2.3';
56
56
  export const DEFAULT_URL = 'https://mcp.battlegrid.trade/mcp';
57
57
  const MAX_RETRIES = 3;
58
58
  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": "31.2.1",
3
+ "version": "31.2.3",
4
4
  "description": "BattleGrid MCP server — play crypto prediction games from AI agents",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -34,11 +34,14 @@ ladder successor — 1d for a 4h anchor), pinned `{ "abs": "<tf>" }` → `_<tf>`
34
34
  Pins bind to discovery's `rankedTimeframes` (a superset of the anchor set), are fixed across
35
35
  anchor retunes, and `offset` does not change the header — one offset per `metric × timeframe`
36
36
  per section. `offset` is a `value`-transform parameter only: `distance` rejects it (typed
37
- error), so a level is always measured as it stands now — the literal *previous-day* high/low
38
- (PDH/PDL) is not addressable, and the daily swing levels (`zone_1d`, `dist_swingHi_1d`) are
39
- the named nearest level for daily-breakout intents. Conditions compare a column against a
40
- literal, never against another column. Rank ordering semantics: `hi` most positive, `lo` most
41
- negative, `far`/`near` by magnitude (offered only where sign matters).
37
+ error), so a level is always measured as it stands now. That is a statement about `offset`, not
38
+ about prior-day levels: `PDH`/`PDL` are published structure metrics at the daily anchor and take
39
+ `distance` and `crossDetect`, so the literal previous-session extreme is authored as
40
+ `dist_PDH_1d` rather than reconstructed from an offset. The daily *swing* levels (`zone_1d`,
41
+ `dist_swingHi_1d`) are the tracked pivot — a different level, not a substitute. Conditions
42
+ compare a column against a literal, never against another column. Rank ordering semantics:
43
+ `hi` most positive, `lo` most negative, `far`/`near` by magnitude (offered only where sign
44
+ matters).
42
45
 
43
46
  ## Condition patterns
44
47
 
@@ -37,12 +37,12 @@ closes while stops, trailing, and time decay keep managing the position intraday
37
37
 
38
38
  | TradingView script | Verdict | Port anchor |
39
39
  |---|---|---|
40
- | Squeeze Momentum [LazyBear] / TTM Squeeze | **Direct port** — Keltner is native | `BB_UPPER spread KC_UPPER`, `BB_LOWER spread KC_LOWER`, `bollinger_squeeze` |
40
+ | Squeeze Momentum [LazyBear] / TTM Squeeze | **Direct port** — `KC_SQUEEZE` reads the state itself | `KC_SQUEEZE`, `bollinger_squeeze` |
41
41
  | Supertrend / UT Bot Alerts | **Direct port** for the state; flip still substituted | `ST_LINE`, `ST_DIR`, `EMA5_13` for the flip, position-management trailing |
42
42
  | Chandelier Exit | Direct port of the *mechanism* | trailing from entry (`trailingTriggerR: 0`) |
43
43
  | MACD + 200 MA filter | Direct process port | `MACD_cross`, `dist_SMA200`, `macd_bull_cross` |
44
44
  | Golden / Death Cross | Direct process port | `SMA50_SMA200_spread` + `_trend` |
45
- | RSI-2 (Connors) | Named substitute (no RSI-2; RSI7 is the closest series) | `RSI7`, `dist_SMA200`, time decay |
45
+ | RSI-2 (Connors) | **Direct port** — `RSI2` is native | `RSI2`, `dist_SMA200`, time decay |
46
46
  | VWAP reversion | Direct process port | `dist_VWAP`, `dist_VWAP_rank_far` |
47
47
  | Donchian / Turtle breakout | Process port (N-bar channel → swing structure) | `zone`, `dist_swingHi`, `sr_resistance_break` |
48
48
  | ICT/SMC: FVG + Order Blocks | Direct process port of the zone logic | `STRUCT_ZONES` columns + `structure_*` signals |
@@ -145,10 +145,11 @@ the book out of single-name traps. Rules: `ma_sma200_above` 3 required, `ma_ema_
145
145
  **Source process.** In an uptrend (close > 200 SMA), buy panic dips (RSI(2) < 10); exit fast
146
146
  (cross of the 5-period average / a few bars).
147
147
 
148
- **Port — named substitute.** The catalog carries `RSI14` and `RSI7` only, so there is no `RSI2`;
149
- `RSI7` is the fastest RSI series
150
- and `lte 10` on it is a rarer, deeper panic — state that trade-off rather than hiding it.
151
- `DIP_BUY` verdict UP = `dist_SMA200 gt 0` (ref a required `ABOVE_200`) AND `RSI7 lte 10`.
148
+ **Port — direct.** `RSI2` is native as of contract 49.1, so this ports exactly and no substitution
149
+ note is owed. `DIP_BUY` verdict UP = `dist_SMA200 gt 0` (ref a required `ABOVE_200`) AND
150
+ `RSI2 lte 10`. Keep the literal `lte 10` as the gate: `RSI2 × classifyZone` exists and reads on the
151
+ same Connors 10/90 bands, but a zone label is a fixed reading while the literal is a threshold the
152
+ author can see and tune.
152
153
  Rules: `rsi_oversold` 3 required `{"threshold": 25}` (RSI14 gate tuned toward the fast-dip
153
154
  regime — read the signal schema first) · `ma_sma200_above` 2 required · `bollinger_lower_touch`
154
155
  1. The source's fast exit is time, not price: `timeDecayEnabled: true`, grace 180, interval
@@ -181,10 +182,11 @@ in rules (its own params define the break). Turtle exits are the trend preset: s
181
182
  ATR, RR 2+, trail from 1R with giveback 50, no time decay. Mirror with `"breakdown low"` /
182
183
  `dist_swingLo` / `sr_support_break` for shorts. **Daily variant on any anchor:** pin the same
183
184
  structure at 1d — `zone_1d is "breakout high"`, `dist_swingHi_1d gte 0` (both validated) —
184
- which is the studio's daily-breakout condition. Note the substitution: the level is the
185
- tracked *daily swing* pivot, not the literal previous-day high — `distance` takes no `offset`
186
- and clauses never compare two columns, so PDH/PDL as exact levels are not addressable (see
187
- the not-expressible table).
185
+ which is the studio's daily-breakout condition. That pins the tracked *daily swing* pivot. For
186
+ the literal previous-session extreme instead, author `PDH`/`PDL` directly — both are native
187
+ structure metrics at the daily anchor, and both take `distance` and `crossDetect`, so
188
+ `dist_PDH_1d gte 0` or a `crossDetect` on `PDH` expresses the prior-day break exactly. Pick by
189
+ which level the source actually means; neither is a substitution for the other.
188
190
 
189
191
  ## 9 · ICT / Smart Money Concepts: FVG + Order Blocks — 15m/1h
190
192
 
@@ -215,6 +217,19 @@ Williams %R (`WILLR14`), Stochastic RSI (`STOCH_RSI14`), Bollinger boundaries
215
217
  (`BB_UPPER`/`BB_LOWER`), ADX components (`DI_PLUS`/`DI_MINUS`). All arrived with contract 46.1 —
216
218
  every one of them was listed as inexpressible in this file before it.
217
219
 
220
+ Contract 49.1 did it again with seven more: Connors RSI-2 (`RSI2`, and `RSI2 × classifyZone` on its
221
+ own 10/90 bands), the TTM squeeze state (`KC_SQUEEZE`), the 9/21/50 EMAs (`EMA9`/`EMA21`/`EMA50`)
222
+ and the prior-day levels (`PDH`/`PDL`). Two of those were standing absence claims in this file:
223
+ RSI-2 was called a named substitute, and the prior-day levels were said to need a grammar form no
224
+ metric could supply — true of the `distance` offset it cited, and never a reason a PUBLISHED level
225
+ could not exist. Author the prior-day levels at `1d` and nowhere else: a level computed from the
226
+ prior daily bar has no reading on a 15-minute one, and construction refuses it rather than
227
+ resolving empty.
228
+
229
+ Re-read the absence section against the vendored digest before trusting any row in it. That check
230
+ is `skill-contract.test.ts`, and it is the only thing that catches a claim which raises no error
231
+ and merely tells a paying author their strategy cannot be built.
232
+
218
233
  ## Not expressible — the catalog keys this needs
219
234
 
220
235
  The one section where a claim that the catalog LACKS something may live, and every row names the key
@@ -222,14 +237,14 @@ it denies so the claim stays checkable. A claim about the grammar's SHAPE (a cla
222
237
  column against a literal; `distance` rejects an `offset`) is permanent and belongs in prose above.
223
238
  A claim that a metric is absent belongs here, or nowhere.
224
239
 
240
+ Only a bare backticked key counts as the claim — write the neighbour as a column code or an
241
+ expression, never as a lone key, or the row denies a metric that is in fact served.
242
+
225
243
  | Script / primitive | Key the catalog would need | Nearest expressible neighbour |
226
244
  |---|---|---|
227
- | RSI-2 (Connors) | `RSI2` | `RSI7 lte 10` as a named fast-dip substitute |
228
-
229
- **PDH/PDL** stays inexpressible for a different reason, and the distinction matters: `distance`
230
- rejects an `offset` and a clause never compares two columns, so the *grammar* has no form for it.
231
- No metric would fix that. Use the daily swing structure (`zone_1d`, `dist_swingHi_1d`) and name the
232
- substitution.
245
+ | Slow-baseline trend filters (100-period) | `SMA100` | `dist_SMA50` or `dist_SMA200`, whichever the source's horizon is nearer |
246
+ | 200-period EXPONENTIAL baseline | `EMA200` | `dist_SMA200`. Deferred on measurement, not preference: at the platform's warmup floor an exponential 200 still carries 12.4% of its seed bar while a simple 200 is exact over the same window |
247
+ | Prior-WEEK high/low | `PWH` / `PWL` | the prior-DAY levels at the daily anchor, or `zone_1w` structure |
233
248
 
234
249
  Never compile a "port" of these under the source's name without the substitution note — a
235
250
  player who asked for WaveTrend and silently got Stochastic has no way to learn otherwise.