Skip to main content
Glama
LuxAlgo

LuxAlgo Library MCP

Official
by LuxAlgo

 

CI npm license

Library · Brokers · Edge Stats · Market Trackers · Challenge Simulator · Prop Firms · Vela charts · npm · Endpoint

LuxAlgo MCP is a LuxAlgo open-source project. Official repository: github.com/LuxAlgo/luxalgo-mcp-server.

It puts the LuxAlgo ecosystem behind a single MCP server: an encyclopedia of trading and technical analysis, read-only access to your own brokerage accounts, hosted session statistics with a sample size on every number, the public record of US markets (congressional trades, insider filings, lobbying, contracts, patents and more, with a primary-source link on every row), a Monte Carlo challenge simulator, and a live prop-firm directory. Free and read-only. No API key for anything hosted; the local broker tools use your own keys and never send them anywhere.

claude mcp add --transport http luxalgo https://mcp.luxalgo.com/mcp

What's inside

Area

What you get

Library

The encyclopedia of trading and technical analysis: hundreds of concept pages with formulas, the full indicator catalog with families and tags, and Pine Script sources where publicly served.

Trade Journal (sign-in)

Your own journal in the LuxAlgo app: the dashboard (metrics, Edge Score, equity curve), the P&L calendar, breakdowns by weekday / hold time / symbol / tag and more, every trade with its fills and annotations, day notes — and the writes that keep it alive: log fills by hand, annotate trades (tags, mistakes, rating, stop and target, review), write notes. Always as you, on your data; the app owns the rules.

Brokers (local only)

Read-only access to your own accounts across 22 brokers and exchanges via broker-sdk: balances, positions, trade history, FIFO performance stats. Keys live in your MCP client config as env vars and never leave your machine. The hosted endpoint does not carry these tools, on purpose.

Edge Stats

Hosted session statistics from the open-source edge-stats engine: how often a setup actually worked (gap fills, opening-range breakouts, day-of-week effects, event days) with the sample size and a Wilson 95% confidence interval on every number. A nightly build runs the real engine over free market data and publishes only derived statistics; these tools serve them verbatim.

Market Trackers

The public record of US markets from primary sources only: congressional trades, insider (Forms 3/4/5) transactions, 13F holdings, federal contracts and grants, lobbying filings, FINRA short-sale volume, granted patents, clinical trials, FDA drug events, CFTC positioning, federal bills, FEC campaign finance, hearing transcripts, Federal Reserve communications, committee assignments, Wikipedia pageviews. Read straight from the pipeline's CC0 dumps — live tree plus deep-history archives — with provenance.sourceUrl on every row. Data only: no signals, scores, or predictions.

Challenge Simulator

The open-source prop-firm-sim Monte Carlo engine, running locally inside the server. Your stats, or your real R-multiple trade series, through a firm's exact ruleset: pass probability with confidence intervals, expected attempts and cost, EV over the funded horizon, optimal-risk sweeps, cross-challenge comparison. Deterministic under seed, every assumption disclosed.

Prop Firm Directory

The live data the simulator draws from: firms, funded-account challenges with their full rulebooks (account sizes, fees, steps, profit splits, drawdown modes, trading restrictions), and current offers.

Charts (your browser)

Not a tool: the chart you draw with what the tools return. Vela, LuxAlgo's open-source charting engine, runs the Pine Script that library_get_source_code hands back and paints the fills that broker_trades lists, in a browser tab, on your machine. How the loop works.

Related MCP server: tradingview-mcp

Install

The hosted server is one URL:

https://mcp.luxalgo.com/mcp

Claude (web, desktop, mobile)

Customize → Connectors → Add custom connector, URL https://mcp.luxalgo.com/mcp, keep the detected defaults (Always required, Use Anthropic's hosted client metadata) and click Add, then Connect and sign in with your LuxAlgo account. Anthropic documents lazy authentication — connect anonymously, sign in only when a protected tool is called — as the intended behaviour with Required when the server asks, but as of September 2026 Claude.ai still opens the OAuth window at connect time for this server (it fetches /.well-known/oauth-protected-resource itself after the anonymous handshake). Every tool, keyless or not, works once connected; the anonymous-until-needed flow is available in the other clients.

Claude Code

claude mcp add --transport http luxalgo https://mcp.luxalgo.com/mcp

Cursor

Use the Install in Cursor button above, or add this to .cursor/mcp.json:

{
  "mcpServers": {
    "luxalgo": {
      "url": "https://mcp.luxalgo.com/mcp"
    }
  }
}

Any other MCP client

Point your client's MCP config at the hosted URL:

{
  "mcpServers": {
    "luxalgo": {
      "url": "https://mcp.luxalgo.com/mcp"
    }
  }
}

Client

Where to add it

Cursor

.cursor/mcp.json, or the install button above

Claude Desktop

claude_desktop_config.json

VS Code

Install button above, or MCP settings

Windsurf

~/.codeium/windsurf/mcp_config.json

Zed

settings.json under context_servers

Warp

Settings → Agents → MCP servers

LM Studio

mcp.json

OpenCode

opencode.json

Gemini CLI

~/.gemini/settings.json

Local (stdio)

Runs every hosted tool locally, and unlocks the broker tools. Set read-only credential env vars for the brokers you use. Any subset works: a broker connects when all of its vars are set, and with no vars at all the broker tools simply stay unconfigured.

{
  "mcpServers": {
    "luxalgo": {
      "command": "npx",
      "args": ["-y", "@luxalgo/mcp"],
      "env": {
        "BROKERS_ALPACA_API_KEY": "…",
        "BROKERS_ALPACA_API_SECRET": "…",
        "BROKERS_KRAKEN_API_KEY": "…",
        "BROKERS_KRAKEN_API_SECRET": "…",
        "BROKERS_HYPERLIQUID_WALLET_ADDRESS": "0x…"
      }
    }
  }
}

Env var names derive from each broker's credential fields: BROKERS_<BROKER>_<FIELD> (for example BROKERS_OKX_PASSPHRASE, BROKERS_IBKR_FLEX_FLEX_TOKEN). The broker_setup tool lists every supported broker, its exact variables, and a one-line guide to creating each key with read-only scope, which is all this server ever needs.

Signing in with LuxAlgo (optional)

Almost everything here is keyless and works without an account. The tools in the Account and Trade Journal sections below need to know who you are; they use your LuxAlgo account through standard OAuth 2.1, with app.luxalgo.com as the authorization server. Nothing is required up front: every client can connect, list tools and use the public ones anonymously, and sign-in is only requested when you first call an account tool.

Hosted (ChatGPT, Claude, Cursor, any remote connector). The server advertises its protected-resource metadata and answers an unauthenticated account-tool call with a 401 + WWW-Authenticate challenge; MCP clients handle the rest (discovery, PKCE, consent screen in your browser) and keep the token for you. Each tool also declares its policy in tools/list (securitySchemes: noauth for public tools, oauth2 for account tools), so ChatGPT's per-tool linking works as well. Clients may identify themselves via Client ID Metadata Documents or Dynamic Client Registration — the app accepts both. One client-side exception: Claude.ai/Desktop connectors sign in at connect time whenever OAuth metadata is discoverable, regardless of their Authentication setting (see Install); ChatGPT, Cursor, Claude Code and the stdio server get the anonymous-until-needed flow.

Local (stdio). The server running on your machine is itself the OAuth client. Sign in once:

npx -y @luxalgo/mcp login     # opens your browser; tokens are stored under your user config dir (0600)
npx -y @luxalgo/mcp status    # who is signed in, token expiry
npx -y @luxalgo/mcp logout

Tokens live in ~/.config/luxalgo/mcp-auth.json (%APPDATA%\luxalgo\mcp-auth.json on Windows, or LUXALGO_MCP_AUTH_FILE), are refreshed automatically, and are only ever sent to the LuxAlgo app. If your MCP client supports URL-mode elicitation (MCP 2026-07-28), you can skip the command: the first account-tool call asks the client to open the sign-in page and continues once you approve. Otherwise the tool answers with the challenge and the login hint.

What the token is for. This server never decides what you are entitled to — its code is public, so any such check would be decorative. Instead, once you are signed in, every request a tool makes to the LuxAlgo app carries your token, and the app resolves your account and plan from it exactly as it does when you use the web app. Public tools work without it; with it, the app can tailor what they return. When the app declines — no valid sign-in (401) or a feature outside your plan (403) — the tool reports that, naming the permission involved.

Tools

Library

Tool

Description

library_search

One search over concepts (alias-aware) and indicators

library_get_concept

Full concept page as markdown

library_get_indicator

Indicator detail: body, family, concepts, source code availability

library_get_source_code

Full source code when publicly served, fetched only on demand

library_list_concepts

Paginated concept roster, optionally per family

library_list_indicators

Filtered, paginated browse (family, concept, tags, platform, tier) with server-side sort

library_list_tags

The indicator tag vocabulary, for the tags filter

library_list_families

The taxonomy backbone with counts

library_get_family

A family hub as markdown plus concept roster

Library outputs are compact JSON with canonical urls for citation. Concept and family pages are also directly fetchable as markdown: append .md to any concept URL.

Account (sign-in required)

Tool

Description

luxalgo_account

The signed-in user's plan tier, entitlements (alerts, historical bars, AI credits, …) and profile basics — so an agent can tailor answers to what the plan actually allows

Trade Journal (sign-in required)

Your own trade journal in the LuxAlgo app — the same accounts, trades, annotations and notes the app shows — read and written as you. Dates are YYYY-MM-DD day keys in your journal timezone (journal_list_accounts reports it); account filters take ids from the same call.

Tool

Description

journal_list_accounts

Journal accounts (broker-synced, imported or manual; currency, initial balance, lot method, last sync, archived state) and the journal timezone — the first call, since every accounts filter takes these ids

journal_overview

The dashboard for a window: performance metrics, Edge Score, per-day P&L, equity curve, open positions, accounts and settings; compare adds the previous equal-length window

journal_calendar

One month of the P&L calendar: day cells, weekly and monthly totals, trading and winning days

journal_breakdown

Closed trades grouped by weekday, time of day, hold time, symbol, side, position size, tag, rating and asset class — where the P&L comes from

journal_list_trades

Trade summaries, keyset-paginated; filter by accounts, open-day window, symbol, direction, status, tag; sort by opened/closed time, net or gross P&L, duration, quantity, symbol or rating, either direction

journal_get_trade

One trade in full: fills (reported values, corrections, hidden), per-exit P&L, every annotation

journal_get_day

A single day's stats, trades and notes

journal_list_tags

The user's annotation vocabulary — tags, mistakes, playbooks with usage counts — so new annotations reuse existing words

journal_search_notes

Day notes and trade notes as one newest-first stream; text query, day window, symbol and account filters, paginated

journal_add_trade

Log a trade by hand: its fills into a manual or import account; returns the resulting trade(s)

journal_update_trade

Annotate a trade: notes, tags (replace or add/remove), mistakes, playbook, rating, stop loss, profit target, reviewed

journal_write_note

Add a note to a day

journal_update_note

Replace a day note's text or move it to another day

The journal tools and luxalgo_account are the only tools that need a LuxAlgo account; see Signing in with LuxAlgo. Without a sign-in they return an OAuth challenge instead of data — never a silent fallback. The write tools act only as the signed-in user and only on that user's journal; the app validates and owns every change.

Brokers (local stdio only)

Tool

Description

broker_setup

Supported brokers, their env vars (set or unset, never values), read-only key guides

broker_accounts

Connected accounts: broker, currency, equity, cash

broker_positions

Open positions with market values, asset class, entry price; negative quantity means short

broker_trades

Trade history, newest first; filter by broker or symbol

broker_stats

Total equity, equity by broker, top positions, FIFO win rate and realized PnL

broker_refresh

Bypass the 5-minute cache and re-fetch now

Read-only by construction: the SDK's root export has no trading endpoints, the server never writes secrets anywhere, and per-broker failures are reported alongside results, never silently dropped.

Edge Stats

Hosted session statistics from the open-source edge-stats engine, precomputed nightly:

Tool

Description

edge_symbols

What the hosted store covers: symbols, session calendars, coverage windows, last build

edge_presets

The catalog of precomputed questions, each stating in plain language what its number means

edge_report

One result in the engine's full honesty envelope: estimate, N, Wilson 95% CI, minimum-sample guards, stability split, per-year counts, distribution, disclaimer

Every number arrives with its sample size — the engine has no code path that returns a percentage without one. Results are historical conditional frequencies, never predictions. For arbitrary composed queries or your own market data, run edge-stats locally; its own MCP server exposes the full engine over your local store.

Market Trackers

Tool

Description

trackers_datasets

The catalog: every dataset's row count, freshness, years with data (live vs deep-history archive), ticker-searchability; pass dataset for its field roster, filterable paths, caveats, per-year coverage, source health and dump URLs

trackers_query

Search one dataset by ticker, free text, exact field values (where, dot paths) and event-date range, choosing which years to read; newest/oldest ordering with paging

trackers_latest

The newest daily delta of a dataset (today's insider filings, this week's congressional disclosures), optionally narrowed by ticker or text

trackers_ticker

One ticker across every ticker-bearing dataset for a year: per-dataset counts with the newest rows — a public-record dossier

The data is the CC0 output of LuxAlgo/market-trackers, published daily to LuxAlgo/market-trackers-data: year-sharded gzipped JSON in the repository's live tree, plus deep-history shards attached to the data repo's GitHub Releases and indexed in its archives.json. The server streams shards row by row (never loading a whole file) under a per-call budget of compressed bytes, so a deep-history year (often 30–60 MB compressed) is read one at a time. Amounts disclosed as ranges stay ranges; ticker mappings for contracts, lobbying, trials, FDA events and patents are best-effort against a curated map of public companies; every row keeps its primary-source deep link.

Challenge Simulator

Runs locally inside the server:

Tool

Description

propfirms_list_simulatable

Every simulatable firm and challenge in the live directory, provenance-disclosed

propfirms_challenge_rules

One challenge's full encoded ruleset (drawdown modes, consistency, payout gating, citations), editable and re-simulatable inline

propfirms_simulate

Monte Carlo of your stats (win rate, avg win, trades/day, risk sizing) through a firm's exact ruleset and funded horizon: pass probability with CI, which rule kills attempts, expected attempts and cost, EV, payout probability

propfirms_simulate_trades

Same, from your real R-multiple trade series; block bootstrap preserves your streaks

propfirms_optimal_risk

Risk sweep: pass-optimal vs EV-optimal risk per trade (they differ)

propfirms_compare

Same trader across up to 12 challenges, EV-sorted (not a ranking)

propfirms_pass_rates

The site's reference-archetype odds, recomputed live (seed 42, 10k paths)

propfirms_validate_strategy

Screen one strategy across every simulatable challenge against an explicit pass bar

Every simulation result carries its assumptions, unsimulated-rule flags, seed, and engine version. Results are distributions under stated assumptions, never promises. The engine runs locally; firm rules adapt live from the directory, and inline specs simulate fully offline.

Prop Firm Directory

The live directory the simulator draws from, queryable directly:

Tool

Description

propfirms_search

Search firms; firm filters (platforms, markets, payments, Trustpilot, country availability) compose with nested challenge and offer filters, and include nests matching children

propfirms_get

One firm's full dossier: profile, every challenge, live offers, written overview

propfirms_search_challenges

Search challenges by rules (size, fee, steps, profit split, drawdown, trading restrictions) and parent firm; can attach applicable live offers

propfirms_search_offers

Current discounts and promo codes, resolvable per firm or per challenge

Charts, in your browser, with Vela

Every tool above returns text and JSON. When the answer wants a chart, draw it with Vela (@luxalgo/vela, Apache-2.0), LuxAlgo's open-source charting engine: a headless chart with its own WebGL2 renderer that takes bars you already have, or fetches them from keyless public providers, and runs indicator scripts through pluggable engines. Pine Script lives in the @luxalgo/vela-pinets addon, which is what closes the loop with the Library: library_get_source_code hands an agent an indicator's exact Pine source, and Vela executes that source on a chart.

Not a mockup: the Library's SuperTrend source as returned by library_get_source_code, executed by @luxalgo/vela-pinets on a @luxalgo/vela 0.6 chart and screenshotted in headless Chromium. The bars are a labelled synthetic sample; point data at your own or register a provider for live ones.

The whole demo is two script tags and five lines. source is the source field of a library_get_source_code result:

<div id="chart" style="height: 480px"></div>
<script src="https://cdn.jsdelivr.net/npm/@luxalgo/vela@0.6.15/dist/vela.global.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@luxalgo/vela-pinets@0.2.10/dist/vela-pinets.global.min.js"></script>
<script>
  const chart = new Vela.Vela('#chart', { data: bars, timeframe: '1D', theme: 'dark' }); // bars: [{ time, open, high, low, close, volume? }]
  chart.registerEngine('pine', new VelaPinets.PineEngine());
  chart.addIndicator(source);
</script>

With a bundler it is the same three calls over import { Vela } from '@luxalgo/vela' and import { PineEngine } from '@luxalgo/vela-pinets'; see Vela's quickstart. The same chart paints your own trades: Trade Journal takes the shape broker_trades returns and draws entries, exits and P&L labels through Vela's native-indicator API, engine-free, in one component you can lift as is.

Where each piece runs. This matters because it is the opposite of how the rest of this server works:

Piece

Where

Notes

Vela

A browser tab on your machine (Canvas 2D or WebGL2).

Never inside this server, hosted or stdio, and never in an MCP response. An agent gets the Pine source and the trades as text; the chart is what you build with them.

Bars

Yours, via data, or Vela's keyless Binance, Coinbase and Hyperliquid providers, fetched by the browser.

This server serves no market data, so a chart needs no LuxAlgo key and makes no LuxAlgo request.

Pine Script

@luxalgo/vela-pinets, which executes the PineTS runtime.

AGPL-3.0, licensed separately from Vela's Apache-2.0 and this server's MIT. Vela itself ships no engine and carries no Pine code.

Attribution

Vela's mark, bottom-left of every chart.

Stays on unless you show equivalent attribution next to the chart; see Vela's NOTICE.

Vela already draws the charts in Trade Journal and on the hosted Market Trackers, and the Vela page runs a live one.

Development

npm install
npm run build
npm start            # stdio
npm run start:http   # streamable HTTP on :3333/mcp
npm test               # smoke suite over stdio (hits live endpoints); --only library,edge for a subset
npm run test:http      # the same suite against a running HTTP entry on :3333
npm run test:parity    # simulator tools vs upstream package + raw engine
npm run test:trackers  # offline checks of the Market Trackers streaming engine

Layout — one directory per concern, one directory per tool domain:

src/
  index.ts            the `luxalgo-mcp` binary → entries/stdio.ts
  entries/            stdio.ts (local), node-http.ts (plain Node), hosted.ts (shared by node-http and api/server.ts)
  server/             manifest.ts (the list of tool modules; protected / local-only derived from it),
                      create-server.ts (registration shared by every entry), version.ts (serverInfo)
  tools/<domain>/     index.ts exports a ToolModule (name, tool names, protected, localOnly, register);
                      api.ts wraps the domain's endpoints; the rest is the domain's own
  tools/_shared/      result/format helpers and the ToolModule contract
  auth/               OAuth: config, gate, verify, metadata, challenge, runtime, protected-tool, local/ (stdio client)
  platform/           app-client.ts (the one HTTP client for the LuxAlgo app), analytics.ts
api/server.ts         the Vercel function
test/                 smoke.mjs runner + smoke/<domain>.mjs suites, parity.mjs, trackers-check.mjs

Adding a tool domain: create src/tools/<domain>/index.ts exporting a ToolModule and list it in src/server/manifest.ts; registration asserts the module registers exactly the tools it declares. Mark tools that need a signed-in user in protectedTools (and register them with registerProtectedTool), and modules that read local credentials with localOnly.

Optional env: LUXALGO_APP_ORIGIN and LUXALGO_SITE_ORIGIN point the server at non-production environments; MARKET_TRACKERS_DUMPS_ORIGIN (default https://raw.githubusercontent.com/LuxAlgo/market-trackers-data/main) and MARKET_TRACKERS_DATA_REPO point the Market Trackers tools at another dumps tree.

OAuth env (see src/auth/config.ts): the authorization server is always LUXALGO_APP_ORIGIN + /api/auth; MCP_RESOURCE (default https://mcp.luxalgo.com/mcp) is this server's resource identifier and token audience — it must equal the app's LUXALGO_MCP_SERVER_RESOURCE. For local end-to-end work: LUXALGO_APP_ORIGIN=http://localhost:3001 MCP_RESOURCE=http://localhost:3333/mcp npm run start:http, with the app running on 3001 and the same MCP_RESOURCE exported for npx -y @luxalgo/mcp login / the stdio server. LUXALGO_AUTH_CHALLENGE=result makes the hosted entries let an anonymous protected call reach the tool (which answers the in-band _meta["mcp/www_authenticate"] challenge) instead of short-circuiting with HTTP 401 — the default; invalid tokens are always a 401. LUXALGO_SECURITY_SCHEMES=off drops the per-tool securitySchemes hint from tools/list (ChatGPT's per-tool linking extension; not part of Anthropic's lazy-auth recipe) so the anonymous surface is indistinguishable from an authless server's — the 401 challenge is unaffected. LUXALGO_REACTIVE_AUTH_ONLY=on hides the well-known PRM paths (404) and serves the metadata at /auth/prm, reachable only via the 401's resource_metadata — a temporary counter-measure for claude.ai starting OAuth at connect time (claude-ai-mcp#1013); see docs/auth.md §5 for the trade-off before enabling. npm test covers the anonymous paths and the advertised securitySchemes on both transports.

Disclaimer

Nothing this server returns is investment advice. Simulation outputs are modeled estimates under stated assumptions, not predictions or guarantees. Verify balances and performance numbers against your broker's own statements, and a prop firm's own page is authoritative for its current rules.

License

Code is MIT © LuxAlgo Global, LLC. Library content and Pine Script sources served by this server keep their own licenses; see NOTICE.

The LuxAlgo name and logo are trademarks of LuxAlgo Global, LLC; see TRADEMARKS.md. To report a vulnerability, see SECURITY.md.

Available Tools

48 tools
broker_accountsList connected brokerage accountsAInspect

All connected accounts across every configured broker: stable id, name, broker, currency, total equity, and cash when reported. Uses a short-lived cache; call broker_refresh for live numbers. Read-only — this server cannot trade.

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?

With no annotations provided, the description carries the full burden and does well: it discloses read-only behavior, states that the server cannot trade, and reveals the cache behavior. This goes beyond the bare schema and gives the agent realistic expectations about 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?

Three tightly packed sentences: the first states scope and return content, the second warns about caching and routes to broker_refresh, and the third reinforces safety. No filler or repetition.

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 parameterless list tool with no annotations and no output schema, the description is complete: it explains what is returned, the caching caveat, the live alternative, and the safety restriction. An agent has everything necessary to select and call it correctly.

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 the schema coverage is effectively complete, so there is nothing for the description to clarify. The field list adds useful context about what the response contains, which is the relevant semantic information here.

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 a specific verb and resource: listing all connected accounts across every configured broker, and enumerates the returned fields (id, name, broker, currency, total equity, cash). This clearly distinguishes it from sibling tools that cover positions, trades, stats, or refresh operations.

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 tells the agent that it uses a short-lived cache and points to broker_refresh when live numbers are needed. It clearly frames when this tool is appropriate, though it does not exhaustively discuss all sibling alternatives or exclusions.

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

broker_positionsOpen positionsBInspect

Open positions across all connected accounts: symbol, quantity (negative means short), market value in the account currency when the broker prices it, plus asset class and average entry price where reported. Optionally filter by broker id.

ParametersJSON Schema
NameRequiredDescriptionDefault
brokerNoBroker id to filter by, e.g. 'alpaca' or 'kraken'

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the transparency burden. It usefully explains that negative quantity means short, market value is in the account currency when the broker prices it, and average entry price is provided where reported. However, it does not explicitly state that this is a read-only operation with no side effects, nor does it mention pagination 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?

The description is a single front-loaded sentence that covers the core purpose, returned fields, key caveats, and the optional filter without any filler. Every clause adds information an agent needs.

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 tool with one optional parameter and no output schema, the description adequately explains the scope, field semantics, and data caveats. The main omission is an explicit statement that the result is a list/array and what happens when there are no open positions or no connected accounts.

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?

The only parameter, broker, has 100% schema description coverage and includes concrete examples. The tool description simply restates that filtering is optional, adding no meaning beyond the schema, so the baseline of 3 applies.

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 identifies the resource (open positions) and scope (all connected accounts), and enumerates the returned fields. It lacks an explicit imperative verb such as 'list' or 'get' and does not differentiate itself from sibling tools like broker_trades, so it is clear but not fully distinguished.

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?

There is no guidance about when to use this tool versus alternatives such as broker_trades, broker_accounts, or broker_stats. The only usage hint is the optional broker filter, which is parameter-level guidance rather than tool-selection guidance.

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

broker_refreshRefresh broker dataAInspect

Bypass the 5-minute cache and re-fetch every configured broker right now. Returns per-broker success/failure.

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?

With no annotations provided, the description carries the behavioral burden. It discloses that the tool bypasses caching, refreshes all configured brokers, and returns per-broker success/failure. It stops short of mentioning rate limits, failure details, or whether the operation is safe/idempotent, but the core behavior and return shape are clear.

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 tight sentences with no filler. The most important behavioral fact, cache bypass, is front-loaded, and the return value is stated succinctly.

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 zero-parameter refresh tool, the description is largely complete: it explains the action, the reason (bypass cache), the scope (every configured broker), and the result format. It lacks minor context such as potential slowness or error handling, but nothing essential is missing for correct invocation.

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 the schema is empty, so there are no parameter semantics to document. The baseline of 4 applies because the description fully covers what an agent needs to know about invocation: no arguments are required.

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 a specific action ('Bypass the 5-minute cache and re-fetch every configured broker right now') with a clear resource and behavior. It also distinguishes itself from sibling query tools like broker_accounts and broker_stats by focusing on refreshing rather than reading data.

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 clearly implies when to use this tool: when cached broker data is stale or up-to-the-minute data is needed. It does not explicitly name alternatives or exclusions, but the cache-bypass framing provides enough context to select it over read-only sibling tools.

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

broker_setupBroker connection setup & statusAInspect

Every broker this server can connect to (22 brokers & exchanges via @luxalgo/broker-sdk), the environment variables its credentials go in, whether each is set in this session (never the values), and the one-line guide to creating each key with read-only scope. Call this first when no broker data comes back, or when the user asks how to connect an account.

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?

With no annotations provided, the description carries the behavioral burden. It discloses that it never reveals credential values, only whether they are set in the session, and that key guides are read-only. This is useful transparency, though it does not explicitly state whether the tool performs any network calls or has 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.

Conciseness5/5

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

The description is two sentences with no filler. The first sentence front-loads all substantive content, and the second sentence gives precise invocation triggers. Every clause earns its place.

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 zero-parameter informational tool with no output schema, the description is complete: it explains what is returned, what is deliberately not returned, and when to use it. An agent can decide to call this tool correctly without needing additional details.

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 100% schema coverage, so the baseline of 4 applies. The description adds no parameter-specific details because there are none to document; it correctly focuses on the tool's informational contents.

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 what the tool provides: an inventory of every connectable broker/exchange, the environment variables for credentials, whether they are set in the current session, and one-line key-creation guides. This distinguishes it from data-oriented siblings like broker_accounts, broker_positions, and broker_trades.

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 says when to call it: first when no broker data comes back, or when the user asks how to connect an account. It does not explicitly name sibling alternatives or state when not to use it, but the 'call this first' phrasing gives clear context.

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

broker_statsPortfolio performance statsAInspect

Computed performance across the whole portfolio: total equity, equity by broker, top positions, and FIFO-matched trade stats — win rate, average win/loss, realized PnL, per-symbol breakdown. Amounts stay in each account's native currency, so mixed-currency totals are approximate. For prop-firm challenge odds from these stats, feed winRate plus avgWin/avgLoss converted to R-multiples (divide by the average amount risked per trade) into propfirms_simulate; for odds that respect the real trade sequence, use broker_trades with propfirms_simulate_trades instead.

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?

No annotations are provided, so the description carries the full burden. It discloses important non-obvious behavior: amounts remain in each account's native currency, mixed-currency totals are approximate, and trade stats are FIFO-matched. These are genuinely useful behavioral details beyond a simple 'get stats' statement.

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 front-loaded with the core purpose and then expands into a structured list of outputs and a caveat. The second sentence, while dense, provides actionable routing to sibling tools without wasted words. Every clause earns its place.

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?

With no output schema, the description adequately covers the return contents, including per-symbol breakdown and realized PnL. It also communicates the mixed-currency approximation caveat and provides alternative tooling for sequence-accurate simulations. For a zero-parameter analytics tool, nothing essential is missing.

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 zero parameters, so there is nothing for the description to clarify. The baseline of 4 applies: no parameter ambiguity exists, and the description focuses on output and usage rather than 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 opens with a specific verb and resource: 'Computed performance across the whole portfolio', and enumerates the exact outputs (total equity, equity by broker, top positions, FIFO-matched trade stats). This clearly differentiates broker_stats from siblings like broker_positions and broker_trades, which return raw data.

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 gives explicit routing guidance for prop-firm odds: use propfirms_simulate from these stats, or broker_trades with propfirms_simulate_trades for sequence-respecting odds. However, it does not explicitly contrast broker_stats with broker_positions or broker_trades outside that odds context, though the aggregate-vs-raw distinction is strongly implied.

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

broker_tradesTrade historyAInspect

Executed trades across all connected accounts (the most recent window each broker exposes), newest first. Optionally filter by broker id and/or symbol. To simulate prop-firm challenge odds from this history, pass this tool's JSON result (the {trades: [...]} object) straight into propfirms_simulate_trades as tradeLogText, with importRisk set to the risk taken per trade. Filter to one broker/account first when several are connected: mixed-account histories are refused rather than replayed as one equity curve.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax trades to return (default 100)
brokerNoBroker id to filter by
symbolNoSymbol to filter by, e.g. 'BTC' or 'AAPL'

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full behavioral burden, and it delivers: it discloses the broker-specific recency window, newest-first ordering, the output shape, and the critical refusal behavior for mixed-account histories. This adds meaningful context beyond the raw schema.

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 dense sentences, each earning its place. It front-loads the core purpose and ordering, then gives the integration workflow, then the critical warning. No filler or 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?

Despite having no annotations and no output schema, the description provides enough context to invoke the tool correctly: what it returns, how results are ordered, available filters, how to use the result downstream, and a key constraint. The schema covers parameter limits, so no critical information is missing.

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?

Schema description coverage is 100%, so the baseline is 3. The description adds value by clarifying that broker/symbol filters are optional and, more importantly, by explaining the broker-filtering requirement when multiple accounts are connected. This goes beyond the schema's simple parameter 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 identifies the tool as returning executed trades across all connected accounts, with an explicit ordering ('newest first') and optional filters. This distinguishes it from sibling tools like broker_positions, broker_stats, and broker_accounts.

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 gives strong usage context: it explains how to feed the result into propfirms_simulate_trades and warns to filter to one broker/account first because mixed-account histories are refused. It does not explicitly name alternatives like broker_positions, but the workflow and constraints are clear.

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

edge_presetsList Edge Stats report presetsAInspect

The catalog of session-statistics questions the hosted store precomputes nightly — gap fills, opening-range breakouts, day-of-week effects, event-day behavior, and more. Each preset states in plain language what its number means. Returns preset ids for edge_report.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoNarrow to one category (the result lists all categories)

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the burden, and it does disclose the catalog is precomputed nightly, explains what each preset provides, and states that the return value is preset ids for edge_report. It does not discuss auth, rate limits, or exact output shape, but for a simple read/list tool these omissions are minor.

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 compact: it front-loads the catalog concept, gives concrete examples, explains the presets' value, and closes with the output relation to edge_report. Every sentence earns its place and there is no fluff.

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 optional-parameter list tool with no output schema and no annotations, the description covers what the tool does, what its data represents, and how the returned ids are used. The category behavior is already documented in the schema, so nothing critical is missing for an agent to call it correctly.

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?

The only parameter, category, has a schema description ('Narrow to one category (the result lists all categories)'), giving 100% schema coverage. The tool description itself does not mention the parameter, so it adds no additional meaning beyond the schema; baseline 3 is appropriate.

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 lists Edge Stats report presets and returns preset ids for edge_report. This distinguishes it from the edge_report tool, which likely consumes those ids rather than listing 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 establishes the tool as a catalog of precomputed session-statistics questions and explicitly ties the output to edge_report, making it clear this is the discovery/preview step before running a report. It does not explicitly contrast with siblings or say when not to use it, but the context is clear.

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

edge_reportGet a hosted Edge Stats reportAInspect

One precomputed session-statistics result: P(outcome | conditions) for a preset on a hosted symbol, in the engine's full honesty envelope — the estimate with N and a Wilson 95% confidence interval, minimum-sample guards, a first-half vs second-half stability split, per-year counts, the value distribution where the outcome is continuous, and the disclaimer. Historical conditional frequencies, not predictions. Preset ids come from edge_presets; symbols from edge_symbols.

ParametersJSON Schema
NameRequiredDescriptionDefault
presetYesPreset id, e.g. 'gap-fill' — see edge_presets
symbolYesHosted symbol, e.g. 'BTCUSDT' — see edge_symbols

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations provided, the description carries the full disclosure burden and does so well: it states results are precomputed, framed as historical conditional frequencies rather than predictions, and enumerates the statistical guards (Wilson 95% CI, minimum-sample guards, stability split, per-year counts, disclaimer). It leaves failure modes unaddressed, but for a read-only report tool the honesty-envelope detail is unusually transparent.

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?

Tightly front-loaded with the core message ('One precomputed session-statistics result') and every clause earns its place — the honesty-envelope list and the 'not predictions' caveat are all informative. It reads as a dense run-on em-dash chain, so scannability suffers slightly, but there is no wasted verbiage.

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 two-parameter read tool with no output schema, the description compensates by spelling out the full return envelope: estimate, N, Wilson interval, minimum-sample guards, stability split, per-year counts, value distribution, and disclaimer. The only notable omission is error behavior for invalid preset/symbol values, which the schema examples partially mitigate.

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 100%, and both parameter descriptions already include examples ('gap-fill', 'BTCUSDT') plus cross-references to edge_presets and edge_symbols. The tool description repeats that sourcing relationship but adds nothing materially new beyond what the input schema states, so the high-coverage baseline of 3 applies.

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?

States a specific deliverable — 'One precomputed session-statistics result: P(outcome | conditions) for a preset on a hosted symbol' — and details the return contents. The epistemic qualifier 'Historical conditional frequencies, not predictions' further pins down what the tool does. References to edge_presets/edge_symbols distinguish it from the sibling listing tools that supply its inputs.

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 closing sentence, 'Preset ids come from edge_presets; symbols from edge_symbols,' implies the correct calling workflow and routes the agent to the data-source siblings. The 'Historical conditional frequencies, not predictions' phrase acts as a when-not-to-use caution. No explicit comparison to an alternative report tool is given, but the guidance is clear enough.

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

edge_symbolsHosted Edge Stats coverageAInspect

What the hosted Edge Stats store covers: the symbols, their session calendars, coverage windows, session counts, and when the nightly build last ran. Session statistics (how often a setup actually worked, with sample sizes and confidence intervals) come from the open-source edge-stats engine over free market data. Start here, then edge_presets for the questions you can ask, then edge_report for a result.

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?

With no annotations, the description carries the transparency burden. It discloses the scope of data covered, the nightly build timing, and the boundary between this tool and the open-source edge-stats engine. It does not describe return formatting or size, but for a zero-parameter coverage tool this is sufficient 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?

Three sentences, each earning its place: the first defines scope, the second clarifies what is not included, and the third gives the workflow. It is front-loaded with the most important information and contains no filler.

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 zero-parameter tool with no output schema, the description is complete: it explains what the tool covers, where it fits in the workflow, and what it does not provide. An agent can confidently invoke it as the starting point for Edge Stats questions.

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, so there is nothing for the description to explain about arguments. The empty input schema is already fully covered, and the description appropriately focuses on content rather than parameters. This matches the baseline for a no-parameter tool.

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 identifies the resource ('hosted Edge Stats store') and enumerates its contents: symbols, session calendars, coverage windows, session counts, and nightly build timestamp. It lacks a strong imperative verb like 'List' or 'Get', but the phrasing 'What the hosted Edge Stats store covers' is specific enough to tell an agent what this tool returns and distinguishes it from edge_presets and edge_report.

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 gives explicit workflow guidance: 'Start here, then edge_presets for the questions you can ask, then edge_report for a result.' It also clarifies that session statistics come from a separate open-source engine, which helps an agent avoid expecting statistical results from this tool.

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

journal_add_tradeLog a trade by handA
Idempotent
Inspect

Log a trade by adding its fills to a manual or import journal account (never a broker-synced one — the sync owns those). The journal derives trades from fills: a long round trip is a buy fill then a sell fill, a short is sell then buy, scale-ins and partial exits are just more fills, and a lone fill opens a position. Times are ISO 8601 instants with offset; fees are per fill. Fills identical to existing ones are skipped as duplicates. Returns the insert counts and the trade(s) the fills now belong to, with keys for journal_update_trade. Correcting or removing an existing fill is done in the app, not here. Requires signing in with a LuxAlgo account (OAuth).

ParametersJSON Schema
NameRequiredDescriptionDefault
fillsYesThe fills, in any order.
accountIdYesA `manual` or `import` account id from journal_list_accounts.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations cover safety/idempotency, but the description adds real context beyond them: the OAuth LuxAlgo sign-in requirement, the duplicate-skip rule, the fill-to-trade derivation model (long = buy then sell, lone fill opens a position), and the return shape. That is substantive behavioral disclosure the annotations do not carry.

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 core action and account constraint are front-loaded in the first clause, and each following sentence contributes distinct value (derivation rules, duplication behavior, return shape, exclusions, auth). Dense but free of filler.

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 nested-fills write tool with no output schema, the description supplies everything an agent needs: account eligibility, fill ordering/derivation semantics, duplicate handling, auth prerequisite, and a summary of what is returned.

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?

Schema coverage is 100% so the baseline is 3, but the description adds domain semantics the schema does not: ISO 8601 instants with offset, fees being per fill, and how side/sequence map onto trade direction. It goes past restating field descriptions without documenting every individual field.

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?

Specific verb (log/add) plus resource (fills into a journal account) with an explicit scope constraint: only `manual` or `import` accounts, never broker-synced ones. It also names journal_update_trade as the follow-up consumer of returned keys, so an agent can separate it from siblings without opening schemas.

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?

States when to use it (hand-logging fills to manual/import journals) and when not to (broker-synced accounts, correcting or removing existing fills — done in the app). It routes the agent to journal_update_trade for subsequent edits, leaving little to inference.

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

journal_breakdownJournal P&L breakdownA
Read-only
Inspect

Where the P&L actually comes from: closed trades in the window grouped nine ways — weekday, time of day, hold time, symbol, side, position size, tag, rating and asset class — each group with trade count, wins, losses, net P&L, average net P&L and win rate (breakevens excluded). Defaults to all time, since groups need sample size; narrow with range or from/to. The tool for 'what am I good or bad at' questions; journal_overview has the headline numbers. Requires signing in with a LuxAlgo account (OAuth).

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoInclusive end day (YYYY-MM-DD, journal timezone). Overrides `range`.
fromNoInclusive start day (YYYY-MM-DD, journal timezone). Overrides `range`.
rangeNoNamed window ending today in the journal timezone. Ignored when from/to are given.
accountsNoJournal account ids to scope to (from journal_list_accounts). Omit for every account, archived ones included. Unknown ids are rejected.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint and openWorldHint, so safety is covered; description adds what annotations cannot: the auth requirement (LuxAlgo OAuth sign-in), the default-all-time behavior, the breakevens-excluded rule, and the sample-size rationale. Lacks disclosure of return format/pagination, but no output schema exists so this is a modest gap.

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?

Front-loaded with the core purpose and the nine-dimension enumeration, then defaults, then routing guidance, then auth. Every sentence earns its place. Slightly dense with the long enumeration and metric list, but no wasted filler.

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?

Covers purpose, grouping dimensions, returned metrics, default window, scoping, sibling routing, and auth — substantial for a 4-param read tool with no output schema. Missing only pagination/result-size limits, which is minor given the schema is fully documented.

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 description coverage is 100% and the schema already documents range/from/to override precedence and account id semantics. The description's 'narrow with range or from/to' corroborates but adds no syntax or format detail beyond the schema. Baseline 3.

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?

States a specific verb+resource ('P&L breakdown' of closed trades) and enumerates the nine grouping dimensions and the eight aggregate metrics returned. Differentiates from the sibling journal_overview by name, and positions it against 'what am I good or bad at' questions.

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?

Explicit when-to-use ('what am I good or bad at' questions vs journal_overview for headline numbers), explicit defaults ('Defaults to all time, since groups need sample size'), and explicit scoping guidance (narrow with range or from/to). The narrow-vs-broad tradeoff is spelled out.

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

journal_calendarJournal P&L calendarA
Read-only
Inspect

One month of the P&L calendar: week rows of day cells (net and gross P&L, fees, trade/win/loss/breakeven counts, volume; null for days with no trades), each week's net P&L and trade count, and the month's net P&L, trade count, trading days and winning days. Days are in the journal timezone. Omit month for the current month. Drill into one day with journal_get_day. Requires signing in with a LuxAlgo account (OAuth).

ParametersJSON Schema
NameRequiredDescriptionDefault
monthNoMonth as YYYY-MM. Default: the current month in the journal timezone.
accountsNoJournal account ids to scope to (from journal_list_accounts). Omit for every account, archived ones included. Unknown ids are rejected.

TDQS

A4.1/5.0
Behavior4/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses the OAuth/LuxAlgo sign-in requirement, the timezone semantics ('Days are in the journal timezone'), and the null-cell convention for days without trades. These are real behavioral facts not recoverable from 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.

Conciseness4/5

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

Dense but front-loaded: it leads with what the calendar contains, then defaults, then the sibling route, then auth. Every clause carries information, though the long enumerations of cell fields make it heavier than strictly necessary.

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 no output schema, the description carries the burden of explaining return values and does so thoroughly, including per-week and per-month aggregates and the null convention. Auth prerequisites and the day-drill route are also covered, leaving little an agent would need to infer.

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 description coverage is 100%, so the schema already documents both `month` and `accounts` (including defaults, rejection of unknown ids, and archived-account behavior). The description restates the current-month default but adds no parameter detail the schema lacks; baseline 3 applies.

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 exactly what the tool returns: one month of the P&L calendar with week rows, day cells, per-week and per-month aggregates, and the trade statistics included. It is clearly distinguishable from siblings like journal_get_day (single-day drill-down) and journal_overview (different 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?

It gives explicit operating guidance: omit `month` for the current month, and 'Drill into one day with journal_get_day' routes the agent to the day-level alternative. It does not say when to prefer this over journal_overview or journal_breakdown, so it stops short of full when/when-not coverage.

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

journal_get_dayGet one journal dayA
Read-only
Inspect

A single trading day: its stats (null when nothing traded), its trades (closed that day, or opened that day and still open) as summaries, and the day's notes with their ids. date is a YYYY-MM-DD day key in the journal timezone. Use it for 'how did Tuesday go', and to find note ids for journal_update_note. Requires signing in with a LuxAlgo account (OAuth).

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesThe day, YYYY-MM-DD in the journal timezone.
accountsNoJournal account ids to scope to (from journal_list_accounts). Omit for every account, archived ones included. Unknown ids are rejected.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover read-only and open-world nature, but the description adds real behavioral detail beyond them: stats is null when nothing traded, how 'trades' is defined (closed that day OR opened that day and still open), and that OAuth sign-in is required. These edge cases and the auth requirement meaningfully improve invoke correctness.

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 the return payload, then the date key, then usage, then auth requirement — each clause earns its place with no padding.

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 no output schema, the description correctly enumerates the return shape (stats, trade summaries, notes with ids) and discloses the auth prerequisite. It stops just short of noting the accounts scoping or any pagination/limit behavior, but is otherwise complete for invoking the tool.

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 description coverage is 100%, so both `date` and `accounts` are already fully documented in the schema. The description restates the date format but adds no syntax or semantics beyond it, and omits the accounts scoping entirely, leaving the schema to carry the load — the baseline 3.

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 exactly what the tool returns for a specific resource (a single trading day): stats, trade summaries, and notes with ids. The single-day scope inherently distinguishes it from aggregate siblings like journal_overview or journal_calendar, so an agent can route correctly without opening the schema.

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 gives concrete when-to-use guidance ('how did Tuesday go') and a downstream workflow ('to find note ids for journal_update_note'), which is genuinely useful routing. It lacks an explicit when-not or a named alternative tool, so it lands at 4 rather than 5.

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

journal_get_tradeGet one journal tradeA
Read-only
Inspect

One trade in full: the summary fields plus its fills (each with the effective values, what the source reported, the user's corrections and whether it is hidden), per-exit gross P&L, hidden fills inside the trade's span, and every annotation — notes, tags, mistakes, playbook id, stop loss, profit target, review time. Use after journal_list_trades or journal_get_day when the user asks about a specific trade or before annotating it. Requires signing in with a LuxAlgo account (OAuth).

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesThe trade's `key` exactly as returned by journal_list_trades, journal_get_day, journal_search_notes or journal_add_trade. Never construct one.

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 and openWorldHint=true, so safety is covered. The description adds real behavioral context beyond them: the OAuth/LuxAlgo account requirement and the fact that hidden fills and user corrections are exposed in the response. It stops short of noting pagination or payload size, but for a single-record read that is minor.

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?

Front-loaded with the returned payload, then usage guidance, then auth. The long field enumeration is dense but earns its place because there is no output schema; still, it could be tightened slightly for readability.

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?

With no output schema, the description compensates by itemizing the response contents, and it covers the trigger, prerequisites, and auth requirement. An agent has everything needed to select and invoke this tool correctly.

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 100% and the schema's own description already instructs that the key must come from sibling tools and never be constructed. The body text adds no syntax or format detail about the key, so the baseline 3 applies — the schema does the heavy lifting here.

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?

States a specific verb and resource — fetch one trade in full — and enumerates exactly what the payload contains (summary fields, fills, per-exit gross P&L, hidden fills, annotations). This distinguishes it cleanly from list/day/search siblings that return multiple trades or partial data.

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?

Explicitly says when to call it: 'Use after journal_list_trades or journal_get_day when the user asks about a specific trade or before annotating it.' It names the prerequisite siblings and the downstream workflow (annotating), leaving nothing to inference.

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

journal_list_accountsList journal accountsA
Read-only
Inspect

The signed-in user's trade-journal accounts — id, name, broker, kind (sync mirrors a live broker connection, import came from statements, manual is hand-entered), currency, initial balance, P&L lot method, last broker sync, archived state — plus timeZone, the journal timezone every date in the journal tools is expressed in. Call this first: every other journal tool's accounts filter takes these ids and rejects unknown ones, and journal_add_trade needs a manual or import account. An empty list means no journal yet. Requires signing in with a LuxAlgo account (OAuth).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

The annotations already declare a safe read-only open-world operation, and the description adds important behavioral context: OAuth sign-in requirement, empty-list semantics, and the downstream constraint that other tools reject unknown account ids. It also discloses the returned account metadata without needing an output schema.

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 front-loaded with the purpose and then usage guidance, and every clause adds useful information. It is somewhat dense because it lists many returned fields in one long sentence, but that detail is justified without an output schema.

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 no output schema and no input parameters, the description fully covers what the tool returns, when to call it, authentication requirements, and empty-state behavior. An agent has everything needed to invoke it correctly.

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 input parameters, so there are no parameter semantics to describe. The baseline for a no-parameter tool is 4, and the description does not need to compensate for missing schema 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 states a specific verb and resource: listing the signed-in user's trade-journal accounts. It also enumerates the returned fields and distinguishes itself from siblings by saying other journal tools' `accounts` filters depend on these ids.

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 says to call this first, explains why other journal tools reject unknown account ids, and notes that journal_add_trade requires a `manual` or `import` account. It also tells the agent what an empty list means and what authentication is required.

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

journal_list_tagsList journal tags, mistakes and playbooksA
Read-only
Inspect

The user's annotation vocabulary: every tag, mistake and playbook id they have put on any trade (open or closed), most-used first with the number of trades carrying each. Check it before journal_update_trade so new annotations reuse the user's own words instead of minting near-duplicates. Per-trade tags are on each trade summary, not here. Requires signing in with a LuxAlgo account (OAuth).

ParametersJSON Schema
NameRequiredDescriptionDefault
accountsNoJournal account ids to scope to (from journal_list_accounts). Omit for every account, archived ones included. Unknown ids are rejected.

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 and openWorldHint=true, so safety is covered. The description adds real context beyond that: an OAuth/LuxAlgo-account auth requirement and the result ordering contract ('most-used first with the number of trades carrying each'). Only the sort/aggregation behavior is disclosed; nothing about pagination or limits, so it lands just short of full marks.

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, each carrying a distinct payload: what the tool returns, when to call it, and the auth requirement. The scope constraint and the sibling exclusion are front-loaded before the trailing auth note.

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 no output schema, the description compensates by describing the return shape (tags with trade counts, most-used first) and the auth prerequisite. It is essentially complete for a low-complexity read tool, though it says nothing about result size or truncation.

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 description coverage is 100% and the single optional 'accounts' parameter is fully documented in the schema, including the journal_list_accounts source, the omit-for-all behavior and rejection of unknown ids. The description adds nothing further about parameters, so the baseline 3 applies.

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?

Names a specific resource ('the user's annotation vocabulary') and precisely enumerates what it contains: every tag, mistake and playbook id attached to any trade, open or closed. It also explicitly carves out what it does NOT cover ('per-trade tags are on each trade summary, not here'), which lets an agent separate it from journal_get_trade and journal_list_trades.

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?

Gives an explicit when-to-use rule tied to a named sibling workflow: 'Check it before journal_update_trade so new annotations reuse the user's own words instead of minting near-duplicates.' That is both the condition and the rationale, leaving nothing to inference.

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

journal_list_tradesList journal tradesA
Read-only
Inspect

Trade summaries — key, account, symbol, asset class, direction, status (open/win/loss/breakeven), open and close times, quantity and open quantity, average entry/exit, gross and net P&L, fees, fill count, duration, realized R, tags, rating, reviewed flag, hasNotes — newest-opened first by default. sort orders by any of openedAt, closedAt, netPnl, grossPnl, durationMs, quantity, symbol or rating (names match the response fields); order is desc unless set, except symbol which defaults to asc. Trades lacking the sort value (open trades for closedAt/durationMs, unrated for rating) come last in either order; netPnl is after fees, grossPnl before. Filter by account ids, open-day window (from/to are inclusive YYYY-MM-DD day keys in the journal timezone, applied to the trade's open day; open positions are always listed), symbol, direction, status or one exact tag. Keyset-paginated: pass nextCursor back as cursor with the same sort, order and filters. Examples: biggest winners this month = from/to + sort netPnl; worst by gross = sort grossPnl, order asc, status loss; longest holds = sort durationMs. Summaries carry no fills or note text: journal_get_trade with the key has those. Requires signing in with a LuxAlgo account (OAuth).

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoInclusive end day (YYYY-MM-DD, journal timezone). Overrides `range`.
tagNoTrades carrying exactly this tag (see journal_list_tags).
fromNoInclusive start day (YYYY-MM-DD, journal timezone). Overrides `range`.
sortNoField to order by; default openedAt. Trades without a value for it come last in either order.
limitNoPage size, default 25.
orderNoDefault desc (largest / latest first); symbol defaults to asc (A→Z).
cursorNo`nextCursor` from the previous page; keep every other argument identical.
statusNo
symbolNoOne symbol, e.g. 'AAPL' (case-insensitive).
accountsNoJournal account ids to scope to (from journal_list_accounts). Omit for every account, archived ones included. Unknown ids are rejected.
directionNo

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, it discloses non-obvious behavior: keyset pagination requiring identical sort/order/filters on the cursor call, trades lacking the sort value sorting last in either direction, netPnl being post-fee vs grossPnl pre-fee, and the OAuth LuxAlgo sign-in prerequisite. This is exactly the extra context annotations cannot carry.

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 scoping and sort/order defaults are front-loaded, and every clause carries real information. It is dense and unbroken as a single block, and the long field enumeration at the start is slightly heavy, but with no output schema that enumeration does earn its place.

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 an 11-param list tool with no output schema, the description covers return fields, sort/order defaults and tie-breaking, pagination protocol, filter semantics and auth requirements. Nothing an agent needs to call it correctly is missing.

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

Parameters5/5

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

Schema coverage is already 82%, but the description still adds meaning: sort names match response field names, order defaults to desc except symbol (asc), from/to are inclusive day keys in the journal timezone applied to the open day, open positions are always listed, and tag must match exactly one tag. These clarify ambiguous parameters rather than repeat 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?

Opens with a specific resource ('Trade summaries') and enumerates the exact fields returned, making the verb+resource unambiguous. It explicitly distinguishes itself from journal_get_trade (which has fills and note text) and from other journal list tools, so an agent can route correctly without opening a schema.

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?

Provides concrete when-to-use recipes ('biggest winners this month = from/to + sort netPnl', 'longest holds = sort durationMs') and an explicit redirect ('journal_get_trade with the key has those'). Filter and sort semantics are stated as rules, not hints.

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

journal_overviewJournal dashboardA
Read-only
Inspect

The journal dashboard in one call for a window: performance metrics (net/gross P&L, fees, win rate, day win rate, profit factor, expectancy, average win/loss and their ratio, largest win/loss, streaks, max drawdown, recovery factor, profit concentration, average realized R), the Edge Score with its six components, per-day P&L stats, the cumulative equity curve, open positions, and the accounts and settings the numbers cover. Closed trades bucket by close day in the journal timezone; open positions count toward any window that reaches today. compare: true adds previous — the equal-length window just before. Defaults to the last 30 days; pass range: 'all' or explicit from/to for more. Null metrics are not computable yet (e.g. no losses → profitFactorIsInfinite). Use journal_breakdown for where the P&L comes from and journal_list_trades for the trades themselves. Requires signing in with a LuxAlgo account (OAuth).

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoInclusive end day (YYYY-MM-DD, journal timezone). Overrides `range`.
fromNoInclusive start day (YYYY-MM-DD, journal timezone). Overrides `range`.
rangeNoNamed window ending today in the journal timezone. Ignored when from/to are given.
compareNoAlso compute the equal-length window immediately before this one.
accountsNoJournal account ids to scope to (from journal_list_accounts). Omit for every account, archived ones included. Unknown ids are rejected.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations only declare readOnlyHint and openWorldHint; the description adds substantial behavioral context beyond them, including close-day bucketing in the journal timezone, open positions counting toward any window reaching today, what compare:true returns (a `previous` window), null-metric semantics, and the OAuth sign-in requirement. It stops short of covering pagination, output size limits, or latency/rate behavior.

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?

Front-loaded with the core purpose and efficient overall, with routing and prerequisites trailing correctly. The long parenthetical metric enumeration is dense but justified for a dashboard tool, since it tells the agent what it will receive without an output schema.

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?

With five parameters, no output schema, and open-world annotations, the description supplies the missing pieces: return contents, window semantics, compare behavior, defaults, null handling, and auth. An agent has everything needed to call it correctly.

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?

Schema coverage is 100%, so the baseline is 3. The description nonetheless adds meaning beyond the schema by explaining compare's effect ('adds `previous` — the equal-length window just before'), the default 30-day window, and the timezone/bucketing rule that governs how from/to and range are interpreted.

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?

States a specific verb and resource ('the journal dashboard in one call for a window') and enumerates the metric families returned, so an agent knows exactly what this tool produces. It also explicitly names sibling routes (journal_breakdown, journal_list_trades), making it easy to distinguish from them.

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?

Explicitly directs the agent elsewhere when appropriate: 'Use journal_breakdown for where the P&L comes from and journal_list_trades for the trades themselves.' It also states the default window (last 30 days) and how to widen it (range: 'all' or explicit from/to), covering when and how to invoke.

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

journal_search_notesSearch journal notesA
Read-only
Inspect

Search the notes feed — day notes and trades that carry notes — newest first as one stream split by kind: notes (day notes, with ids for journal_update_note) and tradeNotes (the trade summary with its note text; annotate via journal_update_trade). Filter by case-insensitive text (q), day-key window, symbol (trade notes only — day notes have no symbol and drop out) and account ids; keyset-paginated via cursor/nextCursor. Omit every filter for the latest notes. Requires signing in with a LuxAlgo account (OAuth).

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSubstring to look for in note text, case-insensitive.
toNoInclusive end day (YYYY-MM-DD, journal timezone). Overrides `range`.
fromNoInclusive start day (YYYY-MM-DD, journal timezone). Overrides `range`.
limitNoPage size, default 25.
cursorNo`nextCursor` from the previous page; keep every other argument identical.
symbolNo
accountsNoJournal account ids to scope to (from journal_list_accounts). Omit for every account, archived ones included. Unknown ids are rejected.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint, but the description adds real behavioral detail: newest-first single stream split by kind, the shape of each stream, keyset pagination via cursor/nextCursor, and the OAuth sign-in requirement. These are exactly the traits an agent needs and cannot infer from 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.

Conciseness4/5

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

Front-loaded with the verb and resource, then filters, then pagination, then auth — a logical order with no filler. It is dense to the point of being one long run-on, but every clause carries 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?

With no output schema, the description carries the return-shape burden and does so: it describes the stream split, the per-kind contents, and the pagination cursor contract. Auth and filtering caveats round it out, leaving nothing an agent needs to call it correctly.

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?

Schema coverage is 86% so the baseline is already high, yet the description still adds meaning: `q` is case-insensitive, `to`/`from` form a day-key window, `symbol` applies only to trade notes, `accounts` scoping with unknown-id rejection, and the cursor must keep other arguments identical. It notably compensates for the `symbol` parameter, which has no schema description.

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?

States a specific verb (search) plus the exact resource (the notes feed) and even resolves the resource into its two constituent streams, `notes` and `tradeNotes`. An agent can distinguish it from journal_list_trades or journal_get_day without opening a schema.

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?

Gives concrete usage context: omit every filter to get the latest notes, symbol only applies to trade notes (day notes drop out), and it names journal_update_note/journal_update_trade as the follow-up consumers of the returned ids. It never explicitly names a sibling search/list tool as the alternative to use instead, so it falls short of a full when/when-not/alternative statement.

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

journal_update_noteUpdate a journal noteA
Idempotent
Inspect

Replace a day note's text and/or move it to another day, by note id (from journal_get_day or journal_search_notes). The body is replaced whole — to append, read the current text first and send the full new version. Trade notes are edited with journal_update_trade, not here. Returns the updated note. Requires signing in with a LuxAlgo account (OAuth).

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoThe full new text.
dateNoMove the note to this day, YYYY-MM-DD in the journal timezone.
noteIdYesThe note's `id`.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare non-read-only and idempotent behavior, but the description adds genuinely non-derivable context: the body is replaced whole (an easy-to-miss destructive semantic), OAuth sign-in with a LuxAlgo account is required, and the updated note is returned. It stops short of rate limits or error handling, but the key mutation caveat is disclosed.

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 with the replacement-destroys-text warning front-loaded and no filler. Each sentence carries distinct, load-bearing information (targeting, replacement semantics, sibling exclusion, auth).

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 three-parameter mutation tool with no output schema, the description covers targeting, replacement semantics, the sibling alternative, the auth prerequisite, and what is returned. Nothing an agent needs to invoke it correctly is missing.

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 description coverage is 100%, so noteId, body, and date are already documented, including that body is the full new text and date moves the note in the journal timezone. The description reinforces but does not extend this beyond the schema, so the baseline 3 applies.

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?

States a specific verb (replace/move) and resource (day note) plus the identifier needed to target it. It also explicitly distinguishes itself from journal_update_trade and implicitly from journal_write_note, so an agent can route correctly without opening sibling schemas.

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?

Gives the provenance of noteId (journal_get_day or journal_search_notes), names the excluded case (trade notes go to journal_update_trade), and instructs append users to read the current text first. When-to-use, when-not, and the alternative are all covered.

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

journal_update_tradeAnnotate a journal tradeA
Idempotent
Inspect

Annotate a trade — the user-owned fields only: notes (free text about this trade), tags, mistakes, playbookId, rating 1–5, stopLoss and profitTarget (price levels; the stop is what realized R is measured against) and reviewed. tags/mistakes replace the whole list; use addTags/removeTags/addMistakes/removeMistakes to change a few entries without clobbering the rest (check journal_list_tags for the user's existing words). Pass null to clear a field. Does not touch fills, prices or P&L — those derive from the fills. Returns the updated trade in full. Requires signing in with a LuxAlgo account (OAuth).

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesThe trade's `key` exactly as returned by journal_list_trades, journal_get_day, journal_search_notes or journal_add_trade. Never construct one.
tagsNo
notesNoReplaces the trade's note text; null clears it.
ratingNoExecution quality 1–5; null clears it.
addTagsNoTags to add (existing ones are kept; case-insensitive duplicates are ignored).
mistakesNo
reviewedNoMark the trade reviewed (true) or not (false).
stopLossNoPlanned stop price; null clears it.
playbookIdNoPlaybook / setup name this trade followed; null clears it.
removeTagsNoTags to remove (case-insensitive).
addMistakesNoMistakes to add.
profitTargetNoPlanned target price; null clears it.
removeMistakesNoMistakes to remove (case-insensitive).

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and openWorldHint=true. The description adds that fields are user-owned only, that fills/prices/P&L are immutable, and that OAuth with a LuxAlgo account is required. It doesn't disclose failure modes or what happens on partial updates beyond the null-clear rule.

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?

Front-loaded with the verb, but the enumerations of field names and the parenthetical asides make it dense and run-on. Every sentence carries information, but the wall-of-prose format hurts scannability.

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 13-parameter mutation tool with no output schema, it covers the key semantic distinctions (replace vs. add/remove, null clears, auth required, derived fields untouched). It could note the return shape or idempotency behavior more explicitly, but it's nearly complete.

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?

Schema coverage is 85%, so the baseline is 3. The description adds the semantic distinction that tags/mistakes are wholesale replacements vs. the add/remove variants, and clarifies that stopLoss is the reference for realized R — meaning beyond the schema's terse field 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?

States a specific verb and resource ('Annotate a trade') and enumerates exactly which fields are user-owned vs. derived. It explicitly distinguishes itself from sibling tools like journal_update_note by scoping to trade-level fields.

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?

Explicitly tells the agent when to use addTags/removeTags/addMistakes/removeMistakes instead of tags/mistakes, warns against combining them, and points to journal_list_tags for existing vocabulary. This is actionable routing guidance.

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

journal_write_noteWrite a journal noteAInspect

Add a new note to a trading day — any day, traded or not; date is YYYY-MM-DD in the journal timezone. Days hold any number of notes, so this never overwrites: to change an existing note use journal_update_note, and for a note about one specific trade use journal_update_trade's notes. Returns the note with its id. Requires signing in with a LuxAlgo account (OAuth).

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesThe note text (plain text or markdown).
dateYesThe day the note belongs to, YYYY-MM-DD in the journal timezone.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare a non-destructive write (readOnlyHint=false, destructiveHint=false), and the description adds real value on top: it explains why it never overwrites (days hold any number of notes), states the return value, and discloses the OAuth/LuxAlgo sign-in requirement. Auth prerequisites are exactly the kind of context annotations don't carry.

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 tight sentences, front-loaded with the core action, followed by the non-overwrite guarantee and the routing alternatives. No filler or repetition; every clause carries 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 simple two-parameter write tool, the description covers the action, the non-destructive guarantee, the alternatives, the return value, and the auth requirement. With no output schema, noting that it returns the note with its id is a helpful touch.

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 100% and both parameters are already documented with format and timezone. The description repeats the YYYY-MM-DD/journal-timezone constraint but adds no syntax or edge-case detail beyond the schema, so the baseline 3 applies.

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?

States a specific verb and resource ('Add a new note to a trading day') and immediately distinguishes itself from journal_update_note and journal_update_trade's notes. An agent can tell what this does and what it doesn't do without opening the schema.

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?

Explicitly names both alternatives and the condition that selects each: use journal_update_note to change an existing note, and journal_update_trade's notes for a trade-specific note. It also clarifies the day can be traded or not, removing ambiguity about applicability.

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

library_get_conceptGet a Library conceptAInspect

Explain a trading concept: the Library's full write-up as markdown — definition, formula, how traders read it, and its indicator implementations. Use for any 'what is X / how does X work' question. Needs the exact slug — find it with library_search or library_list_concepts.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesExact concept slug, e.g. 'rsi' or 'order-blocks' — from search or list results

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden. It discloses the output format (markdown), the content scope, and the exact-slug requirement, which are genuinely useful behavioral details. It does not discuss potential errors, output length, or non-existent-slug behavior, but the key behavior is well conveyed.

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, each earning its place: what the tool returns, when to use it, and what prerequisite knowledge is needed. The most important information is front-loaded.

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 single-parameter, read-only lookup tool with no output schema, this description is complete. It explains the tool's purpose, content, usage trigger, and parameter provenance, leaving no critical gap for correct invocation.

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 schema already fully documents the slug parameter, so the baseline is 3. The description adds meaningful semantics by emphasizing that the slug must be exact and should be obtained from search or list results, which helps agents avoid guessing or constructing invalid slugs.

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 identifies a specific action and resource: explaining a trading concept using the Library's full markdown write-up. It lists the content components (definition, formula, trader interpretation, indicator implementations), which clearly distinguishes it from sibling tools like library_get_indicator or library_get_source_code.

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 gives an explicit usage context: 'Use for any what is X / how does X work question.' It also routes the agent to library_search or library_list_concepts to obtain the required slug. It does not state explicit when-not-to-use conditions versus siblings, so it misses the top score.

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

library_get_familyGet a family hubAInspect

A family's hub page as markdown — the written overview of that school of analysis plus its complete concept roster. Use after library_list_families, or when the user asks about a whole area like 'SMC' or 'Wyckoff'.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesFamily key, e.g. 'smc-ict'

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are provided, so the description carries the burden of behavioral disclosure. It reveals the output type (markdown), the two main sections (overview and concept roster), and the informational/read-only nature of the call. It does not mention error cases or auth, but for a simple retrieval tool this is adequate.

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 with no filler. It front-loads what the tool returns, then gives a compact usage rule with concrete examples, all in minimal space.

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 a single enum-constrained parameter, no output schema, and no annotations, the description provides everything needed to invoke correctly: what is returned, in what format, and when to use it. The sibling routing is also covered.

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 100%, and the schema already documents the key parameter with an enum and an example value ('smc-ict'). The description adds usage context but no additional parameter-level meaning, so the baseline of 3 applies.

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 identifies the resource ('a family's hub page') and specifies the deliverable format ('as markdown') and content ('written overview ... plus its complete concept roster'). It distinguishes itself from library_get_concept by framing usage around a whole school of analysis, and from library_list_families by being a follow-up detail fetch.

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 tells the agent when to use this tool: after library_list_families, or when the user asks about a broad area such as 'SMC' or 'Wyckoff'. It stops short of explicitly naming the alternative for single-concept queries, but the 'whole area' phrasing implies that boundary.

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

library_get_indicatorGet a Library indicatorAInspect

Details for one indicator: what it does, how to read it, family, concept links, preview image — plus whether its source code is available (fetch the code itself with library_get_source_code). Use when the user asks about a specific indicator.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesIndicator slug, e.g. 'tri-star'

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of explaining behavior. It discloses what the tool returns in useful detail, including indicator semantics, how to read it, related concepts, preview image, and source-code availability. It doesn't mention error handling or explicit read-only guarantees, but the 'Get' semantics and content listing give a solid behavioral picture.

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 with no filler. The first sentence front-loads the tool's purpose and return contents, and the second provides a concrete usage trigger with an alternative. Every clause earns its place.

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 simple one-parameter lookup tool with no output schema, the description is complete: it explains what information the agent will receive, when to use the tool, and that source code is obtained via a sibling. Nothing critical is missing for correct selection and invocation.

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?

The input schema already fully documents the single 'slug' parameter with format guidance and an example ('tri-star'), giving 100% schema coverage. The description adds no additional parameter-specific detail, but it doesn't need to because the schema carries the meaning. Baseline 3 is appropriate.

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 identifies the tool as returning details for one specific indicator, listing concrete content types (what it does, how to read it, family, concept links, preview image, source availability). It also distinguishes itself from library_get_source_code by noting that the actual code is fetched by that sibling. An agent can confidently select this tool over its 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 explicitly says 'Use when the user asks about a specific indicator,' giving a clear trigger condition. It also points to library_get_source_code as the alternative when source code itself is requested, though it doesn't explicitly contrast with library_search or library_list_indicators for broader queries.

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

library_get_source_codeGet an indicator's source codeAInspect

The full, working source code of a Library indicator (works on TradingView). Kept separate from library_get_indicator because sources are long — call it only when the user wants the code itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesIndicator slug

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden. It discloses that the output is the full working source code, that it works on TradingView, and importantly that sources are long, implying a potentially large response. It does not mention error behavior or output formatting, but the core behavioral traits are covered.

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 deliver the resource, the key differentiating behavior, and explicit usage guidance with no wasted words. The most decision-relevant information appears first.

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 one-parameter read tool with no output schema, the description adequately describes the returned artifact: the full working source code. It also adds the important context that this is a TradingView indicator and that responses can be long. Slightly more detail about what happens for an invalid slug would push this higher, but the current content is sufficient for correct invocation.

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?

The input schema already documents the only parameter, slug, with 100% coverage. The description adds only that the slug refers to a Library indicator, which is marginal. Per the schema-coverage baseline, a 3 is appropriate.

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 identifies the specific verb+resource: retrieving the full working source code of a Library indicator. It also explicitly differentiates itself from the sibling library_get_indicator, so an agent can immediately tell which tool to select.

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 gives explicit usage guidance: call it only when the user wants the code itself, and explains why it is separate from library_get_indicator because sources are long. This is strong when-to-use and alternative-routing information.

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

library_list_conceptsList Library conceptsAInspect

Browse every trading and technical-analysis concept in the Library — paginated, optionally one family. Use to enumerate a topic area or find slugs for library_get_concept; for keyword lookup prefer library_search.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoDefault 0
familyNo
page_sizeNoDefault 50

TDQS

A4.7/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses that results are paginated and optionally filtered by one family, and implies a read-only browsing operation. It does not mention response format or rate limits, but the core behavior is clearly conveyed.

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 with no filler. The primary behavior is front-loaded, and the alternative-tool routing is stated in the same compact passage.

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 simple list tool with no required parameters, this description is complete: it states the scope, pagination, filtering, and relationship to sibling tools. The mention of finding slugs also signals what the output can be used for, which is sufficient given there is no output schema.

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?

Schema coverage is 67%, and the description adds useful meaning to the family parameter by explaining it as a filter for a single family and by tying pagination to the page and page_size parameters. The schema already documents defaults, so the description complements rather than repeats 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 a specific action ('Browse every trading and technical-analysis concept in the Library') and defines the pagination and optional family scoping. It distinguishes this tool from library_search and library_get_concept by naming the exact use cases.

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 says to use this tool to enumerate a topic area or find slugs for library_get_concept, and directs users to prefer library_search for keyword lookup. This gives clear when-to-use and when-not-to-use guidance relative to key siblings.

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

library_list_familiesList concept familiesAInspect

The Library's top-level taxonomy: 17 families of trading concepts (trend, momentum, SMC/ICT, statistics, …) with concept counts and hub links. The natural first call for orientation.

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?

No annotations are provided, so the description carries the burden of disclosing behavior. It does so by stating the tool returns 17 families, includes concept counts and hub links, and serves as a top-level taxonomy. The word 'list' plus the described output makes the read-only nature clear enough for this simple tool.

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 short sentences with no filler. The core information—top-level taxonomy, 17 families, examples, and output content—is front-loaded, and the usage cue is appended efficiently.

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 zero-parameter, simple listing tool with no output schema, the description provides enough context: what the result represents, roughly how many items, what each item includes, and when to use it. Nothing critical is missing for an agent to select and invoke this tool correctly.

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 description coverage is 100% by definition. The rubric sets a baseline of 4 for zero-parameter tools, and the description adds no unnecessary parameter claims while still explaining what the output contains.

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 names a specific verb and resource: listing concept families, and clearly characterizes them as the Library's top-level taxonomy with 17 items. This distinguishes it from sibling tools like library_list_concepts by emphasizing 'families' as the top-level grouping rather than individual concepts.

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 this is 'the natural first call for orientation,' giving clear guidance on when to invoke it. It does not explicitly mention alternatives or exclusions, but for a zero-parameter orientation tool this is sufficient context.

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

library_list_indicatorsList Library indicatorsAInspect

Browse the indicator catalog with filters and server-side sorting (newest first by default). Filter by family, concept slug (implementations of one concept), tags (ids from library_list_tags, AND-combined), trading platform, or plan tier. Use for structured browsing — 'latest indicators', 'everything in the volatility family', 'indicators implementing liquidity sweeps'; for keyword discovery prefer library_search.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoDefault 0
sortNoDefault: date
tagsNoTag ids (from library_list_tags); an indicator must carry every tag
textNoServer-side text filter
tierNoOnly indicators included in this LuxAlgo plan tier
familyNo
conceptNoConcept slug — only indicators linked to this concept, e.g. 'rsi'
platformNoTrading platform the indicator supports, e.g. 'metatrader'
directionNo
page_sizeNoDefault 24

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden, and it does a good job: it discloses server-side sorting, default newest-first ordering, AND-combination for tags, and what a concept slug means. It does not explicitly mention pagination behavior or response shape, but the schema documents page/page_size defaults and there is no mutation or auth concern implied.

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 compact sentences front-load the core behavior, list the filter dimensions, and close with concrete use cases and sibling routing. Every sentence earns its place with no repetition of schema details.

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 read-only browsing tool with 10 optional parameters, the description covers the main filter dimensions, sorting semantics, and the key sibling split. Minor gaps remain around supported platform values and return/pagination shape, but these are partly covered by the schema and not critical for correct invocation.

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?

Schema coverage is 80%, so the baseline is 3, and the description adds meaningful semantics: it explains the concept slug as 'implementations of one concept', sources tags from library_list_tags, and clarifies AND-combination. It also clarifies the default sort ordering, which informs the sort parameter.

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 names a specific action and resource: 'Browse the indicator catalog with filters and server-side sorting'. It explicitly contrasts itself with library_search ('for keyword discovery prefer library_search'), so an agent can distinguish this structured-browsing tool from its closest sibling.

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 gives explicit when-to-use examples ('latest indicators', 'everything in the volatility family', 'indicators implementing liquidity sweeps') and states the alternative for keyword-style queries. It also tells the agent that tag ids must come from library_list_tags, connecting it to the correct sibling tool.

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

library_list_tagsList indicator tagsAInspect

The Library's indicator tag vocabulary (behavioral traits like 'Volatility', 'Trailing-Stop', 'Repainting Functionality'). Returns ids to pass as the tags filter of library_list_indicators — tags are orthogonal to the concept-family taxonomy.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden; it does so by clarifying that the result is ids for downstream filtering rather than a display of tag metadata. It does not explicitly state read-only/pagination behavior, but a zero-parameter vocabulary listing implies no mutation and no pagination.

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 front-loaded sentences and every phrase earns its place; the key output semantics come before the relationship/orthogonality context.

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 simple zero-parameter list tool, the description is complete: it defines the vocabulary, gives examples, states the output type, and names the consuming sibling. No missing context would prevent a correct call.

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 no parameters, so the schema has nothing to document. The description adds value by explaining the return ids' meaning and destination, which is all an agent needs.

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?

States a specific action (returns ids from the indicator tag vocabulary) and names the downstream consumer (library_list_indicators). The note that tags are orthogonal to the concept-family taxonomy separates it from sibling concept/family listers.

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?

Explicitly tells the agent when this tool is relevant: to obtain ids for the tags filter of library_list_indicators. The orthogonality statement acts as a when-not, steering agents away from using it for concept-family filtering.

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

luxalgo_accountMy LuxAlgo accountA
Read-only
Inspect

The signed-in user's LuxAlgo account: plan tier, entitlements (limits such as alerts, historical bars, AI credits) and profile basics. Use it to tailor answers to what the user's plan actually allows, or when the user asks what plan they are on. Requires signing in with a LuxAlgo account (OAuth).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark the tool as read-only and open-world. The description adds value beyond that by specifying that data is scoped to the signed-in user and requires OAuth authentication. It also discloses what categories of data will be returned, giving the agent a clear behavioral model. There is no contradiction with 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 compact and front-loaded: the first sentence defines the resource and contents, the second supplies use cases, and the third states the authentication requirement. Every sentence earns its place with no filler or repetition of schema 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 zero-parameter, read-only account lookup tool, the description is self-sufficient. It tells the agent what fields are available, when to call the tool, and what prerequisite must be satisfied. No output schema exists, but the listed categories give enough shape for the agent to use the result correctly.

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 the schema coverage is trivially 100%, so the description has nothing to add for parameter invocation. The baseline of 4 for zero-parameter tools applies. The description instead appropriately focuses on the returned data and usage context.

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 identifies the resource as the signed-in user's LuxAlgo account and enumerates its contents: plan tier, entitlements, and profile basics. It lacks an explicit retrieval verb like 'get' or 'list', but the use-case sentence clarifies that it exposes account information. It is clearly distinct from the sibling tools, none of which cover account data.

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 gives concrete trigger conditions: use this tool to tailor answers to what the user's plan allows, or when the user asks what plan they are on. It also states the OAuth prerequisite. It does not explicitly name alternatives or exclusion cases, but no sibling tool covers the same account resource, so the guidance is sufficient.

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

propfirms_challenge_rulesGet a challenge's full rulesetAInspect

Fetch one directory challenge's complete ruleset (ChallengeSpec), adapted from the live LuxAlgo directory: evaluation steps (profit targets in percent units of the initial account, minimum trading days, time limits); the daily-loss rule with its exact semantics (basis = measured from prior-day balance vs prior-day equity; limitBasis = whether a pct limit is a fixed allowance of the initial balance or recomputed daily from the anchor; evaluation = breached on an intraday touch vs only at the close; includesOpenPnl = whether floating P&L can breach it); the max-loss rule and its drawdown mode (How the max-loss floor behaves - the single most consequential rule difference between firms. 'static-initial': floor fixed at initial balance minus the limit; never moves (classic CFD two-step). 'trailing-realized-eod': floor ratchets up with end-of-day balance highs; intraday highs do not move it. 'trailing-intraday-unrealized': floor trails the peak unrealized equity intraday and never stops trailing (futures-style; the most-miscalculated rule in the industry: it cuts pass probability dramatically). 'trailing-locks-at-initial': trails intraday peak equity until the floor reaches the initial balance, then freezes (common futures variant). Locking is also composable: locksAtInitial adds the same lock to an EOD trail, and lockOffsetAmount shifts the lock level to initial balance + that amount (e.g. 100 models 'stops trailing $100 above the start').); per-step consistency rules (steps[].consistency.maxBestDayProfitPct - SIMULATED: one outsized day effectively raises the target until the best-day share complies); fees (price, one-time vs monthly billing, reset fee, activation fee, refundable-on-pass); funded terms (profit split percent, payout frequency, first-payout minimum days, and funded.payoutRules - SIMULATED payout gating: minWinningDays, winningDayMinProfit, per-payout caps maxPayoutPctOfProfit/maxPayoutAmount, bufferAmount, and a windowed consistencyMaxBestDayPct gate); flagsNotSimulated (rules the entry declares but the engine does not simulate - material caveats to relay to the user); and sources (the firm-page citation when the directory serves one). The result also carries provenance and inferredFields - every rule read from free text instead of a structured column is named there; relay them and treat the firm's page as authoritative. The returned challenge object is exactly the shape the simulation tools accept as inline spec: copy it, change a rule, and re-simulate to quantify how a rule variation moves pass probability and EV. UNITS: every *Pct rule field and every percent-mode risk value is in PERCENT UNITS (5 = 5%, 0.5 = 0.5%). The one exception is winRate, which is a FRACTION in [0, 1] (0.55 = 55% winners). Probabilities in results are fractions in [0, 1]. DATA SOURCE & PROVENANCE: firm data comes live from LuxAlgo's public, keyless prop-firm directory API - the data behind luxalgo.com/prop-firms (origin overridable via the LUXALGO_APP_ORIGIN env var). Rule semantics are used verbatim where the directory serves structured rule columns; where it serves only free text, semantics are inferred ONLY when one reasonable reading exists, and every inferred field is disclosed in inferredFields (provenance 'directory+inferred') - relay those to the user next to any numbers. Challenges whose loss rules cannot be established are refused as not simulatable rather than guessed. Firms change rules; each firm's own page is always authoritative. NOTE: this returns the simulatable encoding of one challenge's rules; the directory listing with every captured field, plus live offers, is propfirms_get and propfirms_search_challenges.

ParametersJSON Schema
NameRequiredDescriptionDefault
firmIdYesDirectory firm id or firm name from propfirms_list_simulatable, e.g. 'ftmo'.
challengeIdYesDirectory challenge id from propfirms_list_simulatable.

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and delivers extensively: refusal behavior, provenance disclosure via `inferredFields`, data-source attribution with env-var override (LUXALGO_APP_ORIGIN), authority caveats ('Firms change rules; each firm's own page is always authoritative'), and a precise units convention. It even distinguishes simulated rules from declared-only ones via `flagsNotSimulated`.

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 front-loaded with the core purpose and organized via labeled sections (UNITS, DATA SOURCE & PROVENANCE, NOTE), which aids navigation in a very long text. However, it is exceptionally verbose, and the provenance/authoritative-page point is made roughly three times, so it does not fully meet 'every sentence earns its place.'

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?

There is no output schema and no annotations, yet the description documents the full return shape (evaluation steps, daily-loss and max-loss semantics, fees, funded terms, flagsNotSimulated, sources, provenance), the units convention, the data origin, and edge/refusal cases. An agent can call this tool and interpret its result accurately without any additional lookups.

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 description coverage is 100% and both parameter descriptions already name the source listing (propfirms_list_simulatable) and give an example ('ftmo'). The main description reinforces the origin of the IDs but adds no new syntax, defaults, or formats for firmId/challengeId beyond what the schema provides, so baseline 3 applies.

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 opening sentence states a specific verb and resource: 'Fetch one directory challenge's complete ruleset (ChallengeSpec)'. The closing NOTE explicitly distinguishes it from propfirms_get and propfirms_search_challenges, removing any ambiguity with the closest siblings.

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 end of the description gives explicit routing: 'the directory listing with every captured field, plus live offers, is propfirms_get and propfirms_search_challenges.' It also explains the integration path with simulation tools ('copy it, change a rule, and re-simulate') and states a refusal condition ('Challenges whose loss rules cannot be established are refused as not simulatable').

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

propfirms_compareCompare challenges for one traderAInspect

Simulate the SAME trader across several challenges (directory references and/or inline specs, up to 12) under identical options and seed, and return one row per challenge sorted by expected value. THIS IS NOT A RANKING: rows are ordered by EV for the caller's specific inputs - trader stats, risk sizing, and options - and a different trader profile reorders them. The tool computes data for the user's own decision; it implies no endorsement, league table, or recommendation of any firm, and results should be presented that way ('best EV for these inputs', never 'best firm'). Each row carries perAttemptPassProbability, fundedProbability, expectedAttempts, expectedCost, evTotal, pEvPositive, daysToFundedP50, and the challenge's flagsNotSimulated - challenges with more unsimulated rules have optimistic numbers, so compare flags alongside EV, not EV alone. Consistency rules and funded payout gating ARE simulated (engine v1), so EV already reflects them where a ruleset has them. For full per-challenge distributions run propfirms_simulate on the interesting rows. UNITS: every *Pct rule field and every percent-mode risk value is in PERCENT UNITS (5 = 5%, 0.5 = 0.5%). The one exception is winRate, which is a FRACTION in [0, 1] (0.55 = 55% winners). Probabilities in results are fractions in [0, 1]. DETERMINISM: identical inputs including seed reproduce byte-identical results on any platform. Include the seed and path count when reporting numbers so users can reproduce them exactly; re-run with a few different seeds to gauge Monte Carlo spread. ASSUMPTIONS: every result carries assumptions.flags - dataset-declared rules the engine does NOT simulate (e.g. scaling plans or soft daily lockouts, which make real odds worse than simulated) plus engine simplifications - and assumptions.disclaimer. These are material: always surface the flags and the disclaimer to the user alongside the numbers, never just the headline probability. Results are distributions under stated assumptions, not promises.

ParametersJSON Schema
NameRequiredDescriptionDefault
seedNoRNG seed (integer or string). Default 42. Same inputs + seed reproduce byte-identical results - include the seed when reporting so users can reproduce the numbers.
pathsNoMonte Carlo paths (independent simulated trader journeys). Default 10,000 (well under a second); capped at 100,000 per tool call. Confidence intervals shrink roughly with the square root of paths.
avgWinRYesAverage winning trade in R-multiples, i.e. multiples of the amount risked per trade (1.5 = winners average 1.5x the risk).
winRateYesProbability a trade is a winner, as a FRACTION in [0, 1] (0.55 = 55% winners) - NOT percent units. The most impactful input: traders routinely overestimate it by a few points, which can flip EV negative, so prefer measured stats over self-reported ones.
winStdRNoStandard deviation of winner sizes in R (0 = every winner is exactly avgWinR). Default 0. Adding spread makes streak damage more realistic.
avgLossRNoAverage losing trade in R, as a POSITIVE number. Default 1 (losers lose exactly the risked amount, i.e. stops are honored). Raise above 1 to model slippage or blown stops.
lossStdRNoStandard deviation of loser sizes in R (0 = every loser is exactly avgLossR). Default 0.
riskModeNoHow riskValue is interpreted. 'percent-of-balance' (default): risk compounds with the current balance. 'percent-of-initial': constant currency risk derived from the initial account size - how most prop traders size, since loss limits are fixed in currency. 'fixed-amount': explicit currency risked per 1R.
riskValueYesRisk per trade - the value of 1R. PERCENT UNITS for percent modes (0.5 = 0.5% risked per trade; a typical prop range is 0.25-2), or a currency amount for 'fixed-amount'. NOT a fraction.
attemptCapNoMaximum challenge attempts per path before that path gives up. Default 25. Journey statistics (expected attempts/cost, P(funded)) are censored at this cap.
challengesYesThe challenges to simulate this trader across (1-12 entries; 2+ for a meaningful comparison). Mix dataset references and inline specs freely.
tradesPerDayYesAverage trades per simulated trading day. More trades per day means more ways to hit the daily loss limit within a single day.
simulateFundedNoWhether to simulate the funded stage (payouts, blowup risk) after passing. Default true - EV is only meaningful with it on; set false to study the evaluation alone.
fundedHorizonDaysNoFunded-stage horizon in trading days for the payout/EV simulation. Default 90 (about 4 calendar months). EV scales with this choice - state it when reporting EV.
tradesPerDayModelNo'fixed' (default): the same count every day. 'poisson': daily count drawn Poisson(tradesPerDay); days can then have zero trades, which do not count as trading days.

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries full disclosure and does so thoroughly: EV ordering is input-dependent and not a ranking, unsimulated rules make numbers optimistic, consistency and payout gating ARE simulated, results are deterministic given seed, and outputs are distributions under assumptions, not promises.

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 long but every section earns its place, with clear CAPITALIZED signposts (UNITS, DETERMINISM, ASSUMPTIONS) and front-loaded behavior/scope before caveats. Given the tool's complexity, this density is appropriate rather than bloated.

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 complex Monte Carlo tool with no output schema and no annotations, the description is complete: it names the output row fields, explains assumptions/disclaimer handling, gives units, determinism, input forms, caps, and routes to propfirms_simulate for deeper analysis. Nothing essential to correct invocation is missing.

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?

Schema coverage is 100%, so the baseline is 3; the description adds value by establishing global unit conventions (percent units vs winRate as a fraction), explaining determinism/seed reporting, and warning that probabilities in results are fractions. It does not need to restate each field.

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 opening sentence names a specific verb and resource — 'Simulate the SAME trader across several challenges' — and clarifies the return shape (one row per challenge sorted by expected value). It also distinguishes itself from propfirms_simulate by deferring per-challenge distributions to that sibling.

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 gives clear context: compare the same trader across up to 12 challenges and states an explicit alternative ('For full per-challenge distributions run propfirms_simulate on the interesting rows'). It does not enumerate when-not conditions against every sibling, but the routing advice is unambiguous.

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

propfirms_getGet a prop firmAInspect

One prop firm's full dossier by slug: general profile (platforms, markets, payments, Trustpilot, restricted countries), every challenge with its rules, live offers with promo codes and affiliate links, and the written overview (about, rules, payout policy, FAQ). Find slugs with propfirms_search. Uncaptured (null) fields are omitted; challenges reference applicable offers via offerIds into the firm-level offers list. For simulated pass odds on this firm's challenges (reference archetypes, same engine as luxalgo.com/prop-firms), use propfirms_pass_rates.

ParametersJSON Schema
NameRequiredDescriptionDefault
propfirmIdYesPublic firm slug, e.g. 'ftmo'

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains that uncaptured null fields are omitted and that challenges reference offers through offerIds, which are meaningful behavioral details beyond the name. It could mention read-only behavior more explicitly, but 'get' plus the dossier framing strongly implies a safe retrieval.

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 dense but every sentence contributes: what the tool returns, how to find the slug, how nulls and offer references behave, and when to use a sibling tool. It is front-loaded with the core purpose and keeps auxiliary guidance compact.

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 there is no output schema and no annotations, the description does a strong job of setting expectations for a complex dossier response: it enumerates the major sections, explains omission behavior, clarifies cross-references between challenges and offers, and points to search and pass-rate tools. An agent has enough context to invoke the tool correctly and interpret the result.

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?

Schema coverage is 100% and the single parameter is already described as a public firm slug. The description adds value by stating that the parameter is used by slug and pointing to propfirms_search for discovering valid slugs, which helps the agent supply a correct value.

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 identifies the tool as retrieving one prop firm's full dossier by slug, with an explicit enumeration of the contents (profile, challenges, offers, overview). It distinguishes itself from sibling tools such as propfirms_search, propfirms_challenge_rules, and propfirms_pass_rates by focusing on the complete consolidated record.

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 gives direct usage guidance: use this to get a full dossier by slug, find slugs via propfirms_search, and use propfirms_pass_rates for simulated pass odds. This explicitly routes to alternative sibling tools, making the selection criteria clear.

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

propfirms_list_simulatableList prop firms and challengesAInspect

List the prop firms in the live LuxAlgo directory together with every simulatable challenge (challengeId, display name, account size, currency, price, and its rule-semantics provenance). Call this first to discover the firmId + challengeId pairs accepted by propfirms_challenge_rules, propfirms_simulate, propfirms_optimal_risk, propfirms_compare and propfirms_simulate_trades. Challenges whose loss-rule semantics cannot be established are listed under notSimulatable instead of being guessed. The listing is data, not endorsement: firms are alphabetical - no recommendation or ranking is implied, and none should be presented. DATA SOURCE & PROVENANCE: firm data comes live from LuxAlgo's public, keyless prop-firm directory API - the data behind luxalgo.com/prop-firms (origin overridable via the LUXALGO_APP_ORIGIN env var). Rule semantics are used verbatim where the directory serves structured rule columns; where it serves only free text, semantics are inferred ONLY when one reasonable reading exists, and every inferred field is disclosed in inferredFields (provenance 'directory+inferred') - relay those to the user next to any numbers. Challenges whose loss rules cannot be established are refused as not simulatable rather than guessed. Firms change rules; each firm's own page is always authoritative. NOTE: this lists only the firms and challenges whose rules the engine can encode honestly. The full directory — every visible firm with platforms, prices, payout terms, and live offers/promo codes — is served by propfirms_search, propfirms_search_challenges, and propfirms_search_offers.

ParametersJSON Schema
NameRequiredDescriptionDefault
productTypeNoOptional filter to one instrument class. Omit to list every firm.

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and does so thoroughly: it discloses the live API source, keyless access, origin override, alphabetical ordering with no endorsement, provenance of rule semantics, inferred-field disclosure, and refusal to guess unverifiable loss rules. This is far beyond what structured fields would reveal.

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 long but information-dense and well structured, with the core purpose and call-first guidance front-loaded, followed by data source and alternatives. A minor deduction for slight repetition of the 'rather than guessed' caveat in multiple sentences.

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 list tool with no output schema and no annotations, the description is remarkably complete: it names the returned attributes, the provenance model, the notSimulatable bucket, the authoritative-source caveat, and the sibling tools for fuller directory data. An agent has everything needed to invoke it correctly and interpret results.

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 description coverage is 100%: the one optional productType parameter is fully documented in the schema with enum values and a clear 'Omit to list every firm' instruction. The description adds no additional parameter-level meaning, so the baseline 3 is appropriate.

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 a specific verb and resource: it lists prop firms and every simulatable challenge with concrete fields. It also explicitly distinguishes itself from the full-directory siblings (propfirms_search, propfirms_search_challenges, propfirms_search_offers), so an agent can tell exactly what this tool provides.

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 says 'Call this first to discover the firmId + challengeId pairs accepted by' the other propfirms tools, which is explicit when-to-use guidance. It also clarifies what it does NOT cover by pointing to sibling tools for the full directory, platforms, prices, payout terms, and offers.

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

propfirms_optimal_riskFind pass- and EV-optimal risk per tradeAInspect

Sweep risk-per-trade over a grid, run the full journey simulation at every point, and report two optima separately: bestByPassProbability (the risk that maximizes a single attempt's chance of passing) and bestByEv (the risk that maximizes expected value across attempts, fees and funded payouts). They usually differ (diverges=true) - and that divergence is the insight: lower risk survives loss limits more often, but EV also weighs the cost of extra attempts and the size of funded payouts, which can favor a different risk. Never present one number as THE optimal risk; report both optima and the trade-off, and let the user choose. The sweep uses common random numbers (the same seed at every grid point), so curves are smooth and the argmax is signal, not Monte Carlo noise. Grid units follow riskMode: percent units for percent modes (default grid 0.1 to 3 in steps of 0.1, i.e. 0.1%-3% per trade), currency per trade for 'fixed-amount' (set min/max/step explicitly). Parametric trader only (riskValue is not a parameter here - the grid supplies it). Cost scales with grid size: one full simulation per point, so ~30 points at the default 10,000 paths takes roughly 10 seconds; use fewer paths or a coarser grid for a first pass, then refine around the optima. UNITS: every *Pct rule field and every percent-mode risk value is in PERCENT UNITS (5 = 5%, 0.5 = 0.5%). The one exception is winRate, which is a FRACTION in [0, 1] (0.55 = 55% winners). Probabilities in results are fractions in [0, 1]. DETERMINISM: identical inputs including seed reproduce byte-identical results on any platform. Include the seed and path count when reporting numbers so users can reproduce them exactly; re-run with a few different seeds to gauge Monte Carlo spread. ASSUMPTIONS: every result carries assumptions.flags - dataset-declared rules the engine does NOT simulate (e.g. scaling plans or soft daily lockouts, which make real odds worse than simulated) plus engine simplifications - and assumptions.disclaimer. These are material: always surface the flags and the disclaimer to the user alongside the numbers, never just the headline probability. Results are distributions under stated assumptions, not promises.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxNoGrid end, same units as min. Default 3 (= 3% per trade for percent modes).
minNoGrid start, in the risk units of riskMode (percent units for percent modes, currency for 'fixed-amount'). Default 0.1 (= 0.1% per trade for percent modes).
seedNoRNG seed (integer or string). Default 42. Same inputs + seed reproduce byte-identical results - include the seed when reporting so users can reproduce the numbers.
specNoInline challenge ruleset, for challenges not in the directory or for what-if rule edits. Mutually exclusive with firmId/challengeId. Identify the challenge EITHER by directory reference (firmId + challengeId, discovered via propfirms_list_simulatable; firmId accepts the directory id or the firm's name) OR by a full inline `spec` object - the exact shape propfirms_challenge_rules returns, so you can fetch a directory entry, change one rule, and re-simulate to model rule variations. Provide exactly one of the two forms; providing both or neither is an error. Directory references need network access; inline specs are fully offline.
stepNoGrid step, same units. Default 0.1. The sweep runs one full simulation per grid point, so (max - min) / step + 1 simulations in total - keep the grid coarse or paths low for a first pass.
pathsNoMonte Carlo paths (independent simulated trader journeys). Default 10,000 (well under a second); capped at 100,000 per tool call. Confidence intervals shrink roughly with the square root of paths.
firmIdNoDirectory firm id or firm name (e.g. 'ftmo' or 'FTMO'); discover with propfirms_list_simulatable. Must be paired with challengeId. Mutually exclusive with `spec`.
avgWinRYesAverage winning trade in R-multiples, i.e. multiples of the amount risked per trade (1.5 = winners average 1.5x the risk).
winRateYesProbability a trade is a winner, as a FRACTION in [0, 1] (0.55 = 55% winners) - NOT percent units. The most impactful input: traders routinely overestimate it by a few points, which can flip EV negative, so prefer measured stats over self-reported ones.
winStdRNoStandard deviation of winner sizes in R (0 = every winner is exactly avgWinR). Default 0. Adding spread makes streak damage more realistic.
avgLossRNoAverage losing trade in R, as a POSITIVE number. Default 1 (losers lose exactly the risked amount, i.e. stops are honored). Raise above 1 to model slippage or blown stops.
lossStdRNoStandard deviation of loser sizes in R (0 = every loser is exactly avgLossR). Default 0.
riskModeNoHow riskValue is interpreted. 'percent-of-balance' (default): risk compounds with the current balance. 'percent-of-initial': constant currency risk derived from the initial account size - how most prop traders size, since loss limits are fixed in currency. 'fixed-amount': explicit currency risked per 1R.
attemptCapNoMaximum challenge attempts per path before that path gives up. Default 25. Journey statistics (expected attempts/cost, P(funded)) are censored at this cap.
challengeIdNoDirectory challenge id; discover with propfirms_list_simulatable. Must be paired with firmId. Mutually exclusive with `spec`.
tradesPerDayYesAverage trades per simulated trading day. More trades per day means more ways to hit the daily loss limit within a single day.
simulateFundedNoWhether to simulate the funded stage (payouts, blowup risk) after passing. Default true - EV is only meaningful with it on; set false to study the evaluation alone.
fundedHorizonDaysNoFunded-stage horizon in trading days for the payout/EV simulation. Default 90 (about 4 calendar months). EV scales with this choice - state it when reporting EV.
tradesPerDayModelNo'fixed' (default): the same count every day. 'poisson': daily count drawn Poisson(tradesPerDay); days can then have zero trades, which do not count as trading days.

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full transparency burden and meets it well. It discloses cost (one full simulation per point, ~30 points at 10,000 paths takes ~10 seconds), common random numbers for smooth curves, byte-identical determinism with the same seed, the mandatory surfacing of assumptions flags/disclaimer, and the caveat that results are distributions, not promises.

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 long, but the tool is complex (19 parameters, nested spec, no output schema) and each section earns its place: purpose, divergence insight, CRN, units, determinism, performance, assumptions. It is front-loaded with the core purpose and then layered with necessary operational detail. Slightly repetitive in warnings, but justified for a high-stakes optimization tool.

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 the tool's complexity, 19 parameters, nested spec object, and no output schema, the description is remarkably complete. It covers the two result optima, the diverges flag, assumptions flags/disclaimer, unit conventions for all risk and probability values, reproducibility requirements, and cost/performance trade-offs. An agent has enough context to select and invoke this tool correctly and interpret its headline results.

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?

Schema coverage is 100% and each parameter already has rich descriptions, so the baseline is 3. The description adds value beyond the schema by explaining grid defaults (0.1 to 3 in steps of 0.1), grid units relative to riskMode, the winRate fraction exception, and performance implications of grid/path choices — going beyond what the schema alone provides.

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 a specific verb and resource: 'Sweep risk-per-trade over a grid, run the full journey simulation at every point, and report two optima separately'. It clearly distinguishes this from single-point simulation tools by noting 'riskValue is not a parameter here - the grid supplies it' and by naming the two output optima, bestByPassProbability and bestByEv.

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 gives strong contextual guidance: report both optima rather than one, use coarse grids or fewer paths for a first pass, refine around the optima, and re-run with different seeds to gauge Monte Carlo spread. It does not explicitly name sibling tools like propfirms_simulate as alternatives, but the 'Parametric trader only' and grid-supplies-risk statements imply the boundary. Clear context, but no direct when-not-to-use comparison.

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

propfirms_pass_ratesReference pass rates per archetypeAInspect

Reference challenge pass rates computed live from the directory's encoded rules with the same engine, seed (42), path count (10,000) and reference archetypes luxalgo.com/prop-firms uses — per challenge and per archetype (developing 45% win rate / consistent 48% / proven edge 52%, all risking conservatively). Returns per-attempt pass probability with 95% CI, P(funded), expected attempts and total cost, EV, payout probability, funded-blowup probability, each cell's assumption flag ids, and the ruleset's provenance (structured directory columns vs fields inferred from listing text — always relay inferred fields). Deterministic per ruleset and cached — cheap to call. These are REFERENCE odds for orientation and comparison, not the user's personal odds: for their own statistics use propfirms_simulate (summary stats) or propfirms_simulate_trades (their real trade series). Not a ranking; a firm's page is authoritative for current rules (check lastVerified). Expected costs use the directory's listed challenge prices; full firm profiles and live offers are directory data (propfirms_get, propfirms_search_offers).

ParametersJSON Schema
NameRequiredDescriptionDefault
firmIdYesDirectory firm id (propfirmId, e.g. 'ftmo') or firm name — from propfirms_list_simulatable.
challengeIdNoOne challenge id. Omit to compute every simulatable challenge the firm has.

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations provided, the description fully carries the transparency burden. It discloses determinism, caching, cheap invocation, the seed and path count, the reference archetype assumptions, returned metrics including confidence intervals and provenance, and the caveat that inferred fields must be relayed. It also warns that the firm's page is authoritative and to check lastVerified.

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 long and dense, but it front-loads the core purpose and scope before caveats and alternatives. Most of the detail is relevant to selecting, invoking, and interpreting the tool correctly, so the verbosity is justified even though a tighter structure could improve readability.

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 complex probabilistic tool with no output schema and no annotations, the description is unusually complete: it covers inputs, outputs, assumptions, caching, expected costs, limitations, and alternative tools. An agent should be able to call it correctly and interpret the results without additional information.

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?

The schema already describes both parameters with 100% coverage, including omitted challengeId behavior. The description adds context about per-challenge and per-archetype computation but does not materially improve on the schema's parameter documentation, so the baseline 3 is appropriate.

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 names a specific operation: compute reference challenge pass rates per challenge and per archetype from the directory's encoded rules. It distinguishes itself from a ranking and from user-specific simulation tools, and the scope is clear enough to tell it apart from siblings like propfirms_simulate.

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 these are reference odds, not the user's personal odds, and directs to propfirms_simulate or propfirms_simulate_trades for personal statistics. It also names propfirms_get and propfirms_search_offers as authoritative sources for current rules and live offers, providing strong when-to-use and when-not-to-use guidance.

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

propfirms_search_challengesSearch prop-firm challengesAInspect

Search funded-account challenges across all visible prop firms. Filter by challenge rules (account size, fee, steps, profit split, drawdown mode, news/copy/auto trading, weekend holding, …) and by parent-firm properties. Pass propfirmId to list one firm's challenges, or challengeId to fetch specific ones. include=['offers'] returns a deduplicated top-level offers list, with each challenge referencing its applicable offers via offerIds (firm-wide offers included). Uncaptured (null) rule fields are omitted from results and never match filters. This returns each challenge's listed rules and terms, not outcomes: to simulate a challenge found here pass its ids to propfirms_simulate or propfirms_pass_rates, and to screen one strategy across many challenges at once use propfirms_validate_strategy.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort key (default accountSize descending)
textNoCase-insensitive search over challenge name and firm name/slug
stepsNoExact evaluation step count (1 = instant/funded, 2 = two-step, …)
includeNoPass ['offers'] to attach live offers that apply to each challenge
intervalNoChallenge fee intervals, e.g. 'one-time', 'monthly'
priceMaxNoMaximum challenge fee (inclusive)
priceMinNoMinimum challenge fee (inclusive)
stepsMaxNoMaximum step count (ignored when steps is set)
stepsMinNoMinimum step count (ignored when steps is set)
directionNoSort direction; each sort key has a sensible default
pageIndexNo0-based page index (default 0)
maxLossMaxNoUpper bound on the overall-loss limit magnitude
propfirmIdNoPublic firm slugs, e.g. ['ftmo']
autoTradingNoWhether automated trading (EAs/bots) is allowed
availableInNoCountry names the firm must NOT restrict, e.g. ['United States']
challengeIdNoPublic challenge ids
copyTradingNoWhether copy trading is allowed
maxLossModeNoDrawdown modes; challenges without a captured mode never match
newsTradingNoWhether news trading is allowed
dailyLossMaxNoUpper bound on the daily-loss limit magnitude (smaller = stricter)
pageQuantityNoPage size (default 50, max 100)
productTypesNoProduct types the firm must offer at least one of, e.g. 'CFD', 'Futures'
challengeNameNoCase-insensitive substring of the challenge name
accountSizeMaxNoMaximum account size (inclusive)
accountSizeMinNoMinimum account size (inclusive)
maxLeverageMinNoMinimum max leverage
profitSplitMinNoMinimum trader profit-split percent
weekendHoldingNoWhether holding over the weekend is allowed
isFeeRefundableNoWhether the challenge fee is refundable
overnightHoldingNoWhether holding overnight is allowed
stoplossRequiredNoWhether a stop loss is required
tradingPlatformsNoPlatforms the firm must offer at least one of, e.g. 'MT5', 'cTrader', 'TradingView'
minTradingDaysMaxNoMaximum required minimum trading days (finds less-strict challenges)
tradedMarketTypesNoMarkets the firm must offer at least one of, e.g. 'forex', 'indices', 'commodities'
isPreferredPartnerNoOnly LuxAlgo preferred-partner firms when true

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does so well: it discloses that uncaptured null rule fields are omitted and never match filters, explains the deduplicated offers list behavior, and clarifies that this tool returns rules and terms, not outcomes. It could mention pagination or response shape more explicitly, but the disclosed edge cases are valuable.

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 front-loaded with the core purpose and filter scope, then moves to parameter usage, edge-case behavior, and sibling routing. Every sentence earns its place, and the parenthetical filter list conveys breadth without bloating the text.

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 35-parameter search tool with no output schema and no annotations, the description is remarkably complete: it covers input modes, optional offers expansion, null-filtering behavior, and clearly states what the tool does not return while pointing to the correct follow-up tools. The lack of a full output shape description is mitigated by the rich schema and the explicit 'rules and terms, not outcomes' framing.

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?

Schema coverage is 100%, so the baseline is 3. The description adds practical meaning beyond the schema for key parameters: propfirmId vs challengeId selection, include=['offers'] behavior, and null-field filter semantics. It does not need to restate all 35 parameters because the schema already documents them thoroughly.

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 a specific verb and resource: search funded-account challenges across visible prop firms, with filtering by challenge rules and firm properties. It also explicitly differentiates itself from simulation tools by saying it returns rules/terms, not outcomes. This clearly separates it from sibling tools like propfirms_simulate and propfirms_validate_strategy.

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 gives explicit usage scenarios: pass propfirmId to list one firm's challenges, challengeId to fetch specific ones, and include=['offers'] to attach offers. It also names alternatives and when to use them: propfirms_simulate/propfirms_pass_rates for outcomes and propfirms_validate_strategy for screening one strategy across many challenges.

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

propfirms_search_offersSearch prop-firm offersAInspect

Search promotional offers (discounts and promo codes) across prop firms — defaults to live (active, unexpired) offers only. propfirmId narrows to one firm; challengeId resolves the offers that apply to a challenge (firm-wide offers included). Every offer carries the promo code, discount, end date, and affiliate link.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort key (default: featured first, then discount)
textNoCase-insensitive search over promo code, descriptions, and firm name/slug
offerIdNoPublic offer ids
isActiveNoDefaults to live offers only; pass false to look at inactive offers
directionNoSort direction; each sort key has a sensible default
offerTextNoCase-insensitive search over promo code and offer descriptions
pageIndexNo0-based page index (default 0)
promoCodeNoCase-insensitive substring of the promo code
isFeaturedNoOnly featured offers when true
propfirmIdNoPublic firm slugs, e.g. ['ftmo']
challengeIdNoPublic challenge ids; an offer matches when it applies to at least one (all-challenges offers match that firm's challenges)
discountMaxNoMaximum discount value
discountMinNoMinimum discount value
pageQuantityNoPage size (default 50, max 100)
includeExpiredNoWhen true, ended offers are not hidden (default false)
includeInactiveNoWhen true, inactive offers are not hidden (default false)
discountIsPercentNotrue for percent discounts, false for absolute amounts

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full behavioral disclosure burden. It does a good job by stating the default live-only filter, explaining that challengeId includes firm-wide offers, and enumerating what each returned offer contains. It could go further by mentioning pagination or sort defaults, but the core behaviors an agent needs are disclosed.

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 with no filler. The core purpose is front-loaded, key filtering behavior is explained, and the output contents are summarized compactly. Every sentence 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?

Given 17 parameters, no output schema, and no annotations, the description supplies a strong high-level model: what offers are, the default scope, how two key filters work, and what fields appear in results. The schema already documents individual parameters, so the description doesn't need to restate them. Minor gaps like pagination defaults and sorting behavior are left to the schema.

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?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantic context beyond field names by clarifying that propfirmId narrows to one firm and that challengeId resolves offers applying to a challenge, including firm-wide offers. This helps agents combine filters correctly.

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 opens with a specific verb and resource: 'Search promotional offers (discounts and promo codes) across prop firms.' This clearly identifies the tool's domain and differentiates it from sibling tools like propfirms_search_challenges, which target challenges rather than offers.

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 default behavior ('defaults to live offers only') and how to narrow results using propfirmId and challengeId, but it never explicitly names alternative tools or states when to choose this tool over propfirms_search or propfirms_search_challenges. Usage context is implied rather than spelled out.

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

propfirms_simulateSimulate a trader through a challengeAInspect

Monte Carlo-simulate a trader with the given statistics through a prop-firm challenge and (by default) a funded horizon. Answers: "What is my chance of passing per attempt, and of ever getting funded? How many attempts and how much total money should I expect? Is this challenge positive expected value for me, and which rule actually kills my attempts?" Identify the challenge EITHER by directory reference (firmId + challengeId, discovered via propfirms_list_simulatable; firmId accepts the directory id or the firm's name) OR by a full inline spec object - the exact shape propfirms_challenge_rules returns, so you can fetch a directory entry, change one rule, and re-simulate to model rule variations. Provide exactly one of the two forms; providing both or neither is an error. Directory references need network access; inline specs are fully offline. The trader is described by flattened parametric fields (one clean design used across all tools): winRate (a FRACTION 0-1), avgWinR/avgLossR and optional winStdR/lossStdR in R-multiples (sizes relative to the amount risked per trade), tradesPerDay with a 'fixed' or 'poisson' day model, and risk sizing via riskMode + riskValue (percent units for percent modes). If you have the user's raw trade series rather than summary stats, prefer propfirms_simulate_trades - it preserves streaks. Returns structuredContent with the full SimResult: perAttempt.passProbability with a Wilson 95% CI and per-step pass rates plus a failure breakdown by rule (daily-loss vs max-loss vs time-limit - which tells the user WHAT to fix); journey.fundedProbability, attempts and cost distributions (cost includes prices, resets, monthly billing, activation, minus refunds), costGivenFunded and daysToFunded; perAttempt.avgDaysWhenPassed/avgDaysWhenFailed and perAttempt.stagnationDays (the longest run of days without a new equity high per attempt - the dead time between progress, which grows sharply as risk per trade shrinks); funded-stage payout distributions plus funded.payoutProbability (P(at least one payout | funded)) and funded.daysToFirstPayout - with payout gating these can be the deciding numbers, since getting funded is not the same as getting paid; ev.evTotal (mean payouts minus costs) with evStandardError and pPositive; drawdown stats; and assumptions (the fully-resolved spec/profile/options the engine actually ran, plus flags and disclaimer). Histogram arrays are omitted unless includeHistograms=true. A compact human summary is returned as text alongside. SIMULATED RULES (engine v1): consistency rules (steps[].consistency) and funded payout gating (funded.payoutRules) are actually SIMULATED, not merely flagged - a distinguishing feature of this engine. Consistency uses a rational stop rule (the trader stops a day once more profit cannot help and keeps trading until the best-day share complies - flag 'consistency-stop-rule'); payouts follow a maximum-withdrawal model (withdraw everything the rules allow above buffer/caps, never below the loss floor; balances and floors carry across payouts - flag 'funded-withdrawal-model'); a funded consistency gate is checked per payout window (flag 'funded-consistency-window-approximated'). The pre-1.0 flag id 'funded-payout-resets-account' no longer exists. UNITS: every *Pct rule field and every percent-mode risk value is in PERCENT UNITS (5 = 5%, 0.5 = 0.5%). The one exception is winRate, which is a FRACTION in [0, 1] (0.55 = 55% winners). Probabilities in results are fractions in [0, 1]. DETERMINISM: identical inputs including seed reproduce byte-identical results on any platform. Include the seed and path count when reporting numbers so users can reproduce them exactly; re-run with a few different seeds to gauge Monte Carlo spread. ASSUMPTIONS: every result carries assumptions.flags - dataset-declared rules the engine does NOT simulate (e.g. scaling plans or soft daily lockouts, which make real odds worse than simulated) plus engine simplifications - and assumptions.disclaimer. These are material: always surface the flags and the disclaimer to the user alongside the numbers, never just the headline probability. Results are distributions under stated assumptions, not promises. DATA SOURCE & PROVENANCE: firm data comes live from LuxAlgo's public, keyless prop-firm directory API - the data behind luxalgo.com/prop-firms (origin overridable via the LUXALGO_APP_ORIGIN env var). Rule semantics are used verbatim where the directory serves structured rule columns; where it serves only free text, semantics are inferred ONLY when one reasonable reading exists, and every inferred field is disclosed in inferredFields (provenance 'directory+inferred') - relay those to the user next to any numbers. Challenges whose loss rules cannot be established are refused as not simulatable rather than guessed. Firms change rules; each firm's own page is always authoritative. Composes with any broker-statistics tool: if another MCP server exposes round-trip statistics (winRate, avgWin, avgLoss) or a raw R-multiple series from the user's real trades, feed them here to answer "given my actual trading, what are my odds on this challenge and what risk should I use?". Convert currency statistics to R-multiples by dividing by the average amount risked per trade: winRate stays a fraction, avgWinR = avgWin / avgRisk, avgLossR = |avgLoss| / avgRisk.

ParametersJSON Schema
NameRequiredDescriptionDefault
seedNoRNG seed (integer or string). Default 42. Same inputs + seed reproduce byte-identical results - include the seed when reporting so users can reproduce the numbers.
specNoInline challenge ruleset, for challenges not in the directory or for what-if rule edits. Mutually exclusive with firmId/challengeId. Identify the challenge EITHER by directory reference (firmId + challengeId, discovered via propfirms_list_simulatable; firmId accepts the directory id or the firm's name) OR by a full inline `spec` object - the exact shape propfirms_challenge_rules returns, so you can fetch a directory entry, change one rule, and re-simulate to model rule variations. Provide exactly one of the two forms; providing both or neither is an error. Directory references need network access; inline specs are fully offline.
pathsNoMonte Carlo paths (independent simulated trader journeys). Default 10,000 (well under a second); capped at 100,000 per tool call. Confidence intervals shrink roughly with the square root of paths.
firmIdNoDirectory firm id or firm name (e.g. 'ftmo' or 'FTMO'); discover with propfirms_list_simulatable. Must be paired with challengeId. Mutually exclusive with `spec`.
avgWinRYesAverage winning trade in R-multiples, i.e. multiples of the amount risked per trade (1.5 = winners average 1.5x the risk).
winRateYesProbability a trade is a winner, as a FRACTION in [0, 1] (0.55 = 55% winners) - NOT percent units. The most impactful input: traders routinely overestimate it by a few points, which can flip EV negative, so prefer measured stats over self-reported ones.
winStdRNoStandard deviation of winner sizes in R (0 = every winner is exactly avgWinR). Default 0. Adding spread makes streak damage more realistic.
avgLossRNoAverage losing trade in R, as a POSITIVE number. Default 1 (losers lose exactly the risked amount, i.e. stops are honored). Raise above 1 to model slippage or blown stops.
lossStdRNoStandard deviation of loser sizes in R (0 = every loser is exactly avgLossR). Default 0.
riskModeNoHow riskValue is interpreted. 'percent-of-balance' (default): risk compounds with the current balance. 'percent-of-initial': constant currency risk derived from the initial account size - how most prop traders size, since loss limits are fixed in currency. 'fixed-amount': explicit currency risked per 1R.
riskValueYesRisk per trade - the value of 1R. PERCENT UNITS for percent modes (0.5 = 0.5% risked per trade; a typical prop range is 0.25-2), or a currency amount for 'fixed-amount'. NOT a fraction.
attemptCapNoMaximum challenge attempts per path before that path gives up. Default 25. Journey statistics (expected attempts/cost, P(funded)) are censored at this cap.
challengeIdNoDirectory challenge id; discover with propfirms_list_simulatable. Must be paired with firmId. Mutually exclusive with `spec`.
tradesPerDayYesAverage trades per simulated trading day. More trades per day means more ways to hit the daily loss limit within a single day.
simulateFundedNoWhether to simulate the funded stage (payouts, blowup risk) after passing. Default true - EV is only meaningful with it on; set false to study the evaluation alone.
fundedHorizonDaysNoFunded-stage horizon in trading days for the payout/EV simulation. Default 90 (about 4 calendar months). EV scales with this choice - state it when reporting EV.
includeHistogramsNoInclude histogram arrays (attempts, cost, net, drawdown) in the result. Default FALSE for this tool to keep responses compact; summary quantiles (p05...p95) are always included.
tradesPerDayModelNo'fixed' (default): the same count every day. 'poisson': daily count drawn Poisson(tradesPerDay); days can then have zero trades, which do not count as trading days.

TDQS

A4.8/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden, and it delivers: byte-identical determinism given a seed, Monte Carlo spread guidance ('re-run with a few different seeds'), explicit lists of what is simulated (consistency, payout gating) vs only flagged (scaling plans, soft daily lockouts), engine versioning and approximation flags, live data provenance with an env-var origin override, and the refusal behavior for challenges whose loss rules cannot be established. This is unusually complete behavioral disclosure for a compute-only tool.

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 long, but it is front-loaded (purpose and the questions it answers come first) and organized with uppercase section headers (SIMULATED RULES, UNITS, DETERMINISM, ASSUMPTIONS, DATA SOURCE & PROVENANCE), making it scannable. There is mild redundancy — the identification contract restates the spec parameter's schema description, and the trader-parameter sentence re-covers schema content — but for an 18-parameter tool with no output schema, the density is mostly earned rather than padded.

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 that there is no output schema, the description compensates thoroughly: it enumerates the full result shape (perAttempt, journey, funded, ev, assumptions, text summary), every unit convention, determinism and reproducibility requirements, assumption flags, and data provenance. For a tool this complex — 18 parameters with deeply nested spec/steps/funded objects and zero annotations — nothing an agent needs to call it correctly is missing.

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?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine value beyond the schema: the currency-to-R conversion formula (avgWinR = avgWin / avgRisk, avgLossR = |avgLoss| / avgRisk), the 'one clean design used across all tools' framing, and the spec mutation workflow (fetch a directory entry, change one rule, re-simulate). The 'provide exactly one of the two forms; providing both or neither is an error' contract is also clearer than the schema's scattered 'mutually exclusive' notes.

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?

Opens with a specific verb+resource+method: 'Monte Carlo-simulate a trader with the given statistics through a prop-firm challenge and (by default) a funded horizon,' and immediately enumerates the exact questions it answers (per-attempt pass chance, ever-funded probability, expected attempts/cost, EV, which rule kills attempts). It also names its closest sibling, propfirms_simulate_trades, and explains the summary-stats-vs-raw-series distinction, so an agent can tell the two apart without opening either schema.

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?

Provides an explicit when-not condition against the nearest alternative: 'If you have the user's raw trade series rather than summary stats, prefer propfirms_simulate_trades - it preserves streaks.' It also spells out the two identification modes (directory reference discovered via propfirms_list_simulatable vs inline spec matching propfirms_challenge_rules), the both-or-neither error contract, the network-vs-offline tradeoff, and how to compose with broker-statistics tools.

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

propfirms_simulate_tradesSimulate from a real trade seriesAInspect

Simulate a challenge by resampling the trader's OWN R-multiple trade series with a stationary block bootstrap instead of a win-rate model. WHY THIS BEATS WIN-RATE MATH: challenge rules are breached by streaks, not by averages - a daily-loss limit dies to a cluster of losses inside one day, and a trailing drawdown dies to a losing streak right after an equity peak. Real trade series are streaky (autocorrelation, volatility clustering, edge that comes and goes), and the stationary bootstrap resamples contiguous blocks of the actual series (geometric length, mean blockMeanLength, default 5 trades), so the trader's real streak structure survives into every simulated day. A parametric model with identical summary statistics shuffles trades independently and therefore understates breach risk for streaky traders. Use propfirms_simulate when only summary stats are available; use this whenever the actual trades are. Provide the series as rSeries (array of R-multiples: each trade's P&L divided by the amount risked on it), rSeriesText (pasted JSON/CSV/whitespace text, optional 'R' suffix per value), or one of the timestamped-log inputs below; exactly one of the four, at least 10 trades, 100+ strongly recommended. Returns the same full SimResult as propfirms_simulate (structuredContent, histograms off by default) plus a text summary that also reports the sample's win rate and mean R. TIMESTAMPED LOGS: tradeLogText accepts a pasted CSV/TSV trade log with a header row (open time and R required; close time and direction optional; loose header names are matched; timestamps without an offset are read as UTC). The R-series and, unless tradesPerDay is passed, the trades-per-day rate are derived from the log, and parse warnings are surfaced in the text output. NEWS WINDOWS: with a timestamped input, newsFilter runs the simulation TWICE on the same seed and options, once on the full history and once without the trades opened inside configurable windows around scheduled releases (a built-in recurring-template calendar of high- and medium-impact events across USD, EUR, GBP, JPY, AUD, CAD, CHF, NZD, plus optional custom event times). The returned SimResult is the news-avoided scenario; structuredContent.newsComparison carries both scenarios' pass probability, funded probability and EV, the excluded-trade count, and a calendar caveat that must be relayed verbatim. PORTFOLIO MODE: tradeLogTexts (2 to 5 logs) merges several timestamped histories into one chronological series and simulates the combined account, so cross-strategy loss clustering survives. Overlap across the histories is ALWAYS analyzed and attached as structuredContent.portfolioOverlap; the text summary carries the audit-risk verdict, and a 'high' verdict is an explicit warning that a prop firm may audit or refuse payouts for correlated accounts. SIMULATED RULES (engine v1): consistency rules (steps[].consistency) and funded payout gating (funded.payoutRules) are actually SIMULATED, not merely flagged - a distinguishing feature of this engine. Consistency uses a rational stop rule (the trader stops a day once more profit cannot help and keeps trading until the best-day share complies - flag 'consistency-stop-rule'); payouts follow a maximum-withdrawal model (withdraw everything the rules allow above buffer/caps, never below the loss floor; balances and floors carry across payouts - flag 'funded-withdrawal-model'); a funded consistency gate is checked per payout window (flag 'funded-consistency-window-approximated'). The pre-1.0 flag id 'funded-payout-resets-account' no longer exists. UNITS: every *Pct rule field and every percent-mode risk value is in PERCENT UNITS (5 = 5%, 0.5 = 0.5%). The one exception is winRate, which is a FRACTION in [0, 1] (0.55 = 55% winners). Probabilities in results are fractions in [0, 1]. DETERMINISM: identical inputs including seed reproduce byte-identical results on any platform. Include the seed and path count when reporting numbers so users can reproduce them exactly; re-run with a few different seeds to gauge Monte Carlo spread. ASSUMPTIONS: every result carries assumptions.flags - dataset-declared rules the engine does NOT simulate (e.g. scaling plans or soft daily lockouts, which make real odds worse than simulated) plus engine simplifications - and assumptions.disclaimer. These are material: always surface the flags and the disclaimer to the user alongside the numbers, never just the headline probability. Results are distributions under stated assumptions, not promises. Composes with any broker-statistics tool: if another MCP server exposes round-trip statistics (winRate, avgWin, avgLoss) or a raw R-multiple series from the user's real trades, feed them here to answer "given my actual trading, what are my odds on this challenge and what risk should I use?". Convert currency statistics to R-multiples by dividing by the average amount risked per trade: winRate stays a fraction, avgWinR = avgWin / avgRisk, avgLossR = |avgLoss| / avgRisk.

ParametersJSON Schema
NameRequiredDescriptionDefault
seedNoRNG seed (integer or string). Default 42. Same inputs + seed reproduce byte-identical results - include the seed when reporting so users can reproduce the numbers.
specNoInline challenge ruleset, for challenges not in the directory or for what-if rule edits. Mutually exclusive with firmId/challengeId. Identify the challenge EITHER by directory reference (firmId + challengeId, discovered via propfirms_list_simulatable; firmId accepts the directory id or the firm's name) OR by a full inline `spec` object - the exact shape propfirms_challenge_rules returns, so you can fetch a directory entry, change one rule, and re-simulate to model rule variations. Provide exactly one of the two forms; providing both or neither is an error. Directory references need network access; inline specs are fully offline.
pathsNoMonte Carlo paths (independent simulated trader journeys). Default 10,000 (well under a second); capped at 100,000 per tool call. Confidence intervals shrink roughly with the square root of paths.
firmIdNoDirectory firm id or firm name (e.g. 'ftmo' or 'FTMO'); discover with propfirms_list_simulatable. Must be paired with challengeId. Mutually exclusive with `spec`.
rSeriesNoThe trader's real trades as R-multiples in chronological order: each trade's P&L divided by the amount risked on it (+1.8 = won 1.8x risk, -1 = lost exactly the risk, -1.4 = stop slipped 40%). At least 10 trades; 100+ strongly recommended - short series make the simulation overconfident in the sample. Mutually exclusive with rSeriesText, tradeLogText, and tradeLogTexts.
riskModeNoHow riskValue is interpreted. 'percent-of-balance' (default): risk compounds with the current balance. 'percent-of-initial': constant currency risk derived from the initial account size - how most prop traders size, since loss limits are fixed in currency. 'fixed-amount': explicit currency risked per 1R.
riskValueYesRisk per trade - the value of 1R. PERCENT UNITS for percent modes (0.5 = 0.5% risked per trade; a typical prop range is 0.25-2), or a currency amount for 'fixed-amount'. NOT a fraction.
attemptCapNoMaximum challenge attempts per path before that path gives up. Default 25. Journey statistics (expected attempts/cost, P(funded)) are censored at this cap.
importRiskNoRisk per trade for imports that carry P&L but no risk data (e.g. TradingView, MT5 deals, broker JSON, ThinkOrSwim): cash risked per trade ("25") or a percent of entry value ("1%"). Applies to tradeLogText/tradeLogTexts only, is labeled rSource inferred, and is never applied silently: without it such files are refused with needs-risk.
newsFilterNoWhat-if comparison: what are my odds if I do not OPEN trades around scheduled news? Requires a timestamped input (tradeLogText or tradeLogTexts). The simulation runs TWICE with the same seed and options, once on the full history and once with every trade opened inside [event - preMinutes, event + postMinutes] removed; trades opened earlier but held through an event are only counted, not removed. The returned SimResult is the news-AVOIDED scenario; structuredContent.newsComparison carries both scenarios' headline numbers, the excluded-trade count, and a calendar caveat that MUST be relayed to the user (the calendar is a recurring-template approximation of scheduled releases, not a historical feed).
challengeIdNoDirectory challenge id; discover with propfirms_list_simulatable. Must be paired with firmId. Mutually exclusive with `spec`.
rSeriesTextNoThe same series as pasted text: a JSON array, CSV, or whitespace/newline separated numbers, with an optional 'R' suffix per value (e.g. "1.8R, -1R, 0.4, 2.1"). Parsed with the library's parseRSeries; unparseable tokens are reported back. Mutually exclusive with rSeries, tradeLogText, and tradeLogTexts.
tradeLogTextNoThe trader's trades as one pasted TIMESTAMPED log instead of a bare series. Accepted formats, auto-detected: the generic CSV template (header: open time,close time,symbol,direction,quantity,entry price,exit price,stop loss,pnl,fees,r), plain timestamped CSV/TSV logs (open time + R columns), real platform exports: TradingView strategy-tester list of trades (both generations), MT4/MT5 account statements (CSV or pasted HTML), MT5 deals tables, and ThinkOrSwim account statements, plus broker trade-history JSON in the @luxalgo/broker-sdk shape (a bare fills array, {"trades": [...]}, or one snapshot account; fills replay FIFO into round trips with price-based P&L, disclosed). Timestamps WITHOUT an explicit offset are read as UTC. Files that carry P&L but no risk information need importRisk to become R-multiples; ambiguous rule readings are refused with diagnostics rather than guessed, and skipped rows are reported as warnings. Timestamps unlock two things a bare series cannot do: tradesPerDay is derived from the log when not given, and newsFilter can compare odds with and without trading around news. Mutually exclusive with rSeries, rSeriesText, and tradeLogTexts.
tradesPerDayNoAverage trades per simulated trading day. REQUIRED with rSeries/rSeriesText, which carry no timestamps. Optional with tradeLogText/tradeLogTexts: when omitted it is derived from the log's own timestamps (trades divided by distinct UTC trading days) and the output says so. More trades per day means more ways to hit the daily loss limit within a single day.
tradeLogTextsNoPORTFOLIO MODE: 2 to 5 timestamped trade logs (same format as tradeLogText), one per strategy or account. They are merged into one chronological series and the combined account is simulated, which preserves cross-strategy loss clustering (exactly what daily and max loss limits punish). Overlap across the histories is ALWAYS analyzed and attached as structuredContent.portfolioOverlap with an audit-risk verdict; see the attached structuredContent.portfolioOverlap analysis for the methodology. Mutually exclusive with rSeries, rSeriesText, and tradeLogText.
simulateFundedNoWhether to simulate the funded stage (payouts, blowup risk) after passing. Default true - EV is only meaningful with it on; set false to study the evaluation alone.
blockMeanLengthNoMean block length of the stationary bootstrap (geometrically distributed blocks). Default 5 trades. 1 = i.i.d. resampling (destroys streaks - only for comparison); raise toward 10 if the trader's edge comes and goes in long regimes.
fundedHorizonDaysNoFunded-stage horizon in trading days for the payout/EV simulation. Default 90 (about 4 calendar months). EV scales with this choice - state it when reporting EV.
includeHistogramsNoInclude histogram arrays (attempts, cost, net, drawdown) in the result. Default FALSE for this tool to keep responses compact; summary quantiles (p05...p95) are always included.
tradesPerDayModelNo'fixed' (default): the same count every day. 'poisson': daily count drawn Poisson(tradesPerDay); days can then have zero trades, which do not count as trading days.

TDQS

A4.8/5.0
Behavior5/5

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

With zero annotations, the description carries the full burden and delivers extensively: it discloses the resampling methodology (geometric block lengths, default blockMeanLength 5), that newsFilter runs the simulation TWICE and returns the news-avoided scenario, that portfolio overlap is ALWAYS analyzed with an audit-risk verdict warning, that consistency and payout rules are SIMULATED (with named flags), determinism guarantees, and the mandatory surface-the-assumptions-flags requirement. Even a removed pre-1.0 flag id is disclosed.

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 long but deliberately structured with scannable section headers (TIMESTAMPED LOGS, NEWS WINDOWS, PORTFOLIO MODE, SIMULATED RULES, UNITS, DETERMINISM, ASSUMPTIONS) and is front-loaded with the core purpose and differentiator. Some content repeats what the exhaustive schema already states (e.g., input format details), and the statistical rationale paragraph is slightly verbose for an agent audience, but each section earns its place given the tool's genuine complexity.

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 20-parameter tool with a deeply nested spec, no output schema, and no annotations, this description is remarkably complete: it covers input selection and mutual exclusivity, minimum data requirements, return shape (references the same SimResult as propfirms_simulate plus named result fields like structuredContent.newsComparison and portfolioOverlap), error behavior (ambiguous imports refused with diagnostics, skipped rows reported as warnings), and mandatory user-relay obligations (calendar caveat verbatim, assumption flags and disclaimer).

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?

Schema coverage is 100%, so baseline is 3, and the description adds real value on top: it interprets R-multiples with worked examples, explains when tradesPerDay is required vs. derived, gives tuning guidance for blockMeanLength (1 = i.i.d. destroys streaks; raise toward 10 for long regimes), and its UNITS section clarifies the winRate fraction exception and that results are fractions. It supplements rather than merely restates 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?

The opening sentence states a specific verb, resource, and method: 'Simulate a challenge by resampling the trader's OWN R-multiple trade series with a stationary block bootstrap instead of a win-rate model.' It actively differentiates from propfirms_simulate by naming the alternative mechanism (win-rate model vs. actual trade series), so an agent can tell them apart immediately from the first line.

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?

Explicit routing guidance is given: 'Use propfirms_simulate when only summary stats are available; use this whenever the actual trades are.' It also states hard input constraints (exactly one of four input forms, at least 10 trades, 100+ recommended), which inputs require tradesPerDay, which are mutually exclusive, and it even provides conversion guidance for composing with broker-statistics tools (avgWinR = avgWin / avgRisk).

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

propfirms_validate_strategyScreen a strategy across all challengesAInspect

Answer 'which challenges would MY strategy actually pass?' in one call: simulate the given strategy through every simulatable challenge in the live directory (optionally scoped by productType, account-size range, priceMax, or firm) and split the results by an explicit, caller-stated bar. Describe the strategy EITHER as real trades (rSeries/rSeriesText R-multiples, preferred: the stationary block bootstrap preserves streaks, which is what breaches loss limits) OR as summary stats (winRate + avgWinR, optional spreads), plus tradesPerDay and risk sizing (riskMode + riskValue). The bar is minPassPerAttempt (a fraction, default 0.5) with optional requirePositiveEv; always state the bar when relaying results. Returns per challenge: pass probability per attempt with 95% CI, P(funded), expected attempts and total cost, EV over the funded horizon, P(EV>0), assumption flag ids, and which rule semantics were inferred from listing text. HONESTY FRAME: this is a screen of distributions for the caller's inputs and bar, NOT a ranking or endorsement; challenges whose rules cannot be encoded honestly are excluded and counted, never guessed; flagged (unsimulated) rules make numbers optimistic, so relay flags. One full simulation runs per challenge (default 5,000 paths each; results are deterministic per seed), and scopes above 40 challenges are refused rather than silently truncated: narrow the scope instead. Numbers move with risk sizing; sweep one challenge with propfirms_optimal_risk afterwards. Fees and expected costs use the directory's listed prices (live discounts are NOT applied); prices, firm profiles, and current offers are directory data (propfirms_search_challenges, propfirms_get, propfirms_search_offers).

ParametersJSON Schema
NameRequiredDescriptionDefault
firmNoRestrict to one firm by propfirmId or name (e.g. 'ftmo').
seedNoRNG seed (integer or string). Default 42. Same inputs + seed reproduce byte-identical results — include the seed when reporting so users can reproduce the numbers.
pathsNoMonte Carlo paths PER CHALLENGE. Default 5,000 here (one full simulation runs per challenge in scope, so this tool costs number-of-challenges times one simulation); raise it to tighten confidence intervals on a narrowed scope.
avgWinRNoAverage winning trade in R-multiples, i.e. multiples of the amount risked per trade (1.5 = winners average 1.5x the risk).
rSeriesNoThe strategy's real trades as R-multiples in chronological order (P&L divided by amount risked; +1.8 = won 1.8x risk, -1 = lost the risk). At least 10 trades, 100+ recommended. When given, the screen uses the stationary block bootstrap (streaks preserved) instead of winRate/avgWinR.
winRateNoProbability a trade is a winner, as a FRACTION in [0, 1] (0.55 = 55% winners) — NOT percent units. The most impactful input: traders routinely overestimate it by a few points, which can flip EV negative, so prefer measured stats over self-reported ones.
winStdRNoStandard deviation of winner sizes in R (0 = every winner is exactly avgWinR). Default 0. Adding spread makes streak damage more realistic.
avgLossRNoAverage losing trade in R, as a POSITIVE number. Default 1 (losers lose exactly the risked amount, i.e. stops are honored). Raise above 1 to model slippage or blown stops.
lossStdRNoStandard deviation of loser sizes in R (0 = every loser is exactly avgLossR). Default 0.
priceMaxNoOnly challenges costing at most this.
riskModeNoHow riskValue is interpreted. 'percent-of-balance' (default): risk compounds with the current balance. 'percent-of-initial': constant currency risk derived from the initial account size — how most prop traders size, since loss limits are fixed in currency. 'fixed-amount': explicit currency risked per 1R.
riskValueYesRisk per trade — the value of 1R. PERCENT UNITS for percent modes (0.5 = 0.5% risked per trade; a typical prop range is 0.25-2), or a currency amount for 'fixed-amount'. NOT a fraction.
attemptCapNoMaximum challenge attempts per path before that path gives up. Default 25. Journey statistics (expected attempts/cost, P(funded)) are censored at this cap.
productTypeNoRestrict the screen to one instrument class.
rSeriesTextNoThe same series as pasted text (JSON, CSV, or whitespace separated, optional 'R' suffix). Mutually exclusive with rSeries.
tradesPerDayYesAverage trades per simulated trading day. More trades per day means more ways to hit the daily loss limit within a single day.
accountSizeMaxNoOnly challenges with at most this account size.
accountSizeMinNoOnly challenges with at least this account size.
simulateFundedNoWhether to simulate the funded stage (payouts, blowup risk) after passing. Default true — EV is only meaningful with it on; set false to study the evaluation alone.
blockMeanLengthNoBootstrap mean block length in trades. Default 5. Only used with rSeries/rSeriesText.
fundedHorizonDaysNoFunded-stage horizon in trading days for the payout/EV simulation. Default 90 (about 4 calendar months). EV scales with this choice — state it when reporting EV.
minPassPerAttemptNoThe pass bar as a FRACTION in [0, 1]: a challenge counts as passing when the simulated per-attempt pass probability is at least this. Default 0.5. State the bar when relaying results.
requirePositiveEvNoAdditionally require expected value (payouts minus all fees over the funded horizon) above zero. Default false.
tradesPerDayModelNo'fixed' (default): the same count every day. 'poisson': daily count drawn Poisson(tradesPerDay); days can then have zero trades, which do not count as trading days.

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden, and it exceeds it: it discloses that this is a screen, not a ranking/endorsement; that flagged rules make numbers optimistic; that results are deterministic per seed; that one full simulation runs per challenge; and that fees use listed prices without live discounts. It also warns about risk-sizing sensitivity and the need to state the bar when relaying results.

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 long but every sentence earns its place given the tool's complexity and 24 parameters. It front-loads the core purpose and bar concept, then packs behavioral caveats, parameter semantics, and sibling routing without 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?

For a complex 24-parameter tool with no output schema and no annotations, the description is remarkably complete: it specifies the return fields per challenge, the simulation methodology and defaults, refusal behavior, fee assumptions, reproducibility, and related tools. Nothing essential for correct invocation is missing.

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?

Schema coverage is 100%, so the baseline is 3, and the description adds value on top: it explains which strategy inputs are alternatives (rSeries/rSeriesText vs winRate/avgWinR), why rSeries is preferred (streak preservation), and emphasizes that riskValue is percent units not a fraction. It also frames minPassPerAttempt as the caller-stated bar and clarifies that funded-horizon EV scales with fundedHorizonDays.

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 a specific verb and resource: 'simulate the given strategy through every simulatable challenge in the live directory' and answers a direct caller question ('which challenges would MY strategy actually pass?'). It clearly distinguishes itself from sibling tools like propfirms_simulate and propfirms_optimal_risk by framing this as an all-challenges screen with an explicit bar.

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 gives explicit when-to-use context: use it to screen across challenges, and use propfirms_optimal_risk to sweep one challenge afterwards. It also states exclusions and limits (challenges whose rules cannot be encoded honestly are excluded and counted, scopes above 40 challenges are refused) and points to sibling tools for directory data, so an agent can choose correctly.

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

trackers_datasetsList Market Trackers datasetsAInspect

The Market Trackers catalog: every dataset of US public-record market data the LuxAlgo pipeline publishes as CC0 dumps — congressional trades, insider (Forms 3/4/5) transactions, 13F holdings, federal contracts and grants, lobbying filings, FINRA short-sale volume, granted patents, clinical trials, FDA drug events, CFTC positioning, federal bills, FEC campaign finance, hearing transcripts, Federal Reserve communications, committee assignments, Wikipedia pageviews. Returns each dataset's row count, freshness, the years with data (live tree vs deep-history archives), and whether it is ticker-searchable. Pass dataset for the full field roster, filterable paths, caveats, per-year coverage, source health, and dump URLs — read it before composing trackers_query filters.

ParametersJSON Schema
NameRequiredDescriptionDefault
datasetNoOne dataset for the detailed view; omit to list all

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden; it discloses both list-mode returns (row count, freshness, years, searchable flag) and detail-mode returns (field roster, filterable paths, caveats, per-year coverage, source health, dump URLs). It implies read-only operation but does not discuss output structure, rate limits, or auth; for a catalog/list tool this is a minor gap.

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 paragraph with the core purpose front-loaded and no filler. The dataset enumeration partly overlaps with the schema enum, but it expands terse enum labels into understandable categories, so it earns its place; still, it could be tightened slightly.

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?

With one optional enum parameter, no annotations, and no output schema, the description fully covers what the agent needs: what the tool lists, what each mode returns, and how to use it as a prerequisite for trackers_query. No critical invocation detail is missing.

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 schema already fully covers the enum and says 'omit to list all', so the baseline is 3. The description adds meaning beyond the schema by explaining that passing dataset yields the full field roster, filterable paths, caveats, per-year coverage, source health, and dump URLs, and by tying this to trackers_query filter composition.

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 identifies the tool as the 'Market Trackers catalog' and states exactly what it returns (row count, freshness, year coverage, ticker-searchability), making the listing purpose unmistakable. It differentiates from query siblings by positioning itself as the catalog to consult before composing trackers_query filters. This is more than just the title.

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 gives explicit context: call without dataset to list all and pass a dataset for the detailed view, and instructs the agent to read it before composing trackers_query filters. It only names trackers_query as an alternative and does not contrast with trackers_latest or trackers_ticker, so it lacks full exclusion coverage.

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

trackers_latestNewest Market Trackers rowsAInspect

What the last daily publish added to one dataset — the newest ingestion day's rows (the dumps' latest.json), optionally narrowed by ticker or text. The cheapest way to see what is new: today's insider filings, this week's congressional disclosures, the latest lobbying registrations. Not available for snapshot-only bulk datasets (patents); use trackers_query there.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoOrder by event date (default newest)
textNoCase-insensitive substring over the dataset's name/title fields (member, insider, issuer, recipient, registrant and client, sponsor, assignee, bill title, …); see textPaths in trackers_datasets
limitNoRows to return (default 25, max 100)
whereNoExact field matches by dot path, e.g. {"side":"buy"}, {"member.state":"CA"}, {"code":"P"}, {"formType":"4"}; string comparisons are case-insensitive, arrays match when any element does
offsetNoRows to skip, for paging (default 0)
tickerNoTrading symbol, case-insensitive (e.g. 'NVDA'); matches the dataset's ticker field(s). Only datasets flagged tickerSearchable carry tickers.
datasetYesDataset id, from trackers_datasets

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden. It discloses that only the latest daily publish is returned rather than full history, that selection can be narrowed by ticker/text, and that patents are unsupported. It does not explicitly state output shape or read-only behavior, but the wording makes the read-only nature clear.

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 with no filler: the core scoping fact is front-loaded, followed by concrete examples and an explicit exclusion/alternative. Every sentence 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?

For a read-only list tool with a fully documented input schema, the description covers what the tool returns, when to use it, and when not to use it. It leaves output shape unspecified, but with no output schema and rich parameter documentation this is a modest gap rather than a critical one.

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 description coverage is 100%, so every parameter is already documented. The description adds a small amount of guidance by highlighting ticker/text narrowing, but otherwise does not meaningfully extend the schema's parameter documentation.

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 precisely defines what the tool returns: the newest ingestion day's rows from latest.json for one dataset, optionally filtered by ticker or text. It distinguishes itself from sibling trackers_query by explicitly naming where that alternative applies (patents).

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 gives concrete use cases ('today's insider filings, this week's congressional disclosures, the latest lobbying registrations') and an explicit when-not condition: not available for patents, with the instruction to use trackers_query there. This directly routes the agent to the correct sibling.

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

trackers_queryQuery a Market Trackers datasetAInspect

Search one Market Trackers dataset by ticker, free text, exact field values, and event-date range, with paging and newest/oldest ordering. Data is read from year-sharded CC0 dumps: pass years (or since/until) to choose which years to read — default is the newest year with data. Deep-history years (see archiveYears in trackers_datasets) can be tens of MB compressed each, so read them one or two at a time; the tool refuses selections over its byte budget and says how to narrow. Every row carries provenance.sourceUrl (the SEC filing, disclosure, award, or record it came from). Examples: insider purchases at NVDA in 2024 → dataset insider-transactions, ticker NVDA, years [2024], where {code: 'P'}; a senator's trades → congress-trades, text 'Tuberville'; who lobbied on a bill → lobbying-filings, text 'H.R.1234'.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoOrder by event date (default newest)
textNoCase-insensitive substring over the dataset's name/title fields (member, insider, issuer, recipient, registrant and client, sponsor, assignee, bill title, …); see textPaths in trackers_datasets
limitNoRows to return (default 25, max 100)
sinceNoEarliest event date (YYYY-MM-DD, YYYY-MM or YYYY), inclusive
untilNoLatest event date, inclusive
whereNoExact field matches by dot path, e.g. {"side":"buy"}, {"member.state":"CA"}, {"code":"P"}, {"formType":"4"}; string comparisons are case-insensitive, arrays match when any element does
yearsNoEvent years to read (max 8); default is the newest year with data. Prefer one year at a time for deep-history datasets.
offsetNoRows to skip, for paging (default 0)
tickerNoTrading symbol, case-insensitive (e.g. 'NVDA'); matches the dataset's ticker field(s). Only datasets flagged tickerSearchable carry tickers.
datasetYesDataset id, from trackers_datasets

TDQS

A4.3/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and exceeds it. It discloses the year-sharded CC0 data source, the default to the newest year, the byte-budget refusal behavior, the performance cost of deep-history years, and the presence of provenance.sourceUrl on every row. These are concrete behavioral traits an agent needs to anticipate outcomes.

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 long but every sentence earns its place: purpose, data source, performance caveat, provenance, and examples. It is front-loaded with the core capability, though slightly more verbose than a minimal definition would require; the density justifies the length for a 10-parameter tool.

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 complex query tool with 10 parameters and no output schema, the description supplies essential operational context: year selection mechanics, deep-history performance costs, refusal behavior, provenance, and worked examples. It does not detail the response shape beyond provenance.sourceUrl, but the input documentation and examples make correct invocation clear. This is near-complete, with only minor gaps around result formatting.

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?

Schema description coverage is 100%, so the baseline is 3. The description adds genuine meaning beyond the schema by explaining how years interact with year-sharding, the default behavior, the byte budget constraint, and by giving concrete query examples that map parameters to real cases (e.g., dataset insider-transactions, ticker NVDA, years [2024], where {code: 'P'}).

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 opens with a specific verb and resource: 'Search one Market Trackers dataset', then enumerates the search dimensions (ticker, free text, exact field values, event-date range) and controls (paging, ordering). This makes the tool's purpose obvious and distinguishes it from metadata or convenience siblings like trackers_datasets, trackers_latest, and trackers_ticker.

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 three examples (insider purchases, senator trades, lobbying) imply concrete usage scenarios, and the reference to trackers_datasets for archiveYears is helpful. However, the description never explicitly contrasts this tool with trackers_latest or trackers_ticker, nor states when NOT to use it, leaving routing to alternatives implicit rather than explicit.

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

trackers_tickerTicker across Market TrackersAInspect

One ticker across every ticker-bearing Market Trackers dataset for one year (default: the current year): insider transactions, congressional trades, 13F holdings, federal contracts and grants, lobbying filings by the company, short-sale volume, clinical trials, FDA events, patents, Wikipedia pageviews. Returns per-dataset match counts with the newest rows of each — a public-record dossier from primary sources. Deep-history archive years too large for one fan-out are listed under skipped with the trackers_query call that reads them.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoEvent year to read (default: the current year)
limitNoNewest rows to include per dataset (default 5)
tickerYesTrading symbol, e.g. 'NVDA'

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations provided, the description carries the full behavioral disclosure burden. It explains the return shape (per-dataset match counts with newest rows), the default-year behavior, and the skipped-deep-history edge case, which gives an agent a solid model of what will happen.

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 somewhat long due to enumerating many datasets, but each sentence contributes: scope, return format, and the deep-history fallback. Core behavior is front-loaded before the edge-case explanation.

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 read-style fan-out tool with no output schema and no annotations, the description explains the datasets, the aggregation approach, the return contents, and the failure/fallback case for too-large archive years. It is reasonably complete for an agent to decide to call it.

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 description coverage is 100%, so the schema already documents ticker, year, and limit. The description adds context like the one-year scope and per-dataset limiting, but does not materially extend the parameter meaning beyond what the schema provides.

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 a specific operation: retrieve data for one ticker across every ticker-bearing Market Trackers dataset for a given year. It enumerates the datasets covered and distinguishes itself from deep-history retrieval by referencing trackers_query.

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 clearly implies the tool is for broad single-ticker, single-year coverage across many public-record datasets. It also provides an explicit alternative for deep-history archive years too large for one fan-out, naming trackers_query as the call that reads them.

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.

  1. 13 tool updatesv1.5.0
    • Addedjournal_add_trade
    • Addedjournal_breakdown
    • Addedjournal_calendar
    • Addedjournal_get_day
    • Addedjournal_get_trade
    • Addedjournal_list_accounts
    • Addedjournal_list_tags
    • Addedjournal_list_trades
    • Addedjournal_overview
    • Addedjournal_search_notes
    • Addedjournal_update_note
    • Addedjournal_update_trade
    • Addedjournal_write_note
  2. 35 tool updatesv1.4.0
    • Addedbroker_accounts
    • Addedbroker_positions
    • Addedbroker_refresh
    • Addedbroker_setup
    • Addedbroker_stats
    • Addedbroker_trades
    • Addededge_presets
    • Addededge_report
    • Addededge_symbols
    • Changedlibrary_get_concept2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlibrary_get_family2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlibrary_get_indicator2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlibrary_get_source_code2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlibrary_list_concepts3 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / page / maximum
        Added value: +9007199254740991
    • Changedlibrary_list_families1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlibrary_list_indicators7 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / concept
        Added value: +{
        +  "description": "Concept slug — only indicators linked to this concept, e.g. 'rsi'",
        +  "type": "string"
        +}
      • addedInput schema / properties / page / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / platform
        Added value: +{
        +  "description": "Trading platform the indicator supports, e.g. 'metatrader'",
        +  "type": "string"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "description": "Tag ids (from library_list_tags); an indicator must carry every tag",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / tier
        Added value: +{
        +  "description": "Only indicators included in this LuxAlgo plan tier",
        +  "enum": [
        +    "essential",
        +    "premium",
        +    "ultimate",
        +    "ultra"
        +  ],
        +  "type": "string"
        +}
    • Addedlibrary_list_tags
    • Changedlibrary_search2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedluxalgo_account
    • Addedpropfirms_challenge_rules
    • Addedpropfirms_compare
    • Addedpropfirms_get
    • Addedpropfirms_list_simulatable
    • Addedpropfirms_optimal_risk
    • Addedpropfirms_pass_rates
    • Addedpropfirms_search
    • Addedpropfirms_search_challenges
    • Addedpropfirms_search_offers
    • Addedpropfirms_simulate
    • Addedpropfirms_simulate_trades
    • Addedpropfirms_validate_strategy
    • Addedtrackers_datasets
    • Addedtrackers_latest
    • Addedtrackers_query
    • Addedtrackers_ticker
  3. 8 tool updatesv0.1.0
    • First observedlibrary_get_concept
    • First observedlibrary_get_family
    • First observedlibrary_get_indicator
    • First observedlibrary_get_source_code
    • First observedlibrary_list_concepts
    • First observedlibrary_list_families
    • First observedlibrary_list_indicators
    • First observedlibrary_search

TDQS

A4/5.0

Scored across 48 tools

Disambiguation4/5

Tools are cleanly namespaced by domain (journal_, broker_, library_, propfirms_, trackers_, edge_), and even the crowded propfirms simulation cluster (simulate vs simulate_trades vs pass_rates vs validate_strategy vs compare) is explicitly differentiated in the descriptions. A few pairs like journal_search_notes vs journal_list_trades and broker_stats vs broker_trades sit close together, but cross-references resolve them.

Naming Consistency4/5

Consistent domain-prefix + verb_noun convention throughout (journal_get_trade, library_list_indicators, trackers_query). Minor deviations: creation uses both 'add' (journal_add_trade) and 'write' (journal_write_note), and broker_setup/broker_refresh skip the noun.

Tool Count3/5

48 tools is heavy for a single server and sits well past the comfortable range. Each of the six bundled domains (journal, broker, library, propfirms, trackers, edge) is individually well-scoped and each tool earns its place within its area, but the aggregate is a monolithic surface that could be split.

Completeness4/5

Coverage is deep and near-complete per domain: journal has full read/annotate/note lifecycle, propfirms has search-to-simulation-to-optimization, and library/trackers/edge cover browse, get, and search. Gaps are minor and intentional (no journal delete/remove of fills or trades — corrections are done in-app; broker is read-only by design).

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    TradingView MCP server — real-time market data, technical indicators, screeners, and backtesting for Claude, ChatGPT, Cursor, Copilot, and any MCP client. Stocks, crypto, forex & futures across global exchanges.
    44
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    A read-only MCP server for EdgeDepth's market microstructure search engine, enabling users to query recorded crypto and TradFi perpetuals for market conditions, outcomes, and reproducibility-keyed evidence directly from MCP clients.
    10
    1,033 npm
    3
    MIT