etoro-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ETORO_ENV | No | demo or real - which trading endpoint group tools call | demo |
| ETORO_API_KEY | Yes | eToro API key, sent as the x-api-key header | |
| ETORO_USER_KEY | Yes | eToro user key, sent as the x-user-key header | |
| ETORO_MCP_TOOLSETS | No | Comma-separated toolset names; all selects every toolset. Unknown names fail startup. | trading core (market,account,trading,history,watchlists,alerts) |
| ETORO_MCP_UPLOAD_DIR | No | The only directory upload_media may read images from. Unset leaves upload_media unregistered | |
| ETORO_MCP_ENABLE_WRITES | No | true/1/yes registers all other write tools: watchlist/alert mutations, notification mark-read, social posting and reactions | off |
| ETORO_MCP_ENABLE_TRADING | No | true/1/yes registers the trading write tools: order placement/cancel, position close, stop-loss/take-profit edits | off |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tasks | {
"list": {},
"cancel": {},
"requests": {
"tools": {
"call": {}
},
"prompts": {
"get": {}
},
"resources": {
"read": {}
}
}
} |
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_profileA | Get the authenticated user's identity and the scopes their keys carry. Calls GET /api/v1/me. Returns gcid (global customer id), realCid and demoCid (real/demo account customer ids), username, first/last name when set, playerLevel (1 Bronze, 2 Platinum, 3 Gold, 4 Internal, 5 Silver, 6 PlatinumPlus, 7 Diamond) with its name, and the OAuth scopes granted to the credentials — useful to verify keys and to see which endpoint groups are accessible. Rate limit: 60 requests per 60 seconds (default shared quota). |
| get_aggregated_balancesA | Get current balances aggregated across the user's accounts. Calls GET /api/v1/balances. Returns totalBalance (in display_currency) plus one entry per account with its native-currency balance, the converted displayBalance, and the exchangeRate used. Account types: Trading, Cash, Options, Crypto, MoneyFarm, Spaceship. Amounts are numbers in the stated currency. Rate limit: 60 requests per 60 seconds (default shared quota). |
| get_balances_by_typeA | Get current balances for every account of one account type. Calls GET /api/v1/balances/{accountType}. Account types: Trading, Cash, Options, Crypto, MoneyFarm, Spaceship. Returns totalBalance (in display_currency) and per-account balances in their native currency alongside the converted displayBalance. Rate limit: 60 requests per 60 seconds (default shared quota). |
| get_balanceA | Get the current balance of one specific account. Calls GET /api/v1/balances/{accountType}/{accountId}. Account types: Trading, Cash, Options, Crypto, MoneyFarm, Spaceship. Returns the account's balance in its native currency plus the displayBalance converted into display_currency. With include_equity_details, Trading accounts also report available buying power, frozen cash, current PnL, and used margin. Rate limit: 60 requests per 60 seconds (default shared quota). |
| get_balance_historyA | Get daily balance snapshots over a date range. Calls GET /api/v1/balances/history (or the {accountType} / {accountType}/{accountId} variant when narrowed). Dates are YYYY-MM-DD; the default range is the last 30 days, history covers at most the last 12 months, and a single range spans at most 365 days — the API answers 404 when no data exists for the range. Each snapshot carries total cash, invested amount, PnL, and balance, both in native currencies and converted into display_currency. Rate limit: 60 requests per 60 seconds (default shared quota). |
| list_cash_transactionsA | List transactions of a cash account, newest pages first. Calls GET /api/v1/money/accounts/cash/{accountId}/transactions. Paginated by cursor: pass pagination.nextPageToken from one call as page_token to fetch the next page; nextPageToken null (or hasNext false) means the last page. Amounts are decimal strings in ISO 4217 currencies; postedAt is an ISO 8601 timestamp. transactionType is one of card, internalTransfer, bankTransfer, balanceAdjustment; direction is debit or credit; status is one of failed, authorized, settled, rejected, returned, expired, unknown. Rate limit: 60 requests per 60 seconds (default shared quota). |
| list_price_alertsA | List the active price alerts on the account. Returns up to |
| list_trading_historyA | List closed trades since a given date. Returns trades closed on or after |
| search_instrumentsA | Search instruments by ticker symbol and return candidate matches. Matching is contains/prefix, NOT exact: searching 'AAPL' also returns variants such as 'AAPL.24-7' and 'AAPL.EUR'. Always verify that the candidate's internalSymbolFull exactly equals the symbol you want before using its instrumentId. Instrument ids are immutable (they survive rebrands and ticker changes), so they are safe to cache. Returns {"totalItems": int, "results": [{"instrumentId": int, "internalSymbolFull": str, "displayName": str, "isCurrentlyTradable": bool}]}. Rate limit: shares the market-data pool of 120 requests per 60 seconds. |
| get_instrument_detailsA | Get display data for instruments by id: name, symbol, type, exchange. Returns {"results": [{"instrumentId": int, "displayName": str, "symbol": str, "instrumentTypeId": int, "exchangeId": int, "stocksIndustryId": int, "priceSource": str, "isInternalInstrument": bool}]}. isInternalInstrument true means the instrument is restricted from public trading. Use search_instruments to resolve a ticker to an instrumentId first. Rate limit: shares the market-data pool of 120 requests per 60 seconds. |
| get_candlesA | Get OHLCV candles for one instrument. Returns {"instrumentId": int, "interval": str, "candles": [{"time": ISO-8601 period start, "open": float, "high": float, "low": float, "close": float, "volume": float}]}. Prices are in the instrument's quote currency; the newest bar can be the still-forming session. History depth is capped at about 1000 bars per interval — there is no way to page further back in time (no from/to parameters exist), so at OneDay one request covers roughly four years; use a coarser interval such as OneWeek for deeper history. 'direction' only changes ordering: asc and desc return the same most-recent window, oldest-first vs newest-first. An unknown instrument id yields no candle data and this tool raises an error rather than returning an empty series. Rate limit: shares the market-data pool of 120 requests per 60 seconds. |
| get_closing_pricesA | Get the latest official closing prices per instrument. The API returns closing prices for every instrument in one response; this tool filters to 'instrument_ids' when given and truncates to 'limit'. Returns {"results": [{"instrumentId": int, "officialClosingPrice": float, "daily"/"weekly"/"monthly": {"price": float, "date": ISO-8601}}]} — daily is the previous trading day's close, weekly the previous week's, monthly the previous month's. A price of -1 with date 0001-01-01 means no data for that period. Rate limit: shares the market-data pool of 120 requests per 60 seconds. |
| get_ratesA | Get real-time bid/ask quotes for instruments. Recommended before placing an order. Returns {"results": [{"instrumentId": int, "bid": float (sell price), "ask": float (buy price), "lastExecution": float, "conversionRateBid": float, "conversionRateAsk": float (instrument currency to USD), "date": ISO-8601 quote timestamp}]}. Rate limit: shares the market-data pool of 120 requests per 60 seconds. |
| list_exchangesA | List exchanges (id and description) for resolving exchangeId values. Returns {"results": [{"exchangeId": int, "description": str}]}. Rate limit: shares the market-data pool of 120 requests per 60 seconds. |
| list_instrument_typesA | List instrument types (stocks, crypto, ETFs, ...) by id. Resolves instrumentTypeId values returned by other market-data tools. Returns {"results": [{"instrumentTypeId": int, "description": str}]}. Rate limit: shares the market-data pool of 120 requests per 60 seconds. |
| list_stock_industriesA | List stock industries (id and name) for resolving stocksIndustryId values. Returns {"results": [{"industryId": int, "name": str}]}. Rate limit: shares the market-data pool of 120 requests per 60 seconds. |
| get_portfolioA | Aggregated portfolio: account totals plus one aggregate per instrument. Account totals are in the account currency (usually USD): accountAvailableCash, accountFrozenCash, accountCurrentPnl, accountTotalUsedMargin, accountBalance, and accountTotalValue (= available cash + used margin + current P&L). Each instrument aggregate carries net units (positive = long, negative = short), average open rate and leverage, margin, exposure, and unrealized return (accountCurrencyReturn) in the account currency. Filters narrow the instrument aggregates only — account totals ignore them. Rate limit: shares a 60 requests/60s pool with get_portfolio_breakdown and get_pnl. |
| get_portfolio_breakdownA | Position-level portfolio snapshot: open positions and pending orders. Returns credit (available trading balance, USD), bonusCredit, open positions (positionID, instrumentID, isBuy — true long / false short, leverage, amount = invested margin in USD, units, openRate, openDateTime ISO 8601, stop-loss/take-profit rates as absolute prices, mirrorID — 0 = manual position, non-zero = copy trading), pending market-if-touched orders (pendingOrders), pending market opens (ordersForOpen), and pending closes (ordersForClose), plus copy-trading mirror summaries. Cheaper than get_pnl — no unrealized P&L fields. Rate limit: shares a 60 requests/60s pool with get_portfolio and get_pnl. |
| get_pnlA | Account P&L: portfolio snapshot with unrealized P&L per position. Returns credit (available trading balance, USD), bonusCredit, the account-level unrealizedPnl (sum across open positions, account currency), and open positions each carrying an unrealizedPnl figure in the account currency, plus mirror summaries with closedPositionsNetProfit. Total P&L = sum of position unrealizedPnl (own and mirror positions) + sum of mirror closedPositionsNetProfit. Rate limit: shares a 60 requests/60s pool with get_portfolio and get_portfolio_breakdown. |
| get_orderA | Look up an order's status by order_id or reference_id (exactly one). Status ids: 1 Received, 2 Placed, 3 Filled, 4 Rejected, 5 PartiallyFilled, 6 PendingCancel, 7 Canceled, 8 Expired, 9 CanceledPartiallyFilled, 10 RejectedPartiallyFilled. A filled order lists its positions under positionExecutions (positionId, state, remaining units, execution price and fees). Rates are absolute instrument prices; timestamps ISO 8601. Rate limit: shares a 60 requests/60s pool with get_close_order_info. |
| get_close_order_infoA | Look up a close order's status by its order id. Same status codes as get_order (1 Received … 10 RejectedPartiallyFilled); positionsToClose and positionExecutions show which positions closed and at what price. Returns HTTP 404 if the close order does not exist. Rate limit: shares a 60 requests/60s pool with get_order. |
| check_trading_eligibilityA | Per-instrument trading rules: leverage, sizing mode, SL/TP bounds. Provide instrument_ids and/or symbols (at least one, at most 100 combined). For each instrument returns the minimum position exposure (USD), max units per order, whether opening/closing/partial closes/ market-if-touched orders/trailing stop-loss are allowed, whether units are whole or fractional, whether sizing must be by units, by amount, or either, and per settlement type and direction the valid leverage values, minimum position amount (USD), and stop-loss/take-profit percentage bounds. Call before create_order to pick valid parameters. Rate limit: dedicated 20 requests/60s quota. |
| get_trading_cost_estimateA | Estimate the costs of a hypothetical open order without placing it. Takes the same arguments as create_order (exactly one of symbol/instrument_id, exactly one of amount/units/contracts) and returns the cost breakdown: one entry per cost type (markup, marketSpread, transactionFee, overnightFee, overWeekendFee, sdrt) with an amount and currency, plus the quote timestamp (ISO 8601). Rate limit: dedicated 20 requests/60s quota. |
| list_watchlistsA | List the authenticated user's watchlists with their items. Each watchlist carries watchlistId, name, watchlistType (one of Static, Dynamic, RecentlyInvested, Default), totalItems, isDefault, isUserSelectedDefault, watchlistRank (display order), and up to items_per_watchlist items with itemId (instrument or person ID), itemType ('Instrument' or 'Person'), itemRank, and itemAddedDate (ISO 8601). Shares the watchlist read quota of 60 requests per 60 seconds. |
| get_watchlistA | Get a single watchlist owned by the authenticated user, by ID. Items are paginated with page_number (zero-based) and items_per_page. Returns the watchlist's metadata plus its items: itemId, itemType ('Instrument' or 'Person'), itemRank, symbol, and itemAddedDate (ISO 8601). Shares the watchlist read quota of 60 requests per 60 seconds. |
| get_default_watchlistA | Get the items of the authenticated user's default watchlist. Returns items with itemId (instrument or person ID), itemType ('Instrument' or 'Person'), itemRank (position in the list), symbol and displayName when market metadata is included, and itemAddedDate (ISO 8601). Shares the watchlist read quota of 60 requests per 60 seconds. |
| get_public_watchlistsA | List another user's public watchlists by their numeric user ID. Returns the same shape as list_watchlists: watchlistId, name, watchlistType, totalItems, watchlistRank, and up to items_per_watchlist items each. Shares the watchlist read quota of 60 requests per 60 seconds. |
| get_curated_listsA | Get eToro's curated investment lists available to the user. Each list carries uuid, name, description, and the instrument IDs it contains (resolve them via the market-data tools). Dedicated quota of 60 requests per 60 seconds. |
| get_market_recommendationsA | Get personalized market recommendations for the authenticated user. Returns responseType and instrumentIds — the recommended instrument IDs, resolvable via the market-data tools. Dedicated quota of 60 requests per 60 seconds. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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