Skip to main content

qjtrader-mcp

For Claude web, mobile, or another hosted assistant, prefer the hosted QJTrader OAuth connector offered inside QJ Gateway. It provides delegated per-user access without putting QJ_CLIENT_SECRET in chat. This package is the local/stdio implementation for Claude Code and controlled local runtimes.

PyPI version Python versions License

Model Context Protocol server for the QJ Trader AI Trading APIs. Point your LLM at your QJ credential and it can watch live Canadian and selected US market data and place simulated orders — no code, no manual API testing.

Built on the official qjtrader Python SDK. Talk to it from Claude Code, Claude Desktop, or any MCP-capable client:

"Check market availability, then compare CA:RY, MX:CRAU26, and US:@ESU26 in the sandbox. Show the books and explain which production permissions would be separate."

Verified selected US futures also include the canonical Treasury symbols US:@USU26 (30-Year Bond), US:@TYU26 (10-Year Note), and US:@FVU26 (5-Year Note).

Verifiable releases. qjtrader-mcp is published straight from this repository via PyPI Trusted Publishing with signed PEP 740 provenance — no manual uploads, no stored tokens. Before you let an agent install it, you (or the agent) can confirm each release was built by QJTrader/qjtrader-mcp from the Provenance section on PyPI. See SECURITY.md.

Safety model — AI trades simulated by default

Order-mutating tools (place_order, cancel_order, replace_order, cancel_all) use the Gateway's authenticated session response as the authority. Sandbox, paper, and shadow credentials cannot be mistaken for live credentials by a stale local setting. Canary and live credentials are refused unless you explicitly opt in.

Server-declared order environment Read tools (quotes/depth/status) Order tools
sandbox ✅ simulated
paper / shadow ✅ non-exchange mutation path
canary / live ⛔ unless QJ_MCP_ALLOW_LIVE=1
unavailable or mismatched ✅ where possible ⛔ fail closed

QJ_ENV is now an optional expected-environment assertion, not the source of truth. If it disagrees with the Gateway, mutations stop with an explanation. Every tool result includes an environment tag, and order quantity is capped client-side by QJ_MCP_MAX_QTY (default 25).

Install

Get a free sandbox credential (no approval) at gateway.qjtrader.ai.

The zero-install path is:

uvx qjtrader-mcp        # or: pipx run qjtrader-mcp

For local development against the SDK checkout:

# from the qjtrader-mcp/ directory, with the qjtrader-python sibling checked out:
uv sync && uv run qjtrader-mcp          # uv resolves qjtrader from ../qjtrader-python
# — or with pip —
pip install -e ../qjtrader-python -e .
qjtrader-mcp

Configure your client

Claude Code

claude mcp add qjtrader -- uvx qjtrader-mcp
# then set the credential + environment for the server:
claude mcp add qjtrader \
  -e QJ_CLIENT_ID=your-client-id \
  -e QJ_CLIENT_SECRET=your-client-secret \
  -e QJ_ENV=sandbox \
  -- uvx qjtrader-mcp

Claude Desktop / generic stdio

Add to your MCP config (claude_desktop_config.json or equivalent):

{
  "mcpServers": {
    "qjtrader": {
      "command": "uvx",
      "args": ["qjtrader-mcp"],
      "env": {
        "QJ_CLIENT_ID": "your-client-id",
        "QJ_CLIENT_SECRET": "your-client-secret",
        "QJ_ENV": "sandbox"
      }
    }
  }
}

The console's "Connect your AI" panel generates these blocks pre-filled, including QJ_ENV=sandbox.

Tools

Tool Kind Description
session_info read Authoritative environment plus the Data products, Order Entry products, and trading accounts active on this key. Call first.
market_availability read, offline Product-by-product sandbox vs production data/order support, verified examples, and known gaps. Call before assuming a product has depth or order authority.
access_status human account read Shows products and requests after qjtrader login; machine trading keys do not grant this authority.
request_production_access human request Requests account-level Data or Order Entry access through the signed-in user API, or returns a safe browser handoff when login is absent. It cannot approve, promote, or choose internal routes.
request_limit_change human request Requests product-specific cloud API safeguards for a production key. Broker/Desktop risk controls remain independent and unchanged.
search_universe read Search current symbol forms and capability metadata by market or text
describe_instrument read Describe one symbol, its product identity, venue scope, and available operations

market_availability also returns an observation_contract and source-aware data_shapes. Agents must preserve null or silence as "unquoted now," treat orders/venues on depth levels as optional, and never infer Greeks, NAV, contract terms, depth, or order authority from the security type alone. Canadian get_depth results include rounded Top5, odd/special-lot views, entitled order_bids/order_asks QJ/TMX TL2 rows, and source timing/provenance. Check meta.stale and meta.transport_age_ms before acting: a connected source can still be delayed by an uplink backlog, reported as meta.stale_reason="transport_backlog". Initial cached books expose meta.cached_snapshot=true and meta.snapshot_age_ms; report that age separately from relay latency. History and statistics also carry source=synthetic|recorded|unavailable plus availability. Production never substitutes generated bars when capture is absent. Production market memory follows attention: bars accumulate while a symbol is observed, while a continuous pin keeps a standing watch and richer event capture. Use watch(..., all_venues=true) to request consolidated plus every entitled Canadian venue book with one logical root. The read-only data_doctor tool reports the exact server expansion, CBBO, per-venue readiness, transport-age distribution, stale observations, and truncation without placing an order. | get_quote | read | Top-of-book (best bid/ask) for one or more symbols | | get_depth | read | Level-2 order book for a symbol (venue-tagged on consolidated books) | | watch | read | Sample the live stream for a bounded window; returns a digest + last messages | | data_doctor | read | Validate all-venue expansion, CBBO, freshness, completeness, and truncation without trading | | list_orders | read | Open orders + session state | | list_trades | read | Individual fills and broker cancel/correct adjustments, with account and strategy-run attribution | | get_positions | read | Broker-truth positions (broker + fill = total), cloud-route and Desktop-profile safeguards, estimated capital in current positions, and order plane | | place_order | write | Submit a limit order and wait for a terminal state | | cancel_order | write | Cancel a working order by cid | | replace_order | write | Amend a working order's qty/price | | cancel_all | write | Cancel every working order (kill switch) | | explain_symbol | util | Parse/explain a symbol (prefix + root + venue), offline | | read_events | read | Order journal — cross-order event history; post-trade analysis & strategy debugging | | get_history | read | Historical OHLCV bars (1s/1m) with synthetic/recorded/unavailable provenance | | get_stats | read | Server digest plus the same history provenance (a digest, not a dump) | | get_recording_status | read | Explain whether a symbol is ready, observed now, or kept in continuous memory | | get_market_events | read | Retrieve recorded quotes, trades, Level 2, and exchange events for sub-second research | | get_close_flow | read | Retrieve normalized MX Basis Trade on Close lifecycles across recorded contracts | | get_auction_imbalance | read | Retrieve authoritative Canadian-equity MOC imbalance history and aggregated closes | | keep_recording | data setting | Keep an entitled production symbol recording after apps disconnect; cannot trade | | stop_recording | data setting | Remove continuous memory and return to automatic observation-driven bars | | get_chain | read | Options chain snapshot for an underlying/expiry (latest or historical) | | compare | read | Rank a digest metric (vwap/volume/realized_vol/spread_mean) across symbols |

The read_*/get_* research tools make the LLM a quant developer: analyse the market and debug the strategy it wrote, without touching the production order path.

Configuration reference

Env var Purpose Default
QJ_CLIENT_ID / QJ_CLIENT_SECRET credential — (required)
QJ_ENV Optional expected environment; mismatch refuses mutations unset
QJ_MCP_ALLOW_LIVE set 1 to authorize live order actions off
QJ_MCP_MAX_QTY client-side max order quantity 25
QJ_DATA_HOST / QJ_ORDERS_HOST endpoint overrides public QJ hosts
QJ_CA_FILE pin a CA/cert (pilot order endpoint) none

License

Apache-2.0. See LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

qjtrader_mcp-0.4.16.tar.gz (32.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

qjtrader_mcp-0.4.16-py3-none-any.whl (26.6 kB view details)

Uploaded Python 3

File details

Details for the file qjtrader_mcp-0.4.16.tar.gz.

File metadata

  • Download URL: qjtrader_mcp-0.4.16.tar.gz
  • Upload date:
  • Size: 32.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for qjtrader_mcp-0.4.16.tar.gz
Algorithm Hash digest
SHA256 398c699275925b857d917f46537259f4fc092dc631f7557e7688883c8a46e1ed
MD5 24256536cf813ea12411e48699442392
BLAKE2b-256 3d22dedbade3fef4eec24317e4325af7a4b4c836e88a23d5936d63be877d710b

See more details on using hashes here.

Provenance

The following attestation bundles were made for qjtrader_mcp-0.4.16.tar.gz:

Publisher: publish.yml on QJTrader/qjtrader-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qjtrader_mcp-0.4.16-py3-none-any.whl.

File metadata

  • Download URL: qjtrader_mcp-0.4.16-py3-none-any.whl
  • Upload date:
  • Size: 26.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for qjtrader_mcp-0.4.16-py3-none-any.whl
Algorithm Hash digest
SHA256 9bb6ae296dff8b2b20437424f8b682344596cd026b063c082d8136d49544bc37
MD5 0e5969dc529d3899d1cc4ff3f5a2dd09
BLAKE2b-256 faff05d7eae019ab5e0a0394592c10ba7856ebe0357bd58831021eb4454e3b51

See more details on using hashes here.

Provenance

The following attestation bundles were made for qjtrader_mcp-0.4.16-py3-none-any.whl:

Publisher: publish.yml on QJTrader/qjtrader-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page