etoro-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@etoro-mcpshow my portfolio"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
etoro-mcp
MCP server for the eToro public API: market data, balances, portfolio, trade history, watchlists, alerts, investor rankings, user statistics, social feeds, and — behind explicit opt-in gates — trading, watchlist/alert mutations, and social posting. Coverage is organised into toolsets; only the toolsets you select are registered, and write tools are not registered at all unless their gate is enabled — a client connected to the default configuration cannot see or call them.
Features
Read-first by design — 62 read tools across eleven of the twelve toolsets (the
socialtoolset is write-only); the 43 write tools exist only when their gate is set — 5 trading tools behindETORO_MCP_ENABLE_TRADING, the other 38 (watchlist, alert, social, and notification mutations) behindETORO_MCP_ENABLE_WRITES.Demo environment by default — trading tools call the demo endpoint group unless
ETORO_ENV=realis set.Toolset selection — register only what you need via
ETORO_MCP_TOOLSETS; unknown names fail startup rather than serving a partial tool set.Trimmed responses — tools return the fields an investor acts on (prices, units, P&L, timestamps), not raw API dumps; list tools are bounded by a
limitparameter or by explicit range parameters (min_date/max_date/count) on the time-series tools.Credentials stay in the environment — keys travel only in the
x-api-key/x-user-keyheaders, and error messages never echo header or credential values.Rate-limit aware — HTTP 429 responses are retried once, honouring
Retry-After, re-sending the samex-request-idso a retried order cannot fill twice.
Related MCP server: eToro MCP Server
Toolsets
Select toolsets with ETORO_MCP_TOOLSETS (comma-separated; all selects every toolset).
Without it, the trading core is registered:
Toolset | Default | Covers |
| ✓ | Instrument search and details, candles, rates, closing prices, exchanges, instrument types, stock industries |
| ✓ | Profile, balances (aggregated, by account type, history), cash transactions |
| ✓ | Portfolio, P&L, order status, eligibility and cost estimates; gated order/position writes |
| ✓ | Closed-trade history |
| ✓ | Own/public/curated watchlists and recommendations; gated watchlist mutations |
| ✓ | Price alerts; gated alert mutations |
| Investor rankings, presets, tags, sector/industry summaries | |
| User search, profiles, portfolios, performance and copier statistics | |
| News, following, for-you, instrument, and user feeds; posts and comments | |
| Gated posting, comments, replies, reactions, polls, and media upload | |
| eToro Club dashboard | |
| Notifications; gated mark-read |
Tools
Read tools (registered whenever their toolset is selected)
Toolset | Tool | Description |
|
| Search instruments by ticker symbol and return candidate matches (contains-matching, so verify the symbol) |
|
| Display data for instruments by id: name, symbol, type, exchange |
|
| OHLCV candles for one instrument (nine intervals, up to 1000 bars) |
|
| Latest official closing prices per instrument |
|
| Real-time bid/ask quotes for instruments |
|
| Exchanges (id and description) for resolving |
|
| Instrument types (stocks, crypto, ETFs, ...) by id |
|
| Stock industries (id and name) for resolving |
|
| The authenticated user's identity and the scopes their keys carry |
|
| Current balances aggregated across the user's accounts |
|
| Current balances for every account of one account type |
|
| Current balance of one specific account |
|
| Daily balance snapshots over a date range |
|
| Transactions of a cash account, newest pages first |
|
| Aggregated portfolio: account totals plus one aggregate per instrument |
|
| Position-level snapshot: open positions and pending orders |
|
| Portfolio snapshot with unrealized P&L per position |
|
| Look up an order's status by order id or reference id |
|
| Look up a close order's status by its order id |
|
| Per-instrument trading rules: leverage, sizing mode, SL/TP bounds |
|
| Estimate the costs of a hypothetical open order without placing it |
|
| Closed trades since a given date |
|
| The authenticated user's watchlists with their items |
|
| A single watchlist owned by the authenticated user, by id |
|
| Items of the authenticated user's default watchlist |
|
| Another user's public watchlists by their numeric user id |
|
| eToro's curated investment lists available to the user |
|
| Personalized market recommendations for the authenticated user |
|
| The active price alerts on the account |
|
| Names of all publicly available ranking presets |
|
| Investor ranking rows for a named preset |
|
| A filtered, sorted page of investor ranking rows |
|
| The full ranking row for a single investor |
|
| Ranking rows for several investors in one call |
|
| The catalog of ranking tags with resolved names |
|
| The ranking universe aggregated by sector or industry |
|
| Search public investors with performance and risk filters |
|
| Public profile and account summary for one or more users |
|
| A user's live public portfolio: open positions and copy trades |
|
| A user's full monthly and yearly gain history |
|
| A user's day-by-day or aggregated gain over a date range |
|
| A user's trading statistics for a period (copy-trading due diligence) |
|
| An investor's gain time-series at daily, monthly, or yearly resolution |
|
| A portfolio's daily asset-allocation breakdown over time |
|
| A portfolio's daily directional market exposure per instrument |
|
| An investor's live copier count and assets-under-management tier |
|
| Anonymised info about the people copying your portfolio |
|
| Search trader portfolios or Smart Portfolios by free text |
|
| A user's top assets ranked by impressions-based score |
|
| The eToro news feed (editorial and market-news posts) |
|
| Posts from users the authenticated user follows |
|
| The personalised For You feed for the authenticated user |
|
| The discussion feed for one instrument (market) |
|
| The posts published by one user |
|
| The posts the authenticated user has saved |
|
| The posts a user has pinned to their profile |
|
| A single post by its UUID, with an inline comments preview |
|
| The top-level comments on a post |
|
| The replies nested under one comment |
|
| Who shared a post (plain reshares and quote shares) |
|
| The eToro Club dashboard for the authenticated user |
|
| The account's in-app notifications, newest data first |
Trading write tools (registered only when ETORO_MCP_ENABLE_TRADING is set)
Toolset | Tool | Description |
|
| Place an order to open a position — not idempotent: every call places a new order |
|
| Cancel a pending (not yet executed) order |
|
| Close an open position, fully or partially, at market |
|
| Cancel a pending close order before it executes |
|
| Edit an open position's stop-loss and/or take-profit |
Other write tools (registered only when ETORO_MCP_ENABLE_WRITES is set)
Toolset | Tool | Description |
|
| Create a new watchlist |
|
| Rename a watchlist |
|
| Delete a watchlist |
|
| Add items to a watchlist |
|
| Remove items from a watchlist |
|
| Reorder items within a watchlist |
|
| Set a watchlist as the selected default |
|
| Change a watchlist's display position |
|
| Create a price alert on an instrument |
|
| Change the target price of an existing price alert |
|
| Permanently delete a price alert |
|
| Mark all in-app notifications as read |
|
| Create a discussion post on the authenticated user's feed |
|
| Create a poll post with 2 to 4 answer options |
|
| Edit the authenticated user's own post in-place |
|
| Soft-delete the authenticated user's own post |
|
| Pin one of the authenticated user's own posts to their profile |
|
| Remove the authenticated user's pin from a post |
|
| Create a top-level comment on a post |
|
| Edit the authenticated user's own comment in-place |
|
| Soft-delete the authenticated user's own comment |
|
| Create a reply nested under an existing comment |
|
| Edit the authenticated user's own reply in-place |
|
| Soft-delete the authenticated user's own reply |
|
| Share an existing post, as a plain reshare or a quote share |
|
| Upload a JPEG or PNG image (max 8 MB) for use as an attachment; requires |
|
| Like a post |
|
| Remove a like from a post |
|
| Like a comment on a post |
|
| Remove a like from a comment |
|
| Like a reply (a nested answer to a comment) |
|
| Remove a like from a reply |
|
| Bookmark a post |
|
| Remove a post from the saved bookmarks |
|
| Subscribe to notifications on a post |
|
| Unsubscribe from notifications on a post |
|
| Cast a vote on a poll option |
|
| Remove a vote from a poll option |
Configuration
All configuration comes from environment variables — no config files, no flags carrying secrets.
Variable | Default | Purpose |
| — (required) | eToro API key, sent as the |
| — (required) | eToro user key, sent as the |
|
|
|
| trading core (see table above) | Comma-separated toolset names; |
| off |
|
| off |
|
| — (unset) | The only directory |
Getting started
Run straight from the repository with uv:
uvx --from git+https://github.com/florinel-chis/etoro-mcp etoro-mcpThe server speaks stdio by default; pass --transport http --host 127.0.0.1 --port 8000 to serve
streamable HTTP at /mcp instead.
Warning: the HTTP endpoint has no authentication — anyone who can reach the port can call every registered tool with your API keys' privileges. The server therefore refuses to bind a non-loopback
--hostunless--allow-remoteis also passed; only use that flag behind an authenticated reverse proxy or an otherwise-restricted network (such as the Docker port-mapping below).
MCP client configuration
Add the server to your MCP client's configuration (the exact file location depends on the client):
{
"mcpServers": {
"etoro": {
"command": "uvx",
"args": ["--from", "git+https://github.com/florinel-chis/etoro-mcp", "etoro-mcp"],
"env": {
"ETORO_API_KEY": "your-api-key",
"ETORO_USER_KEY": "your-user-key",
"ETORO_ENV": "demo"
}
}
}
}Or run the Docker image (build it first, see below):
{
"mcpServers": {
"etoro": {
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "ETORO_API_KEY", "-e", "ETORO_USER_KEY", "-e", "ETORO_ENV", "etoro-mcp"],
"env": {
"ETORO_API_KEY": "your-api-key",
"ETORO_USER_KEY": "your-user-key",
"ETORO_ENV": "demo"
}
}
}
}Docker
docker build -t etoro-mcp .
# stdio (for MCP client configs)
docker run -i --rm -e ETORO_API_KEY -e ETORO_USER_KEY etoro-mcp
# streamable HTTP at http://127.0.0.1:8000/mcp
# (-p 127.0.0.1:8000:8000 keeps the unauthenticated endpoint off external interfaces;
# --host 0.0.0.0 refers to interfaces inside the container and is required for the
# port mapping to work, hence --allow-remote — the host-side bind stays loopback-only)
docker run --rm -p 127.0.0.1:8000:8000 -e ETORO_API_KEY -e ETORO_USER_KEY \
etoro-mcp --transport http --host 0.0.0.0 --port 8000 --allow-remoteSafety
Trading tools call the demo endpoint group unless
ETORO_ENV=realis set. Keys are environment-bound, so a demo key againstreal(or vice versa) fails at the API rather than trading the wrong account.Write tools are hidden behind two independent gates —
ETORO_MCP_ENABLE_TRADINGfor order/position writes andETORO_MCP_ENABLE_WRITESfor everything else (watchlists, alerts, notifications, social). Gated tools are never registered, not merely rejected, so MCP clients cannot discover or call them.The HTTP transport is unauthenticated: anyone who can reach the port can call every registered tool — read balances and positions always, and place or close orders when trading is enabled — using your API keys' privileges. The server refuses non-loopback binds unless
--allow-remoteis passed; only use that flag behind an authenticated proxy or an otherwise-restricted network (the stdio transport has no such exposure).upload_mediareads local JPEG/PNG files and returns a public CDN URL for them — an extra privilege class beyond the API keys themselves. It is therefore triple-gated: thesocialtoolset,ETORO_MCP_ENABLE_WRITES, andETORO_MCP_UPLOAD_DIRmust all be set, and it reads only inside that directory (paths and symlinks resolving outside it are rejected, file content must actually be JPEG/PNG, and the 8 MB limit is checked before the file is read).create_orderis not idempotent across calls: each call mints a freshx-request-id, which is the order's idempotency key, so calling it twice places two orders. (The 429 retry re-sends the same id, so a rate-limited retry cannot double-fill.) Poll fill status withget_orderbefore treating an order as filled — an accepted order can still be rejected.Candle history is capped at roughly 1000 bars per interval with no way to page further back; use a coarser interval (e.g.
OneWeek) for deeper history.The API enforces per-group rate quotas (order execution 20 requests/60 s; market data 120/60 s; portfolio and most other groups 60/60 s; eligibility and cost estimates 20/60 s each). Each tool's description names its quota; 429s are retried once, honouring
Retry-After.Trading leveraged products is risky. Use at your own risk, and test everything against a demo account first.
Development
uv sync
uv run pytest
uv run ruff check .Tests are hermetic: all HTTP is mocked with respx and the server is exercised through the
in-memory FastMCP client. No credentials or network access are needed to run them. A manual,
read-only smoke check against a real demo account lives at scripts/smoke.py.
License
MIT — see LICENSE.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/florinel-chis/etoro-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server