Skip to main content
Glama
borgels

mcp-server-saxo

by borgels

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
PORTNoPort for the optional HTTP server.3000
SAXO_APP_KEYNoApplication key from the developer portal. Required for OAuth refresh.
MCP_HTTP_HOSTNoHost for the HTTP server.127.0.0.1
MCP_HTTP_TOKENNoBearer token required for HTTP API access.
SAXO_AUDIT_LOGNoFile path for JSONL audit log.
SAXO_APP_SECRETNoApplication secret for Code-grant OAuth apps. Omit for PKCE.
SAXO_TIMEOUT_MSNoRequest timeout in milliseconds.30000
SAXO_ENVIRONMENTNoEnvironment: sim (simulation) or live.sim
SAXO_POLICY_PATHNoPath to policy.json file for trading safety rules.
SAXO_ACCESS_TOKENYesBearer token. 24-hour token for SIM, OAuth token for LIVE.
SAXO_REDIRECT_URINoRedirect URI for OAuth. Must be registered in Saxo developer portal.http://localhost:8765/callback
MCP_MAX_BODY_BYTESNoMaximum request body size in bytes.10485760
SAXO_REFRESH_TOKENNoRefresh token for automatic token refresh. Required for LIVE or long-running SIM with OAuth.
MCP_ALLOWED_ORIGINSNoComma-separated list of allowed CORS origins.
MCP_ALLOW_ANY_ORIGINNoSet to 'true' to allow any origin.
ALPHA_VANTAGE_API_KEYNoOptional API key for Alpha Vantage enrichment.
SAXO_TOKEN_EXPIRES_ATNoExpiration timestamp of the access token (ISO 8601). Used for cold-start refresh.
SAXO_ENABLE_LIVE_TRADINGNoSet to 'true' to allow trading on LIVE environment.false
SAXO_ENABLE_LIVE_ALERT_WRITESNoSet to 'true' to allow creating/updating/deleting price alerts on LIVE.false

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
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

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/borgels/mcp-server-saxo'

If you have feedback or need assistance with the MCP directory API, please join our Discord server