Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/backtest-kit/ai-trading-mcp/llms.txt

Use this file to discover all available pages before exploring further.

CC_SYMBOL_LIST is a comma-separated list of Binance spot symbols that AI Trading MCP is permitted to trade. At startup, the engine spawns one Live.background() loop per symbol in the list — each loop maintains a live candle subscription, feeds price data into the strategy, and wires the symbol into the three MCP tools. A symbol that is not on the list cannot be opened, regardless of what the Telegram feed says or what the agent requests. The rejection happens engine-side, not through prompt engineering.

Default Symbol List

The default whitelist contains 13 pairs:
BTCUSDT,POLUSDT,ZECUSDT,HYPEUSDT,DOGEUSDT,SOLUSDT,PENGUUSDT,TRXUSDT,HBARUSDT,NEARUSDT,FARTCOINUSDT,ETHUSDT,PUMPUSDT
These are the symbols that were active when the demo strategy was built. You should review and narrow this list for your own deployment — see Performance Considerations below.

How the List Is Parsed

CC_SYMBOL_LIST is read and split at startup in packages/main/src/config/params.ts:
function parseSymbolList(envVar: string, fallback: string) {
  const originList = process.env[envVar] || fallback;
  return originList
    .split(",")
    .map((s) => s.trim());
}

export const CC_SYMBOL_LIST = parseSymbolList(
  "CC_SYMBOL_LIST",
  "BTCUSDT,POLUSDT,ZECUSDT,HYPEUSDT,DOGEUSDT,SOLUSDT,PENGUUSDT,TRXUSDT,HBARUSDT,NEARUSDT,FARTCOINUSDT,ETHUSDT,PUMPUSDT"
);
Each entry is trimmed of whitespace, so BTCUSDT, ETHUSDT and BTCUSDT,ETHUSDT are equivalent.

How the List Is Used at Startup

Once the strategy and exchange schemas are registered, both the paper and live entrypoints iterate CC_SYMBOL_LIST and call Live.background() for each symbol:
for (const symbol of CC_SYMBOL_LIST) {
  Live.background(symbol, {
    exchangeName: exchangeSchema.exchangeName,
    strategyName: strategySchema.strategyName,
  });
}
Live.background() is the engine’s non-blocking loop primitive. It subscribes to live candles for the symbol, starts the strategy callbacks, and wires the symbol into the MCP tool handlers. Symbols that are not started this way are unknown to the engine and will be rejected if the agent attempts to trade them.

Engine-Side Enforcement

The whitelist enforcement is architectural, not advisory. When the agent calls open_position(symbol, position, note):
  1. The MCP HTTP bridge forwards the call to the trading process.
  2. The engine checks whether symbol has an active Live.background() loop.
  3. If the symbol was not started at boot (i.e., it was not in CC_SYMBOL_LIST), the call is rejected with an error that travels back to the agent as an isError tool result.
No amount of prompt instruction can bypass this — the validation lives in the engine, not in the system prompt.

How to Override

Set CC_SYMBOL_LIST in your environment before starting the trading process:
export CC_SYMBOL_LIST=BTCUSDT,ETHUSDT,SOLUSDT
npm start -- --paper --entry ./content/manual.strategy/manual.strategy.ts --ui
Or add it to your .env:
CC_SYMBOL_LIST=BTCUSDT,ETHUSDT,SOLUSDT
The variable is read once at process start. To change the active symbol list, restart the trading process with the new value.

Naming Convention

Symbols must use the Binance spot format: base asset followed immediately by the quote asset, all uppercase, no separator.
✅ Correct❌ Incorrect
BTCUSDTBTC/USDT
ETHUSDTETH-USDT
SOLUSDTsol_usdt
The symbol string is passed directly to ccxt’s Binance adapter. An incorrectly formatted symbol will cause the Live.background() call to fail at market-data subscription time, usually surfacing as a ccxt BadSymbol error on startup.

Performance Considerations

Each symbol in CC_SYMBOL_LIST creates a persistent candle subscription to Binance’s WebSocket feed. The cost is additive:

Memory

Each Live.background() loop holds a rolling candle buffer plus strategy and signal state in memory. Larger lists push heap usage higher, and with the Redis/Mongo backends, persistence write volume scales proportionally.

API rate usage

Each symbol opens a WebSocket connection and makes periodic REST calls for order state. Binance enforces per-IP and per-key rate limits — a large list brings you closer to them, especially during the initial candle history fetch at startup.
Reducing CC_SYMBOL_LIST is the primary lever for lowering API load and narrowing the agent’s trading universe. If you are running on a resource-constrained host, or if you want to limit the agent to a specific market segment, trimming the list to three to five symbols is a good starting point. The default 13-symbol list was chosen to cover the demo strategy’s range; there is nothing special about the number.

Build docs developers (and LLMs) love