Skip to content

Commit a896550

Browse files
chore(publish): sync internal a29d0d8 (#5)
1 parent 7e0274a commit a896550

6 files changed

Lines changed: 31 additions & 9 deletions

File tree

.claude-plugin/marketplace.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
"ninjatrader-demo": {
3737
"type": "http",
3838
"url": "https://mcp-demo.tradovateapi.com/mcp"
39+
},
40+
"ninjatrader-live": {
41+
"type": "http",
42+
"url": "https://mcp-live.tradovateapi.com/mcp"
3943
}
4044
},
4145
"skills": [

.claude-plugin/plugin.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
"ninjatrader-demo": {
2323
"type": "http",
2424
"url": "https://mcp-demo.tradovateapi.com/mcp"
25+
},
26+
"ninjatrader-live": {
27+
"type": "http",
28+
"url": "https://mcp-live.tradovateapi.com/mcp"
2529
}
2630
},
2731
"skills": [

.codex-plugin/plugin.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
"ninjatrader-demo": {
2323
"type": "http",
2424
"url": "https://mcp-demo.tradovateapi.com/mcp"
25+
},
26+
"ninjatrader-live": {
27+
"type": "http",
28+
"url": "https://mcp-live.tradovateapi.com/mcp"
2529
}
2630
},
2731
"interface": {

README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Full documentation lives at [`docs.ninjatrader.com/mcp`](https://docs.ninjatrade
77
![Sample chart output. ES 5m with VWAP, Buy and Sell fills, stop and target levels](assets/sample-chart.png)
88

99
> [!IMPORTANT]
10-
> This beta connects to the demo server only, so nothing here reaches a live account. The skills propose orders and never submit them, and you approve every payload. See [Safety and disclosures](https://docs.ninjatrader.com/mcp/safety).
10+
> This beta runs on two separate servers: Demo, which trades simulated money, and Live, which trades real money. Start on Demo. The skills propose orders and never submit them, and you approve every payload. See [Safety and disclosures](https://docs.ninjatrader.com/mcp/safety).
1111
1212
## Skills
1313

@@ -48,16 +48,19 @@ codex plugin add ninjatrader@mcp-skills
4848
codex mcp login ninjatrader-demo
4949
```
5050

51+
Log in to `ninjatrader-live` instead to trade a live account. The plugin bundles both servers.
52+
5153
### Skills CLI
5254

5355
```bash
5456
npx skills add NT-NinjaTrader/mcp-skills
5557
```
5658

5759
> [!NOTE]
58-
> The skills CLI installs the skills only, and it doesn't register the MCP server. Register it separately:
60+
> The skills CLI installs the skills only, and it doesn't register the MCP server. Register the server you want:
5961
> ```bash
6062
> claude mcp add --transport http ninjatrader-demo https://mcp-demo.tradovateapi.com/mcp
63+
> claude mcp add --transport http ninjatrader-live https://mcp-live.tradovateapi.com/mcp
6164
> ```
6265
> The first tool call opens the OAuth flow. Full instructions for every client, including Claude Desktop and ChatGPT, are in [Connect Your AI Agent](https://docs.ninjatrader.com/mcp/connect).
6366
@@ -67,7 +70,7 @@ The marketplace listing awaits review. Meanwhile, add the server from this repo'
6770
6871
## Prerequisites
6972
70-
- A Tradovate or NinjaTrader account with demo access.
73+
- A Tradovate or NinjaTrader account with demo or live access.
7174
- Python 3.10+, used by the analytics scripts the skills run.
7275
- `matplotlib`, only for `chart-render`. The script declares it inline, so `uv run` installs it for you.
7376

mcp.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
"ninjatrader-demo": {
55
"type": "http",
66
"url": "https://mcp-demo.tradovateapi.com/mcp"
7+
},
8+
"ninjatrader-live": {
9+
"type": "http",
10+
"url": "https://mcp-live.tradovateapi.com/mcp"
711
}
812
}
913
}

scripts/manifest-lint.sh

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ def servers(path):
300300
301301
302302
key_entries = []
303-
url_entries = []
303+
url_by_name = {}
304304
for path in SERVER_MANIFESTS:
305305
label, block = servers(path)
306306
if not isinstance(block, dict):
@@ -310,13 +310,16 @@ for path in SERVER_MANIFESTS:
310310
for name in sorted(block.keys()):
311311
value = block[name]
312312
url = value.get("url", MISSING) if isinstance(value, dict) else MISSING
313-
url_entries.append((label + "[" + name + "].url", url))
313+
url_by_name.setdefault(name, []).append(
314+
(label + "[" + name + "].url", url))
314315
315-
# The server-registration name. A client builds the qualified tool name
316-
# from this key, so a drift breaks every tool reference in the skills.
316+
# The server-registration names. A client builds the qualified tool name
317+
# from these keys, so a drift breaks every tool reference in the skills.
317318
compare("mcpServers key", key_entries)
318-
# The endpoint. All four files must name the same server.
319-
compare("mcpServers url", url_entries)
319+
# The endpoint of each server. Every manifest must name the same URL for a
320+
# given server. Distinct servers differ, so compare within one name only.
321+
for name in sorted(url_by_name):
322+
compare("mcpServers url", url_by_name[name])
320323
321324
# The skills array. The two Claude manifests must agree with each other
322325
# and with the directories on disk. Claude Code refuses to load the

0 commit comments

Comments
 (0)