Skip to main content
Glama
florinel-chis

etoro-mcp

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
ETORO_ENVNodemo or real - which trading endpoint group tools calldemo
ETORO_API_KEYYeseToro API key, sent as the x-api-key header
ETORO_USER_KEYYeseToro user key, sent as the x-user-key header
ETORO_MCP_TOOLSETSNoComma-separated toolset names; all selects every toolset. Unknown names fail startup.trading core (market,account,trading,history,watchlists,alerts)
ETORO_MCP_UPLOAD_DIRNoThe only directory upload_media may read images from. Unset leaves upload_media unregistered
ETORO_MCP_ENABLE_WRITESNotrue/1/yes registers all other write tools: watchlist/alert mutations, notification mark-read, social posting and reactionsoff
ETORO_MCP_ENABLE_TRADINGNotrue/1/yes registers the trading write tools: order placement/cancel, position close, stop-loss/take-profit editsoff

Capabilities

Features and capabilities supported by this server

CapabilityDetails
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

NameDescription
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 limit alerts, each with its alertId (UUID), instrumentId, symbol (e.g. AAPL), targetPrice (trigger level in the instrument's quote currency), currentPrice (market bid when the alert was created or last updated), and ISO 8601 UTC createdAt/updatedAt timestamps. Quota: 60 requests per 60 seconds (shared default pool).

list_trading_historyA

List closed trades since a given date.

Returns trades closed on or after min_date for the configured environment (demo or real account). Each trade includes position and order ids, instrument id, direction (isBuy), leverage, units, invested amount and fees in the account currency, open/close rates in the instrument's quote currency, and ISO 8601 open/close timestamps. Paginate with page and limit. Quota: 60 requests per 60 seconds (shared default pool).

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

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