etoro-mcp
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., "@etoro-mcpshow my portfolio"
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.
etoro-mcp
MCP server for the eToro public API: market data, balances, portfolio, trade history, watchlists, alerts, investor rankings, user statistics, social feeds, and — behind explicit opt-in gates — trading, watchlist/alert mutations, and social posting. Coverage is organised into toolsets; only the toolsets you select are registered, and write tools are not registered at all unless their gate is enabled — a client connected to the default configuration cannot see or call them.
Features
Read-first by design — 62 read tools across eleven of the twelve toolsets (the
socialtoolset is write-only); the 43 write tools exist only when their gate is set — 5 trading tools behindETORO_MCP_ENABLE_TRADING, the other 38 (watchlist, alert, social, and notification mutations) behindETORO_MCP_ENABLE_WRITES.Demo environment by default — trading tools call the demo endpoint group unless
ETORO_ENV=realis set.Toolset selection — register only what you need via
ETORO_MCP_TOOLSETS; unknown names fail startup rather than serving a partial tool set.Trimmed responses — tools return the fields an investor acts on (prices, units, P&L, timestamps), not raw API dumps; list tools are bounded by a
limitparameter or by explicit range parameters (min_date/max_date/count) on the time-series tools.Credentials stay in the environment — keys travel only in the
x-api-key/x-user-keyheaders, and error messages never echo header or credential values.Rate-limit aware — HTTP 429 responses are retried once, honouring
Retry-After, re-sending the samex-request-idso a retried order cannot fill twice.
Related MCP server: eToro MCP Server
Toolsets
Select toolsets with ETORO_MCP_TOOLSETS (comma-separated; all selects every toolset).
Without it, the trading core is registered:
Toolset | Default | Covers |
| ✓ | Instrument search and details, candles, rates, closing prices, exchanges, instrument types, stock industries |
| ✓ | Profile, balances (aggregated, by account type, history), cash transactions |
| ✓ | Portfolio, P&L, order status, eligibility and cost estimates; gated order/position writes |
| ✓ | Closed-trade history |
| ✓ | Own/public/curated watchlists and recommendations; gated watchlist mutations |
| ✓ | Price alerts; gated alert mutations |
| Investor rankings, presets, tags, sector/industry summaries | |
| User search, profiles, portfolios, performance and copier statistics | |
| News, following, for-you, instrument, and user feeds; posts and comments | |
| Gated posting, comments, replies, reactions, polls, and media upload | |
| eToro Club dashboard | |
| Notifications; gated mark-read |
Tools
Read tools (registered whenever their toolset is selected)
Toolset | Tool | Description |
|
| Search instruments by ticker symbol and return candidate matches (contains-matching, so verify the symbol) |
|
| Display data for instruments by id: name, symbol, type, exchange |
|
| OHLCV candles for one instrument (nine intervals, up to 1000 bars) |
|
| Latest official closing prices per instrument |
|
| Real-time bid/ask quotes for instruments |
|
| Exchanges (id and description) for resolving |
|
| Instrument types (stocks, crypto, ETFs, ...) by id |
|
| Stock industries (id and name) for resolving |
|
| The authenticated user's identity and the scopes their keys carry |
|
| Current balances aggregated across the user's accounts |
|
| Current balances for every account of one account type |
|
| Current balance of one specific account |
|
| Daily balance snapshots over a date range |
|
| Transactions of a cash account, newest pages first |
|
| Aggregated portfolio: account totals plus one aggregate per instrument |
|
| Position-level snapshot: open positions and pending orders |
|
| Portfolio snapshot with unrealized P&L per position |
|
| Look up an order's status by order id or reference id |
|
| Look up a close order's status by its order id |
|
| Per-instrument trading rules: leverage, sizing mode, SL/TP bounds |
|
| Estimate the costs of a hypothetical open order without placing it |
|
| Closed trades since a given date |
|
| The authenticated user's watchlists with their items |
|
| A single watchlist owned by the authenticated user, by id |
|
| Items of the authenticated user's default watchlist |
|
| Another user's public watchlists by their numeric user id |
|
| eToro's curated investment lists available to the user |
|
| Personalized market recommendations for the authenticated user |
|
| The active price alerts on the account |
|
| Names of all publicly available ranking presets |
|
| Investor ranking rows for a named preset |
|
| A filtered, sorted page of investor ranking rows |
|
| The full ranking row for a single investor |
|
| Ranking rows for several investors in one call |
|
| The catalog of ranking tags with resolved names |
|
| The ranking universe aggregated by sector or industry |
|
| Search public investors with performance and risk filters |
|
| Public profile and account summary for one or more users |
|
| A user's live public portfolio: open positions and copy trades |
|
| A user's full monthly and yearly gain history |
|
| A user's day-by-day or aggregated gain over a date range |
|
| A user's trading statistics for a period (copy-trading due diligence) |
|
| An investor's gain time-series at daily, monthly, or yearly resolution |
|
| A portfolio's daily asset-allocation breakdown over time |
|
| A portfolio's daily directional market exposure per instrument |
|
| An investor's live copier count and assets-under-management tier |
|
| Anonymised info about the people copying your portfolio |
|
| Search trader portfolios or Smart Portfolios by free text |
|
| A user's top assets ranked by impressions-based score |
|
| The eToro news feed (editorial and market-news posts) |
|
| Posts from users the authenticated user follows |
|
| The personalised For You feed for the authenticated user |
|
| The discussion feed for one instrument (market) |
|
| The posts published by one user |
|
| The posts the authenticated user has saved |
|
| The posts a user has pinned to their profile |
|
| A single post by its UUID, with an inline comments preview |
|
| The top-level comments on a post |
|
| The replies nested under one comment |
|
| Who shared a post (plain reshares and quote shares) |
|
| The eToro Club dashboard for the authenticated user |
|
| The account's in-app notifications, newest data first |
Trading write tools (registered only when ETORO_MCP_ENABLE_TRADING is set)
Toolset | Tool | Description |
|
| Place an order to open a position — not idempotent: every call places a new order |
|
| Cancel a pending (not yet executed) order |
|
| Close an open position, fully or partially, at market |
|
| Cancel a pending close order before it executes |
|
| Edit an open position's stop-loss and/or take-profit |
Other write tools (registered only when ETORO_MCP_ENABLE_WRITES is set)
Toolset | Tool | Description |
|
| Create a new watchlist |
|
| Rename a watchlist |
|
| Delete a watchlist |
|
| Add items to a watchlist |
|
| Remove items from a watchlist |
|
| Reorder items within a watchlist |
|
| Set a watchlist as the selected default |
|
| Change a watchlist's display position |
|
| Create a price alert on an instrument |
|
| Change the target price of an existing price alert |
|
| Permanently delete a price alert |
|
| Mark all in-app notifications as read |
|
| Create a discussion post on the authenticated user's feed |
|
| Create a poll post with 2 to 4 answer options |
|
| Edit the authenticated user's own post in-place |
|
| Soft-delete the authenticated user's own post |
|
| Pin one of the authenticated user's own posts to their profile |
|
| Remove the authenticated user's pin from a post |
|
| Create a top-level comment on a post |
|
| Edit the authenticated user's own comment in-place |
|
| Soft-delete the authenticated user's own comment |
|
| Create a reply nested under an existing comment |
|
| Edit the authenticated user's own reply in-place |
|
| Soft-delete the authenticated user's own reply |
|
| Share an existing post, as a plain reshare or a quote share |
|
| Upload a JPEG or PNG image (max 8 MB) for use as an attachment; requires |
|
| Like a post |
|
| Remove a like from a post |
|
| Like a comment on a post |
|
| Remove a like from a comment |
|
| Like a reply (a nested answer to a comment) |
|
| Remove a like from a reply |
|
| Bookmark a post |
|
| Remove a post from the saved bookmarks |
|
| Subscribe to notifications on a post |
|
| Unsubscribe from notifications on a post |
|
| Cast a vote on a poll option |
|
| Remove a vote from a poll option |
Configuration
All configuration comes from environment variables — no config files, no flags carrying secrets.
Variable | Default | Purpose |
| — (required) | eToro API key, sent as the |
| — (required) | eToro user key, sent as the |
|
|
|
| trading core (see table above) | Comma-separated toolset names; |
| off |
|
| off |
|
| — (unset) | The only directory |
Getting started
Run straight from the repository with uv:
uvx --from git+https://github.com/florinel-chis/etoro-mcp etoro-mcpThe server speaks stdio by default; pass --transport http --host 127.0.0.1 --port 8000 to serve
streamable HTTP at /mcp instead.
Warning: the HTTP endpoint has no authentication — anyone who can reach the port can call every registered tool with your API keys' privileges. The server therefore refuses to bind a non-loopback
--hostunless--allow-remoteis also passed; only use that flag behind an authenticated reverse proxy or an otherwise-restricted network (such as the Docker port-mapping below).
MCP client configuration
Add the server to your MCP client's configuration (the exact file location depends on the client):
{
"mcpServers": {
"etoro": {
"command": "uvx",
"args": ["--from", "git+https://github.com/florinel-chis/etoro-mcp", "etoro-mcp"],
"env": {
"ETORO_API_KEY": "your-api-key",
"ETORO_USER_KEY": "your-user-key",
"ETORO_ENV": "demo"
}
}
}
}Or run the Docker image (build it first, see below):
{
"mcpServers": {
"etoro": {
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "ETORO_API_KEY", "-e", "ETORO_USER_KEY", "-e", "ETORO_ENV", "etoro-mcp"],
"env": {
"ETORO_API_KEY": "your-api-key",
"ETORO_USER_KEY": "your-user-key",
"ETORO_ENV": "demo"
}
}
}
}Docker
docker build -t etoro-mcp .
# stdio (for MCP client configs)
docker run -i --rm -e ETORO_API_KEY -e ETORO_USER_KEY etoro-mcp
# streamable HTTP at http://127.0.0.1:8000/mcp
# (-p 127.0.0.1:8000:8000 keeps the unauthenticated endpoint off external interfaces;
# --host 0.0.0.0 refers to interfaces inside the container and is required for the
# port mapping to work, hence --allow-remote — the host-side bind stays loopback-only)
docker run --rm -p 127.0.0.1:8000:8000 -e ETORO_API_KEY -e ETORO_USER_KEY \
etoro-mcp --transport http --host 0.0.0.0 --port 8000 --allow-remoteSafety
Trading tools call the demo endpoint group unless
ETORO_ENV=realis set. Keys are environment-bound, so a demo key againstreal(or vice versa) fails at the API rather than trading the wrong account.Write tools are hidden behind two independent gates —
ETORO_MCP_ENABLE_TRADINGfor order/position writes andETORO_MCP_ENABLE_WRITESfor everything else (watchlists, alerts, notifications, social). Gated tools are never registered, not merely rejected, so MCP clients cannot discover or call them.The HTTP transport is unauthenticated: anyone who can reach the port can call every registered tool — read balances and positions always, and place or close orders when trading is enabled — using your API keys' privileges. The server refuses non-loopback binds unless
--allow-remoteis passed; only use that flag behind an authenticated proxy or an otherwise-restricted network (the stdio transport has no such exposure).upload_mediareads local JPEG/PNG files and returns a public CDN URL for them — an extra privilege class beyond the API keys themselves. It is therefore triple-gated: thesocialtoolset,ETORO_MCP_ENABLE_WRITES, andETORO_MCP_UPLOAD_DIRmust all be set, and it reads only inside that directory (paths and symlinks resolving outside it are rejected, file content must actually be JPEG/PNG, and the 8 MB limit is checked before the file is read).create_orderis not idempotent across calls: each call mints a freshx-request-id, which is the order's idempotency key, so calling it twice places two orders. (The 429 retry re-sends the same id, so a rate-limited retry cannot double-fill.) Poll fill status withget_orderbefore treating an order as filled — an accepted order can still be rejected.Candle history is capped at roughly 1000 bars per interval with no way to page further back; use a coarser interval (e.g.
OneWeek) for deeper history.The API enforces per-group rate quotas (order execution 20 requests/60 s; market data 120/60 s; portfolio and most other groups 60/60 s; eligibility and cost estimates 20/60 s each). Each tool's description names its quota; 429s are retried once, honouring
Retry-After.Trading leveraged products is risky. Use at your own risk, and test everything against a demo account first.
Development
uv sync
uv run pytest
uv run ruff check .Tests are hermetic: all HTTP is mocked with respx and the server is exercised through the
in-memory FastMCP client. No credentials or network access are needed to run them. A manual,
read-only smoke check against a real demo account lives at scripts/smoke.py.
License
MIT — see LICENSE.
Available Tools
29 toolscheck_trading_eligibilityARead-only
Per-instrument trading rules: leverage, sizing mode, SL/TP bounds.
Provide instrument_ids and/or symbols (at least one, at most 100 combined). For each instrument returns the minimum position exposure (USD), max units per order, whether opening/closing/partial closes/ market-if-touched orders/trailing stop-loss are allowed, whether units are whole or fractional, whether sizing must be by units, by amount, or either, and per settlement type and direction the valid leverage values, minimum position amount (USD), and stop-loss/take-profit percentage bounds. Call before create_order to pick valid parameters. Rate limit: dedicated 20 requests/60s quota.
| Name | Required | Description | Default |
|---|---|---|---|
| symbols | No | Ticker symbols to check, e.g. AAPL. | |
| instrument_ids | No | Instrument ids to check. |
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, but the description adds valuable behavioral context: rate limit details, constraint of 'at least one, at most 100 combined' parameters, and specifics of what is returned (e.g., min position exposure, allowed order types). No contradiction with 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?
The description is front-loaded with purpose, then details returns in a single sentence. It is informative but not excessively verbose. Could slightly tighten but is 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 still explains the return fields in text, covering everything from leverage to stop-loss bounds. It also includes usage guidance and rate limits, making it fully complete for an agent to use 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?
Schema coverage is 100% with descriptions for both parameters, so baseline is 3. The description adds meaning by stating the combined limit (at most 100) and that at least one must be provided, which the schema does not enforce. This adds value.
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 per-instrument trading rules (leverage, sizing mode, SL/TP bounds). It distinguishes itself from sibling tools (all get_* tools for balances, history, prices, etc.) by being the only eligibility checker.
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 advises 'Call before create_order to pick valid parameters,' providing clear when-to-use guidance. Also mentions rate limit (dedicated 20 requests/60s quota), which helps the agent plan calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_aggregated_balancesARead-only
Get current balances aggregated across the user's accounts.
Calls GET /api/v1/balances. Returns totalBalance (in display_currency) plus one entry per account with its native-currency balance, the converted displayBalance, and the exchangeRate used. Account types: Trading, Cash, Options, Crypto, MoneyFarm, Spaceship. Amounts are numbers in the stated currency. Rate limit: 60 requests per 60 seconds (default shared quota).
| Name | Required | Description | Default |
|---|---|---|---|
| account_types | No | Restrict to these account types; omit for all. | |
| display_currency | No | ISO 4217 currency code the display* amounts are converted into. | USD |
| include_zero_balances | No | Include accounts whose balance is zero. | |
| include_equity_details | No | Expand per-account equity details (buying power, frozen cash, current PnL, used margin; crypto spendable balances). |
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, and the description adds valuable context: HTTP method, response structure, rate limit (60 req/60s), and account types. 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?
Two concise paragraphs, front-loaded with purpose, followed by essential details. Every sentence adds value.
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, and description covers response structure, account types, and rate limit. Sufficient for a read-only tool with well-specified parameters.
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?
Input schema has 100% description coverage, so parameters are fully documented. The description adds minimal value beyond the schema (e.g., mentions account types already in enum). Baseline 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 it retrieves current balances aggregated across accounts, listing specific return fields and account types. It implies aggregation but does not explicitly differentiate from siblings like get_balance or get_balances_by_type.
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. Missing information on when to choose this over get_balance, get_balances_by_type, or get_balance_history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_balanceARead-only
Get the current balance of one specific account.
Calls GET /api/v1/balances/{accountType}/{accountId}. Account types: Trading, Cash, Options, Crypto, MoneyFarm, Spaceship. Returns the account's balance in its native currency plus the displayBalance converted into display_currency. With include_equity_details, Trading accounts also report available buying power, frozen cash, current PnL, and used margin. Rate limit: 60 requests per 60 seconds (default shared quota).
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | Account id, as returned by the balance tools. | |
| account_type | Yes | Type of the account. | |
| display_currency | No | ISO 4217 currency code the display* amounts are converted into. | USD |
| include_zero_balances | No | Include accounts whose balance is zero. | |
| include_equity_details | No | Expand per-account equity details (buying power, frozen cash, current PnL, used margin; crypto spendable balances). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, consistent with a read operation. The description adds behavior beyond annotations: return format, conversion to display_currency, equity details for Trading, and a rate limit of 60 req/60s. No contradiction.
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 at ~120 words, front-loaded with purpose. It is well-structured but could be slightly tighter; however, it efficiently uses each sentence.
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 5 parameters and an output schema, the description covers endpoint, account types, return behavior, and rate limits. It is complete enough for correct tool invocation without 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%, so baseline is 3. The description adds value by explaining the effect of include_equity_details, the conversion to display_currency, and enumerating account types, which enhances understanding 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 states 'Get the current balance of one specific account', providing a specific verb and resource. It lists account types and distinguishes from sibling tools like get_aggregated_balances by focusing on a single account.
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 explains the endpoint, account types, and when to use include_equity_details. It implies single-account usage but does not explicitly exclude aggregated use cases; still, 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.
get_balance_historyARead-only
Get daily balance snapshots over a date range.
Calls GET /api/v1/balances/history (or the {accountType} / {accountType}/{accountId} variant when narrowed). Dates are YYYY-MM-DD; the default range is the last 30 days, history covers at most the last 12 months, and a single range spans at most 365 days — the API answers 404 when no data exists for the range. Each snapshot carries total cash, invested amount, PnL, and balance, both in native currencies and converted into display_currency. Rate limit: 60 requests per 60 seconds (default shared quota).
| Name | Required | Description | Default |
|---|---|---|---|
| to_date | No | Period end, YYYY-MM-DD. Defaults to today (UTC). | |
| from_date | No | Period start, YYYY-MM-DD. Defaults to 30 days before to_date. | |
| account_id | No | Limit history to one account; requires account_type. | |
| account_type | No | Limit history to one account type; omit for all accounts. | |
| display_currency | No | ISO 4217 currency code the display* amounts are converted into. | USD |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite readOnlyHint already being provided, the description adds substantial behavioral context: the HTTP method (GET), date format (YYYY-MM-DD), default range (30 days), maximum history (12 months), maximum single range (365 days), error condition (404 when no data), response fields (cash, invested, PnL, balance, currency conversion), and rate limit (60 requests per 60 seconds). No contradictions with 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?
The description is relatively concise (three sentences) and front-loaded with the core purpose. The second sentence is dense but informative, combining multiple details. A minor restructuring could improve readability, but it is still efficient.
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's complexity (5 parameters, output schema, annotations), the description covers all essential aspects: purpose, API method, parameter constraints, error handling, rate limiting, and response fields. There are no obvious gaps for an agent to use the tool 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?
Schema description coverage is 100%, so each parameter is already documented. The description adds value by explaining overarching constraints (date range limits, default range) that go beyond individual parameter descriptions, providing context for how parameters interact.
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's purpose: 'Get daily balance snapshots over a date range.' It specifies the resource (balance history) and the action (retrieving daily snapshots), and hints at narrowing by account type or ID, distinguishing it from sibling tools like get_balance or get_aggregated_balances.
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 when to use the tool (to retrieve historical daily balances) but does not explicitly contrast it with sibling tools or provide when-not-to-use guidance. It does mention date range limits and defaults, which help the agent decide if the tool fits the requested range.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_balances_by_typeARead-only
Get current balances for every account of one account type.
Calls GET /api/v1/balances/{accountType}. Account types: Trading, Cash, Options, Crypto, MoneyFarm, Spaceship. Returns totalBalance (in display_currency) and per-account balances in their native currency alongside the converted displayBalance. Rate limit: 60 requests per 60 seconds (default shared quota).
| Name | Required | Description | Default |
|---|---|---|---|
| account_ids | No | Restrict to these account ids; omit for all of the type. | |
| account_type | Yes | Account type to query. | |
| display_currency | No | ISO 4217 currency code the display* amounts are converted into. | USD |
| include_zero_balances | No | Include accounts whose balance is zero. | |
| include_equity_details | No | Expand per-account equity details (buying power, frozen cash, current PnL, used margin; crypto spendable balances). |
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, so the description adds value by specifying the HTTP method (GET), the exact endpoint pattern, and the rate limit (60 requests/60s). It does not contradict annotations and provides useful behavioral context beyond what annotations offer.
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 (5 sentences), front-loaded with the main purpose, and each sentence adds value: purpose, endpoint, account types, return structure, and rate limit. No fluff or redundant 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?
For a read-only query tool with 5 parameters (schema fully described) and an output schema, the description covers purpose, endpoint, account types, key return fields, and rate limiting. It is sufficiently complete without need for more detail.
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 description coverage is 100%, so the baseline is 3. The description does not add significant parameter-level information beyond what the schema already provides (e.g., enum values, defaults, descriptions). The only extra context is about the return structure, not parameters.
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 'Get current balances for every account of one account type', providing a specific verb, resource, and scope. It lists account types and mentions the API endpoint, effectively distinguishing it from siblings like get_balance (single account) and get_aggregated_balances (cross-type).
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 gives clear context for when to use the tool (querying balances by account type) but does not explicitly state when not to use it or provide alternatives. It mentions the account types and endpoint, offering sufficient guidance though lacking formal exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_candlesARead-only
Get OHLCV candles for one instrument.
Returns {"instrumentId": int, "interval": str, "candles": [{"time": ISO-8601 period start, "open": float, "high": float, "low": float, "close": float, "volume": float}]}. Prices are in the instrument's quote currency; the newest bar can be the still-forming session.
History depth is capped at about 1000 bars per interval — there is no way to page further back in time (no from/to parameters exist), so at OneDay one request covers roughly four years; use a coarser interval such as OneWeek for deeper history. 'direction' only changes ordering: asc and desc return the same most-recent window, oldest-first vs newest-first. An unknown instrument id yields no candle data and this tool raises an error rather than returning an empty series.
Rate limit: shares the market-data pool of 120 requests per 60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Number of candles, maximum 1000. | |
| interval | No | Candle interval: OneMinute, FiveMinutes, TenMinutes, FifteenMinutes, ThirtyMinutes, OneHour, FourHours, OneDay, or OneWeek. | OneDay |
| direction | No | 'asc' = oldest first, 'desc' = newest first. | asc |
| instrument_id | Yes | Instrument id, e.g. 1001 for AAPL. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate readOnlyHint=true, but the description adds critical details: return format with fields, history cap, rate limit (120 req/60s), error behavior for unknown instrument, and that direction only affects ordering. It fully discloses operational traits.
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 detailed but well-structured, with clear sentences explaining return format, history limits, rate limits, and edge cases. It is appropriately sized for the complexity, though slightly verbose in places. Front-loads key purpose.
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 output schema and annotations, the description covers all necessary aspects: purpose, constraints (history cap, rate limit), behavioral details (error raising, ordering), and return format. It is complete and leaves no obvious 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?
The input schema already covers all 4 parameters with descriptions (100% coverage). The description adds value by explaining that 'direction' does not change the data window, only ordering, and that unknown instrument_id raises an error. This goes beyond the schema's basic 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 the tool retrieves OHLCV candles for one instrument, with a specific verb ('get') and resource ('candles'). It distinguishes from siblings by focusing on historical price data, a unique function among the listed 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?
Provides explicit context on when to use this tool (e.g., for historical price data), including limitations (1000 bar cap, no paging) and guidance on interval selection for deeper history. It does not explicitly state when not to use, 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.
get_close_order_infoARead-only
Look up a close order's status by its order id.
Same status codes as get_order (1 Received … 10 RejectedPartiallyFilled); positionsToClose and positionExecutions show which positions closed and at what price. Returns HTTP 404 if the close order does not exist. Rate limit: shares a 60 requests/60s pool with get_order.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | Close-order id returned by close_position. |
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, and the description adds valuable behavioral details: HTTP 404 if not found, rate limit sharing a 60req/60s pool with get_order, and the presence of specific fields (positionsToClose, positionExecutions). This exceeds the minimum expected from 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?
The description is two sentences with clear front-loading of purpose in the first sentence. Every word contributes meaning, with no redundancy or filler.
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's simplicity (1 parameter, output schema exists), the description covers all essential aspects: purpose, status code reference, field details, error scenario, and rate limiting. It is complete without relying on output schema documentation.
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 has 100% description coverage for the single parameter order_id, which is adequately described as 'Close-order id returned by close_position.' The description mainly restates this without adding extra semantic meaning, so baseline 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 'Look up a close order's status by its order id,' specifying a specific action (look up), resource (close order's status), and method (by order id). It distinguishes from siblings like get_order by targeting close orders specifically.
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 gives context by referencing get_order's status codes and mentioning fields like positionsToClose and positionExecutions. It implies usage for close orders but does not explicitly state when to use this tool versus alternatives like get_order.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_closing_pricesARead-only
Get the latest official closing prices per instrument.
The API returns closing prices for every instrument in one response; this tool filters to 'instrument_ids' when given and truncates to 'limit'. Returns {"results": [{"instrumentId": int, "officialClosingPrice": float, "daily"/"weekly"/"monthly": {"price": float, "date": ISO-8601}}]} — daily is the previous trading day's close, weekly the previous week's, monthly the previous month's. A price of -1 with date 0001-01-01 means no data for that period.
Rate limit: shares the market-data pool of 120 requests per 60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of instruments to return. | |
| instrument_ids | No | Optional instrument ids to keep; omit for all instruments. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint, description discloses rate limit, return format with sentinel values for missing data, and behavior of filtering/truncation. Adds significant value over 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?
Front-loaded with purpose, each sentence adds new information (filtering, return structure, sentinel, rate limit). No redundancies or fluff.
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 simple parameters and presence of output schema, description fully explains tool behavior, edge cases, and constraints. No gaps remain.
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 adds context like 'truncates' for limit and 'filters' for instrument_ids, clarifying behavior 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?
Description clearly states 'Get the latest official closing prices per instrument', specifying the action and resource. It differentiates from sibling tools by focusing on closing prices with optional filtering.
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 explains that the tool returns closing prices for all instruments and then filters/truncates, but does not explicitly state when to use this tool over alternatives like get_candles. Still provides clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_curated_listsARead-only
Get eToro's curated investment lists available to the user.
Each list carries uuid, name, description, and the instrument IDs it contains (resolve them via the market-data tools). Dedicated quota of 60 requests per 60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of curated lists to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only; description adds quota information (60 requests per 60 seconds) and return structure, enhancing transparency 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?
Three concise sentences: purpose, return structure, quota. No waste, front-loaded with the main action.
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 and description mentions key fields. For a read-only tool with one optional parameter and output schema, the description is sufficiently 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% for the single parameter 'limit', with full description (default, min, max). Description adds no additional meaning beyond the schema, so baseline 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?
Clearly states it retrieves eToro's curated investment lists, with a specific verb and resource. This distinguishes it from sibling tools like get_public_watchlists or list_watchlists.
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?
Mentions resolving instrument IDs via market-data tools, providing some usage context, but lacks explicit guidance on when to use this tool versus alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_default_watchlistARead-only
Get the items of the authenticated user's default watchlist.
Returns items with itemId (instrument or person ID), itemType ('Instrument' or 'Person'), itemRank (position in the list), symbol and displayName when market metadata is included, and itemAddedDate (ISO 8601). Shares the watchlist read quota of 60 requests per 60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of items to return (all when omitted). | |
| items_per_page | No | Items per page for pagination. |
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 value by listing return fields (itemId, itemType, itemRank, symbol, displayName, itemAddedDate) and noting the shared watchlist read quota (60 requests per 60 seconds). No contradictions with 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?
The description is concise with three sentences: purpose, return fields, and quota. Every sentence adds value, with no redundant or vague wording. Front-loaded with the core function.
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 that an output schema exists and parameter descriptions are complete, the description covers purpose, key return fields, and quota. It does not elaborate on pagination behavior or error cases, but these are typically inferred from parameters and common patterns. Slight room for more context, but overall adequate.
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 the schema fully documents both parameters (limit, items_per_page). The description does not add any additional meaning or usage hints beyond the schema, hence 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 that the tool retrieves items of the authenticated user's default watchlist, using specific verb ('Get') and resource ('items of default watchlist'). It distinguishes from siblings like 'get_watchlist' (by ID) and 'list_watchlists' (all watchlists) by focusing on 'default'.
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 does not provide any guidance on when to use this tool versus its siblings. It lacks explicit when-to-use, when-not-to-use, or alternative tool references. Given 29 sibling tools, this omission reduces usability for an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_instrument_detailsARead-only
Get display data for instruments by id: name, symbol, type, exchange.
Returns {"results": [{"instrumentId": int, "displayName": str, "symbol": str, "instrumentTypeId": int, "exchangeId": int, "stocksIndustryId": int, "priceSource": str, "isInternalInstrument": bool}]}. isInternalInstrument true means the instrument is restricted from public trading. Use search_instruments to resolve a ticker to an instrumentId first.
Rate limit: shares the market-data pool of 120 requests per 60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| instrument_ids | Yes | Instrument ids to look up, e.g. [1001]. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that isInternalInstrument indicates restricted trading, and includes rate limit (120 requests/60s). These details go beyond the readOnlyHint annotation, 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?
Concise and well-structured, front-loaded with purpose and key output details. The sample return and rate limit are useful, though the description could be slightly more streamlined.
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?
For a single-parameter tool with full schema coverage and an output schema, the description is complete: it explains the return structure, a key boolean field, rate limits, and prerequisite step (resolve ID).
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's example ([1001]) adds minimal value beyond the schema description. No additional semantics about parameter behavior (e.g., maximum IDs) are provided.
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 retrieves display data for instruments by ID, listing specific fields like name, symbol, type, exchange. It distinguishes itself from sibling 'search_instruments' by implying this tool is for known IDs.
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 use 'search_instruments' to resolve a ticker to an instrumentId first, providing clear when-to-use and alternative. Also mentions rate limit context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_market_recommendationsARead-only
Get personalized market recommendations for the authenticated user.
Returns responseType and instrumentIds — the recommended instrument IDs, resolvable via the market-data tools. Dedicated quota of 60 requests per 60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of recommendations to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds transparency about the dedicated quota (60 requests per 60 sec) and the return format (responseType and instrumentIds), beyond the readOnlyHint annotation.
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 concise sentences that front-load the purpose and add essential behavior info 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?
For a simple tool with one parameter, full schema, output schema, and clear annotations, the description covers quota and resolvability adequately.
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 full schema description; the description does not add further parameter context beyond what the schema provides.
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 'Get personalized market recommendations' with a specific verb and resource, and it's distinct from sibling tools like search_instruments or get_instrument_details.
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 the tool is for getting personalized recommendations but does not explicitly contrast it with alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_orderARead-only
Look up an order's status by order_id or reference_id (exactly one).
Status ids: 1 Received, 2 Placed, 3 Filled, 4 Rejected, 5 PartiallyFilled, 6 PendingCancel, 7 Canceled, 8 Expired, 9 CanceledPartiallyFilled, 10 RejectedPartiallyFilled. A filled order lists its positions under positionExecutions (positionId, state, remaining units, execution price and fees). Rates are absolute instrument prices; timestamps ISO 8601. Rate limit: shares a 60 requests/60s pool with get_close_order_info.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | No | Numeric order id returned by create_order. | |
| reference_id | No | The referenceId (UUID) returned by create_order — the x-request-id the order was submitted with. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description complements the readOnlyHint annotation by detailing the output for filled orders (positionExecutions) and the rate limit policy shared with get_close_order_info. No contradictions with 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?
The description is highly concise, front-loading the core purpose. Every sentence adds value: the lookup action, identifier constraint, status list, filled order behavior, and rate limit note. 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 availability of an output schema, the description does not need to detail return values. It covers all necessary aspects: lookup mechanism, status codes, filled order details, and rate limiting, making it complete for an agent to use 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?
While the input schema already describes both parameters, the description adds critical context: 'exactly one' must be provided, and reference_id is the UUID from create_order. This significantly enhances understanding 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 'look up', the resource 'order status', and the required input constraints (exactly one of order_id or reference_id). It effectively distinguishes from sibling tools like get_close_order_info, which shares a rate limit but serves a different purpose.
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 specific guidance that exactly one identifier must be used, and details the status codes. However, it does not explicitly state when not to use this tool or contrast it with alternatives beyond the rate-limit mention.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pnlARead-only
Account P&L: portfolio snapshot with unrealized P&L per position.
Returns credit (available trading balance, USD), bonusCredit, the account-level unrealizedPnl (sum across open positions, account currency), and open positions each carrying an unrealizedPnl figure in the account currency, plus mirror summaries with closedPositionsNetProfit. Total P&L = sum of position unrealizedPnl (own and mirror positions) + sum of mirror closedPositionsNetProfit. Rate limit: shares a 60 requests/60s pool with get_portfolio and get_portfolio_breakdown.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum positions returned. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, which the description respects. Beyond that, it discloses the rate limit and the calculation formula for total P&L, providing useful behavioral context not present in the 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?
The description is concise and front-loaded with the main purpose. It efficiently includes the rate limit and calculation formula without unnecessary verbosity. Every sentence adds value.
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 and input schema covers the single parameter fully, the description provides sufficient context: it explains return components, rate limiting, and total P&L calculation. No gaps for this complexity level.
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 only parameter (limit) is fully described in the input schema with default, min, max, and description. The tool description adds no additional meaning beyond the schema, so 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 it returns a portfolio snapshot with unrealized P&L per position, specifying the components (credit, bonusCredit, unrealizedPnl, etc.). However, it does not explicitly differentiate itself from siblings like get_portfolio or get_portfolio_breakdown beyond mentioning a shared rate limit.
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 explicit guidance on when to use this tool vs alternatives. The description mentions a shared rate limit with get_portfolio and get_portfolio_breakdown but does not clarify the distinct use cases for each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolioARead-only
Aggregated portfolio: account totals plus one aggregate per instrument.
Account totals are in the account currency (usually USD): accountAvailableCash, accountFrozenCash, accountCurrentPnl, accountTotalUsedMargin, accountBalance, and accountTotalValue (= available cash + used margin + current P&L). Each instrument aggregate carries net units (positive = long, negative = short), average open rate and leverage, margin, exposure, and unrealized return (accountCurrencyReturn) in the account currency. Filters narrow the instrument aggregates only — account totals ignore them. Rate limit: shares a 60 requests/60s pool with get_portfolio_breakdown and get_pnl.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum instrument aggregates returned. | |
| mirror_ids | No | Restrict to these copy-trading mirror ids; 0 = directly held. | |
| instrument_ids | No | Restrict instrument aggregates to these instrument ids. | |
| conversion_mode | No | Conversion source for non-USD assets while their market is closed; the API default is eToroApp. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint: true. The description adds value by disclosing that filters only affect instrument aggregates, not account totals, and mentions rate limit sharing with siblings, enhancing transparency 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 efficient and well-structured: first sentence states purpose, then detailed fields, then filter caveat, then rate limit. No redundancy, every sentence adds value.
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 key points: field details, filter behavior, rate limit. Could mention that limit applies to instrument aggregates, but largely 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%, so baseline is 3. The description adds context that filters narrow instrument aggregates only, but does not elaborate on all parameters (e.g., conversion_mode not mentioned). Value added is moderate.
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 'Aggregated portfolio: account totals plus one aggregate per instrument', using specific verbs and resource. It differentiates from sibling get_portfolio_breakdown by mentioning shared rate limit and contrasting filter behavior.
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?
Usage is implied as retrieving aggregated portfolio data, but no explicit when-to-use or alternatives are given. The description notes filter behavior and rate limit sharing, but lacks when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolio_breakdownARead-only
Position-level portfolio snapshot: open positions and pending orders.
Returns credit (available trading balance, USD), bonusCredit, open positions (positionID, instrumentID, isBuy — true long / false short, leverage, amount = invested margin in USD, units, openRate, openDateTime ISO 8601, stop-loss/take-profit rates as absolute prices, mirrorID — 0 = manual position, non-zero = copy trading), pending market-if-touched orders (pendingOrders), pending market opens (ordersForOpen), and pending closes (ordersForClose), plus copy-trading mirror summaries. Cheaper than get_pnl — no unrealized P&L fields. Rate limit: shares a 60 requests/60s pool with get_portfolio and get_pnl.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum entries per list (positions, orders). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true. The description adds context about returned fields (credit, bonusCredit, positions with detailed attributes, pending orders) and rate limit sharing. It does not disclose any additional behavioral concerns beyond what annotations imply, but adds useful detail.
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 somewhat lengthy but efficiently packs detailed information about returned fields and usage hints. It is front-loaded with the purpose and uses a bullet-like structure via commas, which is adequate.
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 the return values including position fields, pending orders, and copy-trading summaries. It provides a comprehensive overview, though some minor structural details of orders are not explicitly enumerated.
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 has 100% coverage with a description for the single 'limit' parameter. The tool description does not add additional meaning about the parameter beyond what the schema provides, so baseline 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 the tool returns a 'Position-level portfolio snapshot: open positions and pending orders.' It is specific about the resource and scope, and contrasts with siblings like get_pnl and get_portfolio.
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 explicitly says it is 'Cheaper than get_pnl — no unrealized P&L fields.' and notes the rate limit pool shared with get_portfolio and get_pnl, giving clear context for when to use. It could be more explicit about exact conditions, but the guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profileARead-only
Get the authenticated user's identity and the scopes their keys carry.
Calls GET /api/v1/me. Returns gcid (global customer id), realCid and demoCid (real/demo account customer ids), username, first/last name when set, playerLevel (1 Bronze, 2 Platinum, 3 Gold, 4 Internal, 5 Silver, 6 PlatinumPlus, 7 Diamond) with its name, and the OAuth scopes granted to the credentials — useful to verify keys and to see which endpoint groups are accessible. Rate limit: 60 requests per 60 seconds (default shared quota).
| 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 context: the HTTP method (GET), specific endpoint path, detailed list of returned fields, and a rate limit of 60 requests per 60 seconds. No contradiction with 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?
The description is concise, front-loaded with the core purpose, followed by specific details and rate limit. 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 no parameters, a readOnly annotation, and an output schema (so description need not detail all return fields), the description still lists all key fields and rate limit, making it fully informative.
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, and the input schema is empty. With 100% schema coverage, no additional parameter description is needed. Baseline score of 4 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 it retrieves the authenticated user's identity and OAuth scopes, lists specific return fields, and names the HTTP endpoint. This is a specific verb+resource that distinguishes it from sibling tools like get_order or get_balance.
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 includes 'useful to verify keys and to see which endpoint groups are accessible,' providing clear context for when to use it. It doesn't explicitly state when not to use it, but given it takes no parameters, this is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_public_watchlistsARead-only
List another user's public watchlists by their numeric user ID.
Returns the same shape as list_watchlists: watchlistId, name, watchlistType, totalItems, watchlistRank, and up to items_per_watchlist items each. Shares the watchlist read quota of 60 requests per 60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of watchlists to return. | |
| user_id | Yes | eToro user ID whose public watchlists to retrieve. | |
| items_per_watchlist | No | Items to include per watchlist. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true. Description adds context: lists only public watchlists, shares read quota, and specifies return shape (fields listed). Adequate disclosure 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?
Two concise sentences, front-loaded with purpose. No superfluous 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?
Output schema exists, so return values are covered. Description adds quota and shape details. Sufficient 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 covers all 3 parameters with descriptions (100% coverage). Description does not add parameter details beyond schema, so baseline 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?
Clear verb (List), specific resource (another user's public watchlists), and qualifier (by numeric user ID). Distinguishes from sibling list_watchlists which likely lists own watchlists.
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 quota constraint (60 req/60s) and states similarity to list_watchlists shape, guiding agent on when to use. Lacks explicit when-not or alternatives but still clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ratesARead-only
Get real-time bid/ask quotes for instruments.
Recommended before placing an order. Returns {"results": [{"instrumentId": int, "bid": float (sell price), "ask": float (buy price), "lastExecution": float, "conversionRateBid": float, "conversionRateAsk": float (instrument currency to USD), "date": ISO-8601 quote timestamp}]}.
Rate limit: shares the market-data pool of 120 requests per 60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| instrument_ids | Yes | Instrument ids to quote, e.g. [1001, 1002]. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=true) match description. Description adds rate limit context and output format, though no further behavioral traits beyond what annotations imply.
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: three sentences covering purpose, output example, and rate limit. Information is front-loaded and 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?
Complete for a simple tool with one parameter and output schema. Includes rate limit, which is critical for usage. No missing elements.
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 provides example usage (e.g., [1001, 1002]) and output structure, adding value 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?
Clearly states it retrieves real-time bid/ask quotes for instruments. Output structure is provided, distinguishing it from sibling tools like get_candles or get_closing_prices.
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 recommends use before placing an order. Mentions rate limit, providing practical guidance. Does not explicitly list alternatives, but purpose is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trading_cost_estimateARead-only
Estimate the costs of a hypothetical open order without placing it.
Takes the same arguments as create_order (exactly one of symbol/instrument_id, exactly one of amount/units/contracts) and returns the cost breakdown: one entry per cost type (markup, marketSpread, transactionFee, overnightFee, overWeekendFee, sdrt) with an amount and currency, plus the quote timestamp (ISO 8601). Rate limit: dedicated 20 requests/60s quota.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Position size in asset units. | |
| amount | No | Position size as money in order_currency (typically USD). | |
| symbol | No | Ticker symbol, e.g. AAPL. Alternative to instrument_id. | |
| leverage | No | Leverage; 1 = no leverage. | |
| contracts | No | Position size in contracts (futures). | |
| order_type | No | mkt = market, mit = market-if-touched. | mkt |
| transaction | Yes | Trade direction. | |
| trigger_rate | No | Absolute trigger price; required when order_type is mit. | |
| instrument_id | No | Instrument id. Alternative to symbol. | |
| order_currency | No | Currency of amount, typically usd. | |
| settlement_type | No | Settlement type for the hypothetical open. | cfd |
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, so the description's 'without placing it' is consistent. It adds value by detailing the return format and a dedicated rate limit (20 requests/60s), but lacks information on error handling or permissions.
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, front-loaded with purpose, followed by concise details on arguments and return. No wasted words; every sentence adds essential 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 11 parameters and output schema existence, the description covers argument constraints, return structure, and rate limit. It does not mention authentication or prerequisites, but the read-only nature reduces need. Could elaborate on usage scenarios.
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%, baseline 3. The description adds the constraint 'exactly one of symbol/instrument_id and exactly one of amount/units/contracts', which clarifies the otherwise optional schema entries. This improves 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 verb 'estimate' and the resource 'costs of a hypothetical open order'. It distinguishes itself from create_order (a sibling-like tool) by emphasizing it does not place the order, making the purpose specific and unambiguous.
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 before placing an order ('without placing it') and references create_order arguments, but does not explicitly state when to avoid this tool or compare to other cost-related tools among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_watchlistARead-only
Get a single watchlist owned by the authenticated user, by ID.
Items are paginated with page_number (zero-based) and items_per_page. Returns the watchlist's metadata plus its items: itemId, itemType ('Instrument' or 'Person'), itemRank, symbol, and itemAddedDate (ISO 8601). Shares the watchlist read quota of 60 requests per 60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| page_number | No | Zero-based page of items to return. | |
| watchlist_id | Yes | Unique identifier of the watchlist. | |
| items_per_page | No | Items per page. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, indicating read-only behavior. The description adds significant context: pagination details (zero-based page_number, items_per_page), rate limit (60 requests per 60 seconds), and the return structure (metadata plus items with specific fields). This goes well beyond the 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?
The description is three sentences, with the first sentence clearly stating the core purpose. Every sentence adds necessary information: purpose, pagination details, and rate limit. No redundant or extraneous content.
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 3 parameters, pagination, a rate limit, and an output schema, the description covers all essential aspects: what it retrieves, how pagination works, the rate limit, and what the response contains. It is fully complete for agent understanding.
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 value by clarifying that page_number is zero-based and that items_per_page has a default and max (implicitly from schema but reinforced). It also explains the return fields (itemId, itemType, etc.), which helps the agent understand parameter effects on output, even though output schema exists.
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's purpose: 'Get a single watchlist owned by the authenticated user, by ID.' It specifies the verb 'get', the resource 'watchlist', and the scope 'by ID'. This distinguishes it from sibling tools like list_watchlists (which lists all watchlists) and get_default_watchlist (which gets the default).
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 fetching a specific watchlist by ID but does not explicitly provide guidance on when to use this tool versus alternatives, such as using list_watchlists to obtain IDs or get_default_watchlist for the default list. No when-not or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_cash_transactionsARead-only
List transactions of a cash account, newest pages first.
Calls GET /api/v1/money/accounts/cash/{accountId}/transactions. Paginated by cursor: pass pagination.nextPageToken from one call as page_token to fetch the next page; nextPageToken null (or hasNext false) means the last page. Amounts are decimal strings in ISO 4217 currencies; postedAt is an ISO 8601 timestamp. transactionType is one of card, internalTransfer, bankTransfer, balanceAdjustment; direction is debit or credit; status is one of failed, authorized, settled, rejected, returned, expired, unknown. Rate limit: 60 requests per 60 seconds (default shared quota).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size; the API allows at most 500. | |
| account_id | Yes | Cash account id (UUID), from the Cash entries of the balance tools. | |
| page_token | No | Opaque cursor from a previous page's pagination.nextPageToken. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, and the description adds substantial behavioral details: pagination mechanism, field types (ISO 8601 timestamps, decimal strings), transaction types, direction, statuses, and rate limit. No contradictions with 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?
The description is a single paragraph with clear, front-loaded purpose. It is informative without being verbose, though it could be slightly more concise by moving some inline field explanations to the schema.
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, the description sufficiently covers pagination, field formats, and status values. It provides enough context for an agent to use the tool correctly, though it does not explain all edge cases.
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 has 100% coverage with descriptions for all parameters. The description adds minimal extra meaning beyond the schema, such as mentioning 'newest pages first' and the response structure. Baseline 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 it lists transactions of a cash account with newest pages first, and mentions the API endpoint. This verb+resource combination distinguishes it from sibling tools, which focus on balances, trading, and other financial data.
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 detailed pagination instructions but does not explicitly state when to use this tool versus alternatives. No alternative tools for transaction listing exist among siblings, so the guidance is adequate but not explicit.
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 (id and description) for resolving exchangeId values.
Returns {"results": [{"exchangeId": int, "description": str}]}.
Rate limit: shares the market-data pool of 120 requests per 60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of exchanges to return. | |
| exchange_ids | No | Optional exchange ids to look up; omit for all exchanges. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true, and description adds valuable context: returns specific JSON structure and shares a rate limit pool. No contradictions, and it discloses behavioral traits 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 concise with three sentences. The first sentence states purpose, second gives return format in a code block, third mentions 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?
Return format is specified, parameters are fully covered, and rate limit is mentioned. While an explicit output schema is not provided, the description gives enough detail. Tool is simple, so completeness is high.
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 description coverage is 100%, so the existing schema already documents both parameters. The description does not add additional meaning for the parameters beyond what is in the schema, so baseline 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?
Description clearly states 'List exchanges (id and description) for resolving exchangeId values.' It specifies the verb 'list' and resource 'exchanges', and the purpose is distinct from sibling tools like search_instruments or list_instrument_types.
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 explains when to use (to resolve exchangeId values) and mentions optional parameters for filtering. However, it does not explicitly state when not to use or provide alternatives, but given the simplicity, it is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_instrument_typesARead-only
List instrument types (stocks, crypto, ETFs, ...) by id.
Resolves instrumentTypeId values returned by other market-data tools. Returns {"results": [{"instrumentTypeId": int, "description": str}]}.
Rate limit: shares the market-data pool of 120 requests per 60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of types to return. | |
| instrument_type_ids | No | Optional instrument type ids to look up; omit for all types. |
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, and the description adds the rate limit sharing with the market-data pool, providing additional behavioral context beyond annotations. 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 very concise with three sentences. It front-loads the purpose, then explains the use case and a behavioral note (rate limit). 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?
Given the presence of an output schema, the description does not need to explain return values. It covers the essential context: what the tool does, when to use it, and rate limitations. Complete for a simple 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?
Schema description coverage is 100%, so baseline is 3. The description adds value by explaining the role of instrument_type_ids in resolving IDs and clarifying the limit's purpose. It complements but does not merely repeat schema info.
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 instrument types by id and resolves instrumentTypeId values. It uses specific verbs and distinguishes from sibling tools that deal with different market data or instrument details.
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 explicitly says it resolves instrumentTypeId values returned by other market-data tools, indicating when to use it. It implies context but does not list exclusions or alternatives, though the sibling set makes differentiation straightforward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_price_alertsARead-only
List the active price alerts on the account.
Returns up to limit alerts, each with its alertId (UUID),
instrumentId, symbol (e.g. AAPL), targetPrice (trigger
level in the instrument's quote currency), currentPrice (market
bid when the alert was created or last updated), and ISO 8601 UTC
createdAt/updatedAt timestamps. Quota: 60 requests per 60
seconds (shared default pool).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of alerts to return. |
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 discloses return fields, default/max limit behavior, and a specific rate limit (60 req/60s). This adds useful 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 concise, well-structured, and front-loaded with the main purpose. Every sentence adds value with no fluff.
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 simplicity of the tool (single parameter, list operation), the description fully covers purpose, return fields, and constraints. The presence of an output schema is assumed but the description compensates with detailed field info.
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 schema already describes the 'limit' parameter fully (100% coverage). The description reiterates the same meaning without additional semantics, so baseline 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 it lists active price alerts on the account, with a specific verb (list) and resource (price alerts). It distinguishes itself from sibling list/get tools by focusing exclusively on this resource.
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 mentions a quota but does not provide guidance on when to use this tool versus alternatives (e.g., other list tools) or when not to use it. Usage is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_stock_industriesARead-only
List stock industries (id and name) for resolving stocksIndustryId values.
Returns {"results": [{"industryId": int, "name": str}]}.
Rate limit: shares the market-data pool of 120 requests per 60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of industries to return. | |
| industry_ids | No | Optional industry ids to look up; omit for all industries. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds rate limit information ('shares the market-data pool of 120 requests per 60 seconds') and the return format, which goes beyond the readOnlyHint annotation. 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 two concise sentences plus a rate limit note, front-loaded with purpose. Every sentence adds value without extraneous text.
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 tool with two optional parameters, readOnly annotation, and output schema, the description covers purpose, return format, and rate limit, providing sufficient context for correct use.
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 has 100% coverage, so baseline is 3. The description adds the return format and rate limit context, which are helpful for the agent to understand data structure and constraints.
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 'List stock industries (id and name) for resolving stocksIndustryId values.' It uses specific verb and resource, and uniquely identifies its purpose among sibling 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 implies usage for resolving industry IDs but does not explicitly state when not to use or provide alternatives. However, given its simple look-up nature, 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_trading_historyARead-only
List closed trades since a given date.
Returns trades closed on or after min_date for the configured
environment (demo or real account). Each trade includes position and
order ids, instrument id, direction (isBuy), leverage, units,
invested amount and fees in the account currency, open/close rates in
the instrument's quote currency, and ISO 8601 open/close timestamps.
Paginate with page and limit. Quota: 60 requests per 60
seconds (shared default pool).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination; omit for the first page. | |
| limit | No | Maximum number of trades per page. | |
| min_date | Yes | Start of the reporting period, date in YYYY-MM-DD format. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the readOnlyHint annotation by detailing the returned fields, pagination behavior, and quota limits, fully disclosing the tool's behavioral traits.
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 efficient sentences with the purpose front-loaded, no redundancy, and all information 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 the presence of an output schema, the description adequately covers environment, pagination, quota, and key response fields, leaving no critical gaps for a list 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?
The schema has 100% coverage, and the description reinforces parameter meaning (e.g., min_date as start of period, pagination with page/limit), adding context like 'closed on or after' that improves 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 'List closed trades since a given date' and specifies the scope (closed trades for configured environment), distinguishing it from sibling tools like get_order or list_cash_transactions.
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 when to use the tool (list closed trades since a date) and provides pagination details, but does not explicitly contrast with alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_watchlistsARead-only
List the authenticated user's watchlists with their items.
Each watchlist carries watchlistId, name, watchlistType (one of Static, Dynamic, RecentlyInvested, Default), totalItems, isDefault, isUserSelectedDefault, watchlistRank (display order), and up to items_per_watchlist items with itemId (instrument or person ID), itemType ('Instrument' or 'Person'), itemRank, and itemAddedDate (ISO 8601). Shares the watchlist read quota of 60 requests per 60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of watchlists to return. | |
| include_builtin | No | Include eToro's built-in watchlists alongside user-created ones. | |
| items_per_watchlist | No | Items to include per watchlist. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds quota information ('Shares the watchlist read quota of 60 requests per 60 seconds') and details on response structure, providing useful behavioral 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?
The description is fairly detailed and lists all response fields, which is informative but slightly verbose. It front-loads the purpose but could be shorter by relying on the output schema.
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 provides return type structure, the description adds quota info, clarifies the resource, and explains the response fields. It is sufficiently complete for a read-only list tool with well-defined parameters.
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 description coverage is 100%, so the schema already documents the parameters. The description mentions 'items_per_watchlist' in the response context but does not add new meaning 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 'List the authenticated user's watchlists with their items', specifying the verb, resource, and scope. It distinguishes from siblings like 'get_watchlist' (single) and 'get_public_watchlists' (public).
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 does not explicitly state when to use this tool versus alternatives. It implies usage for listing all user watchlists but lacks when-not or direct sibling differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_instrumentsARead-only
Search instruments by ticker symbol and return candidate matches.
Matching is contains/prefix, NOT exact: searching 'AAPL' also returns variants such as 'AAPL.24-7' and 'AAPL.EUR'. Always verify that the candidate's internalSymbolFull exactly equals the symbol you want before using its instrumentId. Instrument ids are immutable (they survive rebrands and ticker changes), so they are safe to cache.
Returns {"totalItems": int, "results": [{"instrumentId": int, "internalSymbolFull": str, "displayName": str, "isCurrentlyTradable": bool}]}.
Rate limit: shares the market-data pool of 120 requests per 60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of candidates to return. | |
| query | Yes | Ticker symbol to search for, e.g. 'AAPL' or 'BTC'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses contains/prefix matching, immutability of instrument IDs, and rate limit sharing beyond readOnlyHint annotation. Comprehensive 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?
Well-structured: purpose first, then matching behavior, return format, and rate limit. Every sentence adds value, no fluff.
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 purpose, parameter behavior, return format, rate limits, and caching guidance. Output schema is described explicitly. Complete for a search 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 covers parameters (100% coverage), but description adds crucial detail on how query matching works, adding value 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 searches instruments by ticker symbol and returns candidate matches. Specifies matching behavior (contains/prefix) which distinguishes from exact lookup tools like get_instrument_details.
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 explicit guidance to verify internalSymbolFull before using instrumentId. Does not explicitly contrast with siblings but gives clear context for correct use.
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.
29 tool updates
v0.1.0- First observed
check_trading_eligibility - First observed
get_aggregated_balances - First observed
get_balance - First observed
get_balance_history - First observed
get_balances_by_type - First observed
get_candles - First observed
get_close_order_info - First observed
get_closing_prices - First observed
get_curated_lists - First observed
get_default_watchlist - First observed
get_instrument_details - First observed
get_market_recommendations - First observed
get_order - First observed
get_pnl - First observed
get_portfolio - First observed
get_portfolio_breakdown - First observed
get_profile - First observed
get_public_watchlists - First observed
get_rates - First observed
get_trading_cost_estimate - First observed
get_watchlist - First observed
list_cash_transactions - First observed
list_exchanges - First observed
list_instrument_types - First observed
list_price_alerts - First observed
list_stock_industries - First observed
list_trading_history - First observed
list_watchlists - First observed
search_instruments
TDQS
Scored across 29 tools
Each tool targets a distinct resource or action, with clear descriptions. Even similar tools like get_balance, get_aggregated_balances, and get_balances_by_type are well-differentiated by scope. No overlapping purposes.
All tool names follow a consistent verb_noun pattern (e.g., get_balance, list_watchlists, search_instruments), using lowercase with underscores. No mixing of conventions.
29 tools is on the high side for a single server, exceeding the 'heavy' threshold of 16-25. While each tool serves a specific endpoint, the count may overwhelm an agent. However, the domain is complex enough to justify most tools.
Several critical operations are missing, such as create_order, cancel_order, create/delete/update watchlists, and manage price alerts. The server provides many read operations but lacks corresponding write/delete actions, leading to dead ends for common trading workflows.
Maintenance
Related MCP Connectors
MCP server with quote and live cryptocurrency price tools, local and cloud-deployed transports.
Open-source MCP server for Zerodha Kite Connect. Portfolio, market data, backtesting, alerts.
MCP server for OpenMM — exposes market data, account, trading, and strategy tools to AI agents
MCP server for stocksense-ai documentation, generated by doc2mcp.
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
- FlicenseAqualityDmaintenanceA security-hardened MCP server that wraps the eToro public API, enabling AI assistants to trade, access market data, manage portfolios, and interact with social feeds via 34 tools.6-
- AlicenseAqualityCmaintenanceMCP server connecting AI assistants to eToro for portfolio analysis, market research, and trading, with 35 tools.3532 npm1MIT
- FlicenseAqualityDmaintenanceMCP server for the tastytrade brokerage API, providing tools for account management, market data, and order execution.18-