Skip to main content
Glama
borgels

mcp-server-saxo

by borgels

mcp-server-saxo

TypeScript MCP server for the Saxo Bank OpenAPI. Works against both the SIM (simulation/demo) and LIVE environments. Same shape as the rest of the Borgels MCP server family: typed, documented, policy-aware, credential-sane, and audit-friendly.

Disclaimer: This is an independent, unofficial project by Borgels. Borgels is not affiliated with, endorsed by, or supported by Saxo Bank A/S. "Saxo", "Saxo Bank", and the Saxo OpenAPI are referenced only to describe what this server talks to. You need your own Saxo developer credentials, and use of the Saxo OpenAPI is subject to Saxo Bank's own terms and licensing. Trading on LIVE moves real money. You are responsible for any orders this server places on your behalf.

Scope

Supported Saxo OpenAPI service groups:

  • Root (session, diagnostics)

  • Reference Data (instruments, exchanges)

  • Trading (info prices, snapshot chart, order place / modify / cancel / precheck)

  • Portfolio (accounts, balances, positions, closed positions, orders)

  • Value Add (price alert definitions and notification settings)

Streaming subscriptions (WebSocket), Value Add performance, and Client Management beyond accounts/me are out of scope for v1.

Related MCP server: IBKR MCP Server

Quickstart on SIM

npm install
npm run build
cp .env.example .env

Then pick one of:

Path A — 24-hour token (quickest, one-shot)

  1. Sign up for a free SIM account at https://www.developer.saxo/.

  2. App Management → Generate 24-hour token (no app required).

  3. Paste it into .env:

    SAXO_ENVIRONMENT=sim
    SAXO_ACCESS_TOKEN=...
  4. Start the server (see Path A/B start block below).

The token expires after 24h; you'll need to repeat step 2 to keep going.

Path B — OAuth app (refreshes automatically)

For anything you run longer than a day, do the OAuth dance once and let the server refresh tokens for you. This is also the path you'll need for LIVE.

  1. Sign up at https://www.developer.saxo/.

  2. App Management → Create application (mark as SIM, allow trading if you'll be placing orders). Pick either grant type — the server supports both:

    • Code (confidential client, has an App Secret)

    • PKCE (public client, no secret — slightly safer for distributable clients but functionally equivalent for this server)

  3. Register the redirect URL in the portal:

    • For Code apps: register exactly http://localhost:8765/callback. Saxo matches the full URL including port at runtime, and rejects IP-literal redirects like http://127.0.0.1:..., so use the hostname.

    • For PKCE apps: register http://localhost/callback — Saxo's PKCE flow requires the registered URL to omit the port ("When registering the redirect URL with your application, it cannot include a port number"). The server still sends http://localhost:8765/callback at runtime; Saxo matches port-blind. Mismatching this returns unauthorized_client.

  4. Put the credentials in .env:

    SAXO_ENVIRONMENT=sim
    SAXO_APP_KEY=...
    SAXO_APP_SECRET=...        # Only for Code-grant apps. Omit for PKCE.
    SAXO_REDIRECT_URI=http://localhost:8765/callback
  5. Run the auth CLI:

    npm run auth -- --env sim

    This opens your browser to Saxo's authorize page, you click Allow, and the CLI writes SAXO_ACCESS_TOKEN, SAXO_REFRESH_TOKEN, and SAXO_TOKEN_EXPIRES_AT back into .env. Both grant types use the same flow; the server detects the absence of SAXO_APP_SECRET and switches to PKCE-style token exchange (no Authorization header, client_id in the form body).

The OAuth access token Saxo issues is short-lived (~20 minutes on SIM), but SaxoClient proactively refreshes it from the refresh token ~60s before expiry, so the server stays alive indefinitely.

Start the server

npm run dev          # stdio transport
# or
npm run dev:http     # http://127.0.0.1:3000/mcp

The 24-hour token unlocks authenticated API access, but live bid/ask quotes via /trade/v1/infoprices require a separate per-exchange market data agreement (NYSE, OPRA, EUREX, etc.). Until you accept it, saxo_get_infoprice returns PriceTypeAsk/Bid: "NoAccess" with Amount: 0, and saxo_session_me reports MarketDataViaOpenApiTermsAccepted: false.

There is no Saxo OpenAPI endpoint to flip this flag programmatically — it's a human consent screen. Find it in the Saxo trading platform (SaxoTraderGO → settings → live data subscriptions) or developer.saxo. Once accepted, the same token starts returning quotes (typically DelayedByMinutes: 15 unless the current OpenAPI session has TradeLevel: "FullTradingAndChat"). DataLevel should stay at Saxo's default Standard; Saxo documents that it has no impact for third-party applications.

Use saxo_get_session_capabilities to read TradeLevel directly, and saxo_set_session_trade_level to switch between FullTradingAndChat and OrdersOnly. Only one session per Saxo user can have FullTradingAndChat, so upgrading this MCP session can downgrade SaxoTraderGO/PRO or another OpenAPI session. saxo_diagnostics watches session events and flags TradeLevel problems in warnings[]; infoprices responses are decorated with _warning when they're NoAccess.

Authentication

This server reads credentials from environment variables only — they are never accepted as tool arguments.

Variable

Required for

Notes

SAXO_ENVIRONMENT

always

sim (default) or live

SAXO_ACCESS_TOKEN

always

Bearer token. 24-hour token for SIM, OAuth token for LIVE.

SAXO_REFRESH_TOKEN

LIVE / long-running SIM

Together with app credentials enables 401-auto-refresh.

SAXO_APP_KEY

refresh / OAuth

Application key from the developer portal.

SAXO_APP_SECRET

refresh / OAuth

Application secret.

SAXO_REDIRECT_URI

OAuth

Defaults to http://localhost:8765/callback. Loopback only — and Saxo's authorize endpoint rejects IP-literal redirects, so use the localhost hostname rather than 127.0.0.1. The URL in your app's Redirect URLs list must match exactly.

SAXO_TIMEOUT_MS

optional

Request timeout in ms (default 30000).

Two ways to log in for LIVE / long-running SIM

Option A — CLI (one-off, scriptable):

SAXO_APP_KEY=... SAXO_APP_SECRET=... npm run auth -- --env live

The CLI starts a local callback listener, opens your browser to the Saxo authorize endpoint with a PKCE challenge, and writes SAXO_ACCESS_TOKEN/SAXO_REFRESH_TOKEN/SAXO_TOKEN_EXPIRES_AT back into .env.

Option B — From inside the MCP client (saxo_oauth_* tools):

  1. Set SAXO_APP_KEY + SAXO_APP_SECRET in the MCP server environment. In packaged clients such as Claude Desktop / MCPB this usually means client config, not a local env file.

  2. For the smooth local flow, call saxo_oauth_login. It starts the loopback listener, opens the browser by default, waits for approval, exchanges the code, and updates the running MCP server in memory.

  3. Tokens are not written to disk unless writeToEnvFile=true is supplied. Use envFilePath when you want a specific file such as .env.local.

For clients that want to control their own UI, use the lower-level two-step flow: call saxo_oauth_start, open the returned authorizeUrl (or set openBrowser=true), then call saxo_oauth_complete with the returned ticketId.

The MCP server only listens on loopback (127.0.0.1) for the callback, so the flow never touches the public network beyond Saxo itself.

Install

The server is published as @borgels/mcp-server-saxo on npm and as an .mcpb bundle (MCP Bundle, the new name for DXT) on each GitHub Release. The protocol layer is the same everywhere — stdio + MCP JSON-RPC. The table below is just the per-client config syntax.

Client

How to install

Claude Desktop (1.8089+)

Download mcp-server-saxo-v<version>.mcpb from the latest Release, then Settings → Connectors → Install from file. Claude Desktop prompts you for the SAXO_* config values from the bundle's user_config schema.

Claude Desktop (legacy claude_desktop_config.json)

Add the universal JSON block to %APPDATA%\Claude\claude_desktop_config.json under mcpServers. Restart fully (File → Exit).

Claude Code (CLI)

claude mcp add saxo -- npx -y @borgels/mcp-server-saxo (or edit ~/.claude/mcp.json / per-project .mcp.json).

Cursor

Settings → MCP → Add server, or .cursor/mcp.json per project. Same JSON shape as below.

Codex (OpenAI)

~/.codex/config.toml: [mcp_servers.saxo] with command = "npx", args = ["-y", "@borgels/mcp-server-saxo"], env = { SAXO_ENVIRONMENT = "sim", ... }.

Windsurf / Cline / Zed / continue.dev

Settings UI, point at npx -y @borgels/mcp-server-saxo. Same JSON envelope.

MCP Inspector (debug)

npx @modelcontextprotocol/inspector npx -y @borgels/mcp-server-saxo

Self-host (any client)

command: "node", args: ["/absolute/path/to/dist/transports/stdio.js"]. Use double backslashes on Windows or forward slashes.

Universal config

For any client that uses the standard mcpServers config schema:

{
  "mcpServers": {
    "saxo": {
      "command": "npx",
      "args": ["-y", "@borgels/mcp-server-saxo"],
      "env": {
        "SAXO_ENVIRONMENT": "sim",
        "SAXO_ACCESS_TOKEN": "your-24h-sim-token"
      }
    }
  }
}

That's the minimal form — fine for a quick SIM test. For durable use (no daily token paste), do the OAuth dance once with npm run auth -- --env sim against a clone of this repo, then copy the resulting OAuth env vars into the block:

{
  "mcpServers": {
    "saxo": {
      "command": "npx",
      "args": ["-y", "@borgels/mcp-server-saxo"],
      "env": {
        "SAXO_ENVIRONMENT": "sim",
        "SAXO_APP_KEY": "...",
        "SAXO_APP_SECRET": "...",
        "SAXO_REFRESH_TOKEN": "...",
        "SAXO_ACCESS_TOKEN": "...",
        "SAXO_TOKEN_EXPIRES_AT": "2026-05-19T18:00:37.823Z",
        "SAXO_ENABLE_LIVE_TRADING": "false"
      }
    }
  }
}

SAXO_ACCESS_TOKEN may be expired at startup — SaxoClient decodes the JWT exp, detects it's within 60s of expiry, and runs the refresh-token grant before sending the first request. The refresh token is what really matters at cold start.

Restart after editing

Most MCP clients spawn server processes only at startup. After editing the client's config, fully quit and reopen it. Some clients (notably Claude Desktop) keep running in the system tray when the window is closed — make sure you actually exit before reopening.

Troubleshooting

  • If the server doesn't appear in the client's tool list, check the client's MCP logs (each client documents its log location).

  • Verify npx -y @borgels/mcp-server-saxo runs from a fresh shell — it should start, register tools, and wait for stdin without error.

  • Once connected, call saxo_diagnostics first when something looks off — its warnings[] array surfaces missing market-data terms, near-expiry tokens, TradeLevel not FullTradingAndChat, and LIVE order writes without SAXO_ENABLE_LIVE_TRADING.

Building from source (for hacking or before npm publish)

git clone https://github.com/Borgels/mcp-server-saxo.git
cd mcp-server-saxo
npm install
npm run build           # produces dist/transports/stdio.js
npm test

Use "command": "node", "args": ["/absolute/path/to/dist/transports/stdio.js"] in your client config to point at the built source. For the MCPB bundle, npm run mcpb:pack produces mcp-server-saxo.mcpb in the project root.

Start Here

Use saxo_capabilities first when an MCP client needs to decide which Saxo tool to call. It returns tool descriptions, examples, identifier formats, and safety notes without contacting Saxo.

{ "query": "place order", "limit": 5 }

Optional Alpha Vantage enrichment

The strategy screeners are Saxo-first. They work without third-party data using Saxo instruments, prices, chart bars, option chains, and account/position context. If ALPHA_VANTAGE_API_KEY is set, stock and option strategy tools can optionally enrich candidates with Alpha Vantage OVERVIEW, NEWS_SENTIMENT, and EARNINGS_CALENDAR.

Leave ALPHA_VANTAGE_API_KEY unset to keep the server Saxo-only. Alpha Vantage is optional because tiers and rate limits vary. For deeper research, run Alpha Vantage's own MCP server beside this Saxo server and pass normalized research into externalContextBySymbol.

Factor and portfolio context

Use saxo_screen_stock_factors when you want stock factor context with Saxo quote/liquidity data, Saxo chart context, optional account sizing, optional fundamentals/news enrichment, and warnings:

{
  "accountKey": "your-account-key",
  "market": "us",
  "universe": "large_cap",
  "objective": "balanced",
  "riskProfile": "balanced",
  "includeAccountContext": true,
  "includeFundamentalContext": true,
  "riskBudgetPercentPerIdea": 1,
  "maxSingleNamePercent": 10,
  "maxResults": 10
}

Use saxo_screen_option_strategy_factors when you want optionable underlyings and explicit strategy candidates with liquidity, structure, chart, IV/Greeks, optional news, and account sizing factors:

{
  "accountKey": "your-account-key",
  "market": "us_nasdaq",
  "underlyingUniverse": "auto",
  "strategies": ["put_credit_spread", "iron_condor"],
  "includeAccountContext": true,
  "riskBudgetPercent": 1,
  "requireGreeks": true,
  "maxThetaDailyPercentOfRisk": 1,
  "maxUnderlyings": 50,
  "maxUnderlyingScan": 500,
  "maxSymbolsToPlan": 5,
  "maxPlans": 10
}

Option candidate generation uses Saxo option-chain quotes, Saxo Greeks, optional OptionsChain IV context, and optional account-aware sizing. The output contains factor scores and warnings, not pass/watchlist/reject verdicts or confidence labels.

Use saxo_analyze_portfolio_context for whole-account context. It reads the account snapshot, runs the stock and option factor tools, then returns risk budgets, stock/option factor summaries, concentration context, sector context, and warnings. It does not return target allocations, deployment stages, or recommended contract counts:

{
  "accountKey": "your-account-key",
  "objective": "balanced_growth_income",
  "riskProfile": "balanced",
  "portfolioProfile": "concentrated_conviction",
  "deploymentStyle": "staged",
  "targetInvestedPercent": 80,
  "cashReservePercent": 10,
  "maxCashDollars": 1000,
  "maxSingleNamePercent": 10,
  "maxSectorPercent": 35,
  "maxOptionsRiskPercent": 5,
  "riskBudgetPercentPerIdea": 1,
  "maxSelectedUnderlyings": 5,
  "minPositionRiskDollars": 2500,
  "maxContractsPerPosition": 20,
  "fragmentationPolicy": "reject",
  "requireGreeks": true,
  "maxThetaDailyPercentOfRisk": 1,
  "stockUniverse": "large_cap",
  "stockMaxCandidates": 120,
  "discoverOptionCandidates": true,
  "optionDiscoveryUniverse": "auto",
  "optionTheses": [
    {
      "name": "Long-term stock replacement",
      "symbols": ["NVO"],
      "role": "core_conviction",
      "conviction": "high",
      "horizon": "leaps",
      "preferredStructures": ["long_call", "debit_spread"],
      "targetRiskPercent": 5
    }
  ],
  "includeStocks": true,
  "includeOptions": true
}

Set discoverOptionCandidates=true to blend user-supplied option symbols or theses with deterministic discovery from Saxo market movers. If the Saxo account is not approved for short option legs, set allowShortOptionLegs=false; short-leg structures are filtered from candidate generation.

Use saxo_review_strategy_positions after execution to monitor open stock and option strategies against the plan you opened. Pass the executed stock leg or option legs plus entry metrics from the selected plan or fill. The tool matches those legs to open Saxo positions, refreshes quotes, estimates current value and P/L, and evaluates deterministic profit-taking/loss rules. Option strategies additionally include Greeks, theta, DTE, roll, and close rules. It returns verdicts such as hold, review, consider_trim, consider_close, and roll_watch; execution remains a separate explicit order workflow.

Tools

All tools are registered with MCP annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) so clients can reason about safety. Read-only tools work on SIM and LIVE without extra opt-in. Write tools (orders, OAuth) follow the LIVE Trading Safety rules.

Read-only

Tool

Endpoint

Purpose

saxo_capabilities

Discover tools without calling Saxo.

saxo_session_me

GET /port/v1/users/me

Authenticated user (Name, ClientKey, UserKey, MarketDataViaOpenApiTermsAccepted).

saxo_get_session_capabilities

GET /root/v1/sessions/capabilities

Current AuthenticationLevel, DataLevel, and TradeLevel without running diagnostics.

saxo_diagnostics

(aggregated)

Session + capabilities + token expiry + warnings (market-data terms, TradeLevel, token close to expiry).

saxo_feature_availability

GET /root/v1/features/availability

Inspect Saxo feature flags for News, Calendar, Gainers/Losers, and Chart.

saxo_search_instruments

GET /ref/v1/instruments

Search by keyword + asset type.

saxo_get_instrument_details

GET /ref/v1/instruments/details

Detailed metadata for one or many Uics.

saxo_list_exchanges

GET /ref/v1/exchanges

List exchanges (or one by ExchangeId).

saxo_get_option_chain

GET /ref/v1/instruments/contractoptionspaces/{optionRootId}

Strikes + expirations. normalize=true (default) pivots Put/Call into one row per strike.

saxo_list_option_expiries

(uses option chain)

Cheap helper: just the expiries (date, days, strike count) for an option root.

saxo_list_standard_option_expiries

GET /ref/v1/standarddates/optionexpiry

Standardized option-expiry calendar (3rd Friday monthlies, quarterlies, weeklies). Distinct from list_option_expiries.

saxo_find_option_leg

(composes search + chain)

Convenience helper: given symbol + expiry + strike + Call/Put, returns the leg Uic in one call instead of 4. Picks multi-leg-capable root when ambiguous.

saxo_get_infoprice

GET /trade/v1/infoprices

Snapshot bid/ask/last for one instrument. Adds _warning if PriceType=NoAccess.

saxo_get_infoprices_list

GET /trade/v1/infoprices/list

Snapshot prices for multiple Uics.

saxo_get_chart

GET /chart/v3/charts

Historical OHLC bars (horizon in minutes).

saxo_screen_market

Saxo instruments + info prices

User-friendly top gainers/losers and pre-market screeners.

saxo_compute_spread_quote

(uses infoprices)

Fetch bid/ask per leg and compute worst-case, mid, best-case net debit for a multi-leg spread.

saxo_estimate_vertical_spread

(pure math)

Given side + strikes + debit + contracts: max loss, max gain, breakeven, R/R. Applies 100x option multiplier.

saxo_generate_option_strategy_candidates

Option chain + prices

Explicit option strategy candidates with factor scores.

saxo_screen_option_strategy_factors

Market screener + chart TA + OptionsChain IV + planner

Cross-symbol option factor screening.

saxo_screen_stock_factors

Saxo instruments + prices + chart TA + optional fundamentals/news

Stock factor screening without verdicts.

saxo_analyze_portfolio_context

Account snapshot + stock/options factor tools

Whole-account factor, budget, and constraint context.

saxo_review_strategy_positions

Positions + quotes (+ Greeks for options)

Post-execution strategy follow-up with hold/trim/close/roll verdicts.

saxo_list_accounts

GET /port/v1/accounts/me

List the client's trading accounts.

saxo_get_balance

GET /port/v1/balances

Cash + margin balance.

saxo_list_positions

GET /port/v1/positions/me

Open positions (one row per fill).

saxo_list_net_positions

GET /port/v1/netpositions/me

Positions aggregated per instrument (one row per Uic). Right view for current exposure.

saxo_list_closed_positions

GET /port/v1/closedpositions/me

Closed positions / history.

saxo_list_activities

GET /port/v1/activities

Recent account events: orders placed/modified/cancelled, trades, dividends, corporate actions.

saxo_list_orders

GET /port/v1/orders/me

Working orders.

saxo_get_order

GET /port/v1/orders/{orderId}

One order by id.

saxo_list_price_alerts

GET /vas/v1/pricealerts/definitions

List Saxo price alerts, optionally by state.

saxo_get_price_alert

GET /vas/v1/pricealerts/definitions/{id}

One price alert definition by id.

saxo_get_price_alert_user_settings

GET /vas/v1/pricealerts/usersettings

Price-alert email/popup/sound settings.

Write — guarded

Tool

Endpoint

Guards

saxo_precheck_order

POST /trade/v2/orders/precheck

Policy + audit. No execution.

saxo_place_order

POST /trade/v2/orders

LIVE: SAXO_ENABLE_LIVE_TRADING=true + policy.json allow + optional auto-precheck.

saxo_modify_order

PATCH /trade/v2/orders

Same as place_order.

saxo_cancel_order

DELETE /trade/v2/orders/{ids}

Policy + audit.

saxo_precheck_multileg_order

POST /trade/v2/orders/multileg/precheck

Validate a spread (no execution).

saxo_place_multileg_order

POST /trade/v2/orders/multileg

Place a spread atomically with a single net debit/credit limit.

saxo_modify_multileg_order

PATCH /trade/v2/orders/multileg

Adjust spread Amount or OrderPrice.

saxo_cancel_multileg_order

DELETE /trade/v2/orders/multileg/{id}

Cancel the whole strategy.

saxo_create_price_alert

POST /vas/v1/pricealerts/definitions

LIVE alert writes require SAXO_ENABLE_LIVE_ALERT_WRITES=true + policy allow.

saxo_update_price_alert

PUT /vas/v1/pricealerts/definitions/{id}

Partial tool input is merged with the current definition before PUT.

saxo_delete_price_alerts

DELETE /vas/v1/pricealerts/definitions/{ids}

Delete one or more price alerts.

saxo_update_price_alert_user_settings

PUT /vas/v1/pricealerts/usersettings

Update email/popup/sound settings.

saxo_set_session_trade_level

PATCH /root/v1/sessions/capabilities

LIVE requires policy.allow_live_session_capability_writes=true; can downgrade other Saxo sessions.

saxo_oauth_login

OAuth2 PKCE

One-call local login; updates in-process tokens. Optional env-file persist.

saxo_oauth_start

OAuth2 PKCE

Loopback redirect only; reads app creds from env.

saxo_oauth_complete

OAuth2 PKCE

Replaces in-process tokens. Optional .env persist.

saxo_oauth_cancel

Closes a pending OAuth listener.

Place / modify order body

Order tools accept Saxo's standard POST /trade/v2/orders body. Required fields: AccountKey, Uic, AssetType, BuySell, Amount, OrderType, OrderDuration. Optional: OrderPrice (Limit/StopLimit), StopPrice (Stop/StopLimit), ManualOrder, ExternalReference, and Orders[] for related orders (OCO, IfDone, brackets).

{
  "AccountKey": "your-account-key",
  "Uic": 211,
  "AssetType": "Stock",
  "BuySell": "Buy",
  "Amount": 1,
  "OrderType": "Market",
  "OrderDuration": { "DurationType": "DayOrder" }
}

Multi-leg option order body

Multi-leg tools wrap Saxo's /trade/v2/orders/multileg family. OrderType must be Limit. OrderPrice is always positive — the absolute limit price you are willing to pay (debit spread) or receive (credit spread). Saxo's API rejects negative OrderPrice with "Price cannot be negative"; the debit/credit direction is implicit in each leg's BuySell. Legs[] accepts 2–20 legs that all share the same option root (same underlying + expiry).

{
  "AccountKey": "your-account-key",
  "OrderType": "Limit",
  "OrderPrice": 1.08,
  "OrderDuration": { "DurationType": "GoodTillCancel" },
  "ManualOrder": true,
  "ExternalReference": "bull-call-spread-1",
  "Legs": [
    {
      "Uic": 14853018,
      "AssetType": "StockOption",
      "BuySell": "Buy",
      "Amount": 150,
      "ToOpenClose": "ToOpen"
    },
    {
      "Uic": 14853056,
      "AssetType": "StockOption",
      "BuySell": "Sell",
      "Amount": 150,
      "ToOpenClose": "ToOpen"
    }
  ]
}

Saxo returns a MultiLegOrderId plus per-leg Orders[].OrderId values. Use saxo_modify_multileg_order (Amount/OrderPrice only) or saxo_cancel_multileg_order (cancels the whole strategy) afterwards. To find the per-leg Uics, start with saxo_search_instruments for the underlying, then saxo_get_option_chain to read off strikes and expirations.

LIVE Trading Safety

LIVE writes are denied by default. To enable them you must do all three:

  1. Set SAXO_ENVIRONMENT=live.

  2. Set SAXO_ENABLE_LIVE_TRADING=true.

  3. Point SAXO_POLICY_PATH at a policy.json that sets "allow_live_writes": true.

Price-alert writes are separate from trading writes. To create, update, delete, or change notification settings on LIVE you must set SAXO_ENABLE_LIVE_ALERT_WRITES=true and set "allow_live_alert_writes": true in policy. This does not enable order placement.

A copy of policy.example.json is included. Supported fields:

Field

Effect

allow_live_writes

Master switch for all order writes on LIVE.

allow_live_alert_writes

Master switch for price-alert create/update/delete/settings writes on LIVE.

allow_live_session_capability_writes

Allows changing LIVE session TradeLevel (FullTradingAndChat / OrdersOnly).

require_precheck_on_live

Place-order automatically runs precheck first.

allow_short_option_legs

Set to false when the Saxo option profile does not permit opening short option legs; multi-leg write tools then block sell-to-open option legs before calling Saxo.

allowed_asset_types

Whitelist of AssetTypes that may be ordered.

allowed_account_keys

Whitelist of AccountKeys that may be traded.

denied_uics

Blocklist of Uics.

max_order_amount

Per-AssetType caps; default falls back when no specific entry.

max_notional

Cap on Amount * (OrderPrice or StopPrice) * contract_multiplier. Multiplier is 100 for StockOption / IndexOption / StockIndexOption / FuturesOption, 1 otherwise. For multi-leg spreads, applied as `

Even on SIM, all write tools run through the policy check (it just defaults to permissive). Use the policy in SIM too if you want predictable limits.

Optional HTTP Server

The local stdio transport is the default for agent compatibility. A small Streamable HTTP entry point is also available:

PORT=3000 SAXO_ACCESS_TOKEN=... npm run dev:http

By default the HTTP server binds to 127.0.0.1, limits request bodies to 10 MiB, allows browser CORS only from loopback origins, and does not require an HTTP Bearer token. Override with MCP_HTTP_HOST, MCP_MAX_BODY_BYTES, MCP_ALLOWED_ORIGINS, MCP_ALLOW_ANY_ORIGIN=true, and MCP_HTTP_TOKEN. The MCP endpoint is POST http://127.0.0.1:3000/mcp.

Verification

npm run typecheck
npm test
npm run build

Optional live SIM smoke test (requires a 24-hour SIM token):

SAXO_ACCESS_TOKEN="your-sim-token" npm run smoke:live

Releasing

Tagged releases trigger .github/workflows/release.yml. On git push --tags vX.Y.Z:

  1. Typecheck, test, build, validate the MCPB manifest.

  2. Publish @borgels/mcp-server-saxo@X.Y.Z to npm with --provenance so the package carries a SLSA attestation linking it to the exact CI run + commit.

  3. Reinstall with --omit=dev and pack a small .mcpb bundle (~2.6 MB; full dev install yields ~17 MB).

  4. Create a GitHub Release with the matching CHANGELOG section as the body and the .mcpb attached.

Pre-release tags (e.g. v0.1.1-rc.1) publish under the next npm dist-tag and as a GitHub pre-release.

One-time setup before the first release

  1. Create the npm org. At https://www.npmjs.com/org/create, create the borgels organization (free, public packages).

  2. Bootstrap the first publish. Trusted Publishing (see below) can't be configured until the package exists on npm, so the very first publish needs a token. Either:

    • Local one-shot: npm publish --access public with a one-time Automation Token logged in as a member of the borgels org. Run this once from a clean checkout of the tagged commit. Revoke the token immediately afterwards.

    • CI bootstrap: add the token as the NPM_TOKEN repo secret, push v0.1.1-rc.1, let CI publish, then delete the secret.

  3. Configure Trusted Publishing (one-time, per package): https://www.npmjs.com/package/@borgels/mcp-server-saxo/accessTrusted publishing → Add publisher. Enter

    • Organization: Borgels

    • Repository: mcp-server-saxo

    • Workflow filename: release.yml

    • Environment: leave blank (or set to e.g. production if you want to gate releases behind a GitHub Environment approval).

  4. Revoke the bootstrap token and delete the NPM_TOKEN repo secret. From this point on, every release authenticates via GitHub Actions OIDC — no long-lived secrets anywhere.

The same three steps repeat once per sibling Borgels MCP server when they migrate to this template.

Rate Limits

Saxo applies per-service-group rate limits (typically ~120 requests per minute per session per service group, and ~1 order per second). On 429 the server preserves the retry-after header on the thrown SaxoHttpError so callers can back off.

Security And Audit

  • All credentials (SAXO_ACCESS_TOKEN, SAXO_REFRESH_TOKEN, SAXO_APP_KEY, SAXO_APP_SECRET) are read only from the MCP server environment.

  • Credentials are never accepted as tool arguments.

  • Error formatting and audit records redact Authorization: Bearer ..., access_token, refresh_token, and SAXO_APP_SECRET style material.

  • The OAuth listener only binds to loopback. Non-loopback SAXO_REDIRECT_URI is rejected at startup.

  • If SAXO_AUDIT_LOG is set, every tool call writes a JSONL line with timestamp, request id, tool name, environment, action (start / finish / error / policy_denied), SHA-256 hash of the input, status, and redacted error text. Raw inputs and tokens are not written.

  • Reports of suspected vulnerabilities go privately to security@borgels.com. Do not include credentials or personal data in public GitHub issues.

API Sources

License

Apache-2.0. See LICENSE.

Available Tools

51 tools
saxo_analyze_portfolio_contextAnalyze Portfolio ContextB
Read-onlyIdempotent

Read-only whole-account context analyzer. Combines account snapshot, stock factors, option factors, risk budgets, concentration context, and warnings without allocation or deployment recommendations.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountKeyYes
objectiveNobalanced_growth_income
riskProfileNobalanced
portfolioProfileNobalanced
deploymentStyleNostaged
targetInvestedPercentNo
cashReservePercentNo
maxCashDollarsNo
maxSingleNamePercentNo
maxSectorPercentNo
maxOptionsRiskPercentNo
maxThesisRiskPercentNo
maxSingleTradeRiskPercentNo
riskBudgetPercentPerIdeaNo
allowShortOptionLegsNo
requireGreeksNo
maxThetaDailyPercentOfRiskNo
optionsModeNoguardrailed
fragmentationPolicyNo
maxContractsPerPositionNo
maxSelectedUnderlyingsNo
maxMonitoringSymbolsNo
minPositionRiskDollarsNo
minPositionRiskPercentNo
includeStocksNo
includeOptionsNo
stockMarketNo
stockUniverseNo
stockMaxCandidatesNo
stockMaxTechnicalCandidatesNo
discoverOptionCandidatesNo
optionDiscoveryUniverseNo
optionDiscoveryPresetNo
optionDiscoveryPlaybookNo
optionDiscoveryMaxUnderlyingsNo
optionDiscoveryMaxSymbolsToPlanNo
optionDiscoveryTargetRiskPercentNo
stockSymbolsNo
optionSymbolsNo
optionThesesNo
maxStockIdeasNo
maxOptionIdeasNo
includeNewsContextNo
includeFundamentalContextNo

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true; the description aligns by stating 'Read-only' and further adds transparency by clarifying that the tool does not make allocation or deployment recommendations. This extra context is valuable beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, which is concise, but given the tool's complexity and 44 parameters, it is too brief. A more structured breakdown (e.g., bullet points for parameter categories) would improve readability without sacrificing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 44 parameters, no output schema, and zero parameter documentation, the description is grossly incomplete. It does not specify expected outputs, parameter dependencies, or how to interpret results. The tool's complexity demands a more thorough description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 44 parameters with 0% description coverage. The tool description provides no explanation of any parameter, leaving the agent to infer meanings from field names and enums. For such a complex tool, the description must compensate, but it fails entirely.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Read-only whole-account context analyzer' and lists specific components (account snapshot, stock factors, option factors, risk budgets, concentration context, warnings). It clearly distinguishes from siblings that perform order placement or recommendations by noting it does not provide allocation or deployment recommendations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for obtaining portfolio context without recommendations, but it does not provide explicit guidance on when to use it versus other tools like saxo_get_balance, saxo_list_positions, or saxo_screen_stock_factors. The 'read-only' nature is clear, but alternatives are not mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_cancel_multileg_orderCancel Multi-Leg Option OrderA
Destructive

Cancel a working multi-leg order. Cancels the whole strategy — individual legs cannot be cancelled separately.

ParametersJSON Schema
NameRequiredDescriptionDefault
multiLegOrderIdYes
accountKeyYes

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructive=true, and the description confirms cancellation of the entire strategy, adding that individual legs cannot be cancelled separately. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with purpose, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Lacks return value details, success/failure indications, and process steps; no output schema to compensate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the description does not explain the parameters (multiLegOrderId, accountKey) or how to obtain them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool cancels a working multi-leg order and cancels the whole strategy, distinguishing it from single-leg cancellation (sibling 'saxo_cancel_order' exists).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (cancel a multi-leg order), but does not explicitly state when not to use or compare to alternatives like saxo_cancel_order for single orders.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_cancel_orderCancel OrderA
Destructive

Cancel one or more working orders. LIVE writes require SAXO_ENABLE_LIVE_TRADING=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
orderIdsYes
accountKeyYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint: true, so the agent knows it's destructive. The description adds the crucial behavioral context that LIVE writes require SAXO_ENABLE_LIVE_TRADING=true, which goes beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the core function, but it could be slightly more structured, e.g., by separating the cancellation from the environment constraint.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the sibling tools for canceling multileg orders (saxo_cancel_multileg_order) and no output schema, the description adequately covers the tool's purpose and key constraint, though it could mention error handling or side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, yet the description offers no explanation of what 'orderIds' or 'accountKey' represent, failing to compensate for the schema's lack of semantic meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action 'Cancel' and the resource 'working orders,' which is specific and distinguishes from sibling tools like saxo_cancel_multileg_order that target multileg orders.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It mentions an environment variable requirement for LIVE writes but does not provide explicit when-to-use or when-not-to-use guidance against alternatives like saxo_cancel_multileg_order.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_capabilitiesSearch Saxo CapabilitiesA
Read-onlyIdempotent

Search the Saxo MCP server capabilities and examples. Use this first when deciding which Saxo tool to call.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNo
limitNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true, which convey safe, read-only behavior. The description adds that it searches capabilities and examples, which is a modest addition. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two short sentences, each serving a purpose: stating what the tool does and when to use it. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and many sibling tools, the description should clarify what 'capabilities and examples' means (e.g., tool names, descriptions, arguments). It is vague on the format and scope of results, leaving the agent uncertain about what it will actually retrieve.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning the input schema provides no descriptions for the two parameters (query, limit). The tool description does not describe them either, leaving the AI agent to infer meaning from parameter names alone. This is insufficient for a discoverability tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches the Saxo MCP server capabilities and examples, and explicitly positions it as a first-use discovery tool distinct from the many sibling tools that perform specific actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this first when deciding which Saxo tool to call,' giving clear guidance on when to use it. It doesn't explicitly list when not to use it, but the context strongly implies it's for orientation before selecting other tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_compute_spread_quoteCompute Spread QuoteA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
legsYes
accountKeyNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds value by explaining the sign convention (positive=net debit, negative=net credit) and that it surfaces NoAccess warnings per leg, which annotations do not cover.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each adding distinct value: core function, result interpretation, and warning behavior. It is front-loaded and free of filler, making it highly concise and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 2 parameters and no output schema. The description explains the conceptual output and a behavioral warning, but it omits the purpose of accountKey and whether it is required. Given the complexity of multi-leg strategies, some additional context (e.g., constraints like min/max legs) would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the description does not explain the parameters (legs array fields, accountKey). The description only mentions 'legs' broadly but omits details like uic, assetType, buySell, amount. This fails to compensate for the missing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the tool's function: fetching live bid/ask for each leg of a multi-leg option strategy and computing worst-case, best-case, and mid net debit. This distinguishes it from siblings that may estimate or place orders.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for computing spread quotes but does not explicitly state when to use this tool versus alternatives like saxo_estimate_vertical_spread or saxo_generate_option_strategy_candidates. No when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_create_price_alertCreate Price AlertB
Destructive

Create a Saxo price alert definition. LIVE alert writes require SAXO_ENABLE_LIVE_ALERT_WRITES=true plus policy.allow_live_alert_writes=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
AccountIdYes
UicYes
AssetTypeYes
TargetValueYes
OperatorYes
PriceVariableNoTraded
ExpiryDateNo
IsRecurringNo
IsExtendedHoursNo
StateNoEnabled
CommentNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark destructiveHint=true and not readOnly. The description adds context about LIVE alert requirements, but no further behavioral details like side effects or limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise: two sentences, no filler. First sentence states purpose, second adds important condition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 11 parameters, no output schema, and moderate complexity, the description fails to cover return behavior, error handling, or parameter details, leaving the agent underinformed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, leaving 11 parameters unexplained. Description does not define any parameter meaning or constraints beyond the schema itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states verb 'Create' and resource 'Saxo price alert definition'. Distinguishes from siblings like get, list, update, delete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Mentions a prerequisite for LIVE alerts (environment variable and policy) but provides no general guidance on when to use this tool vs others like update or delete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_delete_price_alertsDelete Price AlertsA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
alertDefinitionIdsYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark destructive=True; the description adds context about live alert write configuration, which is valuable beyond annotations and does not contradict them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficient sentences: one for purpose, one for prerequisite info. No redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose and a critical prerequisite, but lacks information about return values or error handling, which is useful for a deletion tool without output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description completely fails to explain the alertDefinitionIds parameter beyond its name, leaving the agent without guidance on format, constraints, or usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (Delete) and resource (price alert definitions), distinguishing it from sibling tools like saxo_get_price_alert, saxo_list_price_alerts, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides important prerequisites for LIVE alert writes, but does not explicitly specify when to use alternatives or exclude contexts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_diagnosticsSaxo OpenAPI DiagnosticsA
Read-onlyIdempotent

Hit the Saxo diagnostics endpoint to verify connectivity.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate the tool is read-only, non-destructive, idempotent, and open-world. The description adds the detail that it verifies connectivity, which is consistent but does not significantly expand on behavioral traits beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the purpose. It is appropriately sized with no wasted words, though a slight addition about the expected outcome could improve it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, no output schema, and clear annotations), the description is complete enough for an agent to understand and invoke it. It provides the essential information without needing elaboration.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is 100%, so the description does not need to add parameter info. The baseline score of 4 is appropriate since there is no missing semantic information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'verify connectivity' using the Saxo diagnostics endpoint. This is a specific verb and resource, and it distinguishes the tool from its siblings which focus on orders, accounts, and other operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, exclusions, or context for usage. An agent would not know when to choose diagnostics over other tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_estimate_vertical_spreadEstimate Vertical Spread RiskA
Read-onlyIdempotent

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
sideYes
longStrikeYes
shortStrikeYes
debitYes
contractsYes
assetTypeNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, idempotent, and non-destructive. Description adds context about the option multiplier (100 for US equities) and debit sign convention, but does not mention behavior for invalid parameters or the role of assetType.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with no filler; front-loaded with 'Pure math' to convey core nature, and every part adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers key outputs (max loss, max gain, breakeven) and important details (multiplier, debit sign), but misses edge-case behaviors (e.g., invalid strike ordering) and the purpose of assetType.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, description compensates by explaining side enum, debit sign, and multiplier, but fails to explain the optional assetType parameter and ordering constraints between strikes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Pure math' and specifies the tool computes max loss, max gain, and breakeven for vertical spreads, distinguishing it from sibling tools like saxo_compute_spread_quote (for quoting) or saxo_generate_option_strategy_candidates (strategy generation).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description implies use for pre-trade estimation but does not explicitly state when to use this tool versus others, nor does it provide exclusion criteria or alternatives. Context of 'pure math' suggests it does not use live market data, but no direct guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_feature_availabilityGet Saxo Feature AvailabilityA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey safety (read-only, idempotent, open-world). The description adds the diagnostic nature and endpoint caveat, providing useful behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with purpose. Every phrase earns its place; no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and no output schema, the description covers the core purpose and a key limitation. However, it could mention the response format (e.g., boolean flags) for greater completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so baseline 4 applies. The description correctly doesn't add parameter info, as the schema is trivially complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns specific feature flags (News, Calendar, Gainers/Losers, Chart) and labels it as diagnostic. This distinguishes it from siblings, all of which perform other operations like trading or data retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states 'Diagnostic only' and warns that flags don't guarantee public endpoints. This helps the agent understand its limited role, though it doesn't explicitly list when not to use it or contrast with alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_find_option_legFind Option Leg by Symbol/Expiry/StrikeA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYes
expiryYes
strikeYes
putCallYes
exchangeIdNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate read, non-destructive, idempotent, open-world. Description adds details about preferring multi-leg-capable root and surfacing alternatives in warnings[], enhancing transparency beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, followed by workflow compression, usage context, and disambiguation tip. Every sentence adds value; no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Fully addresses tool's helper nature with clear input semantics, behavioral expectations (preference logic, warnings), and usage context. Missing output schema is acceptable for a resolving tool that returns a Uic.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description explains each parameter's role: symbol, expiry, strike, putCall as human-readable inputs for resolution, and exchangeId for disambiguation. Adds significant meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly describes it as a convenience helper that resolves an option leg Uic from human-readable parameters, distinguishing its role in compressing a 4-step workflow. References sibling tools saxo_place_order and saxo_place_multileg_order for context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States explicit usage before order placement tools and advises passing exchangeId to disambiguate when multiple option roots match. Lacks explicit 'when not to use' but provides sufficient context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_generate_option_strategy_candidatesGenerate Option Strategy CandidatesA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordsNo
optionRootIdNo
accountKeyNo
minDteNo
maxDteNo
strikeWindowPercentNo
putCallNo
limitExpiriesNo
limitStrikesPerExpiryNo
strategiesYes
maxCandidatesNo
riskBudgetNo
allowShortOptionLegsNo
restrictedShortCallSymbolsNo
requireGreeksNo
maxThetaDailyPercentOfRiskNo
minOpenInterestNo
maxSpreadPercentNo
includeVolatilityContextNo
externalContextNo
directionalBiasNo

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds valuable behavioral context beyond annotations: it confirms being read-only (consistent with annotations), details return contents, and explicitly lists omitted actions. This is sufficient given the strong annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, each front-loaded with core information: first sentence states purpose, second lists returns and exclusions. No wasted words, highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 21 parameters, nested objects, and no output schema, the description is far too high-level. It does not explain how to use required or key optional parameters, nor what the output structure looks like. Critical missing context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description provides no detail on the 21 parameters, and the schema has 0% description coverage. Parameters like 'accountKey', 'optionRootId', 'minDte', etc. are left unexplained, forcing reliance on names alone. The description must compensate but fails entirely.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool is a 'Read-only option candidate generator for explicit caller-provided strategies' and lists what it returns (structures, legs, pricing, Greeks, factor context). It distinguishes from siblings by explicitly stating what it does not do (choose playbook, precheck, place orders).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description specifies that strategies must be explicitly provided by the caller and that the tool does not select a playbook or execute orders, guiding usage. However, it lacks explicit references to alternative tools like saxo_precheck_order or saxo_place_order for when those actions are needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_get_balanceGet Account BalanceC
Read-onlyIdempotent

Fetch the cash + margin balance for an account.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountKeyNo
clientKeyNo

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate safe read-only operation (readOnlyHint, idempotentHint). The description adds detail about the type of balance (cash + margin), but no additional behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence is concise but overly minimal. It saves words at the expense of omitting parameter details and usage context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema and no parameter descriptions leave significant gaps. In a complex domain like trading, the description lacks essential context for correct tool invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description provides no explanation of the two parameters (accountKey, clientKey). The agent receives no clarity on which key corresponds to what, making parameter selection ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The title and description clearly state the tool fetches cash and margin balance for an account, distinguishing it from sibling tools like saxo_list_accounts or saxo_get_infoprice.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. The description does not mention prerequisites, when not to use, or refer to any sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_get_chartGet Chart (Historical OHLC)B
Read-onlyIdempotent

Fetch historical OHLC bars for an instrument. Horizon is in minutes (1, 5, 60, 1440 ...). Count defaults to Saxo default (max 1200).

ParametersJSON Schema
NameRequiredDescriptionDefault
uicYes
assetTypeYes
horizonYes
countNo
modeNo
timeNo
fieldGroupsNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds that it fetches historical data and mentions horizon details, but does not disclose other behaviors like default time zone, data format, or rate limits. With annotations covering safety, the description provides marginal extra context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no redundancy. Purpose is front-loaded, and additional detail is concise. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite good annotations and 7 parameters, the description omits critical context: no output format (e.g., what fields are in the OHLC bars), no explanation of mode/time, and no note about pagination or limit. The tool remains underspecified for an agent to reliably use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries full burden. It only explains two of seven parameters: 'Horizon is in minutes' and 'Count defaults to Saxo default (max 1200).' The required parameters uic and assetType, plus mode, time, and fieldGroups, are entirely unexplained, leaving the agent to infer meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Fetch historical OHLC bars for an instrument.' It uses a specific verb ('fetch') and resource ('historical OHLC bars'), and distinguishes this tool from the many sibling tools (e.g., get_infoprice, get_instrument_details) by focusing on chart data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. With 50+ sibling tools including many 'get' functions, explicit context (e.g., 'Use this for charting; use saxo_get_infoprice for single price points') is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_get_infopriceGet Snapshot PriceA
Read-onlyIdempotent

Fetch a snapshot bid/ask/last price for a single instrument. Snapshot only — no subscription side effects.

ParametersJSON Schema
NameRequiredDescriptionDefault
uicYes
assetTypeYes
accountKeyNo
amountNo
fieldGroupsNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, idempotent, non-destructive. Description adds 'no subscription side effects' which is valuable behavioral context beyond annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences that front-load the main action ('Fetch a snapshot...') and add a clarifying note. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given five parameters, no output schema, and no parameter descriptions, the description is too brief. It does not explain return values, parameter meanings, or any constraints (e.g., what fieldGroups does). Insufficient for an agent to use correctly without additional knowledge.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate but does not explain any of the five parameters (uic, assetType, accountKey, amount, fieldGroups). Parameter names are somewhat self-explanatory but not formally described, leaving ambiguity for the agent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Fetch a snapshot bid/ask/last price for a single instrument' and distinguishes from sibling 'saxo_get_infoprices_list' by noting it is for a single instrument. Also adds 'Snapshot only — no subscription side effects' to further clarify scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Snapshot only — no subscription side effects,' implying use for one-time price retrieval without starting a subscription. Differentiates from list version implicitly. However, no explicit when-not-to-use or comparison to other related tools like charting tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_get_infoprices_listGet Snapshot Prices (List)B
Read-onlyIdempotent

Fetch snapshot prices for multiple Uics in one call.

ParametersJSON Schema
NameRequiredDescriptionDefault
uicsYes
assetTypeYes
accountKeyNo
fieldGroupsNo

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnlyHint, non-destructive, idempotent) already indicate a safe read operation. The description adds that this fetches snapshot prices, aligning with annotations. No contradictions, and it hints at the batch capability, but additional details (e.g., caching behavior) are absent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that efficiently conveys the core purpose. However, it could be slightly more detailed about parameters without becoming verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema or return value description exists. The description does not clarify optional parameters like accountKey or fieldGroups, nor their impact on results. Given the tool's complexity (multiple Uics, asset types), the description is insufficient for complete understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, and the description does not explain any of the four parameters (uics, assetType, accountKey, fieldGroups). Without additional context, the agent cannot infer parameter meaning, which is critical for correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Fetch snapshot prices'), resource ('multiple Uics'), and batch nature ('in one call'). This distinguishes it from the sibling tool 'saxo_get_infoprice', which likely handles a single Uic.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for batch price retrieval but does not explicitly state when to use this tool versus alternatives like 'saxo_get_infoprice' or other data tools. No exclusions or prerequisites are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_get_instrument_detailsGet Instrument DetailsB
Read-onlyIdempotent

Fetch detailed metadata for one or more instruments by Uic + AssetType.

ParametersJSON Schema
NameRequiredDescriptionDefault
uicsYes
assetTypeYes
accountKeyNo
fieldGroupsNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds minimal additional behavioral context (e.g., it mentions 'metadata' but does not describe rate limits, authentication needs, or error handling). Since annotations cover the core safety profile, the description provides adequate but not enriched transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that front-loads the core functionality without any superfluous words. It efficiently communicates the essential action and key inputs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has four parameters (including optional ones) and no output schema, the description is too sparse. It fails to explain what fields the 'detailed metadata' includes, the role of 'accountKey' and 'fieldGroups', or how the tool differs from similar data-fetching siblings. The description is insufficient for a tool with this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must compensate but only explains 'Uic + AssetType'. It does not clarify the meaning of 'accountKey' or 'fieldGroups', which are optional parameters that could significantly affect the tool's behavior. This omission leaves the agent with incomplete understanding of the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Fetch'), the resource ('detailed metadata for instruments'), and the key parameters ('by Uic + AssetType'). It effectively distinguishes this tool from siblings like saxo_get_infoprice (which retrieves price data) by specifying metadata as the output.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as saxo_search_instruments or saxo_get_infoprice. The description does not mention that this tool is for metadata retrieval or that it requires precise identifiers, leaving the agent without clear context for tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_get_option_chainGet Option ChainA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionRootIdYes
expiryDatesNo
strikeCountNo
clientKeyNo
accountKeyNo
tradingNo
normalizeNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds value by explaining the normalize parameter's effect on output shape (one row per strike vs raw Saxo OptionSpace shape), which is beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loading the core purpose and then providing usage context and a parameter explanation. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While the core purpose and usage sequence are covered, the description lacks details on several parameters (expiryDates, strikeCount, clientKey, accountKey, trading) and has no output schema description. Given the tool's moderate complexity, more parameter documentation would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%. The description only explains the normalize parameter and implicitly mentions optionRootId. The other five parameters (expiryDates, strikeCount, clientKey, accountKey, trading) are not described, leaving significant gaps for the user.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Fetch the option chain (strikes + expirations) for an option root' using a specific verb and resource. It distinguishes the tool by explaining the normalize parameter's effect and its role in a sequence with sibling tools (saxo_search_instruments and multi-leg order placement).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool: 'Use this after saxo_search_instruments with assetTypes=[StockOption] to find the Uic of each option leg before placing a multi-leg spread.' This provides clear context and prerequisite, though it does not list when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_get_orderGet OrderB
Read-onlyIdempotent

Fetch a specific order by OrderId.

ParametersJSON Schema
NameRequiredDescriptionDefault
orderIdYes
clientKeyNo
fieldGroupsNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds no behavioral details beyond the verb 'Fetch', but it is consistent. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence with no wasted words. It is front-loaded with the key action and resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple fetch tool with annotations, the description is minimally adequate. However, it omits details on optional parameters (clientKey, fieldGroups) and expected behavior, such as what happens if the order is not found. Lacks completeness for a fully self-contained definition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning the description does not explain the parameters. Only OrderId is mentioned in the description, while clientKey and fieldGroups are not explained. The description adds minimal value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool fetches a specific order by OrderId. The verb 'Fetch' and resource 'specific order' are precise, and it distinguishes from sibling tools like saxo_list_orders which list multiple orders.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no guidance on when to use this tool versus alternatives, such as saxo_list_orders for listing orders or saxo_modify_order for modifying. Lacks context on prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_get_price_alertGet Price AlertA
Read-onlyIdempotent

Fetch one Saxo price alert definition by AlertDefinitionId.

ParametersJSON Schema
NameRequiredDescriptionDefault
alertDefinitionIdYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds no additional behavioral context beyond what's in structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with no wasted words, front-loaded with the verb 'Fetch', achieving maximum conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple fetch operation with one parameter and rich annotations, the description is adequate. However, it could mention what information is returned (e.g., the full definition object).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description only mentions the parameter name 'AlertDefinitionId' without adding meaning beyond the schema's type constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Fetch one Saxo price alert definition by AlertDefinitionId', which is a specific verb and resource, distinguishing it from listing tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like saxo_list_price_alerts, saxo_create_price_alert, or saxo_update_price_alert. Missing context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_get_price_alert_user_settingsGet Price Alert Notification SettingsA
Read-onlyIdempotent

Read the current user price-alert notification settings (email, popup, sound).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds value by specifying the exact settings returned (email, popup, sound), providing additional behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence containing only essential information. Every word contributes to understanding the tool's purpose and output.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters, rich annotations, and no output schema, the description adequately informs about the tool. It lists the types of settings returned, which is sufficient for understanding the tool's return value.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the input schema provides complete coverage. The description does not need to add parameter details; the baseline for 0 parameters is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Read') and the resource ('user price-alert notification settings'), with specific examples of settings (email, popup, sound). It distinguishes itself from the sibling tool saxo_update_price_alert_user_settings, which writes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies that this tool is for reading notification settings, and the sibling update tool is for modifying them. No explicit 'when not to use' or alternatives are given, but the context is clear given the sibling presence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_get_session_capabilitiesGet Saxo Session CapabilitiesA
Read-onlyIdempotent

Return current Saxo session capabilities, including TradeLevel and DataLevel, without running diagnostics.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint and idempotentHint. The description adds behavioral nuance: it returns specific fields (TradeLevel, DataLevel) and explicitly states no diagnostics are run, which is valuable beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is front-loaded with the core purpose and includes key details without superfluous words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, no output schema, and a simple purpose, the description fully covers what the tool does and does not, with no missing context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so baseline is 4. The description does not need to add parameter info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Return' and resource 'current Saxo session capabilities', explicitly listing TradeLevel and DataLevel. It distinguishes from sibling tools like saxo_diagnostics by stating it does not run diagnostics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for retrieving capabilities without diagnostics, but does not explicitly state when to use this vs saxo_capabilities or other session tools. However, the contrast with diagnostics provides clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_list_accountsList AccountsB
Read-onlyIdempotent

List the authenticated client's trading accounts.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientKeyNo
includeSubAccountsNo

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description adds no behavioral context beyond restating the obvious. It does not explain error handling, authentication requirements, or effects of parameters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no wasted words. However, it could be slightly expanded to cover parameters without losing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and undocumented parameters, the description is inadequate. The agent lacks information about return values and parameter semantics, making the tool harder to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description provides no explanation for the two parameters (clientKey and includeSubAccounts). The agent has no guidance on what values to provide or their effects.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (list) and the resource (trading accounts) for the authenticated client. It distinguishes itself from sibling tools like saxo_list_orders or saxo_list_positions, which list different entities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly indicates when to use (when needing account list) but provides no explicit guidance on when not to use or alternatives. No prerequisites or context are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_list_activitiesList Account ActivitiesA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientKeyNo
accountKeyNo
fromDateTimeNo
toDateTimeNo
activityTypesNo
topNo
skipNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true, making the behavioral profile clear. The description adds server-side default window context but does not introduce any contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, tightly packed with purpose, example activities, parameter guidance, and a use-case hook. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and 0% parameter coverage, the description fails to explain many required aspects: pagination (top, skip), filtering (activityTypes), account scoping (clientKey, accountKey). For a list tool, this is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must compensate. It only explains fromDateTime and toDateTime (ISO 8601, defaults), leaving clientKey, accountKey, activityTypes, top, skip undocumented. This is insufficient for correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists recent account events, gives specific examples (orders, trades, dividends, corporate actions), and references the underlying API endpoint. It effectively distinguishes itself from other list tools among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises when to pass fromDateTime/toDateTime and suggests a use case ('what happened on my account today?'). It provides clear context, though it does not explicitly exclude other scenarios or mention alternatives among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_list_closed_positionsList Closed PositionsC
Read-onlyIdempotent

List closed positions / trade history.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientKeyNo
accountKeyNo
fromDateNo
toDateNo
topNo
skipNo

TDQS

C2.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true, indicating a safe, idempotent read operation. The description adds no additional behavioral context, but does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, consisting of one sentence. While efficient, it lacks important details that could be included without harming conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 6 parameters and no output schema, the description fails to provide sufficient context about date ranges, pagination (top/skip), or the return format. It is insufficient for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage and 6 parameters, the description provides no explanation of what parameters like clientKey, accountKey, fromDate, toDate, top, or skip mean. This is a significant gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List closed positions / trade history,' which is a specific verb and resource. It distinguishes well from siblings like saxo_list_positions and saxo_list_net_positions, but could be more precise about the scope of 'trade history.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as saxo_list_positions or saxo_list_net_positions. The description lacks context on prerequisites or filtering criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_list_exchangesList ExchangesB
Read-onlyIdempotent

List Saxo-supported exchanges, or fetch one by ExchangeId.

ParametersJSON Schema
NameRequiredDescriptionDefault
exchangeIdNo
topNo
skipNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, non-destructive, idempotent, and open-world behavior. The description adds the ability to fetch by ID but does not disclose pagination behavior or response details, which would add value beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that conveys both listing and single-fetch functionality without any unnecessary words. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no output schema and zero schema parameter descriptions. The description does not explain return format, pagination behavior, or how to construct an ExchangeId. This is incomplete given the lack of supporting documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description should explain parameter meanings. It only mentions 'ExchangeId' but ignores 'top' and 'skip' parameters, which are common pagination but undocumented. The description adds little beyond the schema structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all Saxo-supported exchanges or fetches one by ExchangeId. This specific verb+resource combination distinguishes it from sibling tools like saxo_list_accounts or saxo_list_orders.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives, such as other list tools or get_instrument_details. The description does not mention exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_list_net_positionsList Net Positions (Aggregated)A
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientKeyNo
accountKeyNo
fieldGroupsNo
topNo
skipNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true. The description adds context about aggregation and net amounts, which is beyond annotations and clarifies the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with key information, and contains no fluff. Every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While the description covers the high-level purpose, the lack of parameter explanations and no output schema make it incomplete. The agent cannot know what values to provide for clientKey, accountKey, etc.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% (no parameter descriptions in schema). The description does not mention any of the 5 parameters (clientKey, accountKey, fieldGroups, top, skip), leaving them unexplained. This is a critical gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists positions aggregated per instrument (one row per Uic with net amount) rather than per individual fill, distinguishing it from sibling tools like saxo_list_positions. It also provides the use case: 'what is my current exposure?'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says 'Right view for what is my current exposure? — no manual deduplication needed,' which implies when to use it. It contrasts with per-fill views but does not explicitly state when not to use it or list alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_list_option_expiriesList Option ExpiriesB
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionRootIdYes
clientKeyNo
accountKeyNo
tradingNo

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds minimal behavioral context beyond annotations, only calling it a 'cheap helper.' Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint, so the description does not significantly enhance transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences, front-loading the purpose. It efficiently conveys the tool's role but lacks structured parameter documentation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description partially compensates for the missing output schema by listing returned fields. However, parameter semantics are absent, and no guidance on required vs optional parameters is given, leaving gaps for a tool with 4 parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description fails to explain any of the 4 parameters (optionRootId, clientKey, accountKey, trading) even though schema description coverage is 0%. The term 'option root' is mentioned but not mapped to the parameter, leaving all parameters undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns available expiries for an option root, listing specific fields. It distinguishes from sibling tools like saxo_get_option_chain by noting it's a 'cheap helper' for picking an expiry before pulling the full chain.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises using this tool before pulling the full chain, providing usage context. However, it does not explicitly mention when not to use it or compare to alternatives like saxo_list_standard_option_expiries, leaving some ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_list_ordersList OrdersB
Read-onlyIdempotent

List working orders for the authenticated client or a specific account.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientKeyNo
accountKeyNo
statusNo
fieldGroupsNo
topNo
skipNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds that it lists 'working orders' by default, but omits details on pagination (top, skip) and the effect of the status parameter. Behavioral disclosure is adequate but not complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single-sentence description is concise and front-loaded. However, it sacrifices necessary detail for brevity, making it slightly too terse given the six parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite six parameters and no output schema, the description only covers the basic purpose. Missing information on pagination, field filtering, status options, and return format makes it inadequate for an agent to use the tool correctly without external knowledge.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description provides minimal parameter guidance. It implicitly references clientKey and accountKey but does not explain status, fieldGroups, top, or skip. The parameter names are self-descriptive only to a limited extent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and resource 'working orders', and specifies scope: 'for the authenticated client or a specific account.' This distinguishes it from related tools like saxo_get_order (single order) and saxo_cancel_order (mutation).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to choose this tool over siblings such as saxo_get_order, saxo_list_closed_positions, or saxo_list_net_positions. The description does not mention alternatives or exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_list_positionsList Open PositionsA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientKeyNo
accountKeyNo
fieldGroupsNo
topNo
skipNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey readOnlyHint, destructiveHint, idempotentHint, openWorldHint. Description adds specific behavioral detail: returns one row per position, multiple rows for same instrument if filled at different prices. No mention of authentication needs, rate limits, or other behaviors, but annotations cover safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first states purpose and behavior, second gives clear sibling alternative. No filler, front-loaded with essential info.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers core purpose, return format, and differentiator. However, lacks details on pagination parameters (top, skip) and field filtering (fieldGroups), which are common for list tools. Given moderate complexity and no output schema, description is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 5 parameters with 0% description coverage. Description only hints that clientKey and accountKey are for specifying account, but provides no details on fieldGroups, top, skip. For 5 parameters with no schema descriptions, the description should add more meaning; it falls short.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb 'List' with specific resource 'open positions' and scope 'for authenticated client or specific account'. Distinguishes from sibling saxo_list_net_positions by noting that this tool returns one row per position (multiple rows per instrument if different fill prices), while sibling provides aggregated per-instrument view.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly mentions alternative tool saxo_list_net_positions for aggregated view, guiding when to use which. However, does not include any other usage scenarios or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_list_price_alertsList Price AlertsB
Read-onlyIdempotent

List Saxo price alert definitions for the current user, optionally filtered by state.

ParametersJSON Schema
NameRequiredDescriptionDefault
inlinecountNo
skipNo
topNo
stateNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey read-only, non-destructive, idempotent, and open-world hints. The description adds user scope and optional state filtering but does not explain pagination behavior or inlinecount parameter. Some value added beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence, making it concise. However, it lacks essential detail about parameters, so it is under-specified for a tool with no schema descriptions. Conciseness came at the expense of completeness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and 0% schema description coverage, the description is insufficiently complete. It does not explain what the list returns, pagination details, or the meaning of filter values beyond the word 'state'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must add parameter meaning. It only mentions 'optionally filtered by state' but does not describe state values, pagination parameters (skip, top), or inlinecount. Agent must infer from parameter names alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action 'List', the resource 'Saxo price alert definitions', and scope 'for the current user, optionally filtered by state'. This distinguishes it from siblings like get_price_alert (single item) and create/update/delete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives (e.g., saxo_get_price_alert for a specific alert). The description implies usage for listing alerts but does not provide context on pagination or when to use filter/state.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_list_standard_option_expiriesList Standard Option Expiry DatesA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fromDateNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds context about returning a calendar from reference data, confirming read-only behavior, but does not introduce new behavioral details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences: first states purpose, second gives a usage example, third provides alternative. It is front-loaded and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with one optional parameter and no output schema. Annotations cover behavioral aspects well. However, the description omits explanation of the 'fromDate' parameter and does not describe the return format, leaving minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has a single optional parameter 'fromDate' with a pattern for date format, but the description does not explain its purpose or effect. Schema coverage is 0%, and the description fails to compensate for this gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns the standardized option-expiry calendar, listing 3rd Friday monthlies, quarterlies, and weeklies. It also distinguishes itself from the sibling tool 'saxo_list_option_expiries' which handles per-option-root expiries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides a use case ('is 2027-01-15 a standard monthly?' reasoning) and directly names the alternative sibling tool for per-option-root expiries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_modify_multileg_orderModify Multi-Leg Option OrderA
Destructive

Modify a working multi-leg order. Only Amount (scaled symmetrically across legs) and OrderPrice can be changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
AccountKeyYes
MultiLegOrderIdYes
AmountNo
OrderPriceNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark destructiveHint=true. The description adds that only specific fields can be changed, providing behavioral context beyond annotations. However, it does not disclose potential side effects or prerequisites.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no redundant information. The first sentence states the purpose, the second adds constraints. Every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for a simple modification tool, but lacks details about preconditions (e.g., order must be working), error cases, or return behavior. Given the complexity of multi-leg orders, more context would help.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds meaning by explaining that Amount is scaled symmetrically across legs. However, it does not explain AccountKey or MultiLegOrderId, so not all parameters benefit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool modifies a working multi-leg order and specifies which fields can be changed, distinguishing it from sibling tools like saxo_modify_order (single-leg) and saxo_cancel_multileg_order (cancel).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description limits modifications to Amount and OrderPrice, implying when to use this tool vs alternatives for other changes, but does not explicitly state when not to use it or provide alternative tool names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_modify_orderModify OrderB
Destructive

Modify a working order (amount, price, duration). Same LIVE guards as saxo_place_order.

ParametersJSON Schema
NameRequiredDescriptionDefault
OrderIdYes
AccountKeyYes
UicYes
AssetTypeYes
AmountNo
OrderTypeNo
OrderPriceNo
StopPriceNo
OrderDurationNo

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint=true and readOnlyHint=false. The description adds minimal behavioral context beyond hinting at LIVE guards, which are not defined. It does not explain order state changes, side effects, or permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise at two sentences but uses the jargon 'LIVE guards' without explanation, which may reduce clarity. It is front-loaded with the core action, earning its place with minimal waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (9 parameters, nested objects, no output schema), the description is severely incomplete. It does not cover required vs optional fields, return values, error scenarios, or detailed behavior, leaving the agent with insufficient context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, but it only lists three parameter categories (amount, price, duration) without explaining their roles or formatting. Many parameters like AccountKey, Uic, AssetType, OrderType are not mentioned, leaving their semantics unclear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it modifies a working order and lists the modifiable fields (amount, price, duration). It distinguishes from place_order (new order) and cancel_order, though it could explicitly differentiate from modify_multileg_order. Overall, the verb+resource combination is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions 'Same LIVE guards as saxo_place_order,' implying there are constraints but doesn't explain what they are or when to use this tool versus alternatives like modify_multileg_order. No explicit when-not or alternative guidance is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_oauth_cancelCancel Saxo OAuth LoginA
Destructive

Cancel a pending OAuth login flow (closes the callback listener).

ParametersJSON Schema
NameRequiredDescriptionDefault
ticketIdYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint=true. The description adds the specific behavioral detail of closing the callback listener, and there is no contradiction. The description adds value beyond annotations without redundancy.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with the key verb first. No redundant or extraneous information; it earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (cancel with one param) and the description covers the core behavior. The destructiveHint annotation covers risk, but there is no mention of side effects, reversibility, or return value. Still, it is largely complete for the task.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the parameter 'ticketId' is undocumented in the description. The name suggests it identifies a ticket, but the description does not explain its format, origin, or how to obtain it. This leaves the agent with insufficient context to properly fill it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (cancel) and the target (pending OAuth login flow) with the parenthetical detail about closing the callback listener. It effectively distinguishes from sibling tools like saxo_oauth_start and saxo_oauth_complete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when an OAuth login flow is pending, but does not explicitly state when to use versus alternatives (e.g., waiting for completion) or any prerequisites. No explicit when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_oauth_completeComplete Saxo OAuth LoginA
Destructive

Wait for the Saxo callback, exchange the code for tokens, and update the running MCP server. Optionally writes tokens to a .env file.

ParametersJSON Schema
NameRequiredDescriptionDefault
ticketIdYes
timeoutSecondsNo
writeToEnvFileNo
envFilePathNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true, and the description mentions updating the server and optionally writing to .env file, which aligns with destructive behavior. However, it does not elaborate on what exactly gets destroyed or whether changes are reversible. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that efficiently covers the core action and optional behavior. It is front-loaded with the main purpose. However, it could be slightly more structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and moderate complexity (4 parameters), the description is brief. It covers the main steps but omits details on success/failure behavior, return values, or error handling. It is adequate but not comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must explain parameters. It hints at writeToEnvFile and envFilePath via 'optionally writes tokens to a .env file', but does not explain ticketId or timeoutSeconds. Parameter semantics are insufficiently clarified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: waiting for callback, exchanging code for tokens, updating the MCP server, and optionally writing to .env file. It uses specific verbs and resources, and distinguishes from sibling OAuth tools like saxo_oauth_start and saxo_oauth_login.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage during OAuth login flow but does not explicitly state when to use vs alternatives or mention prerequisites like a pending auth request. No when-not-to guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_oauth_loginRun Saxo OAuth LoginA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
environmentNo
timeoutSecondsNo
openBrowserNo
writeToEnvFileNo
envFilePathNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations include destructiveHint: true. The description adds context: it starts a loopback listener, exchanges tokens, updates the running MCP server, and optionally writes to an env file, which goes beyond the annotations and explains the side effects (server state change, possible file persistence). No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense sentence that efficiently lists the sub-steps. It is front-loaded with the main purpose. Could be split for readability, but no extraneous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 5 optional parameters and no output schema, the description covers the essential login flow and optional behaviors. It is complete enough for an agent to understand the tool's purpose and side effects. Lacks explicit mention of sibling tools for alternative flows, but that is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% (no descriptions in schema). The description mentions 'optionally opens the browser' (openBrowser) and 'optionally persists tokens to an env file' (writeToEnvFile/envFilePath), but does not explain environment or timeoutSeconds. This adds some value but fails to cover all parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it runs the full Saxo OAuth2 + PKCE login in one call, listing the steps: starts listener, opens browser, waits, exchanges tokens, updates server, and optionally persists. This distinguishes it from sibling oauth tools (saxo_oauth_start, saxo_oauth_complete, saxo_oauth_cancel) by being the comprehensive version.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this is the high-level login tool, but does not explicitly state when to use it versus the separate oauth steps. It lacks when-not or alternative guidance, though the verb 'Run the full login' suggests it replaces manual multi-step process.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_oauth_startStart Saxo OAuth LoginA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
environmentNo
openBrowserNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true and readOnlyHint=false, which the description supports by stating it begins a login (a state-changing operation). The description adds context about environment variable requirements, return values, and optional browser opening, providing value beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, with the first stating the core purpose, the second listing prerequisites, and the third explaining output and next step. No extraneous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description adequately covers the tool's role as the first step in OAuth login, including required environment variables, returned data (ticketId, authorizeUrl), and the subsequent step (saxo_oauth_complete). No output schema is needed for this level of detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning parameter descriptions are absent from the schema. The description only indirectly references the 'openBrowser' parameter ('optionally opening it in the browser') and does not explain the 'environment' parameter (sim vs live). It fails to add sufficient meaning for both parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it begins a Saxo OAuth2 + PKCE login, with specific verb 'Begin' and resource 'Saxo OAuth Login'. It differentiates from sibling tools by mentioning the returned ticketId and the next step to call saxo_oauth_complete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description specifies prerequisites (SAXO_APP_KEY and SAXO_APP_SECRET in environment) and instructs to follow with saxo_oauth_complete. It does not explicitly state when not to use it, but provides clear context for its intended use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_place_multileg_orderPlace Multi-Leg Option OrderA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
AccountKeyYes
OrderTypeYes
OrderPriceNo
OrderDurationYes
LegsYes
ManualOrderNo
ExternalReferenceNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavioral context beyond annotations: atomicity, limit-only, price direction inference, leg root constraint, and return value (IDs). No contradiction with readOnlyHint false and destructiveHint true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose, zero wasted words. Each sentence adds essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Explains atomicity, constraints, and return value. But with no output schema, it would benefit from mentioning that OrderDuration types are available (not described here). Still, for a complex tool, covers most essential aspects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, description adds meaning to OrderPrice (positive, absolute), OrderType (must be Limit), Legs (same root). But AccountKey, OrderDuration, ManualOrder, ExternalReference get no extra semantics. Still compensates for key parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool places multi-leg option orders as atomic transactions with a single limit price, distinguishing it from siblings like saxo_place_order (likely single-leg) and saxo_precheck_multileg_order (precheck only).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides constraints (Limit only, price positive, same root) that guide when to use, but doesn't explicitly state when not to use or name alternatives. Sufficient for knowledgeable user.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_place_orderPlace OrderA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
AccountKeyYes
UicYes
AssetTypeYes
BuySellYes
AmountYes
ToOpenCloseNo
OrderTypeYes
OrderDurationYes
OrderPriceNo
StopPriceNo
ManualOrderNo
ExternalReferenceNo
OrdersNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark destructiveHint=true. The description adds value by revealing that orders default to SIM and that LIVE requires environment variables and policy, including potential caps. This goes beyond annotations, though more details about side effects (e.g., risk checks) could be added.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences: first states purpose, second and third provide critical constraints. No unnecessary words; front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite complex schema (13 params, nested objects, required fields), the description lacks explanation of multi-leg ordering (though that's a sibling), order duration structure, or output expectations. The agent would need more context to use this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should compensate. It only mentions policy caps on Amount/AssetType/AccountKey/Uic/notional, which gives high-level constraints but does not explain each parameter's meaning or usage. For 13 parameters, this is insufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Place a new Saxo order' which is a specific verb + resource. It distinguishes from siblings like cancel/modify/multileg orders by focusing on single order placement. Adding the default SIM vs LIVE context further clarifies scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions default SIM and LIVE requirements, providing some context. However, it does not explicitly guide when to use this tool vs siblings like saxo_place_multileg_order or saxo_precheck_order, leaving the agent to infer from names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_precheck_multileg_orderPrecheck Multi-Leg Option OrderA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
AccountKeyYes
OrderTypeYes
OrderPriceNo
OrderDurationYes
LegsYes
ManualOrderNo
ExternalReferenceNo

TDQS

A3.9/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description claims validation without placing, but annotations indicate destructiveHint=true and readOnlyHint=false, implying state modification. This contradicts the description, creating significant confusion about the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (3-4 sentences) and front-loads the core purpose. Every sentence adds value, with no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multi-leg options, 7 params), the description covers key constraints but omits explanation of OrderDuration enums and the meaning of ManualOrder/ExternalReference. The annotation contradiction also undermines completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds essential meaning: OrderPrice is always positive and absolute, OrderType must be Limit, and legs require same option root. It compensates well for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool validates multi-leg option strategies without placing them, and lists specific strategy examples (vertical, calendar, condor, straddle), distinguishing it from other order tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states OrderType must be Limit, OrderPrice must be positive, explains debit vs credit inference, and mandates that all legs share the same option root, guiding correct usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_precheck_orderPrecheck OrderC
Destructive

Validate an order against Saxo (margin, prices, instrument rules) without placing it. Runs through the policy + audit even though no execution happens.

ParametersJSON Schema
NameRequiredDescriptionDefault
AccountKeyYes
UicYes
AssetTypeYes
BuySellYes
AmountYes
ToOpenCloseNo
OrderTypeYes
OrderDurationYes
OrderPriceNo
StopPriceNo
ManualOrderNo
ExternalReferenceNo
OrdersNo

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds context about policy and audit runs, but the destructiveHint annotation contradicts the 'no execution' claim. Annotations already declare readOnlyHint=false and destructiveHint=true, creating ambiguity about side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with front-loaded purpose, but lacks essential details about parameters and behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (13 parameters, nested objects, no output schema), the description is severely incomplete, omitting input formats, return values, error handling, and success criteria.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage and 13 parameters, the description provides no explanation for any parameter, leaving the agent to infer meanings from names alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool validates an order against Saxo (margin, prices, instrument rules) without placing it, distinguishing it from order placement tools among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives like saxo_place_order or saxo_precheck_multileg_order, nor does it provide exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_review_strategy_positionsReview Strategy PositionsA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountKeyNo
clientKeyNo
strategySnapshotPathNo
reviewDepthNostatus
includeTechnicalContextNo
includeNewsContextNo
includeFundamentalsContextNo
includeLiquidityContextNo
newsProviderNoauto
newsLookbackDaysNo
newsLimitNo
earningsHorizonNo3month
technicalHorizonNo
technicalBarsNo
defaultRulesNo
strategyPositionsNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true. The description adds context by specifying it refreshes quotes, adds Greeks/DTE, evaluates P/L, and applies rules, and reaffirms no order placement. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a concise three-sentence paragraph, front-loaded with the core purpose. Every sentence adds value without redundancy or unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (16 parameters, nested objects, no output schema), the description is too high-level. It lacks guidance on how to populate parameters, what the return value looks like, or how the 'decision support' is structured. The description is insufficient for an agent to use this tool properly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. However, it provides no explanation of parameters like accountKey, clientKey, strategySnapshotPath, reviewDepth, or the complex strategyPositions array. With 16 parameters and nested objects, this is a significant gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is a 'read-only follow-up review for executed stock and option strategies' and lists specific actions (matches legs, refreshes quotes, adds Greeks/DTE, evaluates P/L, trim/close/roll rules, returns decision support). It explicitly says what it does not do ('Does not precheck or place orders'), distinguishing it from order-related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use after executing a strategy and clarifies it is not for prechecking or placing orders. However, it does not explicitly compare to sibling tools like saxo_list_positions or saxo_precheck_order, leaving some ambiguity about exact context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_screen_marketScreen MarketA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
presetYes
marketNous
exchangeIdsNo
assetTypeNoStock
limitNo
maxInstrumentsNo
accountKeyNo
includeNonTradableNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint; the description adds that output depends on market-data permissions and delay settings, providing valuable context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose, no wasted words. Perfectly concise for the content it delivers.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 8 parameters and no output schema, the description is too brief. It lacks details on return structure, pagination, or how parameters like exchangeIds and assetType affect results, making it incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds minimal parameter help. It lists the preset options (already in enum) but does not explain market, exchangeIds, assetType, or other parameters, leaving agents to rely solely on schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose as a read-only market screener for specific presets (top gainers, losers, pre-market). It distinguishes from sibling screen tools like saxo_screen_stock_factors by focusing on market-wide presets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains dependencies (Saxo instruments, InfoPrices) and limitations (permissions, delays). It does not explicitly compare to alternatives but the context is strong enough for agents to infer appropriate use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_screen_option_strategy_factorsScreen Option Strategy FactorsA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountKeyNo
marketNous
symbolsNo
underlyingUniverseNoauto
underlyingPresetNo
strategiesYes
minDteNo
maxDteNo
maxUnderlyingsNo
maxUnderlyingScanNo
maxSymbolsToPlanNo
maxPlansNo
riskBudgetNo
allowShortOptionLegsNo
restrictedShortCallSymbolsNo
requireGreeksNo
maxThetaDailyPercentOfRiskNo
includeAccountContextNo
riskBudgetPercentNo
maxPortfolioRiskPercentNo
maxSymbolExposurePercentNo
allowExistingExposureIncreaseNo
minOpenInterestNo
maxSpreadPercentNo
includeTechnicalContextNo
includeVolatilityContextNo
includeNewsContextNo
newsProviderNoauto
newsLookbackDaysNo
newsLimitNo
earningsHorizonNo3month
technicalHorizonNo
technicalBarsNo
externalContextBySymbolNo

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description fully aligns with annotations (readOnlyHint, idempotentHint) and adds valuable detail about returned data (candidate structures, liquidity, chart, IV/Greeks, optional news, sizing context). It explicitly states 'without verdicts or confidence labels,' which is critical behavioral info beyond annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with two clauses, making it concise and front-loaded with the core purpose. It avoids fluff but could be more structured with separate sentences for returns and constraints. Still, it earns its place without waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (34 parameters, nested objects, no output schema), the description is insufficient. It lists what is returned but lacks detail on the structure of candidates, chart, IV/Greeks, or sizing. The absence of output schema and low schema coverage make the description the primary source, which falls short.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 34 parameters and 0% schema description coverage, the description provides almost no parameter semantics. It only hints at 'symbols or Saxo market movers,' which vaguely references the symbols and underlyingUniverse parameters. The extensive parameter list with enums, min/max constraints, and nested objects demands more explanation than given.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is a read-only factor screener for explicit option strategies, distinguishing it from sibling tools like saxo_generate_option_strategy_candidates and saxo_screen_stock_factors. It specifies the scope (across symbols or Saxo market movers) and what it returns (candidate structures, liquidity, etc.), making the purpose highly specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for exploratory screening without verdicts, and the read-only annotation reinforces that. It differentiates from siblings by focusing on factors rather than generation or stock screening. However, it lacks explicit when-not-to-use instructions or alternatives, leaving some ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_screen_stock_factorsScreen Stock FactorsA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountKeyNo
marketNous
symbolsNo
excludeSymbolsNo
universeNoauto
objectiveNobalanced
riskProfileNobalanced
maxResultsNo
maxCandidatesNo
maxTechnicalCandidatesNo
includeAccountContextNo
riskBudgetPercentPerIdeaNo
maxSingleNamePercentNo
allowExistingExposureIncreaseNo
includeTechnicalContextNo
includeFundamentalContextNo
fundamentalProviderNoauto
fundamentalsLimitNo
includeNewsContextNo
newsProviderNoauto
newsLookbackDaysNo
newsLimitNo
technicalHorizonNo
technicalBarsNo
externalContextBySymbolNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description adds context beyond annotations by specifying read-only nature, return of factors and warnings, and no verdicts/confidence labels. Annotations already declare readOnlyHint=true, but description enriches behavior. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, 150 characters, front-loads key information. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 25 parameters and no output schema, the description is too sparse. It does not explain return format, error handling, or how to use the many parameters beyond high-level intent. Agent would lack critical context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for 25 parameters. Description only vaguely hints at parameters (e.g., 'optional account sizing' maps to includeAccountContext, 'Alpha Vantage fundamentals/news' maps to fundamentalProvider/NewsProvider) but does not explain most parameters or their semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it's a read-only stock factor screener with Saxo quotes, chart context, optional account sizing, and optional Alpha Vantage fundamentals/news. It distinguishes from siblings like saxo_screen_market (market screener) and saxo_screen_option_strategy_factors (options screener) by focusing on stock factors and specifying no verdicts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage for screening stock factors with optional data sources, but does not explicitly state when to use this tool vs alternatives (e.g., saxo_screen_market) or provide when-not scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_search_instrumentsSearch InstrumentsA
Read-onlyIdempotent

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordsNo
assetTypesNo
exchangeIdsNo
accountKeyNo
includeNonTradableNo
topNo
skipNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, etc. The description adds context about the output format and downstream chaining. It does not contradict annotations. However, it does not disclose rate limits or data freshness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, no filler. First sentence states the core purpose, second describes output and usage. Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 7 parameters, many siblings, and no output schema, the description provides only the essentials. It fails to explain optional filters (exchangeIds, accountKey, etc.) or pagination behavior. Adequate for basic use but incomplete for complex queries.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%. The description only mentions keywords and assetTypes, while there are 5 other parameters (exchangeIds, accountKey, includeNonTradable, top, skip) left undocumented. This is insufficient compensation for low coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Search'), the resource ('Saxo reference data for instruments'), and key search criteria ('by keyword and asset type'). It also specifies the output ('Uic and AssetType') and their downstream use, distinguishing it from sibling tools like saxo_get_instrument_details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied from the name and description but no explicit guidance on when to use this tool versus alternatives (e.g., saxo_get_instrument_details). No 'use this when' or 'do not use when' statements.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_session_meGet Saxo SessionA
Read-onlyIdempotent

Return the current Saxo session (ClientKey, UserKey, default account, culture). Useful to verify the access token works.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds value by listing the specific fields returned and the practical use case (token verification), which goes beyond annotation information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two succinct sentences: the first states the function and output, the second provides a practical use case. No redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters and no output schema, the description fully covers what the tool returns (key fields) and when to use it (token verification). No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters (100% coverage trivially), so the description does not need to explain parameters. Baseline score 4 applies as there is nothing to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Return' and the resource 'current Saxo session', listing specific fields (ClientKey, UserKey, default account, culture). It distinguishes this tool from siblings, which focus on orders, positions, or capabilities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly mentions the tool is 'useful to verify the access token works', providing clear context for when to use it. It does not exclude other scenarios or list alternatives, but the context is sufficient for this simple read operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_set_session_trade_levelSet Saxo Session TradeLevelA
Destructive

Set session TradeLevel to FullTradingAndChat or OrdersOnly and return the confirmed session capabilities. LIVE requires policy.allow_live_session_capability_writes=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
tradeLevelYes
confirmTimeoutMsNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the tool modifies the session trade level and returns confirmed capabilities. It adds value beyond annotations by noting the policy requirement for LIVE, which supplements the destructiveHint annotation. No contradiction is present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two concise sentences with no extraneous information. The first sentence covers purpose and return, and the second adds a critical usage condition. This is appropriately front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema, the description mentions the return of 'confirmed session capabilities', which is sufficient for understanding the tool's output. It also covers the key policy constraint. However, it could be slightly more detailed about the effects or return structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description should explain the parameters. It only implicitly mentions the two enum values for 'tradeLevel' but does not describe 'confirmTimeoutMs' (integer, default 10000ms). This is insufficient for an agent to understand the parameters without schema help.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Set', the resource 'session TradeLevel', and the two possible values 'FullTradingAndChat' or 'OrdersOnly'. It also mentions the return of confirmed session capabilities, which distinguishes it from sibling tools like 'saxo_get_session_capabilities'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a crucial usage condition for LIVE environments requiring a specific policy, which provides clear context. However, it does not explicitly mention when not to use this tool or suggest alternatives like the read-only 'saxo_get_session_capabilities'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_update_price_alertUpdate Price AlertA
Destructive

Update an existing Saxo price alert definition. Partial input is merged with the current alert before PUT because Saxo expects the full definition body.

ParametersJSON Schema
NameRequiredDescriptionDefault
AccountIdNo
UicNo
AssetTypeNo
TargetValueNo
OperatorNo
PriceVariableNoTraded
ExpiryDateNo
IsRecurringNo
IsExtendedHoursNo
StateNoEnabled
CommentNo
AlertDefinitionIdYes

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructive hint; the description adds the key behavioral detail that partial input is merged before sending the full definition, which is beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences front-load the purpose and the critical merge detail. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (12 params, no output schema, no param descriptions), the description is insufficient. It lacks basic context on required fields beyond AlertDefinitionId and does not cover return value or constraints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fails to explain the 12 parameters individually. It only hints at merge behavior, leaving parameter semantics to inference from names and schema enums.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'update' and resource 'Saxo price alert definition', and distinguishes it from create/delete/get/list siblings by specifying 'existing' and the merge behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the partial merge behavior before PUT, guiding the agent on how to use the tool (supply partial input). However, it does not explicitly contrast with alternatives like creating a new alert.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

saxo_update_price_alert_user_settingsUpdate Price Alert Notification SettingsB
Destructive

Update the current user price-alert notification settings. Partial input is merged with current settings before PUT.

ParametersJSON Schema
NameRequiredDescriptionDefault
EmailAddressNo
NotifyWithMailNo
NotifyWithPopupNo
SoundNo

TDQS

B3.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true, which is consistent with 'Update'. The description adds value by explaining the merge behavior, which is not captured by annotations. This provides useful context for how the tool modifies settings.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise, with two sentences. The first sentence states the purpose, and the second adds the critical merge behavior. No unnecessary information is included.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 4 parameters all require semantic explanation and the output schema is absent, the description is significantly incomplete. It does not explain return values, prerequisites, or permissions. The merge behavior is helpful but insufficient for full context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the tool description provides no additional information about the parameters (e.g., EmailAddress, NotifyWithMail, NotifyWithPopup, Sound). The lack of parameter semantics makes it difficult for an agent to use the tool correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Update the current user price-alert notification settings', specifying the verb and resource. It adds the merge behavior, but does not explicitly distinguish from sibling tools like saxo_get_price_alert_user_settings or saxo_update_price_alert, though contextually it is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the merge behavior ('Partial input is merged with current settings before PUT'), which implies usage for partial updates. However, it does not specify when to use this tool versus alternatives, nor does it provide exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 51 tool updatesv0.2.2
    • First observedsaxo_analyze_portfolio_context
    • First observedsaxo_cancel_multileg_order
    • First observedsaxo_cancel_order
    • First observedsaxo_capabilities
    • First observedsaxo_compute_spread_quote
    • First observedsaxo_create_price_alert
    • First observedsaxo_delete_price_alerts
    • First observedsaxo_diagnostics
    • First observedsaxo_estimate_vertical_spread
    • First observedsaxo_feature_availability
    • First observedsaxo_find_option_leg
    • First observedsaxo_generate_option_strategy_candidates
    • First observedsaxo_get_balance
    • First observedsaxo_get_chart
    • First observedsaxo_get_infoprice
    • First observedsaxo_get_infoprices_list
    • First observedsaxo_get_instrument_details
    • First observedsaxo_get_option_chain
    • First observedsaxo_get_order
    • First observedsaxo_get_price_alert
    • First observedsaxo_get_price_alert_user_settings
    • First observedsaxo_get_session_capabilities
    • First observedsaxo_list_accounts
    • First observedsaxo_list_activities
    • First observedsaxo_list_closed_positions
    • First observedsaxo_list_exchanges
    • First observedsaxo_list_net_positions
    • First observedsaxo_list_option_expiries
    • First observedsaxo_list_orders
    • First observedsaxo_list_positions
    • First observedsaxo_list_price_alerts
    • First observedsaxo_list_standard_option_expiries
    • First observedsaxo_modify_multileg_order
    • First observedsaxo_modify_order
    • First observedsaxo_oauth_cancel
    • First observedsaxo_oauth_complete
    • First observedsaxo_oauth_login
    • First observedsaxo_oauth_start
    • First observedsaxo_place_multileg_order
    • First observedsaxo_place_order
    • First observedsaxo_precheck_multileg_order
    • First observedsaxo_precheck_order
    • First observedsaxo_review_strategy_positions
    • First observedsaxo_screen_market
    • First observedsaxo_screen_option_strategy_factors
    • First observedsaxo_screen_stock_factors
    • First observedsaxo_search_instruments
    • First observedsaxo_session_me
    • First observedsaxo_set_session_trade_level
    • First observedsaxo_update_price_alert
    • First observedsaxo_update_price_alert_user_settings

TDQS

A3.6/5.0
Disambiguation5/5

Each tool targets a distinct function or resource type. Tools like list_positions vs list_net_positions, place_order vs place_multileg_order, and the various option-related tools are clearly differentiated by their descriptions, leaving no ambiguity.

Naming Consistency5/5

All tools follow a consistent 'saxo_verb_noun' pattern in lowercase snake_case. Verbs are chosen appropriately and nouns specify the target, making the naming predictable and easy to navigate.

Tool Count2/5

With 51 tools, the count exceeds 25, which per the rubric is considered too many for the apparent scope. While the server covers a complex trading domain, the tool surface feels bloated and could benefit from consolidation.

Completeness5/5

The tool set covers the full lifecycle of trading interactions: account management, order placement (single and multi-leg), prechecks, positions, market screening, alerts, OAuth, session management, and diagnostics. No obvious gaps are apparent for the stated purpose.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables trading and portfolio management through the Alpaca API, allowing users to place orders, manage positions and watchlists, access market data, and retrieve account information through natural language.
    86
    3
    ISC
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides AI models with secure access to Interactive Brokers trading data and functionality, enabling account management, market data retrieval, and trading operations through natural language interactions.
    18
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables natural language trading operations through Alpaca's API, supporting stocks, options, crypto, portfolio management, and real-time market data with comprehensive order execution and account management capabilities.
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to interact with Trading 212 investment accounts for portfolio tracking, account management, and real-time order execution. It supports managing investment pies, analyzing historical data, and monitoring market performance across multiple instrument types.
    23
    2
    MIT

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