- Trade It cannot withdraw funds, transfer assets, or take custody — it can only place trades
Resources
6Install
npx skillscat add trade-it-inc/trade-it-mcp Install via the SkillsCat registry.
Trade It MCP Skill
Trade It connects MCP clients directly to the user's brokerage accounts. Use the tools below to search assets, review account balances, and place real trades through natural language.
Available Tools
| Tool | Description |
|---|---|
search_assets |
Look up a stock or crypto by ticker or name. Returns current price and metadata. |
get_accounts |
List all linked brokerage accounts with balances. Also used to link new accounts. |
create_trade |
Create a draft equity/crypto buy or sell order for the user to review. |
create_options_trade |
Create a draft single-leg or multi-leg options order for the user to review. |
execute_trade |
Execute a previously created draft trade. Requires explicit user confirmation. |
Safety Model — Read This First
Trade It uses a draft-first execution model. Every trade starts as a draft and is never placed with the broker until the user explicitly confirms.
Required flow:
- Call
create_tradeorcreate_options_trade→ returns a draft order with atrade_id - Display the order details and inform the user they can execute it
- Call
execute_tradeonly when the user explicitly says to execute/confirm/place the trade - Never call
execute_tradeautomatically or immediately after creating a draft
After creating a draft, always tell the user:
"When you are ready, you can place the order by pressing the Execute button."
Execution Flow
User requests trade
↓
[Optional] search_assets — confirm ticker, get current price
↓
[Optional] get_accounts — identify correct account_id
↓
create_trade / create_options_trade → returns draft with trade_id and status: "draft"
↓
Display draft details to user, prompt to confirm
↓
User confirms → execute_trade(trade_id)
↓
Returns updated trade with status: "placed" or "failed"Tool Reference
search_assets
Look up a stock or crypto by ticker symbol or company/coin name.
Parameters:
query(string) — ticker symbol or name (e.g.,"TSLA","Tesla","bitcoin")
Returns: Asset info including current price, ticker, exchange, and asset type.
Example:
{ "query": "TSLA" }get_accounts
List all linked brokerage accounts. Also used when the user wants to connect a new brokerage.
Parameters: (none)
Returns: Array of accounts, each with id, name, brokerage, balance, and available_cash.
Use account.id as the account_id in trade calls when the user specifies a particular account.
create_trade
Create a draft equity or crypto order.
Parameters:
| Field | Type | Required | Description |
|---|---|---|---|
symbol |
string | ✅ | Ticker symbol, e.g. "TSLA" |
amount |
number | ✅ | Quantity to trade |
unit |
"dollars" | "shares" |
✅ | Whether amount is in dollars or shares |
buy_or_sell |
"buy" | "sell" |
✅ | Trade direction |
order_type |
"market" | "limit" | "stop" | "stop_limit" |
❌ | Defaults to "market" |
limit_price |
number | Conditional | Required for limit and stop_limit orders |
stop_price |
number | Conditional | Required for stop and stop_limit orders |
time_in_force |
"day" | "gtc" | "ioc" | "fok" |
❌ | Omit to use brokerage default |
account_id |
number | ❌ | Omit to use user's default account |
Order Types:
| Type | When to Use | Price Fields |
|---|---|---|
market |
Execute immediately at current price | None |
limit |
Execute only at limit_price or better |
limit_price required |
stop |
Trigger market order when stop_price is hit |
stop_price required |
stop_limit |
Trigger limit order when stop_price is hit |
Both stop_price and limit_price required |
Examples:
Buy $500 of Apple at market:
{ "symbol": "AAPL", "amount": 500, "unit": "dollars", "buy_or_sell": "buy" }Buy 10 shares of NVDA only if it drops to $800 or below:
{ "symbol": "NVDA", "amount": 10, "unit": "shares", "buy_or_sell": "buy", "order_type": "limit", "limit_price": 800 }Sell 5 shares of Meta if the price falls to $450 (stop loss):
{ "symbol": "META", "amount": 5, "unit": "shares", "buy_or_sell": "sell", "order_type": "stop", "stop_price": 450 }Buy 10 shares of AAPL if it breaks above $200, but pay no more than $202:
{ "symbol": "AAPL", "amount": 10, "unit": "shares", "buy_or_sell": "buy", "order_type": "stop_limit", "stop_price": 200, "limit_price": 202 }Buy $1,000 of Bitcoin:
{ "symbol": "BTC", "amount": 1000, "unit": "dollars", "buy_or_sell": "buy" }Sell all (100 shares) of Tesla, good till canceled:
{ "symbol": "TSLA", "amount": 100, "unit": "shares", "buy_or_sell": "sell", "time_in_force": "gtc" }create_options_trade
Create a draft single-leg or multi-leg options order (spreads, straddles, etc.).
Parameters:
| Field | Type | Required | Description |
|---|---|---|---|
symbol |
string | ✅ | Underlying ticker, e.g. "SPY", "TSLA" |
legs |
array | ✅ | One or more legs (see below) |
direction |
"debit" | "credit" |
Multi-leg only | Required for spreads. "debit" = you pay; "credit" = you receive |
order_type |
"market" | "limit" | "stop" | "stop_limit" |
❌ | Defaults to "market" |
limit_price |
number | Conditional | Net debit/credit limit for the spread. Required for limit orders. |
time_in_force |
"day" | "gtc" |
❌ | Omit to use brokerage default |
account_id |
number | ❌ | Omit to use default account |
Leg Fields:
| Field | Type | Required | Description |
|---|---|---|---|
type |
"option" | "equity" |
✅ | Leg type |
action |
"buy" | "sell" |
✅ | Buy or sell this leg |
position_effect |
"open" | "close" |
Option legs only | Whether this opens a new position or closes an existing one |
occ |
string | Option legs only | OCC format string (see below). Set to null for equity legs. |
quantity |
number | ✅ | Contracts (options) or shares (equity) |
OCC Format
Options are identified using the OCC (Options Clearing Corporation) standard format:
YYMMDD[C|P]STRIKE| Part | Description | Example |
|---|---|---|
YY |
2-digit year | 25 for 2025 |
MM |
Month, zero-padded | 06 for June |
DD |
Day, zero-padded | 20 for the 20th |
C or P |
Call or Put | C |
STRIKE |
Strike × 1000, 8 digits, zero-padded | 00250000 for $250 |
OCC Examples:
| Description | OCC String |
|---|---|
| Jun 20, 2025 $250 Call | 250620C00250000 |
| Jun 20, 2025 $260 Call | 250620C00260000 |
| Mar 21, 2025 $500 Put | 250321P00500000 |
| Dec 19, 2025 $1,500 Call | 251219C01500000 |
| Jan 16, 2026 $50 Put | 260116P00050000 |
Strike price formula: Multiply dollar strike by 1000, then zero-pad to 8 digits.
- $250 → 250 × 1000 = 250000 →
00250000 - $1,500 → 1500 × 1000 = 1500000 →
01500000 - $50.50 → 50.5 × 1000 = 50500 →
00050500
Options Examples
Single call option — Buy 1 SPY call at $520 strike, expiring Jun 20, 2025:
{
"symbol": "SPY",
"legs": [
{ "type": "option", "action": "buy", "position_effect": "open", "occ": "250620C00520000", "quantity": 1 }
]
}Bull call spread (debit) — Buy TSLA $250 call, sell TSLA $260 call, both expiring Jun 20, 2025:
{
"symbol": "TSLA",
"direction": "debit",
"legs": [
{ "type": "option", "action": "buy", "position_effect": "open", "occ": "250620C00250000", "quantity": 1 },
{ "type": "option", "action": "sell", "position_effect": "open", "occ": "250620C00260000", "quantity": 1 }
]
}Max loss = net debit paid. Max gain = $10 spread width minus net debit.
Bear put spread (debit) — Buy SPY $520 put, sell SPY $510 put, expiring Jun 20, 2025:
{
"symbol": "SPY",
"direction": "debit",
"legs": [
{ "type": "option", "action": "buy", "position_effect": "open", "occ": "250620P00520000", "quantity": 1 },
{ "type": "option", "action": "sell", "position_effect": "open", "occ": "250620P00510000", "quantity": 1 }
]
}Bull put spread (credit) — Sell SPY $510 put, buy SPY $500 put, expiring Jun 20, 2025:
{
"symbol": "SPY",
"direction": "credit",
"legs": [
{ "type": "option", "action": "sell", "position_effect": "open", "occ": "250620P00510000", "quantity": 1 },
{ "type": "option", "action": "buy", "position_effect": "open", "occ": "250620P00500000", "quantity": 1 }
]
}Bull call spread with limit price — Same spread, but only if net debit is $3.50 or less:
{
"symbol": "TSLA",
"direction": "debit",
"order_type": "limit",
"limit_price": 3.50,
"legs": [
{ "type": "option", "action": "buy", "position_effect": "open", "occ": "250620C00250000", "quantity": 1 },
{ "type": "option", "action": "sell", "position_effect": "open", "occ": "250620C00260000", "quantity": 1 }
]
}Close an existing long call — Sell to close 2 AAPL $200 calls expiring Mar 21, 2025:
{
"symbol": "AAPL",
"legs": [
{ "type": "option", "action": "sell", "position_effect": "close", "occ": "250321C00200000", "quantity": 2 }
]
}Straddle — Buy 1 TSLA $250 call and 1 TSLA $250 put, both expiring Jun 20, 2025:
{
"symbol": "TSLA",
"direction": "debit",
"legs": [
{ "type": "option", "action": "buy", "position_effect": "open", "occ": "250620C00250000", "quantity": 1 },
{ "type": "option", "action": "buy", "position_effect": "open", "occ": "250620P00250000", "quantity": 1 }
]
}execute_trade
Execute a draft trade after the user has reviewed and confirmed it.
Parameters:
trade_id(number) — Theidfrom the draft trade returned bycreate_tradeorcreate_options_trade
Returns: Updated trade with status "placed" (or "failed" with error details).
Call this only when:
- The user explicitly says "execute", "confirm", "place it", "go ahead", "do it", or similar
- The trade being confirmed is the most recently reviewed draft
Never call this:
- Automatically after creating a draft
- Without the user seeing the order details first
- If the trade status is not
"draft"
Trade Status Reference
| Status | Meaning |
|---|---|
draft |
Created, not yet submitted to broker |
pending |
Submitted, awaiting broker acknowledgment |
placed |
Accepted by broker, awaiting fill |
partially_filled |
Some contracts/shares have filled |
complete |
Fully filled |
canceled |
Canceled by user or broker |
failed |
Rejected — check error details |
disconnected |
Brokerage connection issue |
Supported Brokerages
| Brokerage | ID | Supports Options |
|---|---|---|
| Robinhood | 1 | ✅ |
| E*TRADE | 2 | ✅ |
| Coinbase | 3 | Crypto only |
| Kraken | 5 | Crypto only |
| Charles Schwab | 7 | ✅ |
| Webull | 8 | ✅ |
| Public | 11 | ✅ |
| Tastytrade | 12 | ✅ |
Clarification Guidelines
Ask for clarification (all at once, not one field at a time) when:
- The order type is ambiguous (e.g., "buy TSLA at $200" — limit or stop?)
- The user requests an options trade but doesn't specify expiry or strike
- Multiple accounts are linked and the user hasn't specified which to use
- The symbol is ambiguous (e.g., ticker collision between stock and crypto)
Do not ask for clarification on fields with clear defaults (amount defaults to the user's default amount, order_type defaults to market, account defaults to the user's primary account).
Disclaimers
- All investing involves risk, including the possible loss of principal
- Trade It is not a financial advisor and does not provide investment advice
- Options trading involves substantial risk and is not appropriate for all investors
- Trade It cannot withdraw funds, transfer assets, or take custody — it can only place trades