eToro MCP Server
# eToro MCP Server
<div align="center">
<img src="https://raw.githubusercontent.com/gabrielcerutti/etoro-mcp-server/main/icon.png" alt="eToro MCP" width="100" />
Connect any MCP-compatible AI assistant (Claude, Cursor, and others) to your eToro account for portfolio analysis, market research, and trading.
[](https://github.com/gabrielcerutti/etoro-mcp-server/actions/workflows/ci.yml)
[](https://deepwiki.com/gabrielcerutti/etoro-mcp-server)
[](https://nodejs.org)
[](https://www.typescriptlang.org)
[](https://modelcontextprotocol.io)
[](LICENSE)
[Overview](#overview) • [Installation](#installation) • [Configuration](#configuration) • [Tools](#tools-35-total)
</div>
---
## Overview
MCP server wrapping the [eToro public API](https://public-api.etoro.com/api/v1), exposing **35 tools** for AI assistants (Claude Desktop, Cursor, Claude Code, etc.). Built for **investment research and portfolio analysis** — assess positions, research instruments and themes, vet popular investors for copy-trading, backtest DCA strategies against historical data. Trading is fully supported, but use care: letting an AI agent place real-money orders is genuinely risky, and you should treat it as such.
## What Can You Do With It?
The server is built around **research workflows** first. The examples below show real multi-tool conversations — the assistant chains several `etoro_*` calls together to answer a single question. Numbers are representative; actual responses draw from live eToro data.
### 1. Portfolio health check
The assistant calls `etoro_get_portfolio` to pull your open positions, then `etoro_get_instruments` to resolve instrument IDs to names and sectors, and `etoro_get_rates` for live prices. It assembles a full snapshot from the raw data.
> **You:** How is my portfolio doing? Break it down by sector and flag any trouble spots.
>
> **Assistant:** I pulled your portfolio (98 open positions), resolved each instrument, and fetched live rates. Here's the picture:
>
> - **Cash:** $22,265 • **Invested:** $45,782 • **Positions:** 98 open
>
> **Sector breakdown:**
>
> | Sector | % of invested | Top holdings |
> | --- | --- | --- |
> | Technology | 38% | GOOG, META, MSFT, NVDA, AMZN |
> | ETFs & Index | 22% | VOO, QQQ, SOXX, ARGT, IEUR |
> | Crypto | 15% | BTC, ETH |
> | Healthcare | 10% | UNH |
> | Financials | 8% | SAP |
> | Other | 7% | LDO + others |
>
> <img src="https://raw.githubusercontent.com/gabrielcerutti/etoro-mcp-server/main/readme-assets/portfolio-allocation.png" width="480" alt="Portfolio sector allocation" />
>
> **Trouble spot:** Your tech sleeve is 38% of invested capital and concentrated in 5 mega-caps. A single sector drawdown hits hard — consider whether the ETF overlap (QQQ, SOXX) is intentional diversification or accidental doubling-down.
**Tools used:** `etoro_get_portfolio` → `etoro_get_instruments` → `etoro_get_rates`
---
### 2. Instrument research
Search is keyword-based — `etoro_search_instruments` finds instruments by ticker or company name, then you chain `etoro_get_instruments` for full details and `etoro_get_candles` for price history.
> **You:** Pull up NVDA — I want the current price and a weekly chart for the last month.
>
> **Assistant:** Searching for "NVDA" and pulling candle data:
>
> - **NVIDIA Corporation** (NVDA) — InstrumentID 1545
> - **Live rate:** Bid $208.14 / Ask $208.40
> - **Exchange:** NASDAQ • **Type:** Stock • **Sector:** Semiconductors
>
> Weekly candles (last 5 weeks):
>
> | Week of | Open | High | Low | Close |
> | --- | --- | --- | --- | --- |
> | Mar 22 | $172.65 | $181.20 | $167.01 | $167.61 |
> | Mar 29 | $165.26 | $177.47 | $162.95 | $176.72 |
> | Apr 5 | $176.12 | $189.98 | $173.66 | $188.53 |
> | Apr 12 | $184.15 | $201.69 | $183.98 | $201.64 |
> | Apr 19 | $199.02 | $210.92 | $197.23 | $208.26 |
>
> <img src="https://raw.githubusercontent.com/gabrielcerutti/etoro-mcp-server/main/readme-assets/nvda-candles.png" width="560" alt="NVDA weekly candlestick chart" />
>
> NVDA rallied +27% off the March low ($162.95 → $208.26), with each weekly candle printing a higher low. Momentum is strong but the move is getting extended.
**Tools used:** `etoro_search_instruments` → `etoro_get_instruments` → `etoro_get_rates` → `etoro_get_candles`
---
### 3. Copy-trading due diligence
Vet popular investors using real public data. The assistant calls `etoro_get_user_profile` for identity and stats, then `etoro_get_user_performance` for the full yearly return history.
> **You:** Vet user jeppekirkbonde for a long-term copy allocation. I want the honest risk picture.
>
> **Assistant:** Here's what the data says on **jeppekirkbonde**:
>
> - **Name:** Jeppe Kirk Bonde • **PI Level:** 6 (highest tier)
> - **Copiers:** 25,000+ • **AUM:** $200M+
> - **Background:** MSc Finance, Copenhagen Business School
>
> **Year-by-year performance (real data):**
>
> | Year | Return | | Year | Return |
> | --- | --- | --- | --- | --- |
> | 2013 | +8.9% | | 2020 | +36.9% |
> | 2014 | −14.3% | | 2021 | +15.9% |
> | 2015 | +22.4% | | 2022 | −19.2% |
> | 2016 | +81.1% | | 2023 | +23.9% |
> | 2017 | +150.9% | | 2024 | +21.0% |
> | 2018 | −10.9% | | 2025 | +37.7% |
> | 2019 | +45.1% | | | |
>
> <img src="https://raw.githubusercontent.com/gabrielcerutti/etoro-mcp-server/main/readme-assets/jeppe-performance.png" width="600" alt="jeppekirkbonde yearly performance" />
>
> **Average annual return:** +30.7% across 13 full years. Three down years (2014, 2018, 2022) with a max drawdown of −19.2% in the 2022 tech selloff.
>
> **What you should know:**
>
> 1. This is a concentrated, long-only US tech strategy. The +150.9% in 2017 and +81.1% in 2016 are outliers — don't expect those every year.
> 2. Down years are real: 2022 cost −19.2%. If you can't stomach a 20% paper loss, this isn't the right copy.
> 3. 25K+ copiers and $200M+ AUM means his moves have market impact in smaller names. Slippage is a factor.
>
> Reasonable for multi-year capital if you accept the volatility. Not appropriate for money you need inside 18 months.
**Tools used:** `etoro_get_user_profile` → `etoro_get_user_performance`
---
### 4. Watchlist management
The full watchlist lifecycle — create, populate, rename, and curate — all through natural language.
> **You:** Create a "Semiconductor" watchlist and add NVDA, AMD, ASML, TSM, and AVGO to it.
>
> **Assistant:** Done:
>
> 1. Created watchlist **"Semiconductor"** (ID: 48291)
> 2. Searched and resolved all 5 tickers to instrument IDs
> 3. Added: NVDA (1545), AMD (2842), ASML (5765), TSM (3901), AVGO (6192)
>
> Your watchlists now:
>
> | Watchlist | Items |
> | --- | --- |
> | Recently Invested | 38 |
> | My Watchlist | 34 |
> | Stocks pre-screening | 69 |
> | ETFs | 54 |
> | Semiconductor ← new | 5 |
> | People & Smart Portfolios | 26 |
> | Crypto | 6 |
> | Commodities | 5 |
**Tools used:** `etoro_create_watchlist` → `etoro_search_instruments` → `etoro_add_watchlist_items` → `etoro_get_watchlists`
---
### 5. DCA backtest with historical candles
Use `etoro_get_candles` to pull years of OHLCV data, then simulate a dollar-cost averaging strategy — no orders placed, pure research.
> **You:** Backtest a $500/month DCA into QQQ over the last 3 years. What would I have today?
>
> **Assistant:** Pulling weekly QQQ candles (156 weeks) and simulating $500 on the first trading day of each month:
>
> - **Total invested:** $18,000 (36 months × $500)
> - **Units accumulated:** ~38.2 QQQ
> - **Current value:** $25,365 (at $664.01/share)
> - **Gain:** +$7,365 (+40.9% on invested capital)
> - **Approx. IRR:** ~12.8%/year
>
> **Worst stretch:** Nov 2022 – Mar 2023, paper drawdown of −22% on the accumulated stack. You bought through it — those discounted shares are now your biggest winners.
>
> No orders placed. This is research only.
**Tools used:** `etoro_get_candles` → `etoro_get_rates` (for current price)
---
### 6. Macro-aware portfolio review
Combine portfolio data with the assistant's general knowledge to get a risk assessment tied to your actual holdings.
> **You:** My portfolio is heavy on tech. Flag any risks from this week's macro calendar.
>
> **Assistant:** Your tech exposure totals ~$17,400 (38% of invested capital) across GOOG, META, MSFT, NVDA, AMZN and the SOXX/QQQ ETFs. This week's watch-list:
>
> - **Wed** — CPI print (core consensus +0.3% MoM). A hot number re-prices rate-cut odds → tech multiples compress first.
> - **Thu** — Fed speakers (Williams, Waller). Hawkish language strengthens USD, pressuring mega-cap international revenue.
> - **Fri** — NVDA earnings (after close). Binary event for your largest single-stock position.
>
> **What this means for you:**
>
> - A hot CPI + hawkish Fed combo could knock 3–5% off your tech sleeve short-term.
> - NVDA earnings will drive ~8% of your portfolio's week-over-week change. Know your thesis before it prints.
**Tools used:** `etoro_get_portfolio` → `etoro_get_instruments` → `etoro_get_rates` (+ assistant's macro knowledge)
---
<details>
<summary><b>Trading is also supported</b> — one example</summary>
> ⚠️
> **Letting an AI execute real-money trades is risky.** The same natural-language interface that makes research fast also makes it easy to misinterpret intent — a typo, an ambiguous number, a stale context from earlier in the conversation. Mitigations: start in `ETORO_TRADING_MODE=demo`, use read-only API keys for anything that doesn't need write access, and require explicit confirmation in your conversation before any `real` order.
All examples above are research-only. When you're ready to execute, the same interface places orders. Orders always respect the configured `ETORO_TRADING_MODE` (`demo` for paper, `real` for live).
> **You:** Buy $500 of NVDA at market.
>
> **Assistant:** Confirmed — opening a market position:
>
> - **Instrument:** NVDA (1545)
> - **Amount:** $500
> - **Rate:** $208.40 (ask)
> - **Mode:** `demo`
>
> Position opened — ID `3418072`. This is a demo trade, no real money involved.
Full trading coverage includes: open position by amount or units (`etoro_open_position`), close or partially close (`etoro_close_position`), limit/entry orders (`etoro_place_limit_order`), cancel pending orders (`etoro_cancel_order`), and listing pending orders (`etoro_get_orders`).
</details>
---
## Composing with Other MCP Servers
MCP servers are designed to be composed. The eToro server handles portfolio data, live rates, candles, and trading — but an AI assistant can call tools from **multiple servers in a single conversation**, filling in the gaps that no single API covers.
### Example: earnings risk check across two servers
With eToro + a financial data server (e.g. [Financial Datasets](https://github.com/financial-datasets/mcp-server), [Alpha Vantage](https://github.com/alphavantage/mcp-server), or similar):
> **You:** Do any of my open positions have earnings this week? Flag the ones I should watch.
>
> **Assistant:** Pulling your portfolio from eToro (98 positions), then checking the earnings calendar:
>
> - **NVDA** — reports Thursday after close. Your position: $4,200 (9.2% of invested). This is a binary event — expect ±8% move.
> - **GOOGL** — reports Tuesday after close. Your position: $3,100 (6.8%). Consensus is +12% YoY revenue; ad revenue mix is the swing factor.
> - **UNH** — reported Monday pre-market (already priced in). Beat on EPS, slight miss on membership growth.
>
> The rest of your holdings have no earnings this week. Your biggest event risk is NVDA Thursday — it's your largest single-stock position.
This isn't possible with the eToro server alone — it knows your positions but not the earnings calendar. The financial data server knows the calendar but not your portfolio. Together, the assistant connects both.
### Natural pairings
| Pair with | What it adds | Example workflow |
| --- | --- | --- |
| **Research & ratings** ([Morningstar](https://developer.morningstar.com/direct-web-services/documentation/morningstar-mcp-server/about)) | Analyst research, fair value estimates, moat ratings, fund data | "What's Morningstar's fair value for my tech holdings?" — pull portfolio, fetch ratings |
| **News & web search** ([Brave Search](https://github.com/brave/brave-search-mcp-server), [Tavily](https://github.com/tavily-ai/tavily-mcp)) | Breaking news, sentiment, event context | "Any news on my holdings today?" — pull portfolio, search each ticker |
| **Financial data** ([Financial Datasets](https://github.com/financial-datasets/mcp-server), [Alpha Vantage](https://mcp.alphavantage.co/)) | Fundamentals, earnings, SEC filings, economic calendar | "Show me P/E ratios for my tech positions" — pull holdings, fetch fundamentals |
| **Market data** ([Polygon.io](https://github.com/polygon-io/mcp_polygon), [Twelve Data](https://github.com/twelvedata/mcp), [Massive](https://github.com/massive-com/mcp_massive)) | Real-time streaming, options chains, screener universes | "Screen the S&P 500 for momentum setups, then add the top 5 to my watchlist" |
| **Free alternative** ([Yahoo Finance](https://github.com/Alex2Yang97/yahoo-finance-mcp)) | Prices, financials, options, market news (no API key needed) | "Compare earnings growth for NVDA vs AMD over the last 4 quarters" |
### Configuration
Just add multiple servers to your MCP config — the assistant sees all tools from all servers:
```json
{
"mcpServers": {
"etoro": {
"command": "npx",
"args": ["-y", "etoro-mcp-server"],
"env": {
"ETORO_API_KEY": "your-api-key",
"ETORO_USER_KEY": "your-user-key",
"ETORO_TRADING_MODE": "demo"
}
},
"financial-data": {
"command": "npx",
"args": ["-y", "financial-datasets-mcp-server"],
"env": {
"FINANCIAL_DATASETS_API_KEY": "your-key"
}
},
"news": {
"command": "npx",
"args": ["-y", "tavily-mcp-server"],
"env": {
"TAVILY_API_KEY": "your-key"
}
}
}
}
```
The assistant will automatically chain tools across servers when a question requires it — no extra wiring needed.
---
## Installation
### Claude Desktop (recommended)
Download the latest `.mcpb` file from the [Releases](../../releases) page and drag it into Claude Desktop:
**Extensions → drag `etoro-{version}.mcpb` into the window**
You'll be prompted for your API Key, User Key, and trading mode. That's it.
> [!TIP]
> Get your keys at **eToro → Settings → Trading → Create New Key**. Choose your environment (Demo or Real) and the permissions you need (Read or Write).
---
### Via npm (Claude Code, Cursor, Continue, Cody, …)
Add this to your client's MCP config — it'll launch the server from the published npm package on demand, no local install needed:
```json
{
"mcpServers": {
"etoro": {
"command": "npx",
"args": ["-y", "etoro-mcp-server"],
"env": {
"ETORO_API_KEY": "your-api-key",
"ETORO_USER_KEY": "your-user-key",
"ETORO_TRADING_MODE": "demo"
}
}
}
}
```
For Claude Code, the equivalent CLI command:
```bash
claude mcp add etoro \
-e ETORO_API_KEY=your-api-key \
-e ETORO_USER_KEY=your-user-key \
-e ETORO_TRADING_MODE=demo \
-- npx -y etoro-mcp-server
```
Pin a specific version with `etoro-mcp-server@1.1.0` in the args if you want stability over auto-updates.
---
### From source (developers)
If you want to hack on the server locally, clone the repo and build:
```bash
npm install
npm run build
```
Then point your MCP client at the built file (`dist/index.js`):
```bash
claude mcp add etoro-mcp \
-e ETORO_API_KEY=your-api-key \
-e ETORO_USER_KEY=your-user-key \
-e ETORO_TRADING_MODE=demo \
-- node /path/to/etoro-mcp/dist/index.js
```
Or in `claude_desktop_config.json` / equivalent:
```json
{
"mcpServers": {
"etoro-mcp": {
"command": "node",
"args": ["/path/to/etoro-mcp/dist/index.js"],
"env": {
"ETORO_API_KEY": "your-api-key",
"ETORO_USER_KEY": "your-user-key",
"ETORO_TRADING_MODE": "demo"
}
}
}
}
```
---
## MCP Registry
This server is listed on the [MCP Registry](https://registry.modelcontextprotocol.io) under the name [`io.github.gabrielcerutti/etoro-mcp-server`](https://registry.modelcontextprotocol.io/v0/servers?search=etoro-mcp-server). The registry is the public index of MCP servers — think of it as a package registry for AI tools, analogous to what npm is for JavaScript libraries. MCP-compatible clients use it to discover and install servers programmatically without users having to hand-copy configuration.
Each tagged release of this repository is auto-published to the registry by GitHub Actions (via OIDC), so the entry always tracks the latest npm version.
---
## Configuration
| Setting | Env var | CLI arg | Default |
| --- | --- | --- | --- |
| API Key | `ETORO_API_KEY` | `--api-key` | (none) |
| User Key | `ETORO_USER_KEY` | `--user-key` | (none) |
| Trading Mode | `ETORO_TRADING_MODE` | `--trading-mode` | `demo` |
**Trading mode:** `demo` routes all trading calls through eToro's virtual account. Set to `real` only when you're ready to trade with real money.
> [!WARNING]
> `trading_mode` must match the environment of your API key. A demo key used with `real` mode (or vice versa) will cause authentication errors.
---
## Tools (35 total)
All tools are prefixed with `etoro_` for namespace isolation when composed with other MCP servers.
### Market Data (8)
| Tool | Description |
| --- | --- |
| `etoro_search_instruments` | Search instruments by keyword (e.g. "AAPL", "Bitcoin") or exact ticker |
| `etoro_get_instruments` | Get full instrument details by IDs (1–100) |
| `etoro_get_instrument_types` | List all instrument types (stocks, crypto, ETFs…) |
| `etoro_get_industries` | List industry classifications |
| `etoro_get_exchanges` | List stock exchanges |
| `etoro_get_candles` | Get OHLCV candle data for technical analysis and backtesting |
| `etoro_get_closing_prices` | Get historical daily closing prices |
| `etoro_get_rates` | Get live bid/ask rates |
### Portfolio & Trading (7)
| Tool | Description |
| --- | --- |
| `etoro_get_portfolio` | Get portfolio + P&L: positions, unrealized P&L, exposure summary, longest holding |
| `etoro_get_orders` | List all pending orders (limit / entry) |
| `etoro_get_trade_history` | Closed-trade history (entry/exit, P&L, duration). Primary source for performance research |
| `etoro_open_position` | Open position by USD amount **or** units (unified tool) |
| `etoro_close_position` | Close an open position fully, or partially via `unitsToDeduct` |
| `etoro_place_limit_order` | Place a limit / entry order |
| `etoro_cancel_order` | Cancel a pending order |
### User & Discovery (7)
| Tool | Description |
| --- | --- |
| `etoro_get_current_user` | Get the authenticated user's identity (GCID, real / demo CIDs) |
| `etoro_get_user_profile` | Get a user's public profile |
| `etoro_get_user_performance` | Get performance summary (optionally by time period) |
| `etoro_get_user_trades` | Get a user's trade info for a period |
| `etoro_get_user_portfolio` | Get a user's live public portfolio holdings |
| `etoro_discover_users` | Discover popular investors filtered by gain, risk score, period |
| `etoro_get_copiers` | Get info about users copying your portfolio |
### Watchlists (9)
| Tool | Description |
| --- | --- |
| `etoro_get_watchlists` | List your watchlists |
| `etoro_create_watchlist` | Create a watchlist |
| `etoro_delete_watchlist` | Delete a watchlist |
| `etoro_rename_watchlist` | Rename a watchlist |
| `etoro_add_watchlist_items` | Add instruments to a watchlist |
| `etoro_remove_watchlist_item` | Remove an instrument from a watchlist |
| `etoro_set_default_watchlist` | Set default watchlist |
| `etoro_get_curated_lists` | Get eToro's curated lists |
| `etoro_get_public_watchlists` | Browse a user's public watchlists |
### Social Feeds (4)
| Tool | Description |
| --- | --- |
| `etoro_get_instrument_feed` | Get social feed for an instrument |
| `etoro_get_user_feed` | Get social feed for a user |
| `etoro_create_post` | Create a social feed post |
| `etoro_create_comment` | Comment on a post |
---
## Disclaimer
This project is an **unofficial**, community-built integration. It is not affiliated with, endorsed by, or supported by eToro. Use it at your own risk.
- **Not financial advice.** Nothing in this server, its documentation, or its example outputs constitutes investment advice, a recommendation, or a solicitation to buy or sell any financial instrument.
- **You are responsible for your trades.** The server can place real-money orders when configured in `real` mode. Verify every order before confirming, and understand that AI assistants can misinterpret intent.
- **API changes may break things.** This server depends on eToro's public API, which can change without notice. Always pin a version in production.
- **Demo first.** Start with `ETORO_TRADING_MODE=demo` and only switch to `real` after you're confident in your setup.
---
## Contributing
Contributions are welcome — bug reports, feature requests, and pull requests.
The [DeepWiki](https://deepwiki.com/gabrielcerutti/etoro-mcp-server) page gives an auto-generated overview of the codebase architecture — useful starting point before diving in.
1. Fork the repo and create a branch from `main`
2. Run `npm install && npm run build` to verify your changes compile
3. Run `npm test` to make sure existing tests pass
4. Open a PR with a clear description of what changed and why
---
## License
[MIT](LICENSE) — use it, fork it, build on it.TDQS
Scored across 35 tools
Each tool targets a distinct resource and action, from watchlist management to trading operations, social features, and data retrieval. There is no ambiguity even among similar-looking tools like etorro_get_portfolio and etorro_get_user_portfolio, as their descriptions clearly differentiate them.
All tools follow a consistent 'etoro_verb_noun' pattern using snake_case, with verbs like get, create, delete, and open applied uniformly. No mixing of conventions or irregular names.
With 35 tools, the count is slightly high but justified for a comprehensive trading platform covering multiple domains (watchlists, trading, social, data, profiles). The scope is broad enough to need this many tools.
The toolset covers most core functionalities: portfolio, trading, watchlists (full CRUD), social feed, and market data. Minor gaps like position modification (e.g., stop loss adjustment) are absent, but the set is largely complete for the intended operations.