# Bracket Trade > Agent-operated stock trading through your brokerage, exposed as an MCP server. Six tools, no SDK. Every position is opened with a stop-loss and a take-profit attached. Bracket Trade is an MCP server first and a web app second. An agent connects over streamable HTTP and gets a scan → review → execute → verify loop. The web app at https://brackettrade.com is where a person sets that up and watches what the agent did. The name is the product rule. Entries are placed as bracket orders, and `verify_protection` exists to find and fix any position that ended up without one. A position holding no stop is treated as a defect, not a style choice. **The bearer token is normally the whole credential.** A subscribed account's brokerage keys are stored server-side, encrypted, and the AI is included in the plan, so tool calls carry no `credentials` object at all. An account may optionally store its own AI provider key, at no extra cost; that changes which model does the thinking and changes nothing about the wire contract. Some accounts instead keep every key on their own side and send them with each request, either in an `X-Trader-Config` header configured once on the MCP client or in a `credentials` argument on the tool call; that path is still served, and an agent using it that stops sending credentials stops trading rather than trading with something we kept. **Nothing runs on a schedule.** Every order originates in a tool call that something made. There is no cron, no background strategy, no position opened while nobody was looking. ## Connect - [MCP endpoint](https://brackettrade.com/api/mcp): Streamable HTTP. Install with `claude mcp add --transport http bracket-trade https://brackettrade.com/api/mcp` - [OAuth protected-resource metadata](https://brackettrade.com/.well-known/oauth-protected-resource): RFC 9728. Names the authorization server and the `mcp` scope. - [OAuth authorization-server metadata](https://brackettrade.com/.well-known/oauth-authorization-server): RFC 8414. OAuth 2.1 with dynamic client registration, so a client can register itself. Authorization is a bearer token on every request. Tokens are issued by Bracket Trade and are not provider credentials. Holding one proves an agent is connected, not that it has anything to trade with. Per-token limits (a daily spend cap and a maximum single order) are enforced server-side on `execute_auto_trade`. ## Tools - **check_market_status** (Reads): Is the market open, and are you in paper or live. - **scan_for_trades** (Reads): Budget, position count, bracket %, and a plain-English strategy prompt → a plan. Requires: budget. - **execute_auto_trade** (Writes): Places the plan as GTC bracket orders. Requires: plan. - **get_positions** (Reads): Holdings and every open order. - **verify_protection** (Writes): Finds unprotected positions and brackets them. - **add_stop_loss** (Writes): Stop or OCO bracket on a single position. Requires: symbol, qty, stopPrice. Bracket defaults are 3% stop-loss and 6% take-profit unless a call says otherwise. `execute_auto_trade` requires the market to be open; a scan does not. ## Credentials Usually there is nothing to send. The account's brokerage keys are stored server-side and the AI is included in the plan, so the bearer token is the whole credential and `credentials` is omitted entirely. An own AI provider key, if the account has added one, is stored the same way and read server-side: the request looks identical either way. For an account that keeps its keys on its own side, there are two ways in, and the better one costs the model nothing: 1. **Transport (preferred).** The MCP client sends an `X-Trader-Config` header configured once in its server definition. The keys never enter the model's context, a tool-call argument, or a transcript. 2. **Per call.** Pass a `credentials` object on each tool call. Needed only where the client cannot set a static header, such as a cloud routine reading its own environment variables. When it is sent, `credentials` takes `alpacaApiKey`, `alpacaSecretKey` and `alpacaMode` (`paper` or `live`, one pair, matching the mode), plus whichever AI provider key the chosen model family needs: `anthropicApiKey`, `openaiApiKey` or `fireworksApiKey`. Selecting a family whose key is absent returns a 400 naming the missing credential. ## Pages - [Home](https://brackettrade.com/): What the product is, the tool table, and the setup path. - [Terms of Service](https://brackettrade.com/terms) - [Privacy Policy](https://brackettrade.com/privacy): What is stored and what is not. - [Cybersecurity Policy](https://brackettrade.com/security): How the platform protects keys and data, and which vendors touch what. - [Financial Disclaimer](https://brackettrade.com/disclaimer): Read this one before acting on anything the scanner returns. - [Pricing and subscription](https://brackettrade.com/subscribe): one plan, $19/month after a 14-day all-access trial that needs no card. The AI is included, subject to a fair-use cap on inference. An own AI provider key can be added at no extra cost, in which case that provider bills the account holder directly for what it uses and the cap no longer applies. The application itself (setup, scan and execute, positions, activity log, connections) is behind a login and will not answer an unauthenticated fetch. ## What this is not - **Not advice.** The scanner asks a language model what looks interesting and returns a plan. It is not a recommendation, it has no view of anyone's circumstances, and it is wrong regularly. See the disclaimer. - **Not a broker.** Your brokerage is the broker and holds the account. Bracket Trade only sends orders to it. - **Not short-side.** Every pick is bought, with the stop below the entry and the target above it. There is no short path, and the scanner is told so. - **Not autonomous.** A person or an agent has to call a tool. Nothing here acts on its own.