Skip to main content
Glama
florinel-chis

trading212-mcp

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 limit parameter to keep payloads small.

  • One automatic retry on HTTP 429, honouring the Retry-After header 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

get_account_summary

Account summary: cash breakdown, investments, and overall result

list_exchanges

Exchanges with working schedules trimmed to session open/close events

list_instruments

Search the tradable instrument universe by ticker/name substring and type

get_portfolio

List all open positions with quantity, prices, and unrealized P/L

get_position

Fetch a single open position by its Trading 212 ticker

list_orders

List all pending equity orders

get_order

Fetch one pending equity order by its id

list_pies

List all pies with money-in, progress, and performance

get_pie

Fetch one pie's full definition and per-instrument breakdown

list_historical_orders

List executed equity orders, newest first (cursor-paginated)

list_dividends

List paid-out dividends (cursor-paginated)

list_transactions

List cash transactions: deposits, withdrawals, fees, transfers (cursor-paginated)

list_exports

List requested CSV export reports and their processing status

Write tools (registered only when T212_MCP_ENABLE_TRADING is truthy):

Tool

Description

place_market_order

Place a market order (positive quantity = BUY, negative = SELL)

place_limit_order

Place a limit order with a limit price and DAY/GTC validity

place_stop_order

Place a stop order that triggers a market order at the stop price

place_stop_limit_order

Place a stop-limit order (limit order placed once the stop triggers)

cancel_order

Cancel a pending equity order by its id

create_pie

Create a new pie from a ticker-to-weight allocation map

update_pie

Replace an existing pie's definition (name and full allocation)

delete_pie

Delete a pie by ID (irreversible)

duplicate_pie

Duplicate an existing pie under a new name

request_export

Request an asynchronous CSV export report of account history

Configuration

All configuration is via environment variables — never commit credentials.

Variable

Default

Purpose

T212_API_KEY

— (required)

API key (Basic auth username), generated in the Trading 212 app

T212_API_SECRET

— (required)

API secret (Basic auth password)

T212_ENV

demo

Target environment: demo (paper trading) or live (real money)

T212_MCP_ENABLE_TRADING

off

Set to true/1/yes/on to register the write tools

Getting started

Run straight from the repository with uv:

uvx --from git+https://github.com/florinel-chis/trading212-mcp trading212-mcp

The 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 /mcp endpoint can call every registered tool — read the account, and place/cancel orders or delete pies if T212_MCP_ENABLE_TRADING is set — all signed with your API key. Keep it bound to 127.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=live deliberately.

  • Trading tools are not registered — invisible to the MCP client — unless T212_MCP_ENABLE_TRADING is 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 tools
get_account_summaryA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_orderA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYesSystem order id, as returned when placing.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_pieA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pie_idYesNumeric pie ID from list_pies.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_portfolioA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of positions to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_positionA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tickerYesTrading 212 ticker, e.g. "AAPL_US_EQ" or "TMGl_EQ".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_dividendsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoItems per page.
cursorNoPagination cursor from a previous call's next_cursor.
tickerNoFilter to one Trading 212 ticker, e.g. "AAPL_US_EQ".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_exchangesA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of exchanges to return

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_exportsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of reports to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_ordersA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoItems per page.
cursorNoPagination cursor from a previous call's next_cursor.
tickerNoFilter to one Trading 212 ticker, e.g. "AAPL_US_EQ".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_instrumentsA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of instruments to return
searchNoCase-insensitive substring matched against the T212 ticker (e.g. 'AAPL_US_EQ') and the instrument name (e.g. 'Apple')
instrument_typeNoFilter by instrument type (case-insensitive). Common values: STOCK, ETF, WARRANT; the API may also return CRYPTOCURRENCY, FOREX, FUTURES, INDEX, CVR, CORPACT

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_ordersA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of orders to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_piesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of pies to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_transactionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeNoStart listing from this time, ISO 8601 date-time, e.g. "2026-01-01T00:00:00Z".
limitNoItems per page.
cursorNoPagination cursor from a previous call's next_cursor.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 13 tool updatesv0.1.0
    • First observedget_account_summary
    • First observedget_order
    • First observedget_pie
    • First observedget_portfolio
    • First observedget_position
    • First observedlist_dividends
    • First observedlist_exchanges
    • First observedlist_exports
    • First observedlist_historical_orders
    • First observedlist_instruments
    • First observedlist_orders
    • First observedlist_pies
    • First observedlist_transactions

TDQS

A4.2/5.0

Scored across 13 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness2/5

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

ActivityStale
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    MCP server for the Trading 212 API. Provides 28 tools for portfolio management, trading, pies, dividends, market data, and analytics.
    28
    115 PyPI
    8
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    MCP server for the tastytrade brokerage API, providing tools for account management, market data, and order execution.
    18
    -
  • F
    license
    A
    quality
    D
    maintenance
    An MCP server that wraps the Trading 212 Public API, enabling AI agents to interact with your Trading 212 brokerage account through natural language.
    16
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Exposes 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