@battlegrid/mcp-server 31.2.0 → 31.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ Seeing package `31.x` alongside handshake `battlegrid@33.x` — the package **be
|
|
|
24
24
|
|
|
25
25
|
**What this changes for you:** nothing about how you call anything. Upgrading the package no longer waits on a server deploy, and a server deploy no longer strands you on a package that names the wrong contract — reconnect and the announcement follows. **Contract breaking-change notes are no longer keyed to package versions**, since a contract move is no longer a release here; the v11-and-earlier notes below are kept as history, and the live vocabulary is always discovery.
|
|
26
26
|
|
|
27
|
-
## Contract history — v37 →
|
|
27
|
+
## Contract history — v37 → v49.3
|
|
28
28
|
|
|
29
29
|
Eleven majors reached authors while this section stopped at v36. That gap is the mechanism, not an
|
|
30
30
|
oversight: since v31 a contract move needs no release here, so nothing forced a note to be written —
|
|
@@ -32,6 +32,27 @@ and the documentation ships inside the tarball, so a note written but unpublishe
|
|
|
32
32
|
Both halves are now closed by a rule keyed to the *served* contract rather than to a release of this
|
|
33
33
|
package.
|
|
34
34
|
|
|
35
|
+
### Accepted again — input that was rejected now compiles
|
|
36
|
+
|
|
37
|
+
Nothing to migrate. This is the one direction that cannot break a client: a body the server used to
|
|
38
|
+
refuse is now stored. Listed because a client that special-cased the refusal can delete that branch.
|
|
39
|
+
|
|
40
|
+
- **An arming trigger no longer constrains its required conditions' clock** (49.2.0,
|
|
41
|
+
`restore-arming-trigger-authoring`). `compile_strategy_plan`, `apply_strategy_plan` and
|
|
42
|
+
`fork_strategy` accept a strategy whose entry trigger is `ON_CANDLE_CLOSE`, `STOP_THROUGH_LEVEL`
|
|
43
|
+
or `ON_RETEST` **while a required condition reads the `LIVE` clock**. v48.1 announced that pairing
|
|
44
|
+
as rejected, naming the offending condition key on `VALIDATION_ERROR`; that refusal is gone.
|
|
45
|
+
|
|
46
|
+
Why it was withdrawn, since the reasoning matters more than the rule: it ran against the whole
|
|
47
|
+
assembled strategy, so it refused *every* edit to a strategy in that shape — a rename, one report
|
|
48
|
+
column, one signal weight — plus restore and fork. For a strategy whose required conditions read
|
|
49
|
+
columns that can never carry a `CLOSE` clock (zone distances, perp/spot flow), there was no legal
|
|
50
|
+
shape to move to at all. And its premise — that the pairing can never fire — was measured before
|
|
51
|
+
the arming lifecycle was corrected, and no longer holds.
|
|
52
|
+
|
|
53
|
+
The underlying question, *should an entry that waits for a close be decided on a forming bar*, is
|
|
54
|
+
now settled where the decision is made rather than by refusing the author's declaration.
|
|
55
|
+
|
|
35
56
|
### Changed meaning, unchanged shape
|
|
36
57
|
|
|
37
58
|
- **Three tools serve different values for identical input** (47.3.0, `derive-scan-fetch-from-report`).
|
|
@@ -158,6 +179,23 @@ package.
|
|
|
158
179
|
|
|
159
180
|
### Reshaped output — the same call returns a different shape
|
|
160
181
|
|
|
182
|
+
- **An entry void now names the gate that refused it** (49.3.0,
|
|
183
|
+
`fix-arming-trigger-clock-authority`), on `get_radar_activity_summary`. In the cause rollup, the
|
|
184
|
+
`ENTRY_VOID` group's `gateCode` widens from always-`null` to `QualificationGateCode | null`: a
|
|
185
|
+
conditions-side void carries the gate that blocked — `AGGREGATE_BELOW_MIN`,
|
|
186
|
+
`REQUIRED_COUNT_BELOW_MIN`, `REQUIRED_CONDITION_FALSE` — while a band void stays `null`, because
|
|
187
|
+
that void happens on a reading that qualified and has no failing gate to name.
|
|
188
|
+
|
|
189
|
+
A client that renders the field through the same enum the response already uses on four other
|
|
190
|
+
cause arms needs no change. One that treated it as a literal `null` — a strict decoder pinning the
|
|
191
|
+
type, or a branch keyed to its absence — sees a value it did not expect. That is the whole
|
|
192
|
+
migration.
|
|
193
|
+
|
|
194
|
+
Why it moved: the group previously collapsed every conditions-side void under one label. The
|
|
195
|
+
first 26 in production carried that label while two different gates had produced them, and none of
|
|
196
|
+
them was a required condition being false. The rollup ships counts rather than rows, so the gate
|
|
197
|
+
could not be recovered client-side.
|
|
198
|
+
|
|
161
199
|
- **The normalized report section loses `timeframe`** (48.0.0, `remove-section-anchor-override`), on
|
|
162
200
|
every tool that publishes a strategy: `get_strategy`, `fork_strategy`, `archive_strategy`,
|
|
163
201
|
`restore_strategy`, `update_strategy_signal_rule`, `apply_strategy_plan`, and
|
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.
|
|
52
|
+
export declare const PACKAGE_VERSION = "31.2.2";
|
|
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.
|
|
55
|
+
export const PACKAGE_VERSION = '31.2.2';
|
|
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
|
@@ -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** —
|
|
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) |
|
|
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 —
|
|
149
|
-
`
|
|
150
|
-
|
|
151
|
-
|
|
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
|
|
@@ -215,6 +216,19 @@ Williams %R (`WILLR14`), Stochastic RSI (`STOCH_RSI14`), Bollinger boundaries
|
|
|
215
216
|
(`BB_UPPER`/`BB_LOWER`), ADX components (`DI_PLUS`/`DI_MINUS`). All arrived with contract 46.1 —
|
|
216
217
|
every one of them was listed as inexpressible in this file before it.
|
|
217
218
|
|
|
219
|
+
Contract 49.1 did it again with seven more: Connors RSI-2 (`RSI2`, and `RSI2 × classifyZone` on its
|
|
220
|
+
own 10/90 bands), the TTM squeeze state (`KC_SQUEEZE`), the 9/21/50 EMAs (`EMA9`/`EMA21`/`EMA50`)
|
|
221
|
+
and the prior-day levels (`PDH`/`PDL`). Two of those were standing absence claims in this file:
|
|
222
|
+
RSI-2 was called a named substitute, and the prior-day levels were said to need a grammar form no
|
|
223
|
+
metric could supply — true of the `distance` offset it cited, and never a reason a PUBLISHED level
|
|
224
|
+
could not exist. Author the prior-day levels at `1d` and nowhere else: a level computed from the
|
|
225
|
+
prior daily bar has no reading on a 15-minute one, and construction refuses it rather than
|
|
226
|
+
resolving empty.
|
|
227
|
+
|
|
228
|
+
Re-read the absence section against the vendored digest before trusting any row in it. That check
|
|
229
|
+
is `skill-contract.test.ts`, and it is the only thing that catches a claim which raises no error
|
|
230
|
+
and merely tells a paying author their strategy cannot be built.
|
|
231
|
+
|
|
218
232
|
## Not expressible — the catalog keys this needs
|
|
219
233
|
|
|
220
234
|
The one section where a claim that the catalog LACKS something may live, and every row names the key
|
|
@@ -222,14 +236,14 @@ it denies so the claim stays checkable. A claim about the grammar's SHAPE (a cla
|
|
|
222
236
|
column against a literal; `distance` rejects an `offset`) is permanent and belongs in prose above.
|
|
223
237
|
A claim that a metric is absent belongs here, or nowhere.
|
|
224
238
|
|
|
239
|
+
Only a bare backticked key counts as the claim — write the neighbour as a column code or an
|
|
240
|
+
expression, never as a lone key, or the row denies a metric that is in fact served.
|
|
241
|
+
|
|
225
242
|
| Script / primitive | Key the catalog would need | Nearest expressible neighbour |
|
|
226
243
|
|---|---|---|
|
|
227
|
-
|
|
|
228
|
-
|
|
229
|
-
|
|
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.
|
|
244
|
+
| Slow-baseline trend filters (100-period) | `SMA100` | `dist_SMA50` or `dist_SMA200`, whichever the source's horizon is nearer |
|
|
245
|
+
| 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 |
|
|
246
|
+
| Prior-WEEK high/low | `PWH` / `PWL` | the prior-DAY levels at the daily anchor, or `zone_1w` structure |
|
|
233
247
|
|
|
234
248
|
Never compile a "port" of these under the source's name without the substitution note — a
|
|
235
249
|
player who asked for WaveTrend and silently got Stochastic has no way to learn otherwise.
|