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 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| 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
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- 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/borgels/mcp-server-saxo'
If you have feedback or need assistance with the MCP directory API, please join our Discord server