mcp-server-saxo
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PORT | No | Port for the optional HTTP server. | 3000 |
| SAXO_APP_KEY | No | Application key from the developer portal. Required for OAuth refresh. | |
| MCP_HTTP_HOST | No | Host for the HTTP server. | 127.0.0.1 |
| MCP_HTTP_TOKEN | No | Bearer token required for HTTP API access. | |
| SAXO_AUDIT_LOG | No | File path for JSONL audit log. | |
| SAXO_APP_SECRET | No | Application secret for Code-grant OAuth apps. Omit for PKCE. | |
| SAXO_TIMEOUT_MS | No | Request timeout in milliseconds. | 30000 |
| SAXO_ENVIRONMENT | No | Environment: sim (simulation) or live. | sim |
| SAXO_POLICY_PATH | No | Path to policy.json file for trading safety rules. | |
| SAXO_ACCESS_TOKEN | Yes | Bearer token. 24-hour token for SIM, OAuth token for LIVE. | |
| SAXO_REDIRECT_URI | No | Redirect URI for OAuth. Must be registered in Saxo developer portal. | http://localhost:8765/callback |
| MCP_MAX_BODY_BYTES | No | Maximum request body size in bytes. | 10485760 |
| SAXO_REFRESH_TOKEN | No | Refresh token for automatic token refresh. Required for LIVE or long-running SIM with OAuth. | |
| MCP_ALLOWED_ORIGINS | No | Comma-separated list of allowed CORS origins. | |
| MCP_ALLOW_ANY_ORIGIN | No | Set to 'true' to allow any origin. | |
| ALPHA_VANTAGE_API_KEY | No | Optional API key for Alpha Vantage enrichment. | |
| SAXO_TOKEN_EXPIRES_AT | No | Expiration timestamp of the access token (ISO 8601). Used for cold-start refresh. | |
| SAXO_ENABLE_LIVE_TRADING | No | Set to 'true' to allow trading on LIVE environment. | false |
| SAXO_ENABLE_LIVE_ALERT_WRITES | No | Set to 'true' to allow creating/updating/deleting price alerts on LIVE. | false |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| saxo_capabilitiesA | Search the Saxo MCP server capabilities and examples. Use this first when deciding which Saxo tool to call. |
| saxo_session_meA | Return the current Saxo session (ClientKey, UserKey, default account, culture). Useful to verify the access token works. |
| saxo_get_session_capabilitiesA | Return current Saxo session capabilities, including TradeLevel and DataLevel, without running diagnostics. |
| saxo_set_session_trade_levelA | Set session TradeLevel to FullTradingAndChat or OrdersOnly and return the confirmed session capabilities. LIVE requires policy.allow_live_session_capability_writes=true. |
| saxo_diagnosticsA | Hit the Saxo diagnostics endpoint to verify connectivity. |
| saxo_feature_availabilityA | Return Saxo feature flags for News, Calendar, Gainers/Losers, and Chart. Diagnostic only: availability flags do not guarantee that every feature has a public documented endpoint exposed by this MCP server. |
| saxo_search_instrumentsA | Search Saxo reference data for instruments by keyword and asset type. Returns matching instruments with Uic and AssetType (use those as input to other tools). |
| saxo_get_instrument_detailsB | Fetch detailed metadata for one or more instruments by Uic + AssetType. |
| saxo_list_exchangesB | List Saxo-supported exchanges, or fetch one by ExchangeId. |
| saxo_get_option_chainA | Fetch the option chain (strikes + expirations) for an option root. Use this after saxo_search_instruments with assetTypes=[StockOption] to find the Uic of each option leg before placing a multi-leg spread. Set normalize=true (default) to return one row per strike with callUic+putUic; normalize=false returns the raw Saxo OptionSpace shape. |
| saxo_list_option_expiriesB | Cheap helper that returns just the available expiries for an option root: expiry date, days-to-expiry, last trade date, and strike count. Use to pick an expiry before pulling the full chain. |
| saxo_list_standard_option_expiriesA | Return the standardized option-expiry calendar (3rd Friday monthlies, quarterlies, weeklies) from Saxo reference data. Useful for "is 2027-01-15 a standard monthly?" reasoning. For per-option-root expiries, use saxo_list_option_expiries instead. |
| saxo_find_option_legA | Convenience helper that resolves an option leg Uic from human-readable parameters (symbol + expiry + strike + Call/Put). Compresses the 4-step option-discovery workflow (search instrument → search option root → fetch chain → locate strike) into one call. Useful before saxo_place_order / saxo_place_multileg_order. When multiple option roots match (e.g. ADR vs. local listing), prefers the multi-leg-capable root and surfaces alternatives in warnings[]; pass exchangeId to disambiguate. |
| saxo_get_infopriceA | Fetch a snapshot bid/ask/last price for a single instrument. Snapshot only — no subscription side effects. |
| saxo_get_infoprices_listB | Fetch snapshot prices for multiple Uics in one call. |
| saxo_get_chartB | Fetch historical OHLC bars for an instrument. Horizon is in minutes (1, 5, 60, 1440 ...). Count defaults to Saxo default (max 1200). |
| saxo_screen_marketA | User-friendly read-only market screener for presets like top gainers, top losers, pre-market gainers, and pre-market losers. Uses Saxo instruments and InfoPrices only; output depends on market-data permissions and delay settings. |
| saxo_compute_spread_quoteA | Fetch live bid/ask for each leg of a multi-leg option strategy and compute the worst-case, best-case, and mid net debit. Result is positive when the strategy is a net debit (you pay), negative when it is a net credit (you receive). Surfaces NoAccess warnings per leg when market-data terms are missing. |
| saxo_estimate_vertical_spreadA | Pure math: given side (BullCall/BearCall/BullPut/BearPut), longStrike, shortStrike, debit (negative for credit spreads), and contracts, returns max loss, max gain, and breakeven in account currency, applying the option contract multiplier (100 for US equity options). |
| saxo_generate_option_strategy_candidatesA | Read-only option candidate generator for explicit caller-provided strategies. Returns structures, legs, pricing, Greeks, and factor context; does not choose a playbook, call precheck, or place orders. |
| saxo_screen_option_strategy_factorsA | Read-only factor screener for explicit option strategies across symbols or Saxo market movers. Returns candidate structures, liquidity, chart, IV/Greeks, optional news, and sizing context without verdicts or confidence labels. |
| saxo_screen_stock_factorsA | Read-only stock factor screener with Saxo quotes, chart context, optional account sizing, and optional Alpha Vantage fundamentals/news. Returns factors and warnings without verdicts or confidence labels. |
| saxo_analyze_portfolio_contextB | Read-only whole-account context analyzer. Combines account snapshot, stock factors, option factors, risk budgets, concentration context, and warnings without allocation or deployment recommendations. |
| saxo_review_strategy_positionsA | Read-only follow-up review for executed stock and option strategies. Matches expected legs to open positions, refreshes quotes, adds Greeks/DTE for options, evaluates P/L, trim/close/roll rules, and returns deterministic decision support. Does not precheck or place orders. |
| saxo_list_accountsB | List the authenticated client's trading accounts. |
| saxo_get_balanceC | Fetch the cash + margin balance for an account. |
| saxo_list_positionsA | List open positions for the authenticated client or a specific account. Returns one row per position (multiple rows per instrument if filled at different prices). Use saxo_list_net_positions for the per-instrument aggregated view. |
| saxo_list_net_positionsA | List positions aggregated per instrument (one row per Uic with the net amount), rather than per individual fill. Right view for "what is my current exposure?" — no manual deduplication needed. |
| saxo_list_closed_positionsC | List closed positions / trade history. |
| saxo_list_activitiesA | Recent account events from /port/v1/activities — placed/modified/cancelled orders, trades, dividend payments, corporate actions. Pass fromDateTime/toDateTime (ISO 8601 with timezone) to scope; defaults to a recent window on Saxo side. Useful for "what happened on my account today?" reasoning. |
| saxo_list_ordersB | List working orders for the authenticated client or a specific account. |
| saxo_get_orderB | Fetch a specific order by OrderId. |
| saxo_list_price_alertsB | List Saxo price alert definitions for the current user, optionally filtered by state. |
| saxo_get_price_alertA | Fetch one Saxo price alert definition by AlertDefinitionId. |
| saxo_create_price_alertB | Create a Saxo price alert definition. LIVE alert writes require SAXO_ENABLE_LIVE_ALERT_WRITES=true plus policy.allow_live_alert_writes=true. |
| saxo_update_price_alertA | Update an existing Saxo price alert definition. Partial input is merged with the current alert before PUT because Saxo expects the full definition body. |
| saxo_delete_price_alertsA | Delete one or more Saxo price alert definitions. LIVE alert writes require SAXO_ENABLE_LIVE_ALERT_WRITES=true plus policy.allow_live_alert_writes=true. |
| saxo_get_price_alert_user_settingsA | Read the current user price-alert notification settings (email, popup, sound). |
| saxo_update_price_alert_user_settingsB | Update the current user price-alert notification settings. Partial input is merged with current settings before PUT. |
| saxo_precheck_orderC | Validate an order against Saxo (margin, prices, instrument rules) without placing it. Runs through the policy + audit even though no execution happens. |
| saxo_place_orderA | Place a new Saxo order. Defaults to SIM. LIVE writes require SAXO_ENABLE_LIVE_TRADING=true plus a policy.json that sets allow_live_writes=true. Policy may also cap Amount/AssetType/AccountKey/Uic/notional. |
| saxo_modify_orderB | Modify a working order (amount, price, duration). Same LIVE guards as saxo_place_order. |
| saxo_cancel_orderA | Cancel one or more working orders. LIVE writes require SAXO_ENABLE_LIVE_TRADING=true. |
| saxo_precheck_multileg_orderA | Validate a multi-leg option strategy (vertical/calendar spread, condor, straddle, etc.) without placing it. OrderType must be Limit; OrderPrice is always positive — the absolute limit price you are willing to pay (debit spreads) or receive (credit spreads). Saxo infers debit vs credit from the Buy/Sell direction of the legs and rejects negative OrderPrice with "Price cannot be negative." All legs must share the same option root. |
| saxo_place_multileg_orderA | Place a multi-leg option strategy as one atomic order with a single limit price. OrderType must be Limit. OrderPrice is always positive — the absolute price you are willing to pay (debit) or receive (credit); Saxo infers direction from the legs. All legs must share the same option root (same underlying + expiry). Returns MultiLegOrderId plus per-leg OrderIds. |
| saxo_modify_multileg_orderA | Modify a working multi-leg order. Only Amount (scaled symmetrically across legs) and OrderPrice can be changed. |
| saxo_cancel_multileg_orderA | Cancel a working multi-leg order. Cancels the whole strategy — individual legs cannot be cancelled separately. |
| saxo_oauth_loginA | Run the full Saxo OAuth2 + PKCE login in one MCP call. Starts a loopback callback listener, optionally opens the browser, waits for approval, exchanges tokens, updates the running MCP server, and optionally persists tokens to an env file. |
| saxo_oauth_startA | Begin a Saxo OAuth2 + PKCE login. Requires SAXO_APP_KEY + SAXO_APP_SECRET in the MCP server environment. Returns a ticketId and an authorizeUrl, optionally opening it in the browser. Then call saxo_oauth_complete with the ticketId. |
| saxo_oauth_completeA | Wait for the Saxo callback, exchange the code for tokens, and update the running MCP server. Optionally writes tokens to a .env file. |
| saxo_oauth_cancelA | Cancel a pending OAuth login flow (closes the callback listener). |
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
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/borgels/mcp-server-saxo'
If you have feedback or need assistance with the MCP directory API, please join our Discord server