eToro Trading MCP
NPM · ETORO-TRADING-MCP
197 eToro API tools for agents: market data, watchlists, feeds, demo and real trading.
Available components
Last scanned (2 hours ago)
Scores higher than 58% of npm servers
Category Finance and Payments
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 3 of 8 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to n-kostadinov/etoro-trading-mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 1 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability47
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 10749 tokens (~383/item across 28 items; 28 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management33
- Stability observed for 10 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage67
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 28 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 +5
- Stability: unverified → 0.33 ▲ functional
- 27 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 26 Oct 26 58
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed npm/etoro-trading-mcp@1.0.1
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | n-kostadinov/etoro-trading-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/n-kostadinov/etoro-trading-mcp/.github/workflows/release.yml@refs/tags/v1.0.1 |
| Rekor log index | 3492483645 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:0d7c62c5c25a6ac252dbc3a2be52a33b6f3f06860b70cfc0d26821e83e5beefd3726f3111040ff3b92fbc16aae59474e955c95fada0118ef315dfdffb |
Background: How many MCP packages publish verified provenance →
Dependencies 8 packages
| Packages resolved | 8 |
|---|---|
| Stale | 3 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
createTradingExecutionDemoMarketCloseOrdersPositionsByPositionId Close demo position by units ~508
Close demo position by units POST /api/v1/trading/execution/demo/market-close-orders/positions/{positionId} **Rate limit:** 20 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `DELETE /api/v1/trading/execution/demo/limit-orders/{orderId}` - `DELETE /api/v1/trading/execution/demo/market-close-orders/{orderId}` - `DELETE /api/v1/trading/execution/demo/market-open-orders/{orderId}` - `DELETE /api/v2/trading/execution/demo/orders/{orderId}` - `DELETE /api/v3/trading/execution/demo/orders/{orderId}` - `POST /api/v1/trading/execution/demo/limit-orders` - `POST /api/v1/trading/execution/demo/market-open-orders/by-amount` - `POST /api/v1/trading/execution/demo/market-open-orders/by-units` - `POST /api/v2/trading/execution/demo/orders` - `POST /api/v3/trading/execution/demo/orders` --- This endpoint allows traders to close an entire position or a portion of it at the current market rate. If `UnitsToDeduct` is provided, only the specified portion will be closed. If `UnitsToDeduct` is omitted or set to null, the full position will be closed. A 200 response means the close order was submitted, not that the position was closed. Confirm the outcome with GET /api/v1/trading/info/demo/close-orders/{orderId}, using the orderID returned under orderForClose. Toolset source tag: Trading - Demo. Demo operation: changes virtual/demo state only; it is not a real-money trade. OAuth scope alternatives (any one listed alternative): etoro-public:demo:write OR etoro-public:trade.demo:write. Rate limit: 20 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| body | object | – | – |
| headers | object | – | – |
| path | object | yes | – |
No output schema declared.
No examples provided.
createTradingExecutionDemoOrders Create an order ~706
Create an order POST /api/v2/trading/execution/demo/orders **Rate limit:** 20 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `DELETE /api/v1/trading/execution/demo/limit-orders/{orderId}` - `DELETE /api/v1/trading/execution/demo/market-close-orders/{orderId}` - `DELETE /api/v1/trading/execution/demo/market-open-orders/{orderId}` - `DELETE /api/v2/trading/execution/demo/orders/{orderId}` - `DELETE /api/v3/trading/execution/demo/orders/{orderId}` - `POST /api/v1/trading/execution/demo/limit-orders` - `POST /api/v1/trading/execution/demo/market-close-orders/positions/{positionId}` - `POST /api/v1/trading/execution/demo/market-open-orders/by-amount` - `POST /api/v1/trading/execution/demo/market-open-orders/by-units` - `POST /api/v3/trading/execution/demo/orders` --- This endpoint allows traders to place an order. Leverage, stop-loss, and take-profit settings can be applied. Order size must use exactly one of amount, units, or contracts. For open orders the instrument must be identified by exactly one of symbol or instrumentId - providing both is rejected. A stopLossRate is required when leverage is greater than 1, when transaction is sellShort, when settlementType is realFutures, or when stopLossType is trailing. Only the buy and sellShort transactions are currently supported. A unique X-Request-Id header (GUID) is required for idempotency. Currently only orders to open a position are supported. On this v2 create path, settlementType remains optional (stricter settlementType rules apply only on v3). A 200 response means the order was accepted for processing, not that it was executed. Confirm the outcome with GET /api/v2/trading/info/demo/orders:lookup, passing the returned orderId - or referenceId, which echoes your X-Request-Id and is the only handle you…
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| headers | object | – | – |
No output schema declared.
No examples provided.
createTradingExecutionDemoOrdersV3 Submit an order for asynchronous processing ~711
Submit an order for asynchronous processing POST /api/v3/trading/execution/demo/orders **Rate limit:** 20 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `DELETE /api/v1/trading/execution/demo/limit-orders/{orderId}` - `DELETE /api/v1/trading/execution/demo/market-close-orders/{orderId}` - `DELETE /api/v1/trading/execution/demo/market-open-orders/{orderId}` - `DELETE /api/v2/trading/execution/demo/orders/{orderId}` - `DELETE /api/v3/trading/execution/demo/orders/{orderId}` - `POST /api/v1/trading/execution/demo/limit-orders` - `POST /api/v1/trading/execution/demo/market-close-orders/positions/{positionId}` - `POST /api/v1/trading/execution/demo/market-open-orders/by-amount` - `POST /api/v1/trading/execution/demo/market-open-orders/by-units` - `POST /api/v2/trading/execution/demo/orders` --- This endpoint allows traders to place an order. Leverage, stop-loss, and take-profit settings can be applied. Order size must use exactly one of amount, units, or contracts. For open orders the instrument must be identified by exactly one of symbol or instrumentId - providing both is rejected. A stopLossRate is required when leverage is greater than 1, when transaction is sellShort, when settlementType is realFutures, or when stopLossType is trailing. Only the buy and sellShort transactions are currently supported. A unique X-Request-Id header (GUID) is required for idempotency. Currently only orders to open a position are supported. On this v3 create path, settlementType is mandatory for non-MIT orders and must be omitted for MIT orders. A 202 response means the order was accepted for processing, not that it was executed. Confirm the outcome with GET /api/v2/trading/info/demo/orders:lookup, passing the returned orderId - or referenceId, which echoes your X-Request-…
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| headers | object | – | – |
No output schema declared.
No examples provided.
deleteTradingExecutionDemoMarketCloseOrdersByOrderId Cancel pending demo close order ~611
Cancel pending demo close order DELETE /api/v1/trading/execution/demo/market-close-orders/{orderId} **Rate limit:** 20 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `DELETE /api/v1/trading/execution/demo/limit-orders/{orderId}` - `DELETE /api/v1/trading/execution/demo/market-open-orders/{orderId}` - `DELETE /api/v2/trading/execution/demo/orders/{orderId}` - `DELETE /api/v3/trading/execution/demo/orders/{orderId}` - `POST /api/v1/trading/execution/demo/limit-orders` - `POST /api/v1/trading/execution/demo/market-close-orders/positions/{positionId}` - `POST /api/v1/trading/execution/demo/market-open-orders/by-amount` - `POST /api/v1/trading/execution/demo/market-open-orders/by-units` - `POST /api/v2/trading/execution/demo/orders` - `POST /api/v3/trading/execution/demo/orders` --- This endpoint allows traders to cancel a previously placed market order for close before execution. If the order has already been processed, cancellation will not be possible. A 200 response confirms the cancellation request was received, not that the order was cancelled. Confirm with GET /api/v1/trading/info/demo/close-orders/{orderId}, using the orderId of the close order you tried to cancel. If the DELETE response is lost (timeout or network error), do not resend the cancel - poll that GET endpoint with the same orderId. Units reported as executed in its positions[] array were closed before the cancel took effect; the remainder was not closed. No executed entries in positions[] means nothing was closed. Poll until statusID is terminal: 7 (CANCELED) = cancelled with nothing executed, 9 (CANCELED_PARTIALLY_FILLED) = cancelled after a partial fill (executed units in positions[]), 3 (FILLED) = fully executed before the cancel; 1, 2, 5, 6 and 11 are still pending. Toolset source…
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| path | object | yes | – |
No output schema declared.
No examples provided.
deleteTradingExecutionDemoOrdersByOrderId Cancels an order before it is executed ~547
Cancels an order before it is executed DELETE /api/v2/trading/execution/demo/orders/{orderId} **Rate limit:** 20 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `DELETE /api/v1/trading/execution/demo/limit-orders/{orderId}` - `DELETE /api/v1/trading/execution/demo/market-close-orders/{orderId}` - `DELETE /api/v1/trading/execution/demo/market-open-orders/{orderId}` - `DELETE /api/v3/trading/execution/demo/orders/{orderId}` - `POST /api/v1/trading/execution/demo/limit-orders` - `POST /api/v1/trading/execution/demo/market-close-orders/positions/{positionId}` - `POST /api/v1/trading/execution/demo/market-open-orders/by-amount` - `POST /api/v1/trading/execution/demo/market-open-orders/by-units` - `POST /api/v2/trading/execution/demo/orders` - `POST /api/v3/trading/execution/demo/orders` --- This endpoint sends a cancellation request to cancel an order before execution. An order can be cancelled if it is waiting for the market to open, or for the trigger rate to be published (MIT orders). The cancellation request may be successful, and the order is cancelled, or unsuccessful, and the order is not cancelled. This operation is idempotent when the order is already closed or cancelled. A 200 response confirms the cancellation request was accepted, not that the order was cancelled - it may already have executed. Confirm with GET /api/v2/trading/info/demo/orders:lookup: status.id 7 (Canceled) or 9 (CanceledPartiallyFilled) means the cancellation took effect, while 6 (PendingCancel) means it is still being processed. Toolset source tag: Trading - Demo. Demo operation: changes virtual/demo state only; it is not a real-money trade. OAuth scope alternatives (any one listed alternative): etoro-public:demo:write OR etoro-public:trade.demo:write. Rate limit: 20 reque…
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| path | object | yes | – |
No output schema declared.
No examples provided.
deleteTradingExecutionDemoOrdersByOrderIdV3 Request cancellation of a pending order ~547
Request cancellation of a pending order DELETE /api/v3/trading/execution/demo/orders/{orderId} **Rate limit:** 20 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `DELETE /api/v1/trading/execution/demo/limit-orders/{orderId}` - `DELETE /api/v1/trading/execution/demo/market-close-orders/{orderId}` - `DELETE /api/v1/trading/execution/demo/market-open-orders/{orderId}` - `DELETE /api/v2/trading/execution/demo/orders/{orderId}` - `POST /api/v1/trading/execution/demo/limit-orders` - `POST /api/v1/trading/execution/demo/market-close-orders/positions/{positionId}` - `POST /api/v1/trading/execution/demo/market-open-orders/by-amount` - `POST /api/v1/trading/execution/demo/market-open-orders/by-units` - `POST /api/v2/trading/execution/demo/orders` - `POST /api/v3/trading/execution/demo/orders` --- This endpoint sends a cancellation request to cancel an order before execution. An order can be cancelled if it is waiting for the market to open, or for the trigger rate to be published (MIT orders). The cancellation request may be successful, and the order is cancelled, or unsuccessful, and the order is not cancelled. This operation is idempotent when the order is already closed or cancelled. A 202 response confirms the cancellation request was accepted, not that the order was cancelled - it may already have executed. Confirm with GET /api/v2/trading/info/demo/orders:lookup: status.id 7 (Canceled) or 9 (CanceledPartiallyFilled) means the cancellation took effect, while 6 (PendingCancel) means it is still being processed. Toolset source tag: Trading - Demo. Demo operation: changes virtual/demo state only; it is not a real-money trade. OAuth scope alternatives (any one listed alternative): etoro-public:demo:write OR etoro-public:trade.demo:write. Rate limit: 20 requ…
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| path | object | yes | – |
No output schema declared.
No examples provided.
getAggregatedPortfolioDemo Get aggregated portfolio snapshot ~277
Get aggregated portfolio snapshot GET /api/v1/trading/info/demo/aggregate-portfolio **Rate limit:** 60 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `POST /api/v1/trading/info/demo/aggregate-portfolio` --- Returns a complete snapshot of the authenticated user's demo account investment portfolio, organized by asset. The response includes account-level balances and equity, individually held positions grouped by asset, and any copy-trading relationships the user has active. Use the instrumentIds filter to scope results to a specific set of assets, or mirrorIds to isolate specific copy-trading relationships. Account totals always reflect the full portfolio regardless of filters applied. Toolset source tag: Trading - Demo. OAuth scope alternatives (any one listed alternative): etoro-public:trade.demo:read. Rate limit: 60 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| query | object | – | – |
No output schema declared.
No examples provided.
getCostDemo Get what-if trading cost breakdown ~269
Get what-if trading cost breakdown POST /api/v2/trading/info/demo/costs **Rate limit:** 20 requests per 60 seconds. This is a **dedicated** limit for this endpoint — it is **not shared** with (pooled across) any other endpoint, so the full rate is available to this endpoint alone. --- Returns the markup, market spread, transaction fee, overnight fee, over-weekend fee, and tax that would apply if the supplied order were executed now against the demo account. For `action: open`, exactly one of `symbol` or `instrumentId` must be provided and `leverage` must be at least 1. For `action: close`, `positionIds` must be non-empty. Toolset source tag: Trading - Demo. OAuth scope alternatives (any one listed alternative): etoro-public:demo:read OR etoro-public:demo:write OR etoro-public:trade.demo:read OR etoro-public:trade.demo:write. Rate limit: 20 requests per 60 seconds. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| headers | object | – | – |
No output schema declared.
No examples provided.
getInstrumentEligibilityDemo Check instrument trading eligibility ~291
Check instrument trading eligibility POST /api/v2/trading/info/demo/eligibility **Rate limit:** 20 requests per 60 seconds. This is a **dedicated** limit for this endpoint — it is **not shared** with (pooled across) any other endpoint, so the full rate is available to this endpoint alone. --- Returns per-instrument trading configuration for the authenticated account - position limits, permitted order types, stop-loss and take-profit boundaries, and available leverage by settlement type and direction. Instruments not found are listed in notFoundInstrumentIds and notFoundSymbols. At least one of instrumentIds or symbols must be supplied; the combined length must not exceed 100 instruments. This configuration changes rarely for a given instrument and account, so call it once and reuse the result for the rest of the session instead of re-querying before every order. Toolset source tag: Trading - Demo. OAuth scope alternatives (any one listed alternative): etoro-public:demo:read OR etoro-public:demo:write OR etoro-public:trade.demo:read OR etoro-public:trade.demo:write. Rate limit: 20 requests per 60 seconds. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| headers | object | – | – |
No output schema declared.
No examples provided.
getInstrumentsSearch Search instruments by free-text query ~390
Search instruments by free-text query GET /api/v2/market-data/instruments/search **Rate limit:** 120 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/market-data/exchanges` - `GET /api/v1/market-data/instrument-types` - `GET /api/v1/market-data/instruments` - `GET /api/v1/market-data/instruments/history/closing-price` - `GET /api/v1/market-data/instruments/rates` - `GET /api/v1/market-data/instruments/{instrumentId}/history/candles/{direction}/{interval}/{candlesCount}` - `GET /api/v1/market-data/search` - `GET /api/v1/market-data/stocks-industries` - `GET /api/v2/market-data/instruments` - `GET /api/v2/market-data/rates` --- Free-text search of instruments by name or symbol. Results are relevance-ranked by the upstream search index; non-public instruments are filtered out. Toolset source tag: Market Data. OAuth scope alternatives (any one listed alternative): etoro-public:real:read OR etoro-public:demo:read OR etoro-public:real:write OR etoro-public:demo:write OR etoro-public:market-data:read. Rate limit: 120 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| query | object | yes | – |
No output schema declared.
No examples provided.
getMarketDataExchanges List supported exchanges ~325
List supported exchanges GET /api/v1/market-data/exchanges **Rate limit:** 120 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/market-data/instrument-types` - `GET /api/v1/market-data/instruments` - `GET /api/v1/market-data/instruments/history/closing-price` - `GET /api/v1/market-data/instruments/rates` - `GET /api/v1/market-data/instruments/{instrumentId}/history/candles/{direction}/{interval}/{candlesCount}` - `GET /api/v1/market-data/search` - `GET /api/v1/market-data/stocks-industries` - `GET /api/v2/market-data/instruments` - `GET /api/v2/market-data/instruments/search` - `GET /api/v2/market-data/rates` Toolset source tag: Market Data. OAuth scope alternatives (any one listed alternative): unscoped OAuth alternative. Rate limit: 120 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| query | object | – | – |
No output schema declared.
No examples provided.
getMarketDataInstruments Get instrument display data ~326
Get instrument display data GET /api/v1/market-data/instruments **Rate limit:** 120 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/market-data/exchanges` - `GET /api/v1/market-data/instrument-types` - `GET /api/v1/market-data/instruments/history/closing-price` - `GET /api/v1/market-data/instruments/rates` - `GET /api/v1/market-data/instruments/{instrumentId}/history/candles/{direction}/{interval}/{candlesCount}` - `GET /api/v1/market-data/search` - `GET /api/v1/market-data/stocks-industries` - `GET /api/v2/market-data/instruments` - `GET /api/v2/market-data/instruments/search` - `GET /api/v2/market-data/rates` Toolset source tag: Market Data. OAuth scope alternatives (any one listed alternative): unscoped OAuth alternative. Rate limit: 120 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| query | object | – | – |
No output schema declared.
No examples provided.
getMarketDataInstrumentsByInstrumentIdHistoryCandlesByDirectionByIntervalByCandlesCount Get instrument candle history ~386
Get instrument candle history GET /api/v1/market-data/instruments/{instrumentId}/history/candles/{direction}/{interval}/{candlesCount} **Rate limit:** 120 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/market-data/exchanges` - `GET /api/v1/market-data/instrument-types` - `GET /api/v1/market-data/instruments` - `GET /api/v1/market-data/instruments/history/closing-price` - `GET /api/v1/market-data/instruments/rates` - `GET /api/v1/market-data/search` - `GET /api/v1/market-data/stocks-industries` - `GET /api/v2/market-data/instruments` - `GET /api/v2/market-data/instruments/search` - `GET /api/v2/market-data/rates` --- Retrieves historical price data in OHLCV (Open, High, Low, Close, Volume) format for a specified instrument. The data is organized into time-based candles of various intervals, from one minute to one week. Toolset source tag: Market Data. OAuth scope alternatives (any one listed alternative): unscoped OAuth alternative. Rate limit: 120 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| path | object | yes | – |
No output schema declared.
No examples provided.
getMarketDataInstrumentsHistoryClosingPrice Get historical closing prices ~322
Get historical closing prices GET /api/v1/market-data/instruments/history/closing-price **Rate limit:** 120 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/market-data/exchanges` - `GET /api/v1/market-data/instrument-types` - `GET /api/v1/market-data/instruments` - `GET /api/v1/market-data/instruments/rates` - `GET /api/v1/market-data/instruments/{instrumentId}/history/candles/{direction}/{interval}/{candlesCount}` - `GET /api/v1/market-data/search` - `GET /api/v1/market-data/stocks-industries` - `GET /api/v2/market-data/instruments` - `GET /api/v2/market-data/instruments/search` - `GET /api/v2/market-data/rates` Toolset source tag: Market Data. OAuth scope alternatives (any one listed alternative): unscoped OAuth alternative. Rate limit: 120 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
No output schema declared.
No examples provided.
getMarketDataInstrumentsRates Get instrument market rates ~359
Get instrument market rates GET /api/v1/market-data/instruments/rates **Rate limit:** 120 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/market-data/exchanges` - `GET /api/v1/market-data/instrument-types` - `GET /api/v1/market-data/instruments` - `GET /api/v1/market-data/instruments/history/closing-price` - `GET /api/v1/market-data/instruments/{instrumentId}/history/candles/{direction}/{interval}/{candlesCount}` - `GET /api/v1/market-data/search` - `GET /api/v1/market-data/stocks-industries` - `GET /api/v2/market-data/instruments` - `GET /api/v2/market-data/instruments/search` - `GET /api/v2/market-data/rates` --- Provides real-time market data including bid/ask prices, conversion rates, and execution prices for specified financial instruments. Essential for price discovery and trade execution decisions. Toolset source tag: Market Data. OAuth scope alternatives (any one listed alternative): unscoped OAuth alternative. Rate limit: 120 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| query | object | yes | – |
No output schema declared.
No examples provided.
getMarketDataInstrumentTypes List instrument types ~325
List instrument types GET /api/v1/market-data/instrument-types **Rate limit:** 120 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/market-data/exchanges` - `GET /api/v1/market-data/instruments` - `GET /api/v1/market-data/instruments/history/closing-price` - `GET /api/v1/market-data/instruments/rates` - `GET /api/v1/market-data/instruments/{instrumentId}/history/candles/{direction}/{interval}/{candlesCount}` - `GET /api/v1/market-data/search` - `GET /api/v1/market-data/stocks-industries` - `GET /api/v2/market-data/instruments` - `GET /api/v2/market-data/instruments/search` - `GET /api/v2/market-data/rates` Toolset source tag: Market Data. OAuth scope alternatives (any one listed alternative): unscoped OAuth alternative. Rate limit: 120 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| query | object | – | – |
No output schema declared.
No examples provided.
getMarketDataSearch Search for Instruments ~407
Search for Instruments GET /api/v1/market-data/search **Rate limit:** 120 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/market-data/exchanges` - `GET /api/v1/market-data/instrument-types` - `GET /api/v1/market-data/instruments` - `GET /api/v1/market-data/instruments/history/closing-price` - `GET /api/v1/market-data/instruments/rates` - `GET /api/v1/market-data/instruments/{instrumentId}/history/candles/{direction}/{interval}/{candlesCount}` - `GET /api/v1/market-data/stocks-industries` - `GET /api/v2/market-data/instruments` - `GET /api/v2/market-data/instruments/search` - `GET /api/v2/market-data/rates` --- Retrieve a paginated list of instruments. Any field in the Instrument response schema can be projected via the required `fields` parameter and/or used as a query-string filter (e.g. `fields=instrumentId,displayname&displayname=Bitcoin`). Use `pageSize`/`pageNumber` to paginate and `sort` to order. Filters that do not match an indexed instrument field are ignored. Toolset source tag: Market Data. OAuth scope alternatives (any one listed alternative): unscoped OAuth alternative. Rate limit: 120 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| query | object | yes | – |
No output schema declared.
No examples provided.
getMarketDataStocksIndustries Get stocks industries ~326
Get stocks industries GET /api/v1/market-data/stocks-industries **Rate limit:** 120 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/market-data/exchanges` - `GET /api/v1/market-data/instrument-types` - `GET /api/v1/market-data/instruments` - `GET /api/v1/market-data/instruments/history/closing-price` - `GET /api/v1/market-data/instruments/rates` - `GET /api/v1/market-data/instruments/{instrumentId}/history/candles/{direction}/{interval}/{candlesCount}` - `GET /api/v1/market-data/search` - `GET /api/v2/market-data/instruments` - `GET /api/v2/market-data/instruments/search` - `GET /api/v2/market-data/rates` Toolset source tag: Market Data. OAuth scope alternatives (any one listed alternative): unscoped OAuth alternative. Rate limit: 120 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| query | object | – | – |
No output schema declared.
No examples provided.
getRates Retrieve bid/ask rates for one or more instruments ~416
Retrieve bid/ask rates for one or more instruments GET /api/v2/market-data/rates **Rate limit:** 120 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/market-data/exchanges` - `GET /api/v1/market-data/instrument-types` - `GET /api/v1/market-data/instruments` - `GET /api/v1/market-data/instruments/history/closing-price` - `GET /api/v1/market-data/instruments/rates` - `GET /api/v1/market-data/instruments/{instrumentId}/history/candles/{direction}/{interval}/{candlesCount}` - `GET /api/v1/market-data/search` - `GET /api/v1/market-data/stocks-industries` - `GET /api/v2/market-data/instruments` - `GET /api/v2/market-data/instruments/search` --- Returns current bid/ask rates keyed by instrument ID. Each rate carries a `quoteType` indicating whether it is `realtime` or `delayed`. Returns 200 when all requested instruments are found, 206 when only a subset is available. Toolset source tag: Market Data. OAuth scope alternatives (any one listed alternative): etoro-public:real:read OR etoro-public:demo:read OR etoro-public:real:write OR etoro-public:demo:write OR etoro-public:market-data:read. Rate limit: 120 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| query | object | yes | – |
No output schema declared.
No examples provided.
getSecurities Search for securities (instruments) by ID or symbol ~437
Search for securities (instruments) by ID or symbol GET /api/v2/market-data/instruments **Rate limit:** 120 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/market-data/exchanges` - `GET /api/v1/market-data/instrument-types` - `GET /api/v1/market-data/instruments` - `GET /api/v1/market-data/instruments/history/closing-price` - `GET /api/v1/market-data/instruments/rates` - `GET /api/v1/market-data/instruments/{instrumentId}/history/candles/{direction}/{interval}/{candlesCount}` - `GET /api/v1/market-data/search` - `GET /api/v1/market-data/stocks-industries` - `GET /api/v2/market-data/instruments/search` - `GET /api/v2/market-data/rates` --- Returns instrument (security) metadata, optionally filtered by instrument IDs or symbols, with cursor-based pagination. `instrumentsIds` and `symbols` are mutually exclusive. All filters are optional and independent; if neither `instrumentsIds` nor `symbols` is provided, results are not filtered by instrument and are simply paginated by `pageSize`. Toolset source tag: Market Data. OAuth scope alternatives (any one listed alternative): etoro-public:real:read OR etoro-public:demo:read OR etoro-public:real:write OR etoro-public:demo:write OR etoro-public:market-data:read. Rate limit: 120 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| query | object | – | – |
No output schema declared.
No examples provided.
getTradingInfoDemoCloseOrdersByOrderId Get close order information and closed position details ~427
Get close order information and closed position details GET /api/v1/trading/info/demo/close-orders/{orderId} **Rate limit:** 60 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/trading/info/demo/orders/{orderId}` - `GET /api/v2/trading/info/demo/orders:lookup` --- Retrieves information about a close order, including its execution status and the positions that were closed as a result of the request. Use this to track the outcome of a position-closing order and identify which positions were affected. This is a read-only call and is the supported way to confirm the outcome of POST or DELETE /api/v1/trading/execution/demo/market-close-orders/... - including when the DELETE response was lost: poll this endpoint with the same close orderId instead of resending the cancel. Executed quantity is reported per affected position in positions[] (units and amount, with occurred and rate set once that position was closed); the order-level proceeds field totals what was realized. A close order that was cancelled before anything executed has no executed entries in positions[]. Any requested units that do not appear as executed in positions[] were not closed. errorCode and errorMessage are populated when processing failed. Toolset source tag: Trading - Demo. OAuth scope alternatives (any one listed alternative): etoro-public:demo:read OR etoro-public:demo:write OR etoro-public:trade.demo:read OR etoro-public:trade.demo:write. Rate limit: 60 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| path | object | yes | – |
No output schema declared.
No examples provided.
getTradingInfoDemoOrdersLookup Get order information and position details ~323
Get order information and position details GET /api/v2/trading/info/demo/orders:lookup **Rate limit:** 60 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/trading/info/demo/close-orders/{orderId}` - `GET /api/v1/trading/info/demo/orders/{orderId}` --- Retrieves comprehensive information about a specific order, including the order status, execution details, and all positions that were opened or closed from this order. This endpoint is essential for tracking order execution and identifying which positions were created as a result of a specific order request. The response includes detailed position information with PositionID values that can be used to query position-specific details. Provide exactly one of orderId or referenceId. Toolset source tag: Trading - Demo. OAuth scope alternatives (any one listed alternative): etoro-public:demo:read OR etoro-public:demo:write OR etoro-public:trade.demo:read OR etoro-public:trade.demo:write. Rate limit: 60 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| query | object | – | – |
No output schema declared.
No examples provided.
getTradingInfoDemoPnl Get account PnL and portfolio details ~255
Get account PnL and portfolio details GET /api/v1/trading/info/demo/pnl **Rate limit:** 60 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/trading/info/demo/portfolio` - `GET /api/v2/trading/info/demo/instrument-breakdown` --- Retrieves the demo account's current portfolio, including credit, open positions, orders, mirrors, and PnL details. Toolset source tag: Trading - Demo. OAuth scope alternatives (any one listed alternative): etoro-public:demo:read OR etoro-public:demo:write OR etoro-public:trade.demo:read OR etoro-public:trade.demo:write. Rate limit: 60 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
No output schema declared.
No examples provided.
getTradingInfoDemoPortfolio Get demo portfolio breakdown ~260
Get demo portfolio breakdown GET /api/v1/trading/info/demo/portfolio **Rate limit:** 60 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/trading/info/demo/pnl` - `GET /api/v2/trading/info/demo/instrument-breakdown` --- Returns detailed portfolio information including active positions, pending orders, mirror trading details, and account balances. This endpoint provides a complete overview of the user's trading activity and current market exposure. Toolset source tag: Trading - Demo. OAuth scope alternatives (any one listed alternative): etoro-public:demo:read OR etoro-public:demo:write OR etoro-public:trade.demo:read OR etoro-public:trade.demo:write. Rate limit: 60 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
No output schema declared.
No examples provided.
getTradingInfoDemoPortfolioInstrumentBreakdown Get instrument breakdown (demo) ~232
Get instrument breakdown (demo) GET /api/v2/trading/info/demo/instrument-breakdown **Rate limit:** 60 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/trading/info/demo/pnl` - `GET /api/v1/trading/info/demo/portfolio` --- Returns the demo portfolio grouped by instrument, including per-position data, pending orders, and PnL. Toolset source tag: Trading - Demo. OAuth scope alternatives (any one listed alternative): etoro-public:trade.demo:read. Rate limit: 60 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | yes | – |
| query | object | – | – |
No output schema declared.
No examples provided.
getTradingInfoTradeDemoHistory List trading history ~265
List trading history GET /api/v1/trading/info/trade/demo/history **Rate limit:** 60 requests per 60 seconds. This is the **default shared quota** — it is shared with every other endpoint that has no dedicated limit, so requests across those endpoints all draw from the same budget. --- Returns closed trades for the authenticated account from `minDate` through the present. Keep each request's lookback to less than 1 year (maximum 1 year minus 1 day). For longer history, split the range into successive windows of at most that length (advance `minDate` per batch) and use `page` / `pageSize` within each window. Toolset source tag: Trading - Demo. OAuth scope alternatives (any one listed alternative): etoro-public:demo:read OR etoro-public:demo:write OR etoro-public:trade.demo:read OR etoro-public:trade.demo:write. Rate limit: 60 requests per 60 seconds in the default shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| headers | object | – | – |
| query | object | yes | – |
No output schema declared.
No examples provided.
postAggregatedPortfolioDemo Get a filtered aggregated portfolio snapshot ~233
Get a filtered aggregated portfolio snapshot POST /api/v1/trading/info/demo/aggregate-portfolio **Rate limit:** 60 requests per 60 seconds. This is a **shared quota** — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota: - `GET /api/v1/trading/info/demo/aggregate-portfolio` --- Returns the demo portfolio using aggregation levels and structured per-mirror instrument filters from the request body. This filter does not affect the account totals, that are still calculated based on the full portfolio. Toolset source tag: Trading - Demo. OAuth scope alternatives (any one listed alternative): etoro-public:trade.demo:read. Rate limit: 60 requests per 60 seconds in a shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| headers | object | – | – |
No output schema declared.
No examples provided.
updateDemoPosition Modify stop-loss and take-profit settings on an open position ~268
Modify stop-loss and take-profit settings on an open position PATCH /api/v2/trading/demo/positions/{positionId} **Rate limit:** 60 requests per 60 seconds. This is the **default shared quota** — it is shared with every other endpoint that has no dedicated limit, so requests across those endpoints all draw from the same budget. --- Submits an asynchronous request to update stop-loss and/or take-profit on an open position. You can set a new stopLossRate, takeProfitRate, stopLossType, or clear either value (clearStopLoss, clearTakeProfit). At least one SL/TP-related field is required. The response returns acceptance and correlation metadata only. Toolset source tag: Trading - Demo. Demo operation: changes virtual/demo state only; it is not a real-money trade. OAuth scope alternatives (any one listed alternative): etoro-public:demo:write OR etoro-public:trade.demo:write. Rate limit: 60 requests per 60 seconds in the default shared pool. x-request-id is generated when omitted. Reuse the returned request ID when checking an ambiguous outcome; non-idempotent mutations are not automatically retried.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| headers | object | – | – |
| path | object | yes | – |
No output schema declared.
No examples provided.
How do I install the eToro Trading MCP server?
eToro Trading MCP runs locally as an npm package, launched with npx -y etoro-trading-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · etoro-trading-mcp
claude mcp add n-kostadinov-etoro-trading-mcp -- npx -y etoro-trading-mcp
What is the eToro Trading MCP server?
eToro Trading MCP is listed in the public MCP registry as io.github.n-kostadinov/etoro-trading-mcp. 197 eToro API tools for agents: market data, watchlists, feeds, demo and real trading. This page covers its npm package (etoro-trading-mcp).
Is the eToro Trading MCP server safe to use?
eToro Trading MCP scores 78 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the eToro Trading MCP server expose?
eToro Trading MCP exposes 28 tools: createTradingExecutionDemoMarketCloseOrdersPositionsByPosit…, createTradingExecutionDemoOrders, createTradingExecutionDemoOrdersV3, deleteTradingExecutionDemoMarketCloseOrdersByOrderId, deleteTradingExecutionDemoOrdersByOrderId, and 23 more. Their descriptions and schemas cost roughly 10,749 tokens of context every time the server is loaded.
Is the eToro Trading MCP server still maintained?
eToro Trading MCP is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the eToro Trading MCP server under?
eToro Trading MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.