# eToro Trading MCP (npm · etoro-trading-mcp)

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

- Trust score: 78/100 (medium)
- Change this week: +5
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- npm · `etoro-trading-mcp`: 78/100 (this document), [markdown](https://verifymcp.io/servers/n-kostadinov-etoro-trading-mcp/etoro-trading-mcp.md), [page](https://verifymcp.io/servers/n-kostadinov-etoro-trading-mcp/etoro-trading-mcp)

## Channel facts

- Registry: `npm`
- Package: `etoro-trading-mcp`
- Version: `1.0.1`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 3 of 8 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to n-kostadinov/etoro-trading-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 1 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 47/100
  - AI-judged instruction clarity (good).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 33/100
  - Stability observed for 10 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 67/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 28 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## 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.

### Claude

```bash
claude mcp add n-kostadinov-etoro-trading-mcp -- npx -y etoro-trading-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "n-kostadinov-etoro-trading-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "etoro-trading-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "n-kostadinov-etoro-trading-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "etoro-trading-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add n-kostadinov-etoro-trading-mcp -- npx -y etoro-trading-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "n-kostadinov-etoro-trading-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "etoro-trading-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add n-kostadinov-etoro-trading-mcp --command npx --arg -y --arg etoro-trading-mcp
```

### Hermes

```yaml
mcp_servers:
  n-kostadinov-etoro-trading-mcp:
    command: "npx"
    args: ["-y", "etoro-trading-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "n-kostadinov-etoro-trading-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "etoro-trading-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add n-kostadinov-etoro-trading-mcp -t stdio -c npx -a -y etoro-trading-mcp
```

### Other

```json
{
  "mcpServers": {
    "n-kostadinov-etoro-trading-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "etoro-trading-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 78, +5)

- [functional improvement] Stability: unverified → 0.33

### 2026-10-27 (score 73, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-26 (score 58)

First indexed and scored.

## MCP tools (28)

### `createTradingExecutionDemoMarketCloseOrdersPositionsByPositionId` (~508 tokens)

Close demo position by units

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.

Input parameters:

- `body` (object)
- `headers` (object)
- `path` (object, required)

### `createTradingExecutionDemoOrders` (~706 tokens)

Create an order

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…

Input parameters:

- `body` (required)
- `headers` (object)

### `createTradingExecutionDemoOrdersV3` (~711 tokens)

Submit an order for asynchronous processing

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

Input parameters:

- `body` (required)
- `headers` (object)

### `deleteTradingExecutionDemoMarketCloseOrdersByOrderId` (~611 tokens)

Cancel pending demo close order

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…

Input parameters:

- `headers` (object)
- `path` (object, required)

### `deleteTradingExecutionDemoOrdersByOrderId` (~547 tokens)

Cancels an order before it is executed

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…

Input parameters:

- `headers` (object)
- `path` (object, required)

### `deleteTradingExecutionDemoOrdersByOrderIdV3` (~547 tokens)

Request cancellation of a pending order

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…

Input parameters:

- `headers` (object)
- `path` (object, required)

### `getAggregatedPortfolioDemo` (~277 tokens)

Get aggregated portfolio snapshot

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.

Input parameters:

- `headers` (object)
- `query` (object)

### `getCostDemo` (~269 tokens)

Get what-if trading cost breakdown

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.

Input parameters:

- `body` (required)
- `headers` (object)

### `getInstrumentEligibilityDemo` (~291 tokens)

Check instrument trading eligibility

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.

Input parameters:

- `body` (required)
- `headers` (object)

### `getInstrumentsSearch` (~390 tokens)

Search instruments by free-text query

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.

Input parameters:

- `headers` (object)
- `query` (object, required)

### `getMarketDataExchanges` (~325 tokens)

List supported exchanges

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.

Input parameters:

- `headers` (object)
- `query` (object)

### `getMarketDataInstruments` (~326 tokens)

Get instrument display data

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.

Input parameters:

- `headers` (object)
- `query` (object)

### `getMarketDataInstrumentsByInstrumentIdHistoryCandlesByDirectionByIntervalByCandlesCount` (~386 tokens)

Get instrument candle history

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.

Input parameters:

- `headers` (object)
- `path` (object, required)

### `getMarketDataInstrumentsHistoryClosingPrice` (~322 tokens)

Get historical closing prices

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.

Input parameters:

- `headers` (object)

### `getMarketDataInstrumentsRates` (~359 tokens)

Get instrument market rates

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.

Input parameters:

- `headers` (object)
- `query` (object, required)

### `getMarketDataInstrumentTypes` (~325 tokens)

List instrument types

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.

Input parameters:

- `headers` (object)
- `query` (object)

### `getMarketDataSearch` (~407 tokens)

Search for Instruments

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.

Input parameters:

- `headers` (object)
- `query` (object, required)

### `getMarketDataStocksIndustries` (~326 tokens)

Get stocks industries

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.

Input parameters:

- `headers` (object)
- `query` (object)

### `getRates` (~416 tokens)

Retrieve bid/ask rates for one or more instruments

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.

Input parameters:

- `headers` (object)
- `query` (object, required)

### `getSecurities` (~437 tokens)

Search for securities (instruments) by ID or symbol

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.

Input parameters:

- `headers` (object)
- `query` (object)

### `getTradingInfoDemoCloseOrdersByOrderId` (~427 tokens)

Get close order information and closed position details

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.

Input parameters:

- `headers` (object)
- `path` (object, required)

### `getTradingInfoDemoOrdersLookup` (~323 tokens)

Get order information and position details

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.

Input parameters:

- `headers` (object)
- `query` (object)

### `getTradingInfoDemoPnl` (~255 tokens)

Get account PnL and portfolio details

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.

Input parameters:

- `headers` (object)

### `getTradingInfoDemoPortfolio` (~260 tokens)

Get demo portfolio breakdown

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.

Input parameters:

- `headers` (object)

### `getTradingInfoDemoPortfolioInstrumentBreakdown` (~232 tokens)

Get instrument breakdown (demo)

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.

Input parameters:

- `headers` (object, required)
- `query` (object)

### `getTradingInfoTradeDemoHistory` (~265 tokens)

List trading history

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.

Input parameters:

- `headers` (object)
- `query` (object, required)

### `postAggregatedPortfolioDemo` (~233 tokens)

Get a filtered aggregated portfolio snapshot

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.

Input parameters:

- `body` (required)
- `headers` (object)

### `updateDemoPosition` (~268 tokens)

Modify stop-loss and take-profit settings on an open position

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.

Input parameters:

- `body` (required)
- `headers` (object)
- `path` (object, required)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/n-kostadinov-etoro-trading-mcp/etoro-trading-mcp#diagnostics

## Score history

- 2026-11-05: 78
- 2026-11-04: 73
- 2026-11-03: 73
- 2026-11-02: 73
- 2026-11-01: 73
- 2026-10-31: 73
- 2026-10-30: 73
- 2026-10-29: 73
- 2026-10-28: 73
- 2026-10-27: 73
- 2026-10-26: 58

## 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.

## Links

- npm package: https://www.npmjs.com/package/etoro-trading-mcp
- Socket report: https://socket.dev/npm/package/etoro-trading-mcp
- Repository: https://github.com/n-kostadinov/etoro-trading-mcp
- Changelog RSS feed: https://verifymcp.io/servers/n-kostadinov-etoro-trading-mcp/etoro-trading-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/n-kostadinov-etoro-trading-mcp/etoro-trading-mcp.json
- HTML version of this page: https://verifymcp.io/servers/n-kostadinov-etoro-trading-mcp/etoro-trading-mcp
