Skip to main content
Glama

Server Details

LuxAlgo for AI agents: the Library, prop firms, Market Trackers, Edge Stats, and your Trade Journal

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 79 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
LuxAlgo/luxalgo-mcp-server
GitHub Stars
104
Server Listing
LuxAlgo Library MCP
ChatGPT
–
Claude
–

TDQS

A4.1/5.0

Scored across 41 tools

Disambiguation4/5

Prefix grouping (edge_, journal_, library_, propfirms_, trackers_) plus explicit cross-references in descriptions keep almost every tool distinct, and the simulation family (simulate vs simulate_trades vs compare vs validate_strategy vs pass_rates) is carefully separated by input type and intent. The main residual overlaps are propfirms_search vs search_challenges vs search_offers (firm-level search already nests challenges/offers) and journal_overview vs journal_breakdown vs journal_list_trades, which an agent must read carefully to pick correctly.

Naming Consistency4/5

Uniform snake_case with a domain prefix followed by verb_noun (library_get_concept, journal_list_trades, propfirms_simulate, trackers_query) is followed almost everywhere. Minor deviations are noun-only names such as edge_presets, edge_symbols, trackers_datasets and propfirms_pass_rates, which break the verb_noun rhythm but remain readable and domain-prefixed.

Tool Count3/5

41 tools is heavy and well past the comfortable range for a single server, even though it is really five sub-products (edge stats, journal, library, prop firms, trackers) bundled together. Each group is internally scoped (1-3 tools for edge/account, 4 for trackers), so nothing feels redundant, but the overall surface is large enough to burden tool selection.

Completeness4/5

Coverage is broad and mostly lifecycle-complete: journal covers accounts, trades, fills, notes, tags and analytics; propfirms covers discovery, rules, simulation, risk sweep and strategy screening; library and trackers are read-only by nature. Notable gaps are deletion of notes/trades and correction of existing fills, which the descriptions explicitly push to the app, leaving a few dead ends for an agent.

Available Tools

41 tools
edge_presetsList Edge Stats report presetsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
categoryNoNarrow to one category (the result lists all categories)

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover readOnly/openWorld/non-destructive, so the bar is lower; the description adds genuinely new behavior context by noting the presets are precomputed nightly (staleness profile) and that each preset carries a plain-language definition. It omits any note on catalog size, pagination, or caching.

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?

Two front-loaded sentences with no preamble; the purpose lands immediately and the edge_report linkage is last, where it belongs. The five-item family list ('gap fills, opening-range breakouts...') is illustrative but mildly expendable.

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 read-only catalog with 100% schema coverage and no output schema, the description adequately conveys what comes back (preset ids plus plain-language definitions) and why. It could go slightly further on return shape, but 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.

Parameters3/5

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

Schema description coverage is 100%, so both params are documented in the schema (including the category narrow filter and its parenthetical that results otherwise list all categories). The description adds no extra parameter meaning, 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 resource ('the catalog of session-statistics questions the hosted store precomputes nightly') and its scope, with examples of preset families. It also distinguishes itself from sibling edge_report by declaring that it 'returns preset ids for edge_report', so an agent knows this is the enumerator feeding that consumer.

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 clause 'Returns preset ids for edge_report' makes the workflow role clear: call this to discover ids before invoking edge_report. It stops short of explicit when-not guidance or alternatives, but the context is unambiguous.

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 reportA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
presetYesPreset id, e.g. 'gap-fill' — see edge_presets
symbolYesHosted symbol, e.g. 'BTCUSDT' — see edge_symbols
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint and non-destructive behavior, so safety is covered; the description goes further by disclosing the returned envelope (N, Wilson 95% CI, minimum-sample guards, first/second-half stability split, per-year counts, distribution for continuous outcomes, disclaimer). The 'Historical conditional frequencies, not predictions' caveat is genuinely useful interpretive context, though it omits failure modes and any rate/availability limits.

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 core identity ('One precomputed session-statistics result') is front-loaded and the clause list maps to actual returned fields, so little is wasted. It is a single very dense sentence, though, and the trailing id-source sentence could be folded in without loss.

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 must carry return-value information, and it does so thoroughly, listing components of the result and a disclaiming caveat. What is missing is minor: no note on error conditions or sparse-data behavior beyond the mention of minimum-sample guards.

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% across all three parameters, including the detailed third-person 'context' wording, so the schema carries the semantics. The description only echoes the 'see edge_presets / edge_symbols' pointers already present in the schema, adding no format or syntax detail beyond 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 names a specific verb-plus-resource (a precomputed session-statistics report) and pins the exact quantity returned: P(outcome | conditions) for a preset on a hosted symbol. It also implicitly separates itself from edge_presets/edge_symbols by casting them as id sources rather than result producers, so an agent can route 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 Guidelines3/5

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

It tells the agent where the required ids come from ('Preset ids come from edge_presets; symbols from edge_symbols'), which is real prerequisite guidance. However, it never states when to prefer this tool over data-fetching siblings such as trackers_query or propfirms_* tools, nor any when-not condition, so usage is only implied.

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 coverageA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, and the description is fully consistent with them. It adds real context beyond the annotations: the data provenance (open-source edge-stats engine over free market data) and a distinction between coverage metadata versus session statistics with sample sizes and confidence intervals. It does not disclose caching, pagination, or freshness guarantees beyond the build timestamp.

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?

Two sentences, front-loaded with what the store covers and then the workflow routing, with no filler. The parenthetical about the edge-stats engine is dense but earns its place by clarifying the data source, though the sentence is long.

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 describing what is returned, and it does so by enumerating the coverage contents. Read-only annotations cover the safety profile, and the sequencing tells the agent how to proceed. Minor gaps remain (no mention of size, format, or pagination of the coverage listing).

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 single 'context' parameter is a fully documented analytics-only bookkeeping field, so the schema already carries its semantics. The description adds nothing about parameters, which matches the baseline of 3 when the schema does the heavy lifting.

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 states what the hosted Edge Stats store covers (symbols, session calendars, coverage windows, session counts, last nightly build) and literally says 'Start here' for this tool, so an agent understands it exposes coverage metadata. It never uses a crisp verb like 'List' or 'Get', leaving the action implicit, but the resource and scope are unambiguous and it is clearly distinguishable 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?

It gives explicit routing: 'Start here, then edge_presets for the questions you can ask, then edge_report for a result.' Both alternatives are named with the condition that selects each, so an agent knows which sibling to call at each step of the workflow.

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

NameRequiredDescriptionDefault
fillsYesThe fills, in any order.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
accountIdYesA `manual` or `import` account id from journal_list_accounts.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing that identical fills are skipped as duplicates (explaining the idempotentHint mechanism), that trades are derived from fill sequences (long/short round trips, scale-ins, lone fill opens a position), that OAuth sign-in with a LuxAlgo account is required, and what mutations are impossible here.

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 action and account scope, and every clause carries a behavioral rule rather than filler. It is dense but slightly long, with several rules packed into run-on sentences that could be split for faster scanning.

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 covers the return contract (insert counts plus the trades the fills belong to, with keys for journal_update_trade), auth requirements, dedup behavior, and trade-derivation rules. Nothing an agent needs to call this 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 the schema already documents accountId and each fill field. The description's notes ('Times are ISO 8601 instants with offset; fees are per fill') restate what the schema already says rather than adding format or constraint detail. Baseline 3 applies when the schema does the heavy lifting.

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 ('Log a trade by adding its fills') and immediately scopes the target accounts ('a `manual` or `import` journal account — never a broker-synced one'). This clearly separates it from siblings like journal_update_trade, 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 explicit when-to-use (logging manual/import trades) and when-not (broker-synced accounts, correcting/removing fills — 'done in the app, not here'). It also names the follow-up tool (journal_update_trade via the returned keys) and the account source (journal_list_accounts).

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

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.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
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 already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=true), so the bar is lower, and the description still adds real context: authentication via a LuxAlgo OAuth account, breakevens excluded from win-rate math, and a sensible all-time default chosen for sample size. It does not describe result volume/pagination for what could be nine groups of many symbols, which is the one remaining 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 what the tool returns and where the data comes from, then defaults, then sibling routing, then auth — a logical order. The nine-dimension enumeration and result-field list are long, but each clause carries information an agent would otherwise have to guess since there is no 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 no output schema, the description compensates by naming the per-group metrics returned (trade count, wins, losses, net P&L, average net P&L, win rate) and the breakeven exclusion. Combined with the default-window rule, the narrowing parameters, the OAuth requirement, and sibling routing, an agent has everything needed to call this 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, but the description adds semantics the schema lacks: the default window is all time and the reason for it, plus a stated preference for `range` or `from`/`to` when narrowing. The `accounts` and `context` parameters are left entirely to the schema, which documents them well.

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 (P&L sourced from closed trades in a window, grouped nine ways by weekday, time of day, hold time, symbol, side, size, tag, rating, asset class) and explicitly contrasts itself with journal_overview as the headline-numbers tool. An agent can distinguish it from every sibling 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?

Gives an explicit selection rule ('the tool for "what am I good or bad at" questions') and names the alternative (journal_overview) for the headline case. It also states the default window and how to narrow it with `range` or `from`/`to`, so the when-to-use decision is fully specified.

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

NameRequiredDescriptionDefault
monthNoMonth as YYYY-MM. Default: the current month in the journal timezone.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
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 declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, so safety is covered. The description adds genuinely non-structured behavior: days are rendered in the journal timezone, cells are null for days with no trades, and a LuxAlgo OAuth sign-in is required. No pagination or rate-limit context, hence not a 5.

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-loads the return shape before the operational notes, and every clause carries information (field list, timezone, default, alternative, auth). The opening sentence is dense with a long parenthetical field inventory, which slightly taxes 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 carries the full burden of return-value explanation and does so thoroughly: day-cell fields, weekly aggregates, and monthly totals, plus the null convention and timezone. Auth requirement and the drill-down path are also covered, 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.

Parameters3/5

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

Schema description coverage is 100%, so month format/default, context constraints, and accounts scoping are already documented in the schema. The description only echoes the current-month default and the journal timezone, adding no new parameter semantics. 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 resource and scope: one month of the P&L calendar, enumerating the cell-level and aggregate values returned (net/gross P&L, fees, counts, volume). It also names the sibling to use for finer granularity (journal_get_day), so an agent can distinguish it from journal_overview and journal_breakdown 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 explicit invocation guidance ("Omit `month` for the current month"), names the drill-down alternative (journal_get_day), and states the OAuth prerequisite. It stops short of explicit when-not-to-use conditions, e.g. preferring journal_overview or journal_breakdown for other grains.

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

NameRequiredDescriptionDefault
dateYesThe day, YYYY-MM-DD in the journal timezone.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
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 the read-only, non-destructive profile, so the bar is lower; the description still adds real context the annotations cannot: stats are null when nothing traded, trades are summaries rather than full records, and OAuth sign-in with a LuxAlgo account is required. It does not mention pagination or limits, but for a single-day read those are largely moot.

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?

It is compact and front-loads the payload shape, which is the most decision-relevant information. The single dense paragraph is efficient, though the return-shape list and the date-format sentence slightly overlap with the 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 no output schema, the description carries the burden of describing return values and does so — stats, trade summaries, notes with ids, and the null case. It also flags the auth prerequisite, which is exactly the kind of precondition an agent needs before calling.

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 fully documents `date`, `context`, and `accounts`, including the timezone and the 'omit for every account' semantics. The description restates the date format and timezone rather than adding new syntax or constraints, so the baseline of 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 exactly what a call returns for a single day: stats (null when nothing traded), trade summaries, and notes with their ids. It frames the scope as 'a single trading day', which contrasts cleanly with multi-day siblings like journal_calendar and journal_overview.

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 a concrete usage scenario ('how did Tuesday go') and an explicit downstream routing rule, pointing to journal_update_note when note ids are the goal. It stops short of stating when-not-to-use this versus journal_get_trade or journal_search_notes, so it is clear context without full exclusion guidance.

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

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.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, destructiveHint, openWorldHint), the description discloses deployment requirements ('Requires signing in with a LuxAlgo account (OAuth)') and the full shape of the returned payload, including hidden fills and corrections. This is meaningful context the structured fields 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.

Conciseness4/5

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

The lead clause 'One trade in full' front-loads the essential point, and the usage instruction is placed last where it is easy to act on. The middle enumeration of returned fields is dense but every element is a real differentiator, so little is wasted.

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 takes on the burden of explaining return values and does so in detail, while also covering prerequisites and auth. Nothing an agent needs in order 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.

Parameters3/5

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

Schema description coverage is 100%, with the key parameter already documented as returned by journal_list_trades/journal_get_day/journal_search_notes/journal_add_trade and the 'Never construct one' rule. The description echoes the sourcing hint but adds no new syntax or format detail, 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 ('One trade in full') and enumerates exactly what that means — summary fields, fills, per-exit gross P&L, hidden fills, and annotations. This clearly separates it from the list-oriented siblings journal_list_trades and journal_get_day.

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

Usage Guidelines4/5

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

Explicitly says to use it after journal_list_trades or journal_get_day when the user asks about a specific trade, or before annotating it. That is clear contextual guidance, but it never states when not to use it or names a competing alternative tool to prefer.

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

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds real value beyond them: the auth requirement (LuxAlgo OAuth sign-in) and the meaning of an empty list ('no journal yet'), plus inline semantics for the `kind` values.

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?

One paragraph, front-loaded with the resource and its fields before the critical 'Call this first' routing instruction. The field enumeration is somewhat long but justified because no output schema exists; 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 compensates by enumerating the returned fields (id, name, broker, kind, currency, balance, P&L method, sync, archived state, timeZone). It also covers auth, empty-state behavior, and cross-tool id dependencies, leaving nothing an agent needs 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 coverage is 100% and the single `context` parameter is a boilerplate analytics field already fully documented in the schema. The description adds no parameter-level syntax or format guidance, so the baseline 3 applies rather than a higher score.

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 signed-in user's trade-journal accounts') and enumerates the returned fields, so the agent knows exactly what this returns. It is clearly distinguishable from siblings like journal_list_trades, journal_list_tags, and journal_overview.

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 'Call this first' and explains the dependency: other journal tools' `accounts` filter takes these ids and rejects unknown ones, and journal_add_trade needs a `manual` or `import` account. This is a genuine when-to-use and why-first directive that routes the agent correctly.

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

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
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 declare readOnlyHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds genuinely new behavioral context: the authentication requirement (LuxAlgo account via OAuth) and the result ordering/count semantics. It stops short of disclosing result limits or pagination for a potentially long vocabulary.

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?

Four sentences, front-loaded with the resource and scope, then the workflow trigger, then the exclusion, then the prerequisite. Each sentence carries weight, though the auth sentence could have been folded in more tightly.

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 read-only list tool with no output schema and only two parameters, the description covers what is returned, how it is ordered, its scope across accounts and archive state, the auth prerequisite, and a sibling-disambiguation rule. 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 coverage is 100%, so both parameters (context and accounts) are already fully documented, including the 'omit for every account, archived included / unknown ids rejected' semantics. The description reinforces the all-accounts default implicitly but adds no syntax or meaning beyond the schema, making the baseline 3 correct.

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 resource (the user's annotation vocabulary: tags, mistakes, playbook ids) and the exact scope (any trade, open or closed), plus the ordering and payload (most-used first with trade counts). It explicitly separates itself from per-trade tag data and from the similarly named sibling library_list_tags by scoping to journal annotations.

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 a clear triggering condition — call this before journal_update_trade so new annotations reuse the user's own vocabulary rather than minting duplicates — and a boundary rule ('Per-trade tags are on each trade summary, not here'). It does not name the specific alternative tool for per-trade tags (journal_get_trade/journal_list_trades), leaving that inference to the agent.

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

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).
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
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?

Annotations already declare readOnlyHint=true/destructiveHint=false, and the description adds substantial non-obvious behavior: keyset pagination requires identical args on the next call, trades missing the sort value come last in either order, netPnl is after fees vs grossPnl before, open positions are always listed despite the day window, and OAuth sign-in is required.

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 scope and return shape, then sorting, filtering, pagination and examples in a logical order; every sentence carries information. It is dense and long, with a long field enumeration, which costs a little readability, but no sentence is 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?

With no output schema, the description compensates by enumerating the summary fields and explicitly stating what is absent (fills, note text). Auth, pagination contract, filter semantics and defaults are all covered for a 12-parameter read tool.

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 83%, yet the description still adds real meaning beyond the schema: sort names match response field names, symbol is the exception that defaults to asc, tie-break ordering, day keys are journal-timezone open-day keys, and tag matching is exact. The `cursor` must be paired with unchanged sort/order/filters.

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 (list trade summaries) and immediately enumerates the returned fields, setting scope precisely. It explicitly distinguishes itself from journal_get_trade ("summaries carry no fills or note text") 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 explicit when-to-use routing ("journal_get_trade with the `key` has those"), names sibling tools for preconditions (journal_list_tags, journal_list_accounts), and gives four concrete query recipes (biggest winners this month, worst by gross, longest holds). Nothing is left to inference.

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

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.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
accountsNoJournal account ids to scope to (from journal_list_accounts). Omit for every account, archived ones included. Unknown ids are rejected.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly and non-destructive, and the description adds substantial behavior beyond them: close-day bucketing in the journal timezone, open positions counting toward any window reaching today, compare's 'previous' window semantics, and the meaning of null metrics (profitFactorIsInfinite). The OAuth requirement is also 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?

Front-loaded with purpose then progressively narrower detail on windowing and alternatives. The long metric enumeration is verbose but earns its place as de-facto return-value documentation in the absence of an output schema; still, it is a dense run-on that could be trimmed.

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 enumerating the returned metrics, the timezone/close-day logic, null-metric handling, window defaults, comparison behavior, and the auth prerequisite. An agent has everything needed to call and interpret the tool.

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 runtime meaning the schema lacks: the 30-day default, that range:'all'/'from'/'to' widen the window, and the timezone/override behavior. It reinforces 'accounts' as the scope selector, though it doesn't detail every 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?

Opens with a specific verb+resource ('The journal dashboard in one call for a window') and enumerates exactly what it returns: performance metrics, Edge Score components, per-day P&L, equity curve, open positions, and the accounts/settings covered. It also explicitly names the siblings it is not (journal_breakdown, journal_list_trades), so an agent can distinguish it without reading 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 alternatives: 'Use journal_breakdown for where the P&L comes from and journal_list_trades for the trades themselves.' Adds default behavior ('Defaults to the last 30 days'), how to widen ('range: all' or explicit from/to), and a prerequisite (LuxAlgo OAuth sign-in). Nothing about tool selection is left to inference.

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

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
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
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 already declare readOnlyHint/openWorldHint/destructiveHint=false, but the description adds meaningfully: OAuth sign-in requirement, newest-first ordering, keyset pagination via cursor/nextCursor, and the non-obvious drop-out behavior when filtering day notes by symbol. It stops short of return-format detail or rate limits, keeping it below a 5.

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 — the stream/kinds structure comes first, then filters, then pagination, then auth. Every sentence carries information (probably more than a reader wants in one block), with no filler or repetition.

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 (a single stream split by kind, with ids for follow-up tools) and the auth prerequisite. Pagination and filter semantics are covered. Only minor gaps remain, such as default ordering fields or error behavior on unknown ids.

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 88% (baseline 3), and the description adds real semantic value beyond the schema: `symbol` only matches trade notes and causes day notes to be excluded, and the cursor must reuse identical arguments. This is behavioral meaning the schema does not convey.

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) and resource (journal notes feed) and immediately disambiguates the two kinds it returns — `notes` (day notes) and `tradeNotes` — with the sibling tools used to edit each. An agent can distinguish this from journal_list_trades or journal_get_day without opening any 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 actionable context: 'Omit every filter for the latest notes', and explains that the symbol filter applies only to trade notes while day notes 'drop out'. It does not explicitly name a competing sibling (e.g. journal_list_trades) as the alternative when filtering by trade rather than note, so routing guidance is strong but not complete.

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
DestructiveIdempotent
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. Day notes in the LuxAlgo journal: https://docs.luxalgo.com/platform/workspaces/journal/notes Requires signing in with a LuxAlgo account (OAuth).

NameRequiredDescriptionDefault
bodyNoThe full new text.
dateNoMove the note to this day, YYYY-MM-DD in the journal timezone.
noteIdYesThe note's `id`.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description supplies the specifics those hints cannot: the body is replaced whole (what is destroyed), the read-then-resend workaround for appending, the return value, and the OAuth sign-in requirement. This is meaningful context beyond the structured fields.

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

Conciseness5/5

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

The primary action, replacement semantics, and sibling exclusion are all front-loaded in the first two sentences, followed by the return value and reference links. No sentence is filler; each carries a distinct operational fact.

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 four-parameter mutation tool with no output schema, every piece an agent needs is present: id provenance, replacement-vs-append semantics, alternative tool routing, auth requirement, and the return shape. Nothing material 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 real value by naming the tools that produce a valid noteId and by clarifying that 'date' relocates rather than edits the note. The full-replacement semantics for 'body' exceed what the schema's 'The full new text.' conveys.

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 clause names a precise verb (replace), the resource (a day note's text) and a secondary effect (move it to another day), plus the key (note id). It explicitly distinguishes itself from the sibling journal_update_trade, so an agent can route correctly without reading 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?

It states when to use it, where the noteId comes from (journal_get_day or journal_search_notes), and which sibling to use instead for trade notes (journal_update_trade). It also gives an explicit procedural rule for the append case, which is not inferable from the schema.

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

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).
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
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.8/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, and the description adds the crucial detail behind that: tags/mistakes replace the whole list, and null clears a field. It further discloses that P&L is derived from fills (not editable here), that the full updated trade is returned, and that OAuth sign-in with a LuxAlgo account is required.

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 purpose and field inventory, then usage rules, then side-effect boundaries. It is a dense single paragraph with no filler, though the clause stacking makes it slightly heavy to parse at a glance.

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 14-parameter mutation tool with no output schema, the description covers the field set, the replace/clear semantics, the incremental alternatives, the auth requirement, and the return value ('the updated trade in full'). Nothing needed 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 already 86%, so the baseline is 3, but the description adds real meaning: it explains that stopLoss/profitTarget are price levels and that the stop is the basis for realized R, and it clarifies the replace-vs-incremental semantics of the tag/mistake parameters beyond the per-field schema text.

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 immediately scopes it to 'the user-owned fields only', enumerating them. This clearly separates it from journal_add_trade, journal_update_note, and journal_write_note among the 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?

Explicitly routes between modes: bulk replacement fields vs. addTags/removeTags/addMistakes/removeMistakes for incremental edits, with the rationale ('without clobbering the rest') and a pointer to journal_list_tags for existing vocabulary. It also states what the tool does NOT affect (fills, prices, P&L).

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. Day notes in the LuxAlgo journal: https://docs.luxalgo.com/platform/workspaces/journal/notes Requires signing in with a LuxAlgo account (OAuth).

NameRequiredDescriptionDefault
bodyYesThe note text (plain text or markdown).
dateYesThe day the note belongs to, YYYY-MM-DD in the journal timezone.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), and the description adds substantive behavior beyond them: notes are additive and never overwrite, the call returns the note with its id, and it requires OAuth sign-in with a LuxAlgo account. That is exactly the extra context an agent needs before invoking.

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-loads the action and scope in the first clause, then routes to alternatives. It is dense but every clause carries information; the docs URL and OAuth note are mildly incidental but not padding.

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, yet the description covers the return value ('the note with its id'), the write semantics, the auth prerequisite, and the sibling routing. Nothing an agent needs to call this 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 schema already documents date, body, and context, making 3 the baseline. The description adds real meaning for `date` by clarifying it may be any day, traded or not, and reiterates the journal-timezone YYYY-MM-DD format — useful for a date the agent might otherwise assume must correspond to a trade.

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') plus the scope qualifier 'any day, traded or not', which an agent cannot infer from the name alone. It explicitly separates itself from journal_update_note and journal_update_trade's notes, so the sibling boundary is unambiguous.

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 explicit when-to-use routing: this tool for creating, journal_update_note for changing an existing note, and journal_update_trade's notes for a note tied to a specific trade. It also states the non-exclusion ('days hold any number of notes, so this never overwrites'), removing the main ambiguity about whether a day can hold multiple notes.

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 conceptA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
slugYesExact concept slug, e.g. 'rsi' or 'order-blocks' — from search or list results
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish readOnly/openWorld/non-destructive, so the safety profile is covered. The description adds real value beyond that by describing the markdown payload structure and the hard requirement that the slug be exact, which is the main failure mode for this call.

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

Conciseness5/5

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

Two sentences, zero filler: the first front-loads what the tool returns, the second front-loads the trigger condition and then the prerequisite. Every clause carries information an agent needs.

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 read-only lookup with no output schema, the description covers the return format, the content sections, the invocation precondition, and cross-references the discovery tools. Nothing needed 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, and the schema itself documents both slug and context in detail. The description modestly reinforces this by flagging that the slug must be exact and naming the two tools that produce it, adding meaning beyond the schema's 'from search or list results'.

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 (explain/retrieve) and resource (a Library concept) and enumerates the exact content returned: definition, formula, how traders read it, and indicator implementations. This clearly separates it from siblings like library_get_indicator, library_get_family, and 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?

Gives an explicit trigger condition ('Use for any "what is X / how does X work" question') and routes the agent to library_search or library_list_concepts for the required slug. It lacks an explicit statement of when another content tool would be the better pick, but the usage context is unambiguous.

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 hubA
Read-only
Inspect

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

NameRequiredDescriptionDefault
keyYesFamily key, e.g. 'smc-ict'
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, non-destructive, open-world), so the bar is lower. The description usefully adds return-shape information — that the result is markdown and contains both an overview and a full concept roster — which an agent 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.

Conciseness5/5

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

Two compact sentences that front-load what the tool returns before giving usage ordering and triggers. No redundant restatement of the title or schema.

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 describing the return payload, and it does so ('hub page as markdown', 'overview plus concept roster'). It stops short of noting pagination/size limits on the roster, a minor gap for a list-bearing response.

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 enum lists all valid family keys, so the schema already carries parameter meaning. The description adds essentially nothing beyond it ('SMC' and 'Wyckoff' are illustrative enum values, not new semantics), 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 ('a family's hub page as markdown') plus the exact payload ('the written overview ... plus its complete concept roster'). This clearly differentiates it from library_get_concept (single concept) and library_list_families (enumerating families).

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 explicit ordering ('Use after library_list_families') and a user-intent trigger ('when the user asks about a whole area like SMC or Wyckoff'). It does not state when NOT to use it versus library_get_concept, but the trigger language implies the whole-area vs single-concept distinction.

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 indicatorA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
slugYesIndicator slug, e.g. 'tri-star'
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds real value beyond that by disclosing the returned content, notably that source-code availability is reported here while the code itself lives behind another tool  that cross-tool distinction is the kind of behavior annotations cannot express.

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 resource and its payload, then the routing hint, with no filler sentences. The em-dash inventory is slightly dense but every listed field maps to something an agent may need to report back.

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?

No output schema exists, so the description usefully enumerates what comes back and points to the follow-up tool for code. It omits error/not-found behavior and whether the lookup is exact-slug only, but for a simple two-parameter read tool this is close to complete.

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%, including a detailed contract for the 'context' parameter, so baseline 3 applies. The description only implies single-resource lookup via 'one indicator' and adds no slug format or usage detail beyond the schema's own example.

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 ('Details for one indicator') and enumerates the actual payload (behavior, reading guidance, family, concept links, preview image, code availability). It also names the sibling library_get_source_code, so an agent can distinguish retrieval of metadata from retrieval of code 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 Guidelines4/5

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

Gives an explicit trigger ('Use when the user asks about a specific indicator') and routes to library_get_source_code for the code itself. It does not state when NOT to use it (e.g., to browse many indicators, where library_list_indicators or library_search would apply), so it falls short of full when/when-not guidance.

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 codeA
Read-only
Inspect

The Pine Script® source code of a Library indicator. Kept separate from library_get_indicator because sources are long — call it only when the user wants the code itself. For some indicators the app returns only the start of the source to a signed-out user (complete: false, with the line counts): signing in to a LuxAlgo account, free included, returns all of it. chart_url opens the indicator on Vela either way.

NameRequiredDescriptionDefault
slugYesIndicator slug
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses that signed-out users may receive truncated source signalled by `complete: false` plus line counts, that signing in (free tier included) returns the full source, and that `chart_url` always works. That is exactly the kind of auth/partial-result behavior an agent needs and cannot get from readOnlyHint alone.

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?

Three sentences, front-loaded with purpose then the routing rule then the truncation caveat — no filler. Slightly dense with a trademark symbol and parenthetical detail, but every sentence carries actionable 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?

Despite no output schema, the description names the key return signals (`complete`, line counts, `chart_url`) and the auth condition that changes results. Nothing an agent needs in order to call this correctly or interpret a partial answer 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 slug and context are already documented in the schema; the description adds no parameter-level format or constraint detail. Baseline 3 is appropriate when the schema does the work.

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 ('The Pine Script® source code of a Library indicator') and immediately distinguishes itself from the sibling library_get_indicator. An agent knows exactly what this returns without reading 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 states the selection condition — 'call it only when the user wants the code itself' — and explains why it is separate from library_get_indicator (sources are long). This is a clear when-to-use plus a named alternative, with an implicit when-not-to-use.

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 conceptsA
Read-only
Inspect

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 and the concept filter of library_list_indicators; for keyword lookup prefer library_search.

NameRequiredDescriptionDefault
pageNoDefault 0
familyNo
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
page_sizeNoDefault 50

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds pagination and single-family scoping, but says nothing about return shape, page-size bounds, or total-count behavior. Annotations carry most of the behavioral weight, so a 3 is appropriate.

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?

A single dense sentence that front-loads what the tool returns and its scope before listing the routing alternatives. No filler or restatement of the title.

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 no output schema, the description covers purpose, alternative routes, pagination, and family filtering, and even hints at returned slugs. It stops short of describing item shape or how many results a page yields, which is the only thing an agent might still wonder about.

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 75% and the family enum is fully enumerated in the schema; the description still adds meaning by framing the family argument as an optional single-family restriction and by flagging pagination. It does not explain page/page_size defaults or the analytics-only context parameter, leaving a small gap.

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

Purpose5/5

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

States a specific verb and resource ('Browse every trading and technical-analysis concept in the Library') plus its two scoping traits: paginated and optionally a single family. This is clearly separable from library_search (keyword) and library_get_concept (single fetch) named in the same sentence.

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 explicit when-to-use cases ('enumerate a topic area', 'find slugs for library_get_concept and the concept filter of library_list_indicators') and an explicit when-not with the alternative ('for keyword lookup prefer library_search'). The routing decision is fully resolvable without opening schemas.

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 familiesA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds useful content-level detail (concept counts and hub links are returned), which is more than the annotations convey, though it omits return format specifics.

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 tight sentences: the resource definition comes first, followed by the usage cue. No filler, 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 small read-only taxonomy listing with full schema coverage and annotations covering safety, nothing an agent needs to select or invoke it is missing. No output schema means return contents are reasonably summarized in the description.

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 'context' parameter is fully documented as an analytics field, so the schema does the work. The description adds no parameter-specific semantics, which is the expected baseline 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+resource ('List' the 'families') and defines the scope precisely as the top-level taxonomy with 17 families, plus what each entry contains (concept counts, hub links). This distinguishes it from siblings like library_list_concepts and library_get_family, which operate at a deeper level.

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

Usage Guidelines4/5

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

Explicitly frames itself as 'the natural first call for orientation', giving clear usage context. It does not name a specific alternative or an exclusion condition, but the entry-point framing is unambiguous.

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 indicatorsA
Read-only
Inspect

Browse the indicator catalog with filters and server-side sorting (newest first by default). The Library is organized by family and concept: filter by family (keys from library_list_families) or by concept slug (that concept's implementations; slugs from library_list_concepts or library_search), and optionally by 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.

NameRequiredDescriptionDefault
pageNoDefault 0
sortNoDefault: date
textNoServer-side text filter
tierNoOnly indicators included in this LuxAlgo plan tier
familyNoFamily key from library_list_families, e.g. 'volatility'
conceptNoConcept slug (from library_list_concepts or library_search) — only indicators linked to this concept, e.g. 'rsi'
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
platformNoTrading platform the indicator supports, e.g. 'metatrader'
directionNo
page_sizeNoDefault 24

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so safety is covered. The description adds real behavioral detail beyond that — default sort is newest-first, sorting is server-side, and filters compose over family/concept/platform/tier — though it doesn't describe pagination rollout or result shape.

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 action and default ordering, then use cases, then the alternative. Dense but every clause carries information; the trailing 'for keyword discovery prefer library_search' is well-placed. Minor length density keeps it below a 5.

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?

A 10-parameter list tool with no output schema is well served here: filtering axes, sorting default, and sibling dependencies are all covered. The only gap is that it never characterizes the returned page (fields, pagination totals) or result-shape expectations, which matters somewhat without an 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?

With 90% schema coverage the schema already documents most parameters, so the baseline is 3. The description adds genuine provenance semantics the schema cannot: family keys come from library_list_families, concept slugs from library_list_concepts/library_search, and concept filtering means 'that concept's implementations'. Page, page_size, direction, and text remain unaddressed by prose.

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 — browsing the indicator catalog with filters and server-side sorting — and immediately contrasts itself with library_search for keyword discovery. An agent can distinguish it from library_list_concepts, library_list_families, and library_search purely from the description.

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?

Names explicit when-to-use scenarios ('latest indicators', 'everything in the volatility family', 'indicators implementing liquidity sweeps') and an explicit when-not with the alternative to pick instead (library_search for keyword discovery). The dependency keys are routed to the correct sibling tools.

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

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely new context: it is scoped to 'the signed-in user' and requires OAuth authentication. Return contents are summarized though no output schema exists.

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

Conciseness5/5

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

Two sentences, front-loaded with what the tool returns before the usage guidance and the auth requirement. Every clause carries information; no waste.

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 tool the description covers what is returned, when to call it, and the auth requirement. With annotations covering safety and no output schema to explain, nothing an agent needs 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?

There is only one parameter (context) and schema description coverage is 100%, so the schema fully documents it with its own detailed guidance. The description adds nothing about the parameter, which is the correct baseline when the schema does the heavy lifting.

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 names the exact resource (the signed-in user's LuxAlgo account) and enumerates its contents (plan tier, entitlements, profile basics). It clearly distinguishes this account-lookup tool from the journal/library/propfirms siblings. It lacks an explicit verb, but the purpose is unambiguous.

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

Usage Guidelines4/5

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

It gives concrete triggers: 'use it to tailor answers to what the user's plan actually allows' and 'when the user asks what plan they are on.' It also states the prerequisite (sign in with a LuxAlgo account / OAuth). No alternative tool is named, but none of the siblings overlap this function.

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 rulesetA
Read-only
Inspect

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

NameRequiredDescriptionDefault
firmIdYesDirectory firm id or firm name from propfirms_list_simulatable, e.g. 'ftmo'.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
challengeIdYesDirectory challenge id from propfirms_list_simulatable.

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the readOnly/destructive/openWorld annotations it discloses genuinely useful behavior: data is fetched live from a keyless public API, inferred semantics are named in `inferredFields`/`provenance`, and challenges whose loss rules cannot be established are refused rather than guessed. It also flags `flagsNotSimulated` as material caveats and stresses the firm page is authoritative. That is far more than the annotations carry.

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

Conciseness3/5

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

The purpose is front-loaded in the first clause, which is good. However the body is an extremely long, heavily parenthesized enumeration of rule semantics that is difficult to scan; much of it reads like output documentation rather than selection guidance. Some of it is justified because no output schema exists, but the density harms usability.

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, schema-light tool with no output schema, the description covers source and provenance, unit conventions (percent vs fraction), inference disclosure, refusal behavior, and how the result feeds the simulation tools. Nothing an agent needs in order to call it and interpret the result 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?

All three parameters are fully described in the schema (100% coverage), including the analytics-only `context` field with a worked example, so the schema does the heavy lifting. The description adds a units convention for rule fields and winRate, but that concerns the result shape rather than the inputs. 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 opening sentence names a specific verb and resource ('Fetch one directory challenge's complete ruleset (ChallengeSpec)') and scopes it to the live LuxAlgo directory. It explicitly distinguishes itself from siblings, noting that this returns the simulatable encoding while propfirms_get and propfirms_search_challenges serve the raw directory listing. An agent can route correctly without opening any 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 explains the intended workflow clearly: the returned `challenge` object is exactly what the simulation tools accept as inline `spec`, so it can be copied, mutated and re-simulated. The closing NOTE names the alternative tools for the broader directory view. It lacks an explicit 'do not use when...' exclusion, but the routing context is strong.

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 traderA
Read-only
Inspect

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.

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).
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
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?

Annotations only cover read-only/destructive safety, but the description discloses far more: determinism (byte-identical results per seed), units conventions, what is and isn't simulated (consistency rules and payout gating ARE; flagsNotSimulated are not), and the material assumptions/disclaimer. It even prescribes how results must be presented. Rich behavioral context beyond the annotations.

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

Conciseness3/5

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

Purpose and scope are front-loaded, but the description is unusually long and its UNITS and DETERMINISM blocks largely restate schema field descriptions. Several sentences earn their place (flags, presentation guidance), but the overall bulk is heavier than needed.

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 16-parameter, high-complexity simulation tool with no output schema, the description enumerates the returned row fields, explains the flags/disclaimer obligation, and covers determinism and horizon scaling. An agent has everything required to call it and interpret the result responsibly.

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 interpretive value: it flags winRate as a FRACTION (not percent) and 'the most impactful input', restates the percent-mode risk convention, and explains seed/paths reporting for reproducibility. Useful emphasis, though much of it echoes 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?

States a precise verb and resource ('simulate the SAME trader across several challenges') plus the output shape (one row per challenge sorted by EV). Explicitly distinguishes itself from a ranking tool and from propfirms_simulate, so an agent can identify its niche 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?

Gives clear use context ('2+ for meaningful comparison'), an explicit when-not ('THIS IS NOT A RANKING... implies no endorsement'), and a named alternative ('For full per-challenge distributions run propfirms_simulate on the interesting rows'). The routing decision is fully stated.

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 firmA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
propfirmIdYesPublic firm slug, e.g. 'ftmo'

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so safety is covered. The description adds genuinely non-obvious behavior: null/uncaptured fields are omitted rather than returned as nulls, and challenge objects link to firm-level offers through offerIds. It does not mention rate limits or pagination, but with no output schema this is a solid disclosure of shape.

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 payload contents before routing and format caveats, and every clause carries information. It is dense – four ideas packed into two long sentences – but nothing is redundant with the title or schema.

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 must convey the return shape, and it does: the section list, the offerIds cross-reference between challenges and offers, and the null-omission rule. An agent can predict what it gets back and where to look next; only enumeration bounds/pagination remain unspecified.

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 propfirmId slug format ('ftmo') plus the analytics-only context parameter are fully documented in the schema. The description's 'Find slugs with propfirms_search' adds a small navigation hint but no new meaning about the parameters themselves, 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 ('One prop firm's full dossier by slug') and enumerates the payload sections (profile, challenges, offers, overview), which is far more precise than the title alone. It also distinguishes itself from propfirms_search, the sibling that resolves the slug.

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 routes the agent: use propfirms_search to find slugs, and propfirms_pass_rates for simulated pass odds on this firm's challenges. Both the input-discovery path and the analytical alternative are named with the condition that selects them.

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 challengesA
Read-only
Inspect

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

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
productTypeNoOptional filter to one instrument class. Omit to list every firm.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only declare readOnlyHint/openWorldHint/destructiveHint; the description goes far beyond by disclosing the live keyless external data source, that inferred rule semantics are flagged in `inferredFields` with provenance 'directory+inferred', that unencodable challenges are refused into `notSimulatable` rather than guessed, and that the listing is explicitly non-endorsing and unranked.

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

Conciseness3/5

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

The scope and provenance lead are front-loaded and valuable, but the text is very long and repeats itself: 'Challenges whose loss-rule semantics cannot be established are listed under notSimulatable' is restated almost verbatim later as 'Challenges whose loss rules cannot be established are refused as not simulatable rather than guessed.' The provenance rule is likewise stated twice, diluting an otherwise useful definition.

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 compensates by naming the returned fields (challengeId, display name, account size, currency, price, provenance) and the notSimulatable branch. It omits any mention of the required `context` argument, but otherwise an agent has enough to call and interpret 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 coverage is 100% and both parameters (context, productType) are fully documented in the schema with an example for `context`. The description adds nothing about either parameter, so the baseline 3 for schema-does-the-work 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 opens with a specific verb+resource ('List the prop firms ... together with every simulatable challenge') and enumerates the returned fields. It explicitly distinguishes itself from propfirms_search / propfirms_search_challenges / propfirms_search_offers, so an agent can route 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?

It gives an explicit ordering directive ('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') and names the alternative tools for the broader directory. Both when-to-use and when-to-use-something-else are covered.

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 tradeA
Read-only
Inspect

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. Results describe simulated outcomes of the user's own inputs under stated assumptions; they are not financial advice or a recommendation of any risk level.

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).
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
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?

Beyond the annotations (readOnlyHint/openWorldHint), the description discloses rich behavior: common random numbers make the argmax signal not noise, results are byte-identical for the same seed, cost scales with grid size (~30 points at 10,000 paths ≈ 10 seconds), and every result carries assumptions.flags and a disclaimer. This is exactly the extra context annotations cannot provide.

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

Conciseness4/5

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

It is long but intentionally front-loaded, opening with the core action and the two optima before the caveats. Some material (determinism/seed, disclaimer) is restated and could be tightened, but given 20 parameters and a nested spec, most sentences earn their 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 complex tool with no output schema and a deeply nested spec, the description is complete: it names the result fields, explains the divergence concept, covers units, determinism, cost, and the assumption-flag reporting obligation. An agent has everything needed to invoke and report 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, but the description adds interpretive value: it clarifies that grid units follow riskMode (percent units by default 0.1–3, currency for 'fixed-amount'), and prominently warns that winRate is a fraction while percent fields are in percent units. That unit disambiguation meaningfully reduces misconfiguration beyond the schema.

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

Purpose5/5

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

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.' It names the exact outputs (bestByPassProbability, bestByEv) and the core insight (divergence between them), so an agent immediately knows this is a two-optima sweep rather than a single-run simulation.

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 clear operating guidance: 'use fewer paths or a coarser grid for a first pass, then refine around the optima,' 'Parametric trader only,' and 'Never present one number as THE optimal risk.' It does not explicitly name sibling tools (e.g. propfirms_simulate) as alternatives, so routing is implied rather than stated, keeping it below a 5.

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 archetypeA
Read-only
Inspect

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

NameRequiredDescriptionDefault
firmIdYesDirectory firm id (propfirmId, e.g. 'ftmo') or firm name — from propfirms_list_simulatable.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
challengeIdNoOne challenge id. Omit to compute every simulatable challenge the firm has.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly/openWorld annotations, it discloses behavioral traits the annotations cannot convey: deterministic per ruleset, cached and cheap to call, fixed seed/path count, and the exact shape of returned odds including provenance flags. It also tells the agent it must relay inferred fields, a real operational constraint.

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?

Purpose and routing are front-loaded, but the middle enumerates many return fields and engine constants, making it a dense wall of text. Most sentences earn their place, though the return-value list could be trimmed since it borders on 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?

With no output schema, the description carries the full burden of explaining returns, and it does so (pass probability, 95% CI, P(funded), expected attempts/cost, EV, blowup probability, provenance). Combined with the sibling routing, an agent has everything needed to call and interpret 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 baseline is 3, but the description adds that a challengeId can be omitted to compute every simulatable challenge and clarifies the archetype semantics (developing 45% / consistent 48% / proven edge 52%). That is meaningful supplementary context beyond the raw schema.

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

Purpose5/5

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

The description states a specific verb+resource ('Reference challenge pass rates computed live from the directory's encoded rules') and pins down scope per challenge and per archetype, naming the concrete engine parameters (seed 42, 10,000 paths). It clearly distinguishes itself from propfirms_simulate and propfirms_simulate_trades as reference rather than personal odds.

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/when-not routing: 'These are REFERENCE odds for orientation and comparison, not the user's personal odds: for their own statistics use propfirms_simulate ... or propfirms_simulate_trades'. It also warns the tool is 'Not a ranking' and that a firm's page is authoritative, adding a provenance caveat to relay inferred fields.

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 challengesA
Read-only
Inspect

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.

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, …)
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
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.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/destructiveHint/openWorldHint, so the safety profile is covered. The description still adds non-obvious behavior: uncaptured (null) rule fields are omitted from results and never match filters, and include=['offers'] yields a deduplicated top-level offers list with per-challenge offerIds. Return format specifics (pagination shape) remain unstated, keeping this at a 4 rather than 5.

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 core action and scope, then progressively adds filtering scope, id-routing, include behavior, and sibling routing. Every sentence carries distinct information; nothing is redundant with the schema or annotations.

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 36-parameter tool with 100% schema coverage and read-only annotations but no output schema, the description does the heavy lifting on routing and the offers/null-filter contract. It reasonably states the tool returns rules and terms rather than outcomes. Missing only explicit return-shape/pagination detail.

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 lifts this by clarifying the include=['offers'] contract (deduplicated top-level list, offerIds cross-reference, firm-wide offers included) and the null-field filter behavior, which the schema's one-line parameter notes do not convey. Minor added value beyond schema, hence 4.

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

Purpose5/5

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

States a specific verb+resource ("Search funded-account challenges across all visible prop firms") and immediately names the dimension of differentiation (rules/terms vs. outcomes). Siblings propfirms_search, propfirms_search_offers, propfirms_compare are distinguishable because this tool returns challenge rule/term records specifically.

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: "Pass propfirmId to list one firm's challenges, or challengeId to fetch specific ones," and it names the exact alternatives for downstream steps (propfirms_simulate, propfirms_pass_rates, propfirms_validate_strategy) with the condition that selects each. When-to-use and when-to-go-elsewhere are both covered.

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 offersA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
sortNoSort key (default: featured first, then discount)
textNoCase-insensitive search over promo code, descriptions, and firm name/slug
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
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.1/5.0
Behavior4/5

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

Annotations already declare readOnly/openWorld/non-destructive, so the safety bar is low; the description adds meaningful behavior by stating the live-offers default and enumerating the payload each offer carries (promo code, discount, end date, affiliate link). With no output schema, that return-field disclosure is genuinely useful. It does not cover pagination limits, but the schema does.

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?

Two densely informative sentences with the default behavior front-loaded and no filler. Slightly compressed—the challengeId clause is a bit parenthetical—but nothing is wasted.

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 an 18-parameter search with no output schema, the description covers intent, default scope, key routing filters, and return fields, which is close to complete. Remaining gaps (sorting, paging, the expire/inactive toggles) are handled adequately by the schema descriptions.

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 all 18 parameters, establishing a baseline of 3. The description's mention of propfirmId and challengeId filtering largely restates what the schema says (including the firm-wide offer inclusion note), adding little beyond 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 states a specific verb and resource ("Search promotional offers (discounts and promo codes) across prop firms") and scopes it to live offers by default. An agent can distinguish this from siblings like propfirms_search_challenges or propfirms_search, which cover different resources.

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 explains the default behavior (live/active, unexpired offers only) and how two key filters route the query (propfirmId narrows to one firm; challengeId resolves applicable offers including firm-wide ones). It stops short of naming alternatives such as propfirms_search_challenges or stating when-not to use this tool, so it is solid context without explicit exclusions.

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 challengeA
Read-only
Inspect

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

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).
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
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.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so safety is covered. The description goes well beyond that, disclosing determinism (seed reproduces byte-identical results), what is actually simulated vs merely flagged (consistency stop-rule, withdrawal model, funded consistency approximation), required surfacing of assumption flags/disclaimer, and data provenance (live LuxAlgo directory, inferredFields, refusal of un-simulatable challenges). This is unusually rich, though some claims (return shape) sit in description rather than a schema.

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?

Purpose and scope are front-loaded, but the description is very long (roughly 700 words) and repeats material already carried verbatim by the schema — the units conventions, the seed/determinism note, the winRate warning, and the directory-vs-spec rule all appear in both places. Much earns its place; enough is redundant that it is not tight.

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 19-parameter tool with nested spec objects and no output schema, the description fills the gap by enumerating the returned SimResult fields (perAttempt, journey, funded, ev, drawdown, assumptions) and explaining payout gating vs getting funded. Nothing an agent needs to call it correctly or interpret results 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 per-parameter meanings are already documented and the baseline is 3. The description still adds cross-cutting value the schema cannot: the flattened parametric design rationale, the recurring UNITS convention (every *Pct and percent-mode risk is percent units; winRate alone is a fraction), and the exactly-one-of requirement for firmId/spec identification.

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 ('Monte Carlo-simulate a trader ... through a prop-firm challenge') and enumerates the concrete questions answered (pass probability, attempts/cost, EV, which rule kills attempts). It explicitly contrasts itself with the sibling propfirms_simulate_trades, so an agent can route between them 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?

It states the two mutually exclusive identification paths (directory firmId+challengeId vs full inline spec), that exactly one is required, and the network/offline implication of each. It also names the discovery sibling (propfirms_list_simulatable) and the condition for preferring propfirms_simulate_trades (raw trade series, streak preservation).

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 seriesA
Read-only
Inspect

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 resampling matters: 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. 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'). 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.

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`.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
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.7/5.0
Behavior5/5

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

Annotations only declare readOnly/openWorld/non-destructive; the description adds substantial behavior beyond that: determinism via `seed` (byte-identical reruns), the double-run with shared seed for newsFilter, the audit-risk warning that a 'high' overlap verdict may cause firms to refuse payouts, verbatim-relay caveats, assumption flags that make real odds worse than simulated, and the consistency/withdrawal simulation model. This is unusually rich behavioral disclosure.

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?

It is front-loaded correctly (purpose, then why, then sibling routing, then input modes), but the SIMULATED RULES and UNITS paragraphs largely repeat content already present in the per-parameter schema descriptions, and the whole block runs far longer than the agent needs to select and call the tool. Dense but not concise.

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 21 parameters, deep nesting, no output schema, and two required inputs, the description carries the full burden and meets it: it describes the returned SimResult, structuredContent.newsComparison and structuredContent.portfolioOverlap, histogram default-off behavior, and the reporting obligations (seed, paths, flags, disclaimer). Nothing material for correct invocation is left unstated.

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, but the description adds cross-parameter semantics the schema does not: the exactly-one-of constraint across the four series inputs, the 10-trade minimum / 100+ recommendation, the PERCENT-vs-FRACTION unit convention for all *Pct fields vs winRate, and the rSource inference behavior of importRisk. The Units and Simulated Rules paragraphs partially restate per-parameter descriptions, keeping it below 5.

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 ('Simulate a challenge by resampling the trader's OWN R-multiple trade series with a stationary block bootstrap') and explicitly contrasts its method with the parametric alternative. It names the sibling it is not ('Use propfirms_simulate when only summary stats are available; use this whenever the actual trades are'), so an agent can route 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?

It states exactly when to use this vs the alternative, and enumerates the mutually-exclusive input modes (rSeries / rSeriesText / tradeLogText / tradeLogTexts) with 'exactly one of the four, at least 10 trades'. It also gates the news-filter and portfolio behaviors on timestamped inputs, giving conditional when-to-use guidance throughout.

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 challengesA
Read-only
Inspect

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

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).
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
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.5/5.0
Behavior5/5

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

Annotations only declare readOnly/openWorld/non-destructive, but the description discloses determinism per seed, one full simulation per challenge (cost scales with scope), a hard 40-challenge refusal, fees taken from listed prices with discounts NOT applied, flags making numbers optimistic, and honest exclusion of unencodable challenges. This is substantial behavioral context well beyond the annotations.

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

Conciseness3/5

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

Front-loaded with the core question and scope, but it is a very long run-on paragraph packing in assumptions, honesty framing, and caveats. Every clause carries content, yet the wall-of-text form hurts scannability for a 25-parameter 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?

No output schema exists, and the description compensates by enumerating the returned fields (pass probability with 95% CI, P(funded), expected attempts/cost, EV, P(EV>0), assumption flags). For a high-complexity screening tool it is complete enough to call 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% and each parameter is already documented, so the baseline is 3. The description still adds interpretive value: it explains the two strategy-input modes and that rSeries is preferred, clarifies the minPassPerAttempt bar default and the 'always state the bar' convention, and notes that numbers move with risk sizing.

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+scope ('simulate the given strategy through every simulatable challenge in the live directory') and frames it as answering a concrete question. It is clearly distinguishable from single-challenge siblings like propfirms_simulate and propfirms_optimal_risk, which it explicitly names.

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 strong routing guidance: 'sweep one challenge with propfirms_optimal_risk afterwards', refuses scopes above 40 challenges ('narrow the scope instead'), and points to directory siblings (propfirms_search_challenges/get/search_offers). It stops short of stating when NOT to use this versus propfirms_simulate or simulate_trades, so it is clear context rather than a full when/when-not map.

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 datasetsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
datasetNoOne dataset for the detailed view; omit to list all

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, non-destructive, open-world), so the bar is lower. The description adds real behavioral context: the dumps are CC0, the listing returns row count, freshness, year coverage (live tree vs deep-history), and ticker-searchability, and the dataset variant surfaces caveats, per-year coverage and source health.

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?

Two tightly packed sentences; the scope statement is front-loaded and the workflow instruction comes last where it belongs. The 18-item dataset enumeration is long but earns its place by decoding the enum, so waste is minimal.

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?

No output schema exists, so the description must carry return-value information — and it does, listing the fields of both the summary and the per-dataset detailed view, plus dump URLs. The required context parameter's constraints are fully handled in the schema, so 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?

Schema coverage is 100% so the baseline is 3, but the description adds meaning beyond the schema: it maps the opaque enum slugs to human-readable sources (cot-reports → CFTC positioning, short-volume → FINRA short-sale volume, fed-communications → Federal Reserve communications) and explains what the dataset-specific view returns.

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 concrete verb+resource (the Market Trackers catalog / listing every published dataset) and enumerates the exact domain content, so the agent knows precisely what it retrieves. It is unmistakably distinct from trackers_latest, trackers_query, 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 Guidelines4/5

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

Explicitly routes the agent: 'Pass dataset for the full field roster... read it before composing trackers_query filters.' That gives a clear when-to-call and names the primary alternative (trackers_query). It stops short of stating when *not* to use it or how it relates to trackers_latest/trackers_ticker.

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 rowsA
Read-only
Inspect

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.

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.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
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?

Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=true), and the description adds genuinely new context: the data is the dumps' latest.json, scoped to a single ingestion day, and is unavailable for snapshot-only bulk datasets. It does not mention rate limits or result freshness caveats, but the added availability constraint is substantive.

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

Conciseness5/5

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

Three sentences, front-loaded with the core definition and the availability caveat, with zero filler. The parenthetical naming latest.json is dense but earns its place by grounding the data source.

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 an 8-parameter read tool with no output schema, the description conveys the data source, the scoping semantics, the filtering options, and the dataset limitation. It stops short of describing return shape or paging behavior, but annotations plus full schema coverage carry most of the remaining burden.

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%, so all eight parameters are already documented in the schema, making 3 the baseline. The description adds only marginal meaning — that ticker/text optionally narrow the newest-day scope and that textPaths live in trackers_datasets — without explaining sort/limit/offset/where beyond what the schema states.

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 precise verb+resource+scope: the newest ingestion day's rows added to one dataset by the last daily publish, sourced from latest.json. It explicitly distinguishes itself from the sibling trackers_query for the cases where it does not apply, so an agent can route 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?

It gives both when-to-use ('the cheapest way to see what is new: today's insider filings, this week's congressional disclosures, the latest lobbying registrations') and when-not ('Not available for snapshot-only bulk datasets (patents)'), naming the alternative tool to use instead. Nothing is left to inference.

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 datasetA
Read-only
Inspect

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 member of Congress's trades → congress-trades, text set to their name; who lobbied on a bill → lobbying-filings, text 'H.R.1234'.

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.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
datasetYesDataset id, from trackers_datasets

TDQS

A4.2/5.0
Behavior5/5

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

With readOnlyHint/openWorldHint/destructiveHint already covering the safety profile, the description adds substantial non-obvious behavior: data comes from year-sharded CC0 dumps, the default year is the newest with data, deep-history years are tens of MB compressed, the tool self-limits via a byte budget and returns narrowing instructions on refusal, and every row carries provenance.sourceUrl. That is real operational context an agent cannot get from the 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 purpose, the sharding/budget mechanics, and the examples are ordered sensibly with the core search capability front-loaded. The examples sentence is long and packs three scenarios into one breath, but each clause adds routing value rather than 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?

For an 11-parameter tool with no output schema, the description covers defaults, cost/limits, refusal behavior, and provenance fields well. It stops short of describing the row shape beyond provenance.sourceUrl, which is a minor gap given there is no output schema to lean on.

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 goes beyond the schema by tying parameters together in end-to-end examples (dataset + ticker + years + where for insider purchases; dataset + text for lobbying) and by stating the default years behavior and the prefer-one-year-at-a-time rule for `years`.

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 opens with a precise verb+resource+capability statement: 'Search one Market Trackers dataset by ticker, free text, exact field values, and event-date range, with paging and newest/oldest ordering.' That cleanly separates it from a listing tool, but it never names the obvious siblings (trackers_datasets for discovery, trackers_latest, trackers_ticker), so the agent must infer the routing.

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?

Usage context is concrete: it explains the year-sharding model, that the default is the newest year with data, that deep-history years should be read 'one or two at a time', and it gives three worked examples mapping a user goal to dataset/ticker/years/where/text. What it lacks is explicit exclusion or alternative routing (when to prefer trackers_latest or trackers_ticker instead).

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 TrackersA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
yearNoEvent year to read (default: the current year)
limitNoNewest rows to include per dataset (default 5)
tickerYesTrading symbol, e.g. 'NVDA'
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, destructiveHint=false, so the safety profile is covered. The description adds real behavioral detail: per-dataset match counts plus newest rows, and the fact that some archives are returned as 'skipped' rather than fetched inline — useful for anticipating truncated results.

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, then the dataset enumeration and the skipped-year caveat. The long list of datasets is informative rather than filler, though it makes the entry denser 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?

For a multi-dataset fan-out tool with no output schema and no nested objects, the description covers what comes back (counts + newest rows, skipped archives) and how to follow up. It omits anything about ordering/volume limits of the aggregate response, but nothing essential for a correct call 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%, and the schema already documents the year default (current year), limit default (5 newest rows per dataset), ticker format, and the context field. The description restates the year scope and the 'newest rows' semantics without adding formats or edge-case syntax, 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?

States a specific verb+resource+scope ('one ticker across every ticker-bearing Market Trackers dataset for one year') and enumerates the covered dataset families, so an agent knows exactly what it returns. It also names a sibling (trackers_query) as the follow-up for large archive years, distinguishing it from the other trackers_* tools.

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

Usage Guidelines4/5

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

Gives clear context (single ticker across all datasets for one year, default current year) and an explicit alternative path: deep-history years too large for one fan-out are listed under 'skipped' with the trackers_query call that reads them. It does not, however, state when to prefer trackers_latest or trackers_datasets over this tool.

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. 2 tool updates
    • Changedlibrary_list_indicators3 fields changed
      • changedInput schema / properties / concept / description
        Previous value: -"Concept slug — only indicators linked to this concept, e.g. 'rsi'"New value: +"Concept slug (from library_list_concepts or library_search) — only indicators linked to this concept, e.g. 'rsi'"
      • addedInput schema / properties / family / description
        Added value: +"Family key from library_list_families, e.g. 'volatility'"
      • removedInput schema / properties / tags
        Removed value: -{
        -  "description": "Tag ids (from library_list_tags); an indicator must carry every tag",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
    • Removedlibrary_list_tags
  2. 13 tool updates
    • 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
  3. 1 tool update
    • Addedluxalgo_account
  4. 28 tool updates
    • Changededge_presets2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • Changededge_report2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • Changededge_symbols2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • 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"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • 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"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • 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"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • 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"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • 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"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
      • addedInput schema / properties / page / maximum
        Added value: +9007199254740991
    • Changedlibrary_list_families2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • Changedlibrary_list_indicators3 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
      • addedInput schema / properties / page / maximum
        Added value: +9007199254740991
    • Changedlibrary_list_tags2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • 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"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • Changedpropfirms_challenge_rules2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • Changedpropfirms_compare22 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 / properties / challenges / items / additionalProperties
        Removed value: -false
      • changedInput schema / properties / challenges / items / properties / spec / additionalProperties
        Previous value: -trueNew value: +{}
      • addedInput schema / properties / challenges / items / properties / spec / properties / constraints / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / challenges / items / properties / spec / properties / dailyLoss / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        -    "properties": {
        -      "amount": {
        -        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "basis": {
        -        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        -        "enum": [
        -          "prior-day-balance",
        -          "prior-day-equity"
        -        ],
        -        "type": "string"
        -      },
        -      "evaluation": {
        -        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        -        "enum": [
        -          "intraday",
        -          "end-of-day"
        -        ],
        -        "type": "string"
        -      },
        -      "includesOpenPnl": {
        -        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        -        "type": "boolean"
        -      },
        -      "limitBasis": {
        -        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        -        "enum": [
        -          "initial-balance",
        -          "anchor"
        -        ],
        -        "type": "string"
        -      },
        -      "pct": {
        -        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        +    "properties": {
        +      "amount": {
        +        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "basis": {
        +        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        +        "enum": [
        +          "prior-day-balance",
        +          "prior-day-equity"
        +        ],
        +        "type": "string"
        +      },
        +      "evaluation": {
        +        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        +        "enum": [
        +          "intraday",
        +          "end-of-day"
        +        ],
        +        "type": "string"
        +      },
        +      "includesOpenPnl": {
        +        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        +        "type": "boolean"
        +      },
        +      "limitBasis": {
        +        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        +        "enum": [
        +          "initial-balance",
        +          "anchor"
        +        ],
        +        "type": "string"
        +      },
        +      "pct": {
        +        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / challenges / items / properties / spec / properties / fees / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / challenges / items / properties / spec / properties / funded / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / challenges / items / properties / spec / properties / funded / properties / dailyLoss / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        -    "properties": {
        -      "amount": {
        -        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "basis": {
        -        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        -        "enum": [
        -          "prior-day-balance",
        -          "prior-day-equity"
        -        ],
        -        "type": "string"
        -      },
        -      "evaluation": {
        -        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        -        "enum": [
        -          "intraday",
        -          "end-of-day"
        -        ],
        -        "type": "string"
        -      },
        -      "includesOpenPnl": {
        -        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        -        "type": "boolean"
        -      },
        -      "limitBasis": {
        -        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        -        "enum": [
        -          "initial-balance",
        -          "anchor"
        -        ],
        -        "type": "string"
        -      },
        -      "pct": {
        -        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        +    "properties": {
        +      "amount": {
        +        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "basis": {
        +        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        +        "enum": [
        +          "prior-day-balance",
        +          "prior-day-equity"
        +        ],
        +        "type": "string"
        +      },
        +      "evaluation": {
        +        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        +        "enum": [
        +          "intraday",
        +          "end-of-day"
        +        ],
        +        "type": "string"
        +      },
        +      "includesOpenPnl": {
        +        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        +        "type": "boolean"
        +      },
        +      "limitBasis": {
        +        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        +        "enum": [
        +          "initial-balance",
        +          "anchor"
        +        ],
        +        "type": "string"
        +      },
        +      "pct": {
        +        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / challenges / items / properties / spec / properties / funded / properties / firstPayoutMinDays / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / challenges / items / properties / spec / properties / funded / properties / maxLoss / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / challenges / items / properties / spec / properties / funded / properties / payoutRules / additionalProperties
        Previous value: -trueNew value: +{}
      • addedInput schema / properties / challenges / items / properties / spec / properties / funded / properties / payoutRules / properties / minWinningDays / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / challenges / items / properties / spec / properties / maxLoss / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / challenges / items / properties / spec / properties / sources / items / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / challenges / items / properties / spec / properties / steps / items / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / challenges / items / properties / spec / properties / steps / items / properties / consistency / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {
        -      "maxBestDayProfitPct": {
        -        "description": "Maximum share of the step's total profit the best single day may contribute, in PERCENT UNITS (40 = the best day may be at most 40% of total profit).",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "maxBestDayProfitPct"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {
        +      "maxBestDayProfitPct": {
        +        "description": "Maximum share of the step's total profit the best single day may contribute, in PERCENT UNITS (40 = the best day may be at most 40% of total profit).",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "maxBestDayProfitPct"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / challenges / items / properties / spec / properties / steps / items / properties / dailyLoss / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        -    "properties": {
        -      "amount": {
        -        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "basis": {
        -        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        -        "enum": [
        -          "prior-day-balance",
        -          "prior-day-equity"
        -        ],
        -        "type": "string"
        -      },
        -      "evaluation": {
        -        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        -        "enum": [
        -          "intraday",
        -          "end-of-day"
        -        ],
        -        "type": "string"
        -      },
        -      "includesOpenPnl": {
        -        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        -        "type": "boolean"
        -      },
        -      "limitBasis": {
        -        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        -        "enum": [
        -          "initial-balance",
        -          "anchor"
        -        ],
        -        "type": "string"
        -      },
        -      "pct": {
        -        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        +    "properties": {
        +      "amount": {
        +        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "basis": {
        +        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        +        "enum": [
        +          "prior-day-balance",
        +          "prior-day-equity"
        +        ],
        +        "type": "string"
        +      },
        +      "evaluation": {
        +        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        +        "enum": [
        +          "intraday",
        +          "end-of-day"
        +        ],
        +        "type": "string"
        +      },
        +      "includesOpenPnl": {
        +        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        +        "type": "boolean"
        +      },
        +      "limitBasis": {
        +        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        +        "enum": [
        +          "initial-balance",
        +          "anchor"
        +        ],
        +        "type": "string"
        +      },
        +      "pct": {
        +        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / challenges / items / properties / spec / properties / steps / items / properties / maxDays / anyOf
        Previous value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / challenges / items / properties / spec / properties / steps / items / properties / maxLoss / additionalProperties
        Previous value: -trueNew value: +{}
      • addedInput schema / properties / challenges / items / properties / spec / properties / steps / items / properties / minTradingDays / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
      • changedInput schema / properties / seed / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 9007199254740991,
        +    "minimum": -9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
    • Changedpropfirms_get2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • Changedpropfirms_list_simulatable2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • Changedpropfirms_optimal_risk21 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
      • changedInput schema / properties / seed / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 9007199254740991,
        +    "minimum": -9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / spec / additionalProperties
        Previous value: -trueNew value: +{}
      • addedInput schema / properties / spec / properties / constraints / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / spec / properties / dailyLoss / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        -    "properties": {
        -      "amount": {
        -        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "basis": {
        -        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        -        "enum": [
        -          "prior-day-balance",
        -          "prior-day-equity"
        -        ],
        -        "type": "string"
        -      },
        -      "evaluation": {
        -        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        -        "enum": [
        -          "intraday",
        -          "end-of-day"
        -        ],
        -        "type": "string"
        -      },
        -      "includesOpenPnl": {
        -        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        -        "type": "boolean"
        -      },
        -      "limitBasis": {
        -        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        -        "enum": [
        -          "initial-balance",
        -          "anchor"
        -        ],
        -        "type": "string"
        -      },
        -      "pct": {
        -        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        +    "properties": {
        +      "amount": {
        +        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "basis": {
        +        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        +        "enum": [
        +          "prior-day-balance",
        +          "prior-day-equity"
        +        ],
        +        "type": "string"
        +      },
        +      "evaluation": {
        +        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        +        "enum": [
        +          "intraday",
        +          "end-of-day"
        +        ],
        +        "type": "string"
        +      },
        +      "includesOpenPnl": {
        +        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        +        "type": "boolean"
        +      },
        +      "limitBasis": {
        +        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        +        "enum": [
        +          "initial-balance",
        +          "anchor"
        +        ],
        +        "type": "string"
        +      },
        +      "pct": {
        +        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / spec / properties / fees / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / funded / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / funded / properties / dailyLoss / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        -    "properties": {
        -      "amount": {
        -        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "basis": {
        -        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        -        "enum": [
        -          "prior-day-balance",
        -          "prior-day-equity"
        -        ],
        -        "type": "string"
        -      },
        -      "evaluation": {
        -        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        -        "enum": [
        -          "intraday",
        -          "end-of-day"
        -        ],
        -        "type": "string"
        -      },
        -      "includesOpenPnl": {
        -        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        -        "type": "boolean"
        -      },
        -      "limitBasis": {
        -        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        -        "enum": [
        -          "initial-balance",
        -          "anchor"
        -        ],
        -        "type": "string"
        -      },
        -      "pct": {
        -        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        +    "properties": {
        +      "amount": {
        +        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "basis": {
        +        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        +        "enum": [
        +          "prior-day-balance",
        +          "prior-day-equity"
        +        ],
        +        "type": "string"
        +      },
        +      "evaluation": {
        +        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        +        "enum": [
        +          "intraday",
        +          "end-of-day"
        +        ],
        +        "type": "string"
        +      },
        +      "includesOpenPnl": {
        +        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        +        "type": "boolean"
        +      },
        +      "limitBasis": {
        +        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        +        "enum": [
        +          "initial-balance",
        +          "anchor"
        +        ],
        +        "type": "string"
        +      },
        +      "pct": {
        +        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / spec / properties / funded / properties / firstPayoutMinDays / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / spec / properties / funded / properties / maxLoss / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / funded / properties / payoutRules / additionalProperties
        Previous value: -trueNew value: +{}
      • addedInput schema / properties / spec / properties / funded / properties / payoutRules / properties / minWinningDays / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / spec / properties / maxLoss / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / sources / items / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / steps / items / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / steps / items / properties / consistency / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {
        -      "maxBestDayProfitPct": {
        -        "description": "Maximum share of the step's total profit the best single day may contribute, in PERCENT UNITS (40 = the best day may be at most 40% of total profit).",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "maxBestDayProfitPct"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {
        +      "maxBestDayProfitPct": {
        +        "description": "Maximum share of the step's total profit the best single day may contribute, in PERCENT UNITS (40 = the best day may be at most 40% of total profit).",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "maxBestDayProfitPct"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / spec / properties / steps / items / properties / dailyLoss / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        -    "properties": {
        -      "amount": {
        -        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "basis": {
        -        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        -        "enum": [
        -          "prior-day-balance",
        -          "prior-day-equity"
        -        ],
        -        "type": "string"
        -      },
        -      "evaluation": {
        -        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        -        "enum": [
        -          "intraday",
        -          "end-of-day"
        -        ],
        -        "type": "string"
        -      },
        -      "includesOpenPnl": {
        -        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        -        "type": "boolean"
        -      },
        -      "limitBasis": {
        -        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        -        "enum": [
        -          "initial-balance",
        -          "anchor"
        -        ],
        -        "type": "string"
        -      },
        -      "pct": {
        -        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        +    "properties": {
        +      "amount": {
        +        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "basis": {
        +        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        +        "enum": [
        +          "prior-day-balance",
        +          "prior-day-equity"
        +        ],
        +        "type": "string"
        +      },
        +      "evaluation": {
        +        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        +        "enum": [
        +          "intraday",
        +          "end-of-day"
        +        ],
        +        "type": "string"
        +      },
        +      "includesOpenPnl": {
        +        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        +        "type": "boolean"
        +      },
        +      "limitBasis": {
        +        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        +        "enum": [
        +          "initial-balance",
        +          "anchor"
        +        ],
        +        "type": "string"
        +      },
        +      "pct": {
        +        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / spec / properties / steps / items / properties / maxDays / anyOf
        Previous value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / spec / properties / steps / items / properties / maxLoss / additionalProperties
        Previous value: -trueNew value: +{}
      • addedInput schema / properties / spec / properties / steps / items / properties / minTradingDays / maximum
        Added value: +9007199254740991
    • Changedpropfirms_pass_rates2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • Changedpropfirms_search13 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
      • addedInput schema / properties / maxYearFounded / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / maxYearFounded / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / minYearFounded / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / minYearFounded / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / pageIndex / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / steps / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / steps / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / stepsMax / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / stepsMax / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / stepsMin / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / stepsMin / minimum
        Added value: +-9007199254740991
    • Changedpropfirms_search_challenges9 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
      • addedInput schema / properties / pageIndex / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / steps / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / steps / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / stepsMax / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / stepsMax / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / stepsMin / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / stepsMin / minimum
        Added value: +-9007199254740991
    • Changedpropfirms_search_offers3 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
      • addedInput schema / properties / pageIndex / maximum
        Added value: +9007199254740991
    • Changedpropfirms_simulate21 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
      • changedInput schema / properties / seed / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 9007199254740991,
        +    "minimum": -9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / spec / additionalProperties
        Previous value: -trueNew value: +{}
      • addedInput schema / properties / spec / properties / constraints / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / spec / properties / dailyLoss / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        -    "properties": {
        -      "amount": {
        -        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "basis": {
        -        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        -        "enum": [
        -          "prior-day-balance",
        -          "prior-day-equity"
        -        ],
        -        "type": "string"
        -      },
        -      "evaluation": {
        -        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        -        "enum": [
        -          "intraday",
        -          "end-of-day"
        -        ],
        -        "type": "string"
        -      },
        -      "includesOpenPnl": {
        -        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        -        "type": "boolean"
        -      },
        -      "limitBasis": {
        -        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        -        "enum": [
        -          "initial-balance",
        -          "anchor"
        -        ],
        -        "type": "string"
        -      },
        -      "pct": {
        -        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        +    "properties": {
        +      "amount": {
        +        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "basis": {
        +        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        +        "enum": [
        +          "prior-day-balance",
        +          "prior-day-equity"
        +        ],
        +        "type": "string"
        +      },
        +      "evaluation": {
        +        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        +        "enum": [
        +          "intraday",
        +          "end-of-day"
        +        ],
        +        "type": "string"
        +      },
        +      "includesOpenPnl": {
        +        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        +        "type": "boolean"
        +      },
        +      "limitBasis": {
        +        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        +        "enum": [
        +          "initial-balance",
        +          "anchor"
        +        ],
        +        "type": "string"
        +      },
        +      "pct": {
        +        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / spec / properties / fees / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / funded / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / funded / properties / dailyLoss / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        -    "properties": {
        -      "amount": {
        -        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "basis": {
        -        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        -        "enum": [
        -          "prior-day-balance",
        -          "prior-day-equity"
        -        ],
        -        "type": "string"
        -      },
        -      "evaluation": {
        -        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        -        "enum": [
        -          "intraday",
        -          "end-of-day"
        -        ],
        -        "type": "string"
        -      },
        -      "includesOpenPnl": {
        -        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        -        "type": "boolean"
        -      },
        -      "limitBasis": {
        -        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        -        "enum": [
        -          "initial-balance",
        -          "anchor"
        -        ],
        -        "type": "string"
        -      },
        -      "pct": {
        -        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        +    "properties": {
        +      "amount": {
        +        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "basis": {
        +        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        +        "enum": [
        +          "prior-day-balance",
        +          "prior-day-equity"
        +        ],
        +        "type": "string"
        +      },
        +      "evaluation": {
        +        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        +        "enum": [
        +          "intraday",
        +          "end-of-day"
        +        ],
        +        "type": "string"
        +      },
        +      "includesOpenPnl": {
        +        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        +        "type": "boolean"
        +      },
        +      "limitBasis": {
        +        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        +        "enum": [
        +          "initial-balance",
        +          "anchor"
        +        ],
        +        "type": "string"
        +      },
        +      "pct": {
        +        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / spec / properties / funded / properties / firstPayoutMinDays / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / spec / properties / funded / properties / maxLoss / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / funded / properties / payoutRules / additionalProperties
        Previous value: -trueNew value: +{}
      • addedInput schema / properties / spec / properties / funded / properties / payoutRules / properties / minWinningDays / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / spec / properties / maxLoss / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / sources / items / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / steps / items / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / steps / items / properties / consistency / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {
        -      "maxBestDayProfitPct": {
        -        "description": "Maximum share of the step's total profit the best single day may contribute, in PERCENT UNITS (40 = the best day may be at most 40% of total profit).",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "maxBestDayProfitPct"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {
        +      "maxBestDayProfitPct": {
        +        "description": "Maximum share of the step's total profit the best single day may contribute, in PERCENT UNITS (40 = the best day may be at most 40% of total profit).",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "maxBestDayProfitPct"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / spec / properties / steps / items / properties / dailyLoss / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        -    "properties": {
        -      "amount": {
        -        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "basis": {
        -        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        -        "enum": [
        -          "prior-day-balance",
        -          "prior-day-equity"
        -        ],
        -        "type": "string"
        -      },
        -      "evaluation": {
        -        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        -        "enum": [
        -          "intraday",
        -          "end-of-day"
        -        ],
        -        "type": "string"
        -      },
        -      "includesOpenPnl": {
        -        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        -        "type": "boolean"
        -      },
        -      "limitBasis": {
        -        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        -        "enum": [
        -          "initial-balance",
        -          "anchor"
        -        ],
        -        "type": "string"
        -      },
        -      "pct": {
        -        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        +    "properties": {
        +      "amount": {
        +        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "basis": {
        +        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        +        "enum": [
        +          "prior-day-balance",
        +          "prior-day-equity"
        +        ],
        +        "type": "string"
        +      },
        +      "evaluation": {
        +        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        +        "enum": [
        +          "intraday",
        +          "end-of-day"
        +        ],
        +        "type": "string"
        +      },
        +      "includesOpenPnl": {
        +        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        +        "type": "boolean"
        +      },
        +      "limitBasis": {
        +        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        +        "enum": [
        +          "initial-balance",
        +          "anchor"
        +        ],
        +        "type": "string"
        +      },
        +      "pct": {
        +        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / spec / properties / steps / items / properties / maxDays / anyOf
        Previous value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / spec / properties / steps / items / properties / maxLoss / additionalProperties
        Previous value: -trueNew value: +{}
      • addedInput schema / properties / spec / properties / steps / items / properties / minTradingDays / maximum
        Added value: +9007199254740991
    • Changedpropfirms_simulate_trades22 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
      • removedInput schema / properties / newsFilter / additionalProperties
        Removed value: -false
      • changedInput schema / properties / seed / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 9007199254740991,
        +    "minimum": -9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / spec / additionalProperties
        Previous value: -trueNew value: +{}
      • addedInput schema / properties / spec / properties / constraints / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / spec / properties / dailyLoss / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        -    "properties": {
        -      "amount": {
        -        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "basis": {
        -        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        -        "enum": [
        -          "prior-day-balance",
        -          "prior-day-equity"
        -        ],
        -        "type": "string"
        -      },
        -      "evaluation": {
        -        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        -        "enum": [
        -          "intraday",
        -          "end-of-day"
        -        ],
        -        "type": "string"
        -      },
        -      "includesOpenPnl": {
        -        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        -        "type": "boolean"
        -      },
        -      "limitBasis": {
        -        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        -        "enum": [
        -          "initial-balance",
        -          "anchor"
        -        ],
        -        "type": "string"
        -      },
        -      "pct": {
        -        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        +    "properties": {
        +      "amount": {
        +        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "basis": {
        +        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        +        "enum": [
        +          "prior-day-balance",
        +          "prior-day-equity"
        +        ],
        +        "type": "string"
        +      },
        +      "evaluation": {
        +        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        +        "enum": [
        +          "intraday",
        +          "end-of-day"
        +        ],
        +        "type": "string"
        +      },
        +      "includesOpenPnl": {
        +        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        +        "type": "boolean"
        +      },
        +      "limitBasis": {
        +        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        +        "enum": [
        +          "initial-balance",
        +          "anchor"
        +        ],
        +        "type": "string"
        +      },
        +      "pct": {
        +        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / spec / properties / fees / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / funded / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / funded / properties / dailyLoss / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        -    "properties": {
        -      "amount": {
        -        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "basis": {
        -        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        -        "enum": [
        -          "prior-day-balance",
        -          "prior-day-equity"
        -        ],
        -        "type": "string"
        -      },
        -      "evaluation": {
        -        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        -        "enum": [
        -          "intraday",
        -          "end-of-day"
        -        ],
        -        "type": "string"
        -      },
        -      "includesOpenPnl": {
        -        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        -        "type": "boolean"
        -      },
        -      "limitBasis": {
        -        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        -        "enum": [
        -          "initial-balance",
        -          "anchor"
        -        ],
        -        "type": "string"
        -      },
        -      "pct": {
        -        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        +    "properties": {
        +      "amount": {
        +        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "basis": {
        +        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        +        "enum": [
        +          "prior-day-balance",
        +          "prior-day-equity"
        +        ],
        +        "type": "string"
        +      },
        +      "evaluation": {
        +        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        +        "enum": [
        +          "intraday",
        +          "end-of-day"
        +        ],
        +        "type": "string"
        +      },
        +      "includesOpenPnl": {
        +        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        +        "type": "boolean"
        +      },
        +      "limitBasis": {
        +        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        +        "enum": [
        +          "initial-balance",
        +          "anchor"
        +        ],
        +        "type": "string"
        +      },
        +      "pct": {
        +        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / spec / properties / funded / properties / firstPayoutMinDays / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / spec / properties / funded / properties / maxLoss / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / funded / properties / payoutRules / additionalProperties
        Previous value: -trueNew value: +{}
      • addedInput schema / properties / spec / properties / funded / properties / payoutRules / properties / minWinningDays / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / spec / properties / maxLoss / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / sources / items / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / steps / items / additionalProperties
        Previous value: -trueNew value: +{}
      • changedInput schema / properties / spec / properties / steps / items / properties / consistency / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {
        -      "maxBestDayProfitPct": {
        -        "description": "Maximum share of the step's total profit the best single day may contribute, in PERCENT UNITS (40 = the best day may be at most 40% of total profit).",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "maxBestDayProfitPct"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {
        +      "maxBestDayProfitPct": {
        +        "description": "Maximum share of the step's total profit the best single day may contribute, in PERCENT UNITS (40 = the best day may be at most 40% of total profit).",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "maxBestDayProfitPct"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / spec / properties / steps / items / properties / dailyLoss / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        -    "properties": {
        -      "amount": {
        -        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        -        "exclusiveMinimum": 0,
        -        "type": "number"
        -      },
        -      "basis": {
        -        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        -        "enum": [
        -          "prior-day-balance",
        -          "prior-day-equity"
        -        ],
        -        "type": "string"
        -      },
        -      "evaluation": {
        -        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        -        "enum": [
        -          "intraday",
        -          "end-of-day"
        -        ],
        -        "type": "string"
        -      },
        -      "includesOpenPnl": {
        -        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        -        "type": "boolean"
        -      },
        -      "limitBasis": {
        -        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        -        "enum": [
        -          "initial-balance",
        -          "anchor"
        -        ],
        -        "type": "string"
        -      },
        -      "pct": {
        -        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        -        "exclusiveMinimum": 0,
        -        "maximum": 100,
        -        "type": "number"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
        +    "properties": {
        +      "amount": {
        +        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "basis": {
        +        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
        +        "enum": [
        +          "prior-day-balance",
        +          "prior-day-equity"
        +        ],
        +        "type": "string"
        +      },
        +      "evaluation": {
        +        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
        +        "enum": [
        +          "intraday",
        +          "end-of-day"
        +        ],
        +        "type": "string"
        +      },
        +      "includesOpenPnl": {
        +        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
        +        "type": "boolean"
        +      },
        +      "limitBasis": {
        +        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
        +        "enum": [
        +          "initial-balance",
        +          "anchor"
        +        ],
        +        "type": "string"
        +      },
        +      "pct": {
        +        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
        +        "exclusiveMinimum": 0,
        +        "maximum": 100,
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / spec / properties / steps / items / properties / maxDays / anyOf
        Previous value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / spec / properties / steps / items / properties / maxLoss / additionalProperties
        Previous value: -trueNew value: +{}
      • addedInput schema / properties / spec / properties / steps / items / properties / minTradingDays / maximum
        Added value: +9007199254740991
    • Changedpropfirms_validate_strategy3 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
      • changedInput schema / properties / seed / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 9007199254740991,
        +    "minimum": -9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
    • Changedtrackers_datasets2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • Changedtrackers_latest4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / where / propertyNames
        Added value: +{
        +  "type": "string"
        +}
    • Changedtrackers_query7 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
      • removedInput schema / properties / until / $ref
        Removed value: -"#/properties/since"
      • addedInput schema / properties / until / pattern
        Added value: +"^\\d{4}(-\\d{2}(-\\d{2})?)?$"
      • addedInput schema / properties / until / type
        Added value: +"string"
      • addedInput schema / properties / where / propertyNames
        Added value: +{
        +  "type": "string"
        +}
    • Changedtrackers_ticker2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / context / description
        Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
  5. 7 tool updates
    • Addededge_presets
    • Addededge_report
    • Addededge_symbols
    • Addedtrackers_datasets
    • Addedtrackers_latest
    • Addedtrackers_query
    • Addedtrackers_ticker
  6. 21 tool updates
    • Changedlibrary_get_concept3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "slug"
        -]New value: +[
        +  "slug",
        +  "context"
        +]
    • Changedlibrary_get_family3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "key"
        -]New value: +[
        +  "key",
        +  "context"
        +]
    • Changedlibrary_get_indicator3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "slug"
        -]New value: +[
        +  "slug",
        +  "context"
        +]
    • Changedlibrary_get_source_code3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "slug"
        -]New value: +[
        +  "slug",
        +  "context"
        +]
    • Changedlibrary_list_concepts3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "context"
        +]
    • Changedlibrary_list_families2 fields changed
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "context"
        +]
    • Changedlibrary_list_indicators3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "context"
        +]
    • Changedlibrary_list_tags2 fields changed
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "context"
        +]
    • Changedlibrary_search3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "query"
        -]New value: +[
        +  "query",
        +  "context"
        +]
    • Changedpropfirms_challenge_rules3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "firmId",
        -  "challengeId"
        -]New value: +[
        +  "firmId",
        +  "challengeId",
        +  "context"
        +]
    • Changedpropfirms_compare3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "challenges",
        -  "winRate",
        -  "avgWinR",
        -  "tradesPerDay",
        -  "riskValue"
        -]New value: +[
        +  "challenges",
        +  "winRate",
        +  "avgWinR",
        +  "tradesPerDay",
        +  "riskValue",
        +  "context"
        +]
    • Changedpropfirms_get3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "propfirmId"
        -]New value: +[
        +  "propfirmId",
        +  "context"
        +]
    • Changedpropfirms_list_simulatable3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "context"
        +]
    • Changedpropfirms_optimal_risk3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "winRate",
        -  "avgWinR",
        -  "tradesPerDay"
        -]New value: +[
        +  "winRate",
        +  "avgWinR",
        +  "tradesPerDay",
        +  "context"
        +]
    • Changedpropfirms_pass_rates3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "firmId"
        -]New value: +[
        +  "firmId",
        +  "context"
        +]
    • Changedpropfirms_search3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "context"
        +]
    • Changedpropfirms_search_challenges3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "context"
        +]
    • Changedpropfirms_search_offers3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "context"
        +]
    • Changedpropfirms_simulate3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "winRate",
        -  "avgWinR",
        -  "tradesPerDay",
        -  "riskValue"
        -]New value: +[
        +  "winRate",
        +  "avgWinR",
        +  "tradesPerDay",
        +  "riskValue",
        +  "context"
        +]
    • Changedpropfirms_simulate_trades5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • changedInput schema / properties / importRisk / description
        Previous value: -"Risk per trade for imports that carry P&L but no risk data (e.g. TradingView, MT5 deals, 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."New value: +"Risk 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."
      • changedInput schema / properties / tradeLogText / description
        Previous value: -"The 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), and 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. 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."New value: +"The 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."
      • changedInput schema / required
        Previous value: -[
        -  "riskValue"
        -]New value: +[
        +  "riskValue",
        +  "context"
        +]
    • Changedpropfirms_validate_strategy3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "tradesPerDay",
        -  "riskValue"
        -]New value: +[
        +  "tradesPerDay",
        +  "riskValue",
        +  "context"
        +]
  7. 4 tool updates
    • Changedpropfirms_compare14 fields changed
      • changedInput schema / properties / challenges / items / properties / spec / description
        Previous value: -"Inline 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."New value: +"Inline 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."
      • changedInput schema / properties / challenges / items / properties / spec / properties / fees / description
        Previous value: -"Fees — everything that goes into expected total cost."New value: +"Fees - everything that goes into expected total cost."
      • changedInput schema / properties / challenges / items / properties / spec / properties / flagsNotSimulated / description
        Previous value: -"Honesty channel: ids of rules this entry has that the engine does not simulate (e.g. 'scaling-plan', 'soft-daily-lockout'). Surfaced in every result's assumption flags. Consistency rules and payout gating do NOT belong here — the engine simulates them."New value: +"Honesty channel: ids of rules this entry has that the engine does not simulate (e.g. 'scaling-plan', 'soft-daily-lockout'). Surfaced in every result's assumption flags. Consistency rules and payout gating do NOT belong here - the engine simulates them."
      • changedInput schema / properties / challenges / items / properties / spec / properties / funded / properties / maxLoss / properties / mode / description
        Previous value: -"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')."New value: +"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')."
      • changedInput schema / properties / challenges / items / properties / spec / properties / funded / properties / payoutRules / description
        Previous value: -"Payout gating — SIMULATED (engine v1), not just flagged: a payout happens only when these conditions are met, and on each eligible payout day the trader withdraws the maximum the rules allow (profit above the buffer, under the caps, never below the loss floor); balances and loss floors carry across payouts (see flag 'funded-withdrawal-model'). Omit for ungated payouts."New value: +"Payout gating - SIMULATED (engine v1), not just flagged: a payout happens only when these conditions are met, and on each eligible payout day the trader withdraws the maximum the rules allow (profit above the buffer, under the caps, never below the loss floor); balances and loss floors carry across payouts (see flag 'funded-withdrawal-model'). Omit for ungated payouts."
      • changedInput schema / properties / challenges / items / properties / spec / properties / maxLoss / properties / mode / description
        Previous value: -"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')."New value: +"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')."
      • changedInput schema / properties / challenges / items / properties / spec / properties / steps / items / properties / consistency / description
        Previous value: -"Consistency rule — SIMULATED (engine v1), not just flagged: one outsized day effectively raises the target (total profit must reach best day / pct), and the simulated trader keeps trading — rationally stopping days early when that helps — until the best-day share complies (see flag 'consistency-stop-rule'). null or omitted = no consistency rule."New value: +"Consistency rule - SIMULATED (engine v1), not just flagged: one outsized day effectively raises the target (total profit must reach best day / pct), and the simulated trader keeps trading - rationally stopping days early when that helps - until the best-day share complies (see flag 'consistency-stop-rule'). null or omitted = no consistency rule."
      • changedInput schema / properties / challenges / items / properties / spec / properties / steps / items / properties / maxLoss / properties / mode / description
        Previous value: -"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')."New value: +"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')."
      • changedInput schema / properties / fundedHorizonDays / description
        Previous value: -"Funded-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."New value: +"Funded-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."
      • changedInput schema / properties / riskMode / description
        Previous value: -"How 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."New value: +"How 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."
      • changedInput schema / properties / riskValue / description
        Previous value: -"Risk 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."New value: +"Risk 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."
      • changedInput schema / properties / seed / description
        Previous value: -"RNG seed (integer or string). Default 42. Same inputs + seed reproduce byte-identical results — include the seed when reporting so users can reproduce the numbers."New value: +"RNG seed (integer or string). Default 42. Same inputs + seed reproduce byte-identical results - include the seed when reporting so users can reproduce the numbers."
      • changedInput schema / properties / simulateFunded / description
        Previous value: -"Whether 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."New value: +"Whether 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."
      • changedInput schema / properties / winRate / description
        Previous value: -"Probability 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."New value: +"Probability 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."
    • Changedpropfirms_optimal_risk14 fields changed
      • changedInput schema / properties / fundedHorizonDays / description
        Previous value: -"Funded-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."New value: +"Funded-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."
      • changedInput schema / properties / riskMode / description
        Previous value: -"How 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."New value: +"How 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."
      • changedInput schema / properties / seed / description
        Previous value: -"RNG seed (integer or string). Default 42. Same inputs + seed reproduce byte-identical results — include the seed when reporting so users can reproduce the numbers."New value: +"RNG seed (integer or string). Default 42. Same inputs + seed reproduce byte-identical results - include the seed when reporting so users can reproduce the numbers."
      • changedInput schema / properties / simulateFunded / description
        Previous value: -"Whether 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."New value: +"Whether 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."
      • changedInput schema / properties / spec / description
        Previous value: -"Inline 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."New value: +"Inline 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."
      • changedInput schema / properties / spec / properties / fees / description
        Previous value: -"Fees — everything that goes into expected total cost."New value: +"Fees - everything that goes into expected total cost."
      • changedInput schema / properties / spec / properties / flagsNotSimulated / description
        Previous value: -"Honesty channel: ids of rules this entry has that the engine does not simulate (e.g. 'scaling-plan', 'soft-daily-lockout'). Surfaced in every result's assumption flags. Consistency rules and payout gating do NOT belong here — the engine simulates them."New value: +"Honesty channel: ids of rules this entry has that the engine does not simulate (e.g. 'scaling-plan', 'soft-daily-lockout'). Surfaced in every result's assumption flags. Consistency rules and payout gating do NOT belong here - the engine simulates them."
      • changedInput schema / properties / spec / properties / funded / properties / maxLoss / properties / mode / description
        Previous value: -"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')."New value: +"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')."
      • changedInput schema / properties / spec / properties / funded / properties / payoutRules / description
        Previous value: -"Payout gating — SIMULATED (engine v1), not just flagged: a payout happens only when these conditions are met, and on each eligible payout day the trader withdraws the maximum the rules allow (profit above the buffer, under the caps, never below the loss floor); balances and loss floors carry across payouts (see flag 'funded-withdrawal-model'). Omit for ungated payouts."New value: +"Payout gating - SIMULATED (engine v1), not just flagged: a payout happens only when these conditions are met, and on each eligible payout day the trader withdraws the maximum the rules allow (profit above the buffer, under the caps, never below the loss floor); balances and loss floors carry across payouts (see flag 'funded-withdrawal-model'). Omit for ungated payouts."
      • changedInput schema / properties / spec / properties / maxLoss / properties / mode / description
        Previous value: -"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')."New value: +"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')."
      • changedInput schema / properties / spec / properties / steps / items / properties / consistency / description
        Previous value: -"Consistency rule — SIMULATED (engine v1), not just flagged: one outsized day effectively raises the target (total profit must reach best day / pct), and the simulated trader keeps trading — rationally stopping days early when that helps — until the best-day share complies (see flag 'consistency-stop-rule'). null or omitted = no consistency rule."New value: +"Consistency rule - SIMULATED (engine v1), not just flagged: one outsized day effectively raises the target (total profit must reach best day / pct), and the simulated trader keeps trading - rationally stopping days early when that helps - until the best-day share complies (see flag 'consistency-stop-rule'). null or omitted = no consistency rule."
      • changedInput schema / properties / spec / properties / steps / items / properties / maxLoss / properties / mode / description
        Previous value: -"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')."New value: +"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')."
      • changedInput schema / properties / step / description
        Previous value: -"Grid 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."New value: +"Grid 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."
      • changedInput schema / properties / winRate / description
        Previous value: -"Probability 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."New value: +"Probability 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."
    • Changedpropfirms_simulate14 fields changed
      • changedInput schema / properties / fundedHorizonDays / description
        Previous value: -"Funded-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."New value: +"Funded-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."
      • changedInput schema / properties / riskMode / description
        Previous value: -"How 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."New value: +"How 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."
      • changedInput schema / properties / riskValue / description
        Previous value: -"Risk 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."New value: +"Risk 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."
      • changedInput schema / properties / seed / description
        Previous value: -"RNG seed (integer or string). Default 42. Same inputs + seed reproduce byte-identical results — include the seed when reporting so users can reproduce the numbers."New value: +"RNG seed (integer or string). Default 42. Same inputs + seed reproduce byte-identical results - include the seed when reporting so users can reproduce the numbers."
      • changedInput schema / properties / simulateFunded / description
        Previous value: -"Whether 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."New value: +"Whether 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."
      • changedInput schema / properties / spec / description
        Previous value: -"Inline 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."New value: +"Inline 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."
      • changedInput schema / properties / spec / properties / fees / description
        Previous value: -"Fees — everything that goes into expected total cost."New value: +"Fees - everything that goes into expected total cost."
      • changedInput schema / properties / spec / properties / flagsNotSimulated / description
        Previous value: -"Honesty channel: ids of rules this entry has that the engine does not simulate (e.g. 'scaling-plan', 'soft-daily-lockout'). Surfaced in every result's assumption flags. Consistency rules and payout gating do NOT belong here — the engine simulates them."New value: +"Honesty channel: ids of rules this entry has that the engine does not simulate (e.g. 'scaling-plan', 'soft-daily-lockout'). Surfaced in every result's assumption flags. Consistency rules and payout gating do NOT belong here - the engine simulates them."
      • changedInput schema / properties / spec / properties / funded / properties / maxLoss / properties / mode / description
        Previous value: -"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')."New value: +"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')."
      • changedInput schema / properties / spec / properties / funded / properties / payoutRules / description
        Previous value: -"Payout gating — SIMULATED (engine v1), not just flagged: a payout happens only when these conditions are met, and on each eligible payout day the trader withdraws the maximum the rules allow (profit above the buffer, under the caps, never below the loss floor); balances and loss floors carry across payouts (see flag 'funded-withdrawal-model'). Omit for ungated payouts."New value: +"Payout gating - SIMULATED (engine v1), not just flagged: a payout happens only when these conditions are met, and on each eligible payout day the trader withdraws the maximum the rules allow (profit above the buffer, under the caps, never below the loss floor); balances and loss floors carry across payouts (see flag 'funded-withdrawal-model'). Omit for ungated payouts."
      • changedInput schema / properties / spec / properties / maxLoss / properties / mode / description
        Previous value: -"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')."New value: +"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')."
      • changedInput schema / properties / spec / properties / steps / items / properties / consistency / description
        Previous value: -"Consistency rule — SIMULATED (engine v1), not just flagged: one outsized day effectively raises the target (total profit must reach best day / pct), and the simulated trader keeps trading — rationally stopping days early when that helps — until the best-day share complies (see flag 'consistency-stop-rule'). null or omitted = no consistency rule."New value: +"Consistency rule - SIMULATED (engine v1), not just flagged: one outsized day effectively raises the target (total profit must reach best day / pct), and the simulated trader keeps trading - rationally stopping days early when that helps - until the best-day share complies (see flag 'consistency-stop-rule'). null or omitted = no consistency rule."
      • changedInput schema / properties / spec / properties / steps / items / properties / maxLoss / properties / mode / description
        Previous value: -"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')."New value: +"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')."
      • changedInput schema / properties / winRate / description
        Previous value: -"Probability 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."New value: +"Probability 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."
    • Changedpropfirms_simulate_trades17 fields changed
      • changedInput schema / properties / blockMeanLength / description
        Previous value: -"Mean 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."New value: +"Mean 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."
      • changedInput schema / properties / fundedHorizonDays / description
        Previous value: -"Funded-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."New value: +"Funded-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."
      • addedInput schema / properties / importRisk
        Added value: +{
        +  "description": "Risk per trade for imports that carry P&L but no risk data (e.g. TradingView, MT5 deals, 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.",
        +  "type": "string"
        +}
      • changedInput schema / properties / rSeries / description
        Previous value: -"The 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."New value: +"The 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."
      • changedInput schema / properties / riskMode / description
        Previous value: -"How 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."New value: +"How 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."
      • changedInput schema / properties / riskValue / description
        Previous value: -"Risk 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."New value: +"Risk 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."
      • changedInput schema / properties / seed / description
        Previous value: -"RNG seed (integer or string). Default 42. Same inputs + seed reproduce byte-identical results — include the seed when reporting so users can reproduce the numbers."New value: +"RNG seed (integer or string). Default 42. Same inputs + seed reproduce byte-identical results - include the seed when reporting so users can reproduce the numbers."
      • changedInput schema / properties / simulateFunded / description
        Previous value: -"Whether 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."New value: +"Whether 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."
      • changedInput schema / properties / spec / description
        Previous value: -"Inline 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."New value: +"Inline 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."
      • changedInput schema / properties / spec / properties / fees / description
        Previous value: -"Fees — everything that goes into expected total cost."New value: +"Fees - everything that goes into expected total cost."
      • changedInput schema / properties / spec / properties / flagsNotSimulated / description
        Previous value: -"Honesty channel: ids of rules this entry has that the engine does not simulate (e.g. 'scaling-plan', 'soft-daily-lockout'). Surfaced in every result's assumption flags. Consistency rules and payout gating do NOT belong here — the engine simulates them."New value: +"Honesty channel: ids of rules this entry has that the engine does not simulate (e.g. 'scaling-plan', 'soft-daily-lockout'). Surfaced in every result's assumption flags. Consistency rules and payout gating do NOT belong here - the engine simulates them."
      • changedInput schema / properties / spec / properties / funded / properties / maxLoss / properties / mode / description
        Previous value: -"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')."New value: +"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')."
      • changedInput schema / properties / spec / properties / funded / properties / payoutRules / description
        Previous value: -"Payout gating — SIMULATED (engine v1), not just flagged: a payout happens only when these conditions are met, and on each eligible payout day the trader withdraws the maximum the rules allow (profit above the buffer, under the caps, never below the loss floor); balances and loss floors carry across payouts (see flag 'funded-withdrawal-model'). Omit for ungated payouts."New value: +"Payout gating - SIMULATED (engine v1), not just flagged: a payout happens only when these conditions are met, and on each eligible payout day the trader withdraws the maximum the rules allow (profit above the buffer, under the caps, never below the loss floor); balances and loss floors carry across payouts (see flag 'funded-withdrawal-model'). Omit for ungated payouts."
      • changedInput schema / properties / spec / properties / maxLoss / properties / mode / description
        Previous value: -"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')."New value: +"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')."
      • changedInput schema / properties / spec / properties / steps / items / properties / consistency / description
        Previous value: -"Consistency rule — SIMULATED (engine v1), not just flagged: one outsized day effectively raises the target (total profit must reach best day / pct), and the simulated trader keeps trading — rationally stopping days early when that helps — until the best-day share complies (see flag 'consistency-stop-rule'). null or omitted = no consistency rule."New value: +"Consistency rule - SIMULATED (engine v1), not just flagged: one outsized day effectively raises the target (total profit must reach best day / pct), and the simulated trader keeps trading - rationally stopping days early when that helps - until the best-day share complies (see flag 'consistency-stop-rule'). null or omitted = no consistency rule."
      • changedInput schema / properties / spec / properties / steps / items / properties / maxLoss / properties / mode / description
        Previous value: -"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')."New value: +"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')."
      • changedInput schema / properties / tradeLogText / description
        Previous value: -"The trader's trades as one pasted TIMESTAMPED log instead of a bare series. Format: CSV/TSV/semicolon text with a header row. Required columns: an open time (openedAt/entry/time/date; ISO 8601, 'YYYY-MM-DD HH:mm', MT4/MT5 'YYYY.MM.DD HH:mm', or epoch seconds/ms; timestamps WITHOUT an explicit offset are read as UTC) and an R-multiple result (r/rMultiple/result, optional 'R' suffix). Optional columns: close time (closedAt/exit) and direction (direction/side; long/buy or short/sell). Unparseable rows are skipped and reported as warnings in the text output. 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."New value: +"The 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), and 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. 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."
  8. 8 tool updates
    • Addedpropfirms_challenge_rules
    • Addedpropfirms_compare
    • Addedpropfirms_list_simulatable
    • Addedpropfirms_optimal_risk
    • Addedpropfirms_pass_rates
    • Addedpropfirms_simulate
    • Addedpropfirms_simulate_trades
    • Addedpropfirms_validate_strategy
  9. 6 tool updates
    • Changedlibrary_list_indicators4 fields changed
      • addedInput schema / properties / concept
        Added value: +{
        +  "description": "Concept slug — only indicators linked to this concept, e.g. 'rsi'",
        +  "type": "string"
        +}
      • 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
    • Addedpropfirms_get
    • Addedpropfirms_search
    • Addedpropfirms_search_challenges
    • Addedpropfirms_search_offers

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI co-pilots to interact with TradingView charts, manage alerts via REST API, automate morning briefs with custom trading rules, and perform real-time market analysis.
    -
  • A
    license
    A
    quality
    A
    maintenance
    Provides AI agents with a TradingView-centric toolkit for screener queries, historical FX data, pattern scanning, chart rendering, backtesting, Pine tooling, and optional account/desktop integration.
    6
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Personal AI assistant for your TradingView Desktop charts. Connects AI to your locally running TradingView app via Chrome DevTools Protocol for AI-assisted chart analysis, Pine Script development, and workflow automation.
    85 npm
    -
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.