Skip to main content
Glama

BotSpot: AI Trading, Backtests and Bots

Start a live deployment

start_deployment
Destructive

Prepares owner review for a new BotSpot deployment; this call does not start a bot or place trades before approval. After explicit owner approval, this is HIGH RISK: the deployment may place real-money trades. Call for an authorized start request even when required saved variables are missing: readiness validation returns the exact missing-variable secure entry cards. Preparing those cards is the next setup step, not a completed start or approval. Never request secret values in chat or claim a schedule was created by this preparation. For an extra iteration of an existing scheduled bot, use run_deployment_once; do not create another deployment. Never use this tool for a direct or one-off buy, sell, or order request. Use place_trade instead; a start_deployment approval is not a trade approval. When the user asks to run, start, turn on, or deploy an attached saved strategy, call this tool to create the website approval request; do not substitute a backtest. Omit brokerCredentialId by default unless the user explicitly named the exact saved broker connection/account to use now. The website approval page is the normal place for visible broker selection and blocks approval until a valid broker is selected. This tool accepts only saved references: aiStrategyRevisionId for code, optional brokerCredentialId for broker access, and optional envVarSetIds for saved non-broker runtime secrets. Broker access must come from a saved broker credential selected in the tool call or on the website approval page. deploymentMode defaults to auto. Auto lets BotSpot choose always-on or scheduled from schedule metadata or schedule policy; the resolved route is shown on the approval action and locked for execution. Use deploymentMode='always_on' only when the user explicitly asks to run continuously. Use deploymentMode='scheduled' only when the user explicitly asks for a schedule and you can provide or reuse schedule metadata/policy. Explicit modes fail instead of silently changing route. When the user asks for a daily schedule and does not name a clock time, do not ask what time or timezone. Call this tool in the same turn with deploymentMode scheduled, runImmediately false, and scheduleMetadata schemaVersion 1, marketSession regular, liveCadenceMatchesBacktest true, source user_instruction, and cadence specific_times at 09:35 America/New_York (five minutes after the US market open, avoiding the turbulent opening minute). For a NEW deployment with an immediate first iteration (including afternoon intraday runs), set runImmediately=true. For one iteration of an EXISTING scheduled deployment, use run_deployment_once; never substitute this start operation or an update. Do not refuse by citing opening-range or market-open+N timing from the recurring schedule; that timing is trading eligibility for later ticks, not a ban on starting an owner-requested one-shot now. For a one-off clock time such as 3:10 p.m., prefer scheduleMetadata with specific_times or event_window for that time and runImmediately=true. For a one-time run "in N minutes", use an event_window window with startAfterApprovalMinutes (at least 3) and durationMinutes instead of startAt, so the run starts N minutes after the owner approves however long the approval takes. An exact startAt that is less than about 4 minutes away is refused, and its approval request expires before that time. Do not pass a broker credential whose status is reconnect_required. Omit brokerCredentialId and still create the start approval; the website approval page lets the owner select, add, or reconnect a broker before approving, including through /account-settings/broker-connections. Non-broker runtime secrets must come from saved environment variables: pass their ids as envVarSetIds. Do not pass raw broker credentials, raw environment variables, raw runtime configuration, inline code, requirements text, API keys, screener exports, CSV rows, JSON row dumps, workbook data, or large base64 blobs. Use broker_connections(action="connect_existing")/list_broker_credentials before deployment, and use saved_env_vars(action="create")/saved_env_vars(action="list") for data-provider API keys or other non-broker runtime secrets. Broker credential key examples: Kalshi (kalshi): KALSHI_API_KEY_ID + KALSHI_PRIVATE_KEY. Optional: KALSHI_SUBACCOUNT, KALSHI_EXCHANGE_INDEX, KALSHI_BASE_URL, KALSHI_WS_URL. Do not pass KALSHI_IS_DEMO; BotSpot derives it from paperOrLive. Example credentialValues: {"KALSHI_API_KEY_ID":"key-id...","KALSHI_PRIVATE_KEY":"private-key-pem..."}. Alpaca (alpaca): ALPACA_API_KEY + ALPACA_API_SECRET OR ALPACA_OAUTH_TOKEN. Do not pass ALPACA_IS_PAPER; BotSpot derives it from paperOrLive. Example credentialValues: {"ALPACA_API_KEY":"PK...","ALPACA_API_SECRET":"secret..."}. Tradier (tradier): TRADIER_ACCOUNT_NUMBER + TRADIER_ACCESS_TOKEN OR TRADIER_ACCOUNT_NUMBER + TRADIER_API_KEY OR TRADIER_ACCOUNT_NUMBER + TRADIER_TOKEN. Optional: TRADIER_REFRESH_TOKEN, TRADIER_OAUTH_CLIENT_ID, TRADIER_OAUTH_CLIENT_SECRET. Do not pass TRADIER_IS_PAPER; BotSpot derives it from paperOrLive. Example credentialValues: {"TRADIER_ACCOUNT_NUMBER":"6AB12345","TRADIER_ACCESS_TOKEN":"token..."}. Charles Schwab (schwab): SCHWAB_ACCOUNT_NUMBER + SCHWAB_TOKEN. Example credentialValues: {"SCHWAB_ACCOUNT_NUMBER":"123456789","SCHWAB_TOKEN":"base64url-token-payload..."}. Tradovate (tradovate): TRADOVATE_USERNAME + TRADOVATE_DEDICATED_PASSWORD + TRADOVATE_CID + TRADOVATE_SECRET. Optional: TRADOVATE_APP_ID, TRADOVATE_APP_VERSION. Do not pass TRADOVATE_IS_PAPER; BotSpot derives it from paperOrLive. Example credentialValues: {"TRADOVATE_USERNAME":"username...","TRADOVATE_DEDICATED_PASSWORD":"dedicated-password...","TRADOVATE_CID":"client-id...","TRADOVATE_SECRET":"secret..."}. TopstepX (projectx-topstepx): PROJECTX_TOPSTEPX_API_KEY + PROJECTX_TOPSTEPX_USERNAME. Optional: PROJECTX_TOPSTEPX_PREFERRED_ACCOUNT_NAME. Example credentialValues: {"PROJECTX_TOPSTEPX_API_KEY":"key...","PROJECTX_TOPSTEPX_USERNAME":"username..."}. WEEX (weex): WEEX_API_KEY + WEEX_API_SECRET + WEEX_API_PASSPHRASE. Example credentialValues: {"WEEX_API_KEY":"key...","WEEX_API_SECRET":"secret...","WEEX_API_PASSPHRASE":"passphrase..."}. Bitunix (bitunix): BITUNIX_API_KEY + BITUNIX_API_SECRET. Optional: BITUNIX_TRADING_MODE. Example credentialValues: {"BITUNIX_API_KEY":"key...","BITUNIX_API_SECRET":"secret..."}. Kraken (kraken): KRAKEN_API_KEY + KRAKEN_API_SECRET. Example credentialValues: {"KRAKEN_API_KEY":"key...","KRAKEN_API_SECRET":"secret..."}. Coinbase (coinbase): COINBASE_API_KEY_NAME + COINBASE_PRIVATE_KEY. Optional: COINBASE_API_PASSPHRASE, COINBASE_SANDBOX. Example credentialValues: {"COINBASE_API_KEY_NAME":"organizations/.../apiKeys/...","COINBASE_PRIVATE_KEY":"-----BEGIN EC PRIVATE KEY-----..."}. Any other CCXT 4.5.64 exchange id (for example okx, binance, bybit, bitget, hyperliquid): use that id as the broker and the credentials it requires, named _API_KEY, _API_SECRET, _API_PASSPHRASE, _UID, _PRIVATE_KEY or _WALLET_ADDRESS. Do not pass _SANDBOX; BotSpot derives it from paperOrLive. memoryGb may be 2, 3, or 4 when the user sets bot memory, including because the strategy needs a browser. Omit memoryGb to keep the current size. Do not send any other size, and do not send a CPU field. CPU stays as it is. Pass memoryGb only with deploymentMode scheduled. A 2, 3, or 4 GB always-on start is rejected because that larger host is not approved; tell the user that start was not placed instead of dropping the memory setting. The tool always creates a short-lived website authorization request and returns an approval URL the user must open while signed in to BotSpot. It does not execute from chat-only approval or reusable grants. No broker secrets are returned to the MCP response. For Codex, Claude, Cursor, and other clients without BotSpot native confirmation cards, return the exact authorizationUrl as a clickable Markdown link in your reply. Do not say a card or button was created unless the client actually rendered it. BotSpot clients may render structuredContent as a native confirmation, but a button name alone is not an approval link. A pending request is not execution; only the signed-in user may approve on the website. Report expiry and check get_deployment_action_status after approval.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "aiStrategyRevisionId": "<aiStrategyRevisionId>"
    },
    "name": "start_deployment"
  }
}

Input Schema

NameRequiredDescriptionDefault
memoryGbNo
acceptancesNo
envVarSetIdsNo
deploymentModeNoauto
idempotencyKeyNo
runImmediatelyNo
scheduleMetadataNo
schedulePolicyIdNo
brokerCredentialIdNo
aiStrategyRevisionIdYes
strategyParameterSetIdNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • addedInput schema / properties / deploymentMode
      Added value: +{
      +  "default": "auto",
      +  "enum": [
      +    "auto",
      +    "always_on",
      +    "scheduled"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / runImmediately
      Added value: +{
      +  "type": "boolean"
      +}
    • addedInput schema / properties / scheduleMetadata
      Added value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "backtestCadence": {
      +      "maxLength": 240,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "billingRoute": {
      +      "enum": [
      +        "scheduled",
      +        "always_on"
      +      ],
      +      "type": "string"
      +    },
      +    "cadence": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": true,
      +          "properties": {
      +            "anchorTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            },
      +            "intervalSeconds": {
      +              "exclusiveMinimum": 0,
      +              "type": "integer"
      +            },
      +            "type": {
      +              "const": "interval",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "type",
      +            "intervalSeconds"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "additionalProperties": true,
      +          "properties": {
      +            "daysOfWeek": {
      +              "items": {
      +                "maximum": 6,
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "maxItems": 7,
      +              "type": "array"
      +            },
      +            "times": {
      +              "items": {
      +                "maxLength": 16,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 48,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "timezone": {
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "type": {
      +              "const": "specific_times",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "type",
      +            "times",
      +            "timezone"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "additionalProperties": true,
      +          "properties": {
      +            "daysOfWeek": {
      +              "items": {
      +                "maximum": 6,
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "maxItems": 7,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "times": {
      +              "items": {
      +                "maxLength": 16,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 48,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "timezone": {
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "type": {
      +              "const": "weekly",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "type",
      +            "daysOfWeek",
      +            "times",
      +            "timezone"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "additionalProperties": true,
      +          "properties": {
      +            "daysOfMonth": {
      +              "items": {
      +                "maximum": 31,
      +                "minimum": 1,
      +                "type": "integer"
      +              },
      +              "type": "array"
      +            },
      +            "ordinalWeekday": {
      +              "additionalProperties": false,
      +              "properties": {
      +                "ordinal": {
      +                  "maximum": 5,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "weekday": {
      +                  "maximum": 6,
      +                  "minimum": 0,
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "ordinal",
      +                "weekday"
      +              ],
      +              "type": "object"
      +            },
      +            "times": {
      +              "items": {
      +                "maxLength": 16,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 48,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "timezone": {
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "type": {
      +              "const": "monthly",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "type",
      +            "times",
      +            "timezone"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "additionalProperties": true,
      +          "properties": {
      +            "event": {
      +              "enum": [
      +                "open",
      +                "close"
      +              ],
      +              "type": "string"
      +            },
      +            "market": {
      +              "enum": [
      +                "US_EQUITIES",
      +                "ALWAYS_OPEN"
      +              ],
      +              "type": "string"
      +            },
      +            "offsetMinutes": {
      +              "default": 0,
      +              "maximum": 240,
      +              "minimum": -240,
      +              "type": "integer"
      +            },
      +            "timezone": {
      +              "default": "America/New_York",
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "type": {
      +              "const": "market_event",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "type",
      +            "market",
      +            "event"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "additionalProperties": true,
      +          "properties": {
      +            "eventType": {
      +              "maxLength": 120,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "type": {
      +              "const": "event_window",
      +              "type": "string"
      +            },
      +            "windows": {
      +              "items": {
      +                "additionalProperties": true,
      +                "properties": {
      +                  "durationMinutes": {
      +                    "maximum": 1440,
      +                    "minimum": 1,
      +                    "type": "integer"
      +                  },
      +                  "endAt": {
      +                    "format": "date-time",
      +                    "type": "string"
      +                  },
      +                  "kind": {
      +                    "maxLength": 80,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "label": {
      +                    "maxLength": 160,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "source": {
      +                    "maxLength": 120,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "startAfterApprovalMinutes": {
      +                    "maximum": 1440,
      +                    "minimum": 3,
      +                    "type": "integer"
      +                  },
      +                  "startAt": {
      +                    "format": "date-time",
      +                    "type": "string"
      +                  },
      +                  "timezone": {
      +                    "maxLength": 80,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              "maxItems": 200,
      +              "minItems": 1,
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "type",
      +            "eventType",
      +            "windows"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "additionalProperties": true,
      +          "properties": {
      +            "daysOfWeek": {
      +              "items": {
      +                "maximum": 6,
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "maxItems": 7,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "endTime": {
      +              "$ref": "#/properties/scheduleMetadata/properties/cadence/anyOf/6/properties/startTime"
      +            },
      +            "shutdownGraceSeconds": {
      +              "default": 0,
      +              "maximum": 3600,
      +              "minimum": 0,
      +              "type": "integer"
      +            },
      +            "startIfInsideWindow": {
      +              "default": true,
      +              "type": "boolean"
      +            },
      +            "startTime": {
      +              "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
      +              "type": "string"
      +            },
      +            "timezone": {
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "type": {
      +              "const": "continuous_window",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "type",
      +            "timezone",
      +            "daysOfWeek",
      +            "startTime",
      +            "endTime"
      +          ],
      +          "type": "object"
      +        }
      +      ]
      +    },
      +    "confidence": {
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "deploymentMode": {
      +      "$ref": "#/properties/deploymentMode",
      +      "default": "auto"
      +    },
      +    "liveCadenceMatchesBacktest": {
      +      "type": "boolean"
      +    },
      +    "marketSession": {
      +      "default": "regular",
      +      "enum": [
      +        "regular",
      +        "extended",
      +        "24/5",
      +        "24/7",
      +        "custom"
      +      ],
      +      "type": "string"
      +    },
      +    "mismatchWarning": {
      +      "maxLength": 500,
      +      "type": "string"
      +    },
      +    "policySource": {
      +      "$ref": "#/properties/scheduleMetadata/properties/source"
      +    },
      +    "requiresAlwaysOn": {
      +      "default": false,
      +      "type": "boolean"
      +    },
      +    "rollout": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "thresholdSeconds": {
      +          "exclusiveMinimum": 0,
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "schemaVersion": {
      +      "default": 1,
      +      "enum": [
      +        1,
      +        2
      +      ],
      +      "type": "number"
      +    },
      +    "source": {
      +      "enum": [
      +        "ai",
      +        "generated",
      +        "refined",
      +        "user_instruction",
      +        "manual_override",
      +        "imported",
      +        "system"
      +      ],
      +      "type": "string"
      +    },
      +    "sourceEvidence": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "file": {
      +            "maxLength": 255,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "line": {
      +            "exclusiveMinimum": 0,
      +            "type": "integer"
      +          },
      +          "reason": {
      +            "maxLength": 240,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "snippet": {
      +            "maxLength": 500,
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "file"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 20,
      +      "type": "array"
      +    },
      +    "windows": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "endAt": {
      +            "format": "date-time",
      +            "type": "string"
      +          },
      +          "kind": {
      +            "maxLength": 80,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "label": {
      +            "maxLength": 160,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "source": {
      +            "maxLength": 120,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "startAt": {
      +            "format": "date-time",
      +            "type": "string"
      +          },
      +          "timezone": {
      +            "maxLength": 80,
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "startAt",
      +          "endAt"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 200,
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "cadence",
      +    "liveCadenceMatchesBacktest",
      +    "source"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / schedulePolicyId
      Added value: +{
      +  "$ref": "#/properties/aiStrategyRevisionId"
      +}
  2. First observed

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already mark the tool as destructive, non-read-only, open-world, and non-idempotent, but the description adds substantial behavioral context beyond them. It explains that this only creates a short-lived website authorization request, returns an approval URL, does not execute from chat-only approval, returns no broker secrets, and requires a signed-in user to approve on the website.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and risk warning are front-loaded, but the description is extremely long and repetitive, especially around runImmediately, broker selection, and schedule behavior. It also includes lengthy Kalshi, Alpaca, Tradier, Schwab, Tradovate, TopstepX, WEEX, Bitunix, Kraken, Coinbase, and CCXT credential examples that belong to broker connection setup, not to start_deployment parameters, so much of the text does not earn its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-risk mutation with a complex nested schedule schema and no output schema, the description covers most operational context: approval flow, return URL, real-money risk, broker selection, scheduling defaults, and status-check follow-up. However, it leaves some parameters undocumented and includes irrelevant credential examples, so it is strong but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 11 parameters, so the description must carry parameter meaning. It explains aiStrategyRevisionId, brokerCredentialId, envVarSetIds, deploymentMode, runImmediately, scheduleMetadata, and memoryGb in detail, but never explains idempotencyKey, acceptances, schedulePolicyId, or strategyParameterSetId. The long exchange-by-exchange credentialValues examples are also not parameters of this tool and do not compensate for those omissions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action — preparing owner review for a new BotSpot deployment — and immediately clarifies that it does not start a bot or place trades before approval. It also distinguishes the tool from run_deployment_once, place_trade, and backtesting, so an agent can identify its role without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance for run/start/turn-on/deploy requests on attached saved strategies, and explicit when-not-to-use guidance: use run_deployment_once for an extra iteration of an existing scheduled bot, use place_trade for direct buy/sell/order requests, and do not substitute a backtest. It also gives decision rules for deploymentMode, runImmediately, scheduling, broker credential omission, and environment variable usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.