Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

eToro Trading MCP

NPM · ETORO-TRADING-MCP

197 eToro API tools for agents: market data, watchlists, feeds, demo and real trading.

Available components

+5 this week 78 Trust /100

Last scanned (2 hours ago)

Scores higher than 58% of npm servers

Category Finance and Payments

Trust breakdown (7 categories)

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
Changelog

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.

Diagnostics

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 →

MCP tools · 28 exposed · ~10,749 tokens

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 →

Tool Tokens
createTradingExecutionDemoMarketCloseOrdersPositionsByPositionId ~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.

NameTypeReqDescription
bodyobject––
headersobject––
pathobjectyes–

No output schema declared.

No examples provided.

createTradingExecutionDemoOrders ~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…

NameTypeReqDescription
body–yes–
headersobject––

No output schema declared.

No examples provided.

createTradingExecutionDemoOrdersV3 ~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-…

NameTypeReqDescription
body–yes–
headersobject––

No output schema declared.

No examples provided.

deleteTradingExecutionDemoMarketCloseOrdersByOrderId ~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…

NameTypeReqDescription
headersobject––
pathobjectyes–

No output schema declared.

No examples provided.

deleteTradingExecutionDemoOrdersByOrderId ~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…

NameTypeReqDescription
headersobject––
pathobjectyes–

No output schema declared.

No examples provided.

deleteTradingExecutionDemoOrdersByOrderIdV3 ~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…

NameTypeReqDescription
headersobject––
pathobjectyes–

No output schema declared.

No examples provided.

getAggregatedPortfolioDemo ~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.

NameTypeReqDescription
headersobject––
queryobject––

No output schema declared.

No examples provided.

getCostDemo ~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.

NameTypeReqDescription
body–yes–
headersobject––

No output schema declared.

No examples provided.

getInstrumentEligibilityDemo ~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.

NameTypeReqDescription
body–yes–
headersobject––

No output schema declared.

No examples provided.

getInstrumentsSearch ~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.

NameTypeReqDescription
headersobject––
queryobjectyes–

No output schema declared.

No examples provided.

getMarketDataExchanges ~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.

NameTypeReqDescription
headersobject––
queryobject––

No output schema declared.

No examples provided.

getMarketDataInstruments ~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.

NameTypeReqDescription
headersobject––
queryobject––

No output schema declared.

No examples provided.

getMarketDataInstrumentsByInstrumentIdHistoryCandlesByDirectionByIntervalByCandlesCount ~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.

NameTypeReqDescription
headersobject––
pathobjectyes–

No output schema declared.

No examples provided.

getMarketDataInstrumentsHistoryClosingPrice ~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.

NameTypeReqDescription
headersobject––

No output schema declared.

No examples provided.

getMarketDataInstrumentsRates ~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.

NameTypeReqDescription
headersobject––
queryobjectyes–

No output schema declared.

No examples provided.

getMarketDataInstrumentTypes ~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.

NameTypeReqDescription
headersobject––
queryobject––

No output schema declared.

No examples provided.

getMarketDataSearch ~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.

NameTypeReqDescription
headersobject––
queryobjectyes–

No output schema declared.

No examples provided.

getMarketDataStocksIndustries ~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.

NameTypeReqDescription
headersobject––
queryobject––

No output schema declared.

No examples provided.

getRates ~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.

NameTypeReqDescription
headersobject––
queryobjectyes–

No output schema declared.

No examples provided.

getSecurities ~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.

NameTypeReqDescription
headersobject––
queryobject––

No output schema declared.

No examples provided.

getTradingInfoDemoCloseOrdersByOrderId ~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.

NameTypeReqDescription
headersobject––
pathobjectyes–

No output schema declared.

No examples provided.

getTradingInfoDemoOrdersLookup ~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.

NameTypeReqDescription
headersobject––
queryobject––

No output schema declared.

No examples provided.

getTradingInfoDemoPnl ~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.

NameTypeReqDescription
headersobject––

No output schema declared.

No examples provided.

getTradingInfoDemoPortfolio ~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.

NameTypeReqDescription
headersobject––

No output schema declared.

No examples provided.

getTradingInfoDemoPortfolioInstrumentBreakdown ~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.

NameTypeReqDescription
headersobjectyes–
queryobject––

No output schema declared.

No examples provided.

getTradingInfoTradeDemoHistory ~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.

NameTypeReqDescription
headersobject––
queryobjectyes–

No output schema declared.

No examples provided.

postAggregatedPortfolioDemo ~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.

NameTypeReqDescription
body–yes–
headersobject––

No output schema declared.

No examples provided.

updateDemoPosition ~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.

NameTypeReqDescription
body–yes–
headersobject––
pathobjectyes–

No output schema declared.

No examples provided.

Install

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

# add to Claude Code
claude mcp add n-kostadinov-etoro-trading-mcp -- npx -y etoro-trading-mcp
Common questions

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.