trading212-mcp
This server integrates the Trading 212 public API into MCP, enabling account monitoring, portfolio management, market data access, and opt-in trading for equities and ETFs on Invest and Stocks ISA accounts.
Account & Portfolio
Retrieve account summaries: cash breakdown (available, reserved, in pies), investments, realized/unrealized P&L, and total value
List all open positions with quantity, average/current price, unrealized P&L, and FX impact
Fetch details for a single position by ticker
Orders
List all pending equity orders (market, limit, stop, stop-limit) with status, quantities, and prices
Fetch details of a single pending order by ID
Browse executed (historical) orders with fill details and wallet impact (cursor-paginated, newest first)
Pies (Automated Portfolios)
List all pies with money-in, goal progress, performance, and dividend details
Fetch full pie definitions including per-instrument breakdown, weights, and issues (e.g. delisted instruments)
Market Data
List exchanges with working schedules and session open/close times
Search ~17,000 tradable instruments by ticker/name and filter by type (STOCK, ETF, WARRANT, etc.)
History & Reporting
List paid-out dividends with amounts and gross per share (cursor-paginated)
List cash transactions: deposits, withdrawals, fees, and transfers (cursor-paginated)
Check status of CSV export reports and retrieve download links
Write/Trading Tools (opt-in via T212_MCP_ENABLE_TRADING=true)
Place market, limit, stop, and stop-limit orders (positive quantity = BUY, negative = SELL)
Cancel pending equity orders by ID
Create, update, delete, and duplicate investment pies
Request asynchronous CSV export reports of account history
Safety & Configuration
Defaults to demo (paper trading) environment; set
T212_ENV=livefor live tradingTrading tools are hidden unless explicitly enabled via environment flag
Handles HTTP 429 rate limits with automatic retries
HTTP transport binds to
127.0.0.1by default; no built-in authentication on HTTP endpoint (use a reverse proxy)Requires a Trading 212 API key for authentication
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@trading212-mcpshow my portfolio positions"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
trading212-mcp
MCP server for the Trading 212 public API — equities and ETF investing on Invest and Stocks ISA accounts. It exposes the account, portfolio, order, pie, and history endpoints as MCP tools, defaults to the demo (paper trading) environment, and keeps trading tools hidden unless explicitly enabled.
Features
Read coverage of the whole public API: account summary, instrument universe, exchange schedules, open positions, pending orders, pies, historical orders, dividends, cash transactions, and CSV exports.
Trading tools (order placement/cancellation, pie management, export requests) are opt-in via an environment flag and stay invisible to the MCP client otherwise.
Demo environment by default; live is an explicit choice.
Responses are trimmed to the fields a trader acts on, and list tools accept a
limitparameter to keep payloads small.One automatic retry on HTTP 429, honouring the
Retry-Afterheader capped at 30 seconds (Trading 212 rate limits are strict and per-endpoint).stdio transport by default, HTTP (
/mcp) on request.
Related MCP server: tastytrade-mcp
Tools
Read tools (always registered):
Tool | Description |
| Account summary: cash breakdown, investments, and overall result |
| Exchanges with working schedules trimmed to session open/close events |
| Search the tradable instrument universe by ticker/name substring and type |
| List all open positions with quantity, prices, and unrealized P/L |
| Fetch a single open position by its Trading 212 ticker |
| List all pending equity orders |
| Fetch one pending equity order by its id |
| List all pies with money-in, progress, and performance |
| Fetch one pie's full definition and per-instrument breakdown |
| List executed equity orders, newest first (cursor-paginated) |
| List paid-out dividends (cursor-paginated) |
| List cash transactions: deposits, withdrawals, fees, transfers (cursor-paginated) |
| List requested CSV export reports and their processing status |
Write tools (registered only when T212_MCP_ENABLE_TRADING is truthy):
Tool | Description |
| Place a market order (positive quantity = BUY, negative = SELL) |
| Place a limit order with a limit price and DAY/GTC validity |
| Place a stop order that triggers a market order at the stop price |
| Place a stop-limit order (limit order placed once the stop triggers) |
| Cancel a pending equity order by its id |
| Create a new pie from a ticker-to-weight allocation map |
| Replace an existing pie's definition (name and full allocation) |
| Delete a pie by ID (irreversible) |
| Duplicate an existing pie under a new name |
| Request an asynchronous CSV export report of account history |
Configuration
All configuration is via environment variables — never commit credentials.
Variable | Default | Purpose |
| — (required) | API key (Basic auth username), generated in the Trading 212 app |
| — (required) | API secret (Basic auth password) |
|
| Target environment: |
| off | Set to |
Getting started
Run straight from the repository with uv:
uvx --from git+https://github.com/florinel-chis/trading212-mcp trading212-mcpThe server speaks stdio by default; add --transport http --port 8000 to
serve MCP over HTTP at /mcp instead. HTTP binds 127.0.0.1 by default,
and a non-loopback --host is refused unless --allow-remote is also
passed — read the Safety section before using that flag.
MCP client configuration
Add the server to your MCP client's configuration (stdio, via uvx):
{
"mcpServers": {
"trading212": {
"command": "uvx",
"args": ["--from", "git+https://github.com/florinel-chis/trading212-mcp", "trading212-mcp"],
"env": {
"T212_API_KEY": "your-api-key",
"T212_API_SECRET": "your-api-secret"
}
}
}
}Or run the Docker image (build it first, see below):
{
"mcpServers": {
"trading212": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "T212_API_KEY",
"-e", "T212_API_SECRET",
"trading212-mcp"
],
"env": {
"T212_API_KEY": "your-api-key",
"T212_API_SECRET": "your-api-secret"
}
}
}
}Docker
docker build -t trading212-mcp .
# stdio (what MCP clients spawn)
docker run -i --rm -e T212_API_KEY -e T212_API_SECRET trading212-mcp
# HTTP at http://127.0.0.1:8000/mcp — publish the port on loopback only:
# the MCP endpoint is unauthenticated (see Safety)
docker run --rm -p 127.0.0.1:8000:8000 -e T212_API_KEY -e T212_API_SECRET \
trading212-mcp --transport http --host 0.0.0.0 --port 8000 --allow-remote(--host 0.0.0.0 binds inside the container so the port mapping works —
which is why --allow-remote is needed; the 127.0.0.1: prefix on -p
keeps the endpoint reachable from this machine only.)
Safety
The HTTP transport has no authentication: anyone who can reach the
/mcpendpoint can call every registered tool — read the account, and place/cancel orders or delete pies ifT212_MCP_ENABLE_TRADINGis set — all signed with your API key. Keep it bound to127.0.0.1(the CLI default; with Docker, publish as-p 127.0.0.1:8000:8000) or put it behind an authenticating reverse proxy. Never expose it directly on a public or shared network.The server defaults to the demo (paper trading) environment; set
T212_ENV=livedeliberately.Trading tools are not registered — invisible to the MCP client — unless
T212_MCP_ENABLE_TRADINGis truthy.The Trading 212 API is v0 beta: order endpoints are not idempotent (resending a request may create duplicate orders), and rate limits are strict and per-endpoint (each tool documents its limit).
Use at your own risk. Nothing here is investment advice.
Development
uv sync
uv run pytest -q
uv run ruff check .License
MIT
Available Tools
13 toolsget_account_summaryARead-only
Get the account summary: cash breakdown, investments, and overall result.
Returns a dict with:
id: primary trading account number.currency: ISO 4217 primary account currency; every monetary value below is denominated in it.totalValue: total account value (cash plus investments).cash:availableToTrade(free funds),reservedForOrders(held for pending orders),inPies(uninvested cash inside pies).investments:currentValue,totalCost(cost basis of the current holdings),realizedProfitLoss(all-time realized P/L),unrealizedProfitLoss.
Rate limit: 1 request per 5 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds behavioral context: a rate limit of 1 request per 5 seconds, and details about the return structure (dict fields). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main purpose, uses bullet points for clarity, and includes only essential information (return fields and rate limit). Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters, an output schema exists, and the description provides a detailed breakdown of the return dict. Rate limit is also specified. The description is complete for an agent to understand the tool's behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, baseline is 4. The description does not need to add parameter info, but it does not mention that no input is required, which is fine since the schema is empty.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns an account summary including cash breakdown, investments, and overall result (specific verb+resource). It distinguishes itself from sibling tools like get_order, get_pie, get_portfolio, etc., which focus on specific entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for high-level account overview but does not explicitly state when to use this tool versus alternatives. No 'when to use' or 'when not to' guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_orderARead-only
Fetch one pending equity order by its id.
Returns the order's id, ticker, type (LIMIT|STOP|MARKET|STOP_LIMIT), side (BUY|SELL), status, quantity, filledQuantity, limitPrice / stopPrice (when applicable), timeInForce, currency, extendedHours and createdAt. Responds HTTP 404 if no pending order has that id. Rate limit: 1 request per 1 second.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | System order id, as returned when placing. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description adds important behavioral details: it only returns pending orders, responds with 404 if not found, and has a rate limit of 1 request per second. This fully informs the agent of expected outcomes and constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long, front-loaded with the core action, followed by a comprehensive list of return fields and a note on error behavior and rate limit. Every sentence adds value, and there is no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (context indicates 'Has output schema: true'), the description still thoroughly lists all return fields, covers the 404 error case, and specifies the rate limit. For a single-parameter tool, this provides complete contextual information for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers the single parameter order_id with a description stating 'System order id, as returned when placing.' The description does not add new semantic details about the parameter beyond stating that it fetches by id, which is already implied. Schema coverage is 100%, meeting the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Fetch one pending equity order by its id', specifying the exact action, resource, and scope. It distinguishes itself from sibling tools like list_orders (which lists multiple orders) and other get_* tools targeting different entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly says to use this tool when you have an order id and need a single pending order. It mentions returning 404 if the id does not exist, reinforcing its use for exact lookup. While it does not explicitly contrast with siblings like list_orders or list_historical_orders, the context is clear enough for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pieARead-only
Fetch one pie's full definition and per-instrument breakdown.
Returns the pie settings (id, name, icon, goal in account currency, creationDate, endDate, dividendCashAction, initialInvestment, instrumentShares as a ticker-to-weight map, publicUrl) plus an instruments list with each holding's ticker, ownedQuantity, currentShare vs expectedShare (weights, 0..1), result, and any issues (e.g. DELISTED, SUSPENDED) with severity. Raises HTTP 404 if the pie does not exist. Rate limit: 1 request per 5 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| pie_id | Yes | Numeric pie ID from list_pies. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that HTTP 404 is raised if the pie does not exist and specifies a rate limit of 1 request per 5 seconds. This adds behavioral detail beyond the readOnlyHint annotation, which already indicates a read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main purpose and then lists return fields concisely. It is about 70 words with no redundancy, though slightly longer than minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple input (1 parameter) and presence of an output schema, the description thoroughly explains what is returned (pie settings and instrument breakdown), error behavior, and rate limits. It is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description does not add new meaning beyond what the schema provides for the single parameter 'pie_id'. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Fetch one pie's full definition and per-instrument breakdown' with a specific verb and resource. It distinguishes from siblings like 'list_pies' which lists all pies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates the tool retrieves a single pie's details and includes a rate limit, but does not explicitly state when to use it over alternatives (e.g., 'list_pies' or 'get_portfolio'). Usage context is implied but not clarified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolioARead-only
List all open positions in the account.
Returns up to limit positions, each with: ticker (Trading 212
identifier, e.g. "AAPL_US_EQ"), quantity (shares held, fractional
allowed), averagePrice and currentPrice (per share, instrument
currency), ppl (unrealized profit/loss, account currency), fxImpact
(currency-conversion component of ppl, account currency; null when
the instrument trades in the account currency), and initialFillDate
(ISO 8601 timestamp the position was opened).
Rate limit: 1 request per 1 second.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of positions to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the rate limit (1 request per 1 second) and details the response fields, adding valuable behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: action first, then response fields in a clear list, then rate limit. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description thoroughly explains return fields and rate limit. For a simple list tool, it is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with description for 'limit'. The description reinforces the parameter's effect ('Returns up to ``limit`` positions'), adding value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and resource 'all open positions in the account', distinguishing it from siblings like 'get_position' (singular) and 'get_pie'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for listing all positions, but does not explicitly state when to use this tool versus alternatives (e.g., 'get_position' for a single position). No when-not or alternative tool names are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_positionARead-only
Fetch a single open position by its Trading 212 ticker.
Returns the same trimmed fields as get_portfolio: ticker, quantity (shares, fractional allowed), averagePrice and currentPrice (per share, instrument currency), ppl (unrealized profit/loss, account currency), fxImpact (nullable, account currency), initialFillDate (ISO 8601). Errors if there is no open position for the ticker.
Rate limit: 1 request per 1 second.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Trading 212 ticker, e.g. "AAPL_US_EQ" or "TMGl_EQ". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return fields, error behavior (no open position), and rate limit; readOnlyHint annotation is consistent and supplemented by description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three efficient sentences, front-loaded with primary action; no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Fully explains purpose, parameters, return fields, error case, and rate limit for a simple tool with one parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and description repeats ticker purpose; no added meaning beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it fetches a single open position by ticker, distinguishing it from get_portfolio which lists all positions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implicitly contrasts with get_portfolio (returns same trimmed fields) and mentions rate limit; no explicit when-not, but context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dividendsARead-only
List paid-out dividends.
Returns {"items": [...], "next_cursor": str | None}. Each item:
ticker, paidOn (ISO 8601), amount (net, in the account currency),
grossAmountPerShare (in the instrument currency), quantity (shares
held), type (e.g. ORDINARY, INTEREST, CAPITAL_GAINS), reference.
Pass next_cursor back as cursor for the next page; it is null on
the last page. Rate limit: 6 requests per 1 minute.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Items per page. | |
| cursor | No | Pagination cursor from a previous call's next_cursor. | |
| ticker | No | Filter to one Trading 212 ticker, e.g. "AAPL_US_EQ". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds return structure, pagination behavior, and rate limit beyond the readOnlyHint annotation, though no further behavioral details like authorization needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise, front-loaded with purpose, then return format, pagination, and rate limit in a structured, efficient manner.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given output schema exists, description covers return structure, pagination, filtering (ticker), and rate limit, making it complete for usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description explains how to use cursor for pagination, adding meaning beyond schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specifies verb 'List' and resource 'paid-out dividends', distinct from sibling tools that handle orders, accounts, pies, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides pagination usage instructions ('Pass next_cursor back as cursor') and rate limit, but lacks explicit when-not-to-use or comparison to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_exchangesARead-only
List exchanges with working schedules trimmed to session open/close events.
Returns one entry per exchange: id, name (e.g. "NYSE"), and
workingSchedules. Each schedule carries its id (instruments
reference it via workingScheduleId) and events — the time
events filtered down to OPEN and CLOSE (pre-market,
after-hours, overnight, and break events are dropped). Event date
values are ISO 8601 timestamps.
Rate limit: 1 request per 30 seconds (data refreshes server-side every 10 minutes).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of exchanges to return |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true. The description adds valuable behavior: rate limiting (1 request per 30 sec), server-side refresh every 10 minutes, and filtering logic (drops non-OPEN/CLOSE events). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise with two paragraphs: first sentence states purpose, rest adds necessary details. No extraneous information. Well structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description covers the return structure adequately. It also includes rate limits, data freshness, and filtering behavior. Complete for a read-only listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (limit) with schema covering 100% (description in schema: 'Maximum number of exchanges to return'). The tool description adds no extra meaning beyond the schema, so baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool lists exchanges and specifies the output structure (id, name, workingSchedules trimmed to OPEN/CLOSE events). It is specific and distinguishes from sibling tools that deal with accounts, orders, or portfolios.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives, such as list_instruments which might also involve exchanges. The rate limit and refresh info is present but not framed as usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_exportsARead-only
List requested CSV export reports and their processing status.
Returns {"items": [...]} where each report has: reportId, timeFrom, timeTo, dataIncluded (the four include* flags), status, downloadLink (populated once the report is finished). Status values are Mixed-Case, not upper-case: "Queued", "Processing", "Running", "Canceled", "Failed", "Finished". Poll this after request_export until the report's status is "Finished", then fetch the CSV from downloadLink. Rate limit: 1 request per 1 minute.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of reports to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses output format, status values (with case sensitivity), rate limit (1 per minute), and that downloadLink populates only when finished. Annotations already declare readOnlyHint=true, consistent with read behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with full purpose, output spec, usage instruction, and rate limit. Front-loaded: first sentence gives purpose, second details output and usage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists (not shown but indicated true), and description fully covers the response fields and status semantics. Complete for a list/poll tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a description for the single parameter, so baseline is 3. Description adds no extra parameter info beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'List requested CSV export reports and their processing status,' with specific verb and resource. Differentiates from siblings by focusing on CSV exports and polling workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to poll after request_export until status is 'Finished' and provides polling guidance. No explicit when-not or alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_historical_ordersARead-only
List executed (historical) equity orders, newest first.
Returns {"items": [...], "next_cursor": str | None}. Each item has an
"order" part (id, ticker, type LIMIT|STOP|MARKET|STOP_LIMIT, side
BUY|SELL, status, quantity, filledQuantity, limitPrice, stopPrice,
timeInForce DAY|GOOD_TILL_CANCEL, currency, createdAt) and a "fill"
part (filledAt, price, quantity, type e.g. TRADE, tradingMethod
TOTV|OTC) plus a "walletImpact" with netValue and realisedProfitLoss
in the account currency. Pass next_cursor back as cursor to fetch
the next page; next_cursor is null on the last page.
Rate limit: 6 requests per 1 minute.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Items per page. | |
| cursor | No | Pagination cursor from a previous call's next_cursor. | |
| ticker | No | Filter to one Trading 212 ticker, e.g. "AAPL_US_EQ". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint:true already declares read-only behavior. The description adds rich behavioral details: output structure with fields, pagination via cursor, and a rate limit of 6/1min. This exceeds the minimal expectation and fully informs the agent of the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: purpose first, then output format, pagination, and rate limit. Every sentence adds value. It could be slightly more concise by merging some sentences, but is appropriate in length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema (not shown), the description is fully self-sufficient: it explains the output structure, pagination, filtering, and rate limit. For a list tool, this level of detail ensures the agent can use it correctly without additional information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds minor context (e.g., passing cursor back) and an example ticker format, but does not significantly enhance understanding beyond the schema. It meets the baseline without going higher.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists executed (historical) equity orders, newest first. The verb 'list' and resource 'historical equity orders' are specific. It distinguishes from sibling 'list_orders' (likely pending) by emphasizing 'executed' and 'historical', but does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool (to retrieve executed orders) and includes pagination instructions and rate limit. It does not explicitly state when not to use it or compare to siblings, but the context is sufficient for basic usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_instrumentsARead-only
Search the tradable instrument universe.
The API returns the full universe (roughly 17,000 instruments) in one
response with no server-side filtering, so search,
instrument_type, and limit are applied client-side here.
Rate limit: 1 request per 50 seconds — strict. Every call fetches the whole universe, so batch your lookups into one broad search rather than issuing several calls in quick succession.
Returns per instrument: ticker (unique T212 identifier such as
"AAPL_US_EQ"; may contain "/" like "BRK/A_US_EQ"), type, name,
shortName (exchange symbol, may contain dots), isin,
currencyCode (ISO 4217, except "GBX" — pence — for some LSE
lines), maxOpenQuantity (fractional allowed), and
extendedHours (whether it trades outside the regular session).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of instruments to return | |
| search | No | Case-insensitive substring matched against the T212 ticker (e.g. 'AAPL_US_EQ') and the instrument name (e.g. 'Apple') | |
| instrument_type | No | Filter by instrument type (case-insensitive). Common values: STOCK, ETF, WARRANT; the API may also return CRYPTOCURRENCY, FOREX, FUTURES, INDEX, CVR, CORPACT |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds critical behavioral details beyond the readOnlyHint annotation: rate limit (1/50s), client-side filtering, full-universe retrieval, field-level quirks (ticker format, currency exceptions). Completely transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise 8-sentence description with clear structure: purpose, caveats, rate limit, return fields. Every sentence serves a purpose, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given output schema exists and full parameter documentation, description covers all behavioral aspects: no server-side filter, rate limit, and field nuances. Fully complete for the complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage, but description adds significant value: client-side filtering explanation, examples for search matching, common instrument_type values, and behavior of limit. Goes well beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search the tradable instrument universe' with a specific verb and resource. It distinguishes itself from sibling tools that are all specific queries (e.g., get_order, list_orders) by being the only search tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains client-side filtering and rate limit, and advises batching lookups. No sibling tool provides similar search, so no exclusion needed. Lacks explicit 'when not to use' but clear from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ordersARead-only
List all pending (not yet filled/cancelled/expired) equity orders.
Returns a list of order objects with: id, ticker (e.g. 'AAPL_US_EQ'),
type (LIMIT|STOP|MARKET|STOP_LIMIT), side (BUY|SELL), status,
quantity, filledQuantity, limitPrice/stopPrice (when applicable),
timeInForce (DAY|GOOD_TILL_CANCEL), currency, extendedHours,
createdAt. The API returns every pending order; limit truncates
the list locally. Rate limit: 1 request per 5 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of orders to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and description adds rate limit (1 request per 5 seconds) and local truncation behavior of the limit parameter. No contradictions; additional context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is compact yet comprehensive, front-loaded with main purpose, followed by return fields and constraints. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all aspects: what it does, what it returns, parameters, rate limits, and data scope (pending only). Output schema exists, but description still provides useful field details. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter 'limit' with schema coverage 100%. Description adds that limit truncates the list locally, providing behavioral nuance not in schema. The default and constraints are already in schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it lists pending equity orders, specifies the status filter (not yet filled/cancelled/expired), and provides a detailed list of returned fields. This is specific and distinguishes from siblings like list_historical_orders and get_order.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description implies usage for retrieving current open orders by specifying 'pending'. It does not explicitly exclude other use cases or mention alternatives, but the scope is clear enough given sibling tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_piesARead-only
List all pies in the account with money-in, progress, and performance.
Returns a list of pie summaries: id (use with get_pie), cash (money put into the pie, in the account currency), progress (fraction of the goal reached, 0..1), status ("AHEAD" | "ON_TRACK" | "BEHIND"), dividendDetails (gained/inCash/reinvested), and result (invested value, absolute result, result coefficient, current value). The API returns all pies; the limit is applied after fetching. Rate limit: 1 request per 30 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of pies to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description details that the tool is read-only (consistent with readOnlyHint annotation) and discloses the rate limit (1 per 30 seconds), which is valuable behavioral context beyond annotations. It also explains the API returns all pies before applying the limit, offering transparency on pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences plus a list of returned fields. It is front-loaded with the main purpose, then specifies return data and rate limits. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool is a simple list with one optional parameter and an output schema exists (mentioned), the description sufficiently covers return fields, rate limiting, and usage with get_pie. No gaps remain for an agent to understand what it does.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers the 'limit' parameter with description, min, max, default. The description adds that 'the limit is applied after fetching,' which is behavioral semantics not in the schema, enhancing understanding of how the parameter behaves.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists pies with specific financial metrics (money-in, progress, performance). It distinguishes from sibling 'get_pie' which retrieves a single pie. The verb 'List' and resource 'pies' are specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises using with 'get_pie' for details, which implies when to use this tool (listing summaries) vs. retrieving individual ones. However, it does not explicitly state when not to use it or alternative tools for filtering (e.g., no user/workspace filter mentioned), but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_transactionsARead-only
List cash transactions (deposits, withdrawals, fees, transfers).
Returns {"items": [...], "next_cursor": str | None}. Each item:
type (WITHDRAW | DEPOSIT | FEE | TRANSFER), amount (in the
transaction currency), currency, dateTime (ISO 8601), reference
(transaction ID). Unlike the other history endpoints the cursor here
is a string, not a number. Pass next_cursor back as cursor for the
next page; it is null on the last page.
Rate limit: 6 requests per 1 minute.
| Name | Required | Description | Default |
|---|---|---|---|
| time | No | Start listing from this time, ISO 8601 date-time, e.g. "2026-01-01T00:00:00Z". | |
| limit | No | Items per page. | |
| cursor | No | Pagination cursor from a previous call's next_cursor. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses return format, item types, pagination mechanics, and rate limits. This adds significant behavioral context beyond the readOnlyHint annotation, which is already consistent. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (three sentences), front-loads the purpose, and efficiently covers return format, pagination, and rate limiting. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has three parameters, no required fields, and an output schema (implied by description), the description fully explains the tool's behavior, including return structure, pagination, and rate limits. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description adds meaningful details: time uses ISO 8601, limit has default and max, cursor specifically relates to next_cursor and is a string (unlike other endpoints). This enriches parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists cash transactions with specific types (deposits, withdrawals, fees, transfers). It distinguishes itself from sibling history endpoints by noting the cursor is a string, not a number, which differentiates it from other list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides pagination guidance (cursor format, next_cursor usage) and rate limits (6 req/min). It implies use for cash transactions vs. other history endpoints, but does not explicitly state when to avoid or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v0.1.0- First observed
get_account_summary - First observed
get_order - First observed
get_pie - First observed
get_portfolio - First observed
get_position - First observed
list_dividends - First observed
list_exchanges - First observed
list_exports - First observed
list_historical_orders - First observed
list_instruments - First observed
list_orders - First observed
list_pies - First observed
list_transactions
TDQS
Scored across 13 tools
Each tool targets a distinct resource or action (e.g., orders vs. positions vs. pies), and similar operations are differentiated by scope (list vs. single item) or state (pending vs. historical). No overlapping purposes exist.
All tools follow a consistent `verb_noun` pattern with snake_case: `get_*` for single items and `list_*` for collections. No mixed conventions or vague verbs.
13 tools cover the major facets of a trading account (overview, orders, positions, pies, dividends, exchanges, exports, instruments, transactions) without being excessive. Each tool earns its place.
The server is entirely read-only; it lacks tools for creating, modifying, or canceling orders, managing pies (create/update), or initiating trading actions. For a trading platform, these are critical gaps that will limit agent functionality.
Maintenance
Related MCP Connectors
MCP server exposing the Backtest360 engine API as tools for AI agents.
MCP server for OpenMM — exposes market data, account, trading, and strategy tools to AI agents
Open-source MCP server for Zerodha Kite Connect. Portfolio, market data, backtesting, alerts.
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server for the Trading 212 API. Provides 28 tools for portfolio management, trading, pies, dividends, market data, and analytics.28115 PyPI8MIT
- FlicenseAqualityDmaintenanceMCP server for the tastytrade brokerage API, providing tools for account management, market data, and order execution.18-
- FlicenseAqualityDmaintenanceAn MCP server that wraps the Trading 212 Public API, enabling AI agents to interact with your Trading 212 brokerage account through natural language.16-
- AlicenseNot gradedqualityBmaintenanceExposes Trading 212 trading account, instruments, orders, history, and pies as MCP tools. Allows placing and canceling real orders (defaults to demo/paper environment).Apache 2.0