Authorization
Every call is made by one agent on behalf of one user. The server follows the MCP authorization spec, so most clients need only the server URL:
https://mcp.strike.trading
Who does what
- WorkOS AuthKit is the authorization server, at
https://auth.strike.trading. It handles sign-in (Google, Apple, GitHub, passkey or a one-time email code) and issues every token: OAuth 2.1 authorization code with PKCE, Client ID Metadata Documents (CIMD), dynamic client registration (RFC 7591) for older clients, and the device flow for agents without a browser. - The MCP server is only a resource server. It checks each access token’s signature, issuer, audience (
https://mcp.strike.trading) and expiry. It never issues tokens and never sees your password. - The terminal is where you control agents. Mode, limits and read-only are set there and nowhere else.
Discovery
- A request without a valid token returns
401withWWW-Authenticate: Bearer error="invalid_token", resource_metadata="https://mcp.strike.trading/.well-known/oauth-protected-resource". - The protected resource metadata names the authorization server:
{"resource": "https://mcp.strike.trading", "authorization_servers": ["https://auth.strike.trading"]}. https://auth.strike.trading/.well-known/oauth-authorization-serverlists the endpoints.S256is the only PKCE method. For older clients the MCP host serves the same document at its own/.well-known/oauth-authorization-server.
The flow
- Your client identifies itself, by a Client ID Metadata Document URL or by registering dynamically. No client secret is needed.
- It opens the authorization endpoint with a PKCE challenge. You sign in to strike.trading and approve the connection.
- The client exchanges the code for tokens and sends
Authorization: Bearer <access token>on every request. Access tokens are short-lived (about 5 minutes); the client refreshes them on its own.
Headless agents: the device flow
An agent with no browser (on a server, in CI, in a container) uses the OAuth device flow. The client prints a short code and a link. Open the link on any device, sign in, enter the code, and the agent gets its tokens. Nothing else changes: the agent appears in the terminal like any other.
What happens on first connect
The first token for a new connection creates an agent:
- In paper mode: orders go to Tradier’s sandbox.
- With the default agent limits: 10 contracts and $500 net debit per order, 5 open spreads per symbol, $500 daily loss, 10 orders a minute.
- Able to read and to trade (
ladder:readandorders:write), unless you make it read-only. - Named after the client (the host of its metadata URL, e.g.
claude.ai, otherwiseAgent N). Rename it in the terminal.
It shows up on the Agents screen in the terminal straight away. There is nothing to create beforehand. If you haven’t connected Tradier yet, its tools return tradier_not_connected until you do.
Changing mode, limits and read-only
Only in the terminal, on the Agents screen. The token carries no scopes that matter to us; permissions are per agent, on our side:
| Permission | Allows | When |
|---|---|---|
ladder:read |
All read tools and the ladder:// resource |
Always |
orders:write |
place_order and cancel_order, inside the agent’s limits |
Unless the agent is read-only |
- Mode: paper or live. Live needs Pro. If your Pro plan lapses, live agents switch to paper.
- Limits: tighten or loosen per agent. No MCP call can change a limit.
- Read-only: a read-only agent’s
place_orderandcancel_orderfail withscope.
Changes apply on the agent’s next call.
Halt and revoke
- Halt cancels the agent’s open orders and fails every call with
halteduntil you resume it. - Revoke cancels its open orders and ends the connection for good: its tokens get
401from the next call, even before they expire, and that approval is never accepted again. Reconnecting the client creates a new agent with default limits.
The agent never sees your Tradier credentials.
The agent limit
Free includes 1 agent and Pro includes 3. A connection beyond that still creates the agent, but halted, and every call fails with -32002 and data.reason: "agent_limit". The terminal shows it as over your plan’s agent limit. Revoke another agent and resume this one, or upgrade. See Errors.