luxalgo-mcp-server
Server Details
LuxAlgo Library — the encyclopedia of trading & technical analysis for AI agents. Free, keyless.
- Status
- Healthy
- Uptime
- 100.0% over 37 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- LuxAlgo/luxalgo-mcp-server
- GitHub Stars
- 60
- Server Listing
- LuxAlgo Library MCP
TDQS
Scored across 42 tools
Most tools are cleanly separated by domain prefixes (edge_, journal_, library_, propfirms_, trackers_) with distinct purposes. The only mild overlap is between propfirms_compare and propfirms_validate_strategy, which both simulate a strategy across challenges, though their scopes and outputs differ.
Names generally follow a domain prefix plus verb_noun pattern (journal_list_trades, library_get_concept, propfirms_simulate). A few noun-only names like edge_presets, propfirms_pass_rates, and trackers_datasets deviate slightly, but the pattern remains predictable within each family.
With 42 tools, the surface is well beyond the typical 3-15 tool range and even exceeds the 25+ threshold for 'too many.' Although the tools are grouped into coherent domains, the sheer number makes navigation and selection heavy for an agent.
Core workflows are well covered across library browsing, journal annotation, prop-firm simulation, and market-data trackers. However, the journal domain lacks delete/remove operations (no journal_delete_note, no fill removal), and edge stats are limited to precomputed presets, leaving notable lifecycle and flexibility gaps.
Available Tools
42 toolsedge_presetsList Edge Stats report presetsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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." | |
| category | No | Narrow to one category (the result lists all categories) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds useful behavioral context beyond that: the data is precomputed nightly, the catalog is framed in plain language, and the output is preset ids. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all informative and free of filler. It front-loads the core concept, gives illustrative examples, and ends with the actionable output. Every sentence earns its place without being overly terse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool, the description is complete: it explains what the preset catalog is, what kind of information each preset contains, and what the tool returns. The absence of an output schema is compensated by 'returns preset ids for edge_report' and the description of each preset's plain-language meaning.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already documented. The description does not add meaning about the optional category parameter or the required context parameter, but it doesn't need to because the schema covers them. This matches the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('list'/'returns'), clearly identifies the resource as Edge Stats report presets, and distinguishes the tool from edge_report by noting it returns preset ids for that sibling tool. The examples of preset types ('gap fills, opening-range breakouts') make the tool's purpose concrete and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the use context clear: it is a catalog of precomputed session-statistics presets and returns ids intended for edge_report. It stops short of explicitly stating when not to use this tool versus alternatives, but the tie to edge_report gives an agent enough context to select it appropriately.
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 reportARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| preset | Yes | Preset id, e.g. 'gap-fill' — see edge_presets | |
| symbol | Yes | Hosted symbol, e.g. 'BTCUSDT' — see edge_symbols | |
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description reveals substantial behavioral detail: the report includes N, a Wilson 95% confidence interval, minimum-sample guards, a first-half/second-half stability split, per-year counts, and a disclaimer. It also clarifies that results are historical conditional frequencies, not predictions. This is precisely the kind of context agents need to interpret outputs correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but purposeful: it opens with the core result, then lists the honesty-envelope components in a compact sequence, then adds the crucial historical-not-predictive qualifier. No sentence is wasted, though the length is on the high side; a slightly tighter grouping of output components would make it ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description carries the burden of explaining what the tool returns, and it does so thoroughly: the probability estimate, confidence interval, sample-size guards, stability split, yearly counts, value distribution, disclaimer, and a clear caveat about historical frequency. Together with the schema's fully documented parameters, an agent has enough information to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 three parameters, including the detailed context-parameter instructions. The description adds only light semantic help by mentioning that preset ids come from edge_presets and symbols from edge_symbols, which the schema also already states. This matches the baseline 3 for fully schema-documented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb-resource pair ('precomputed session-statistics result') and defines the exact semantic content: P(outcome | conditions) for a preset on a hosted symbol. It also distinguishes the tool from siblings by tying it to edge_presets and edge_symbols, making it clear this is the report lookup tool rather than a journal, library, propfirm, or tracker tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly situates the tool as a historical-frequency source and explicitly warns 'not predictions,' which helps an agent avoid misusing it for forecasting. It also tells the agent where to get required inputs ('Preset ids come from edge_presets; symbols from edge_symbols'). However, it does not explicitly state when to prefer this tool over sibling analytics tools, such as trackers_query or propfirms_simulate, so it stops short of a full when/when-not guide.
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 coverageARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and open-world, so the safety profile is covered. The description adds useful behavioral context by clarifying that hosted data includes coverage metadata but that session statistics come from the open-source edge-stats engine over free market data, reducing the risk of expecting outcomes this tool 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences each add distinct value: contents, data source/semantics, and usage pipeline. The description is front-loaded with the scope and contains no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a single generic context parameter and no output schema, the description gives enough coverage detail and pipeline context for an agent to decide to call it. It does not describe the return format, but that omission is minor here because the tool's role is clearly a starting overview and the annotations cover safety.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, context, is fully described in the schema with a 15–25 word analytics requirement, so the description is not required to add parameter detail. It adds no extra parameter semantics, but the schema already carries the full burden, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool's resource precisely—what the hosted Edge Stats store covers—and enumerates concrete contents: symbols, session calendars, coverage windows, session counts, and nightly build timing. It also distinguishes itself from the sibling tools by naming edge_presets and edge_report and positioning this as the starting point.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing guidance: 'Start here, then edge_presets for the questions you can ask, then edge_report for a result.' This tells the agent exactly when to select this tool relative to its closest siblings, with a clear sequencing.
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 handAIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| fills | Yes | The fills, in any order. | |
| context | Yes | 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." | |
| accountId | Yes | A `manual` or `import` account id from journal_list_accounts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: trade-derivation semantics (round trips, scale-ins, lone fills opening positions), ISO 8601 offset requirement, per-fill fee semantics, duplicate-skip behavior that concretely enriches the idempotentHint=true annotation, the return shape (insert counts, trades, keys), and OAuth sign-in requirement. The write semantics are consistent with readOnlyHint=false and add no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long (~5 sentences) but every clause earns its place: scope restriction, derivation rules, time format, dedupe behavior, return value, exclusions, and auth. It is front-loaded with the core purpose. It could be marginally leaner (e.g., the derivation rules could partly live in the fills schema), but for a tool with genuinely complex trade-formation semantics, the density is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for this tool's complexity. There is no output schema, and the description correctly shoulders that burden by explaining the return value (insert counts, resulting trades, keys). All required parameters are covered by the schema, and the description supplies the non-obvious semantics — how fills map to trades, account-type restrictions, dedupe, and auth — that 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds genuine value by explaining how fills relate to each other to form trades — critical for populating the fills array correctly — plus per-fill fee semantics and duplicate behavior. The schema already documents ISO 8601 and fee defaults, so the description supplements rather than carries the parameter meaning alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 to a manual or import journal account.' It goes further by naming the account-type scope (never broker-synced) and explicitly ties to siblings — journal_update_trade for follow-up edits and journal_list_accounts as the accountId source. An agent can distinguish this tool from its journal siblings 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use (manual/import journal accounts) and when-not-to-use ('never a broker-synced one — the sync owns those') guidance. It also states what this tool does not do ('Correcting or removing an existing fill is done in the app, not here') and points to the successor action via 'with key's for journal_update_trade.' Little 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_breakdownJournal P&L breakdownARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Inclusive end day (YYYY-MM-DD, journal timezone). Overrides `range`. | |
| from | No | Inclusive start day (YYYY-MM-DD, journal timezone). Overrides `range`. | |
| range | No | Named window ending today in the journal timezone. Ignored when from/to are given. | |
| context | Yes | 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." | |
| accounts | No | Journal account ids to scope to (from journal_list_accounts). Omit for every account, archived ones included. Unknown ids are rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark it read-only and open-world. The description adds useful behavioral context beyond those: it operates on closed trades, excludes breakevens from win rate, defaults to all time for sample-size reasons, and requires signing in with a LuxAlgo OAuth account. These are not inferred from schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences front-load the core output and metric list, then move to selection guidance, the alternative tool, and the auth requirement. Every sentence earns its place with no filler or restating of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only analytics tool with no output schema, the description covers grouping dimensions, returned metrics, default and narrowed time windows, account scope, the closest sibling, and authentication needs. An agent can decide when to call it and what response shape to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter already documented including precedence and override behavior, so the baseline is 3. The description reinforces the default all-time window and narrowing via range/from/to, but it doesn't add meaningfully new parameter semantics beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool reports: closed trades in a window grouped nine ways, with a full list of metrics including net P&L and win rate. It also names journal_overview as the sibling holding headline numbers, which lets an agent distinguish the two without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says this is the tool for 'what am I good or bad at' questions and routes headline-number questions to journal_overview. It also explains when the default all-time window makes sense and how to narrow with range/from/to, giving clear decision guidance.
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 calendarARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| month | No | Month as YYYY-MM. Default: the current month in the journal timezone. | |
| context | Yes | 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." | |
| accounts | No | Journal account ids to scope to (from journal_list_accounts). Omit for every account, archived ones included. Unknown ids are rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral detail beyond the read-only annotation: null cells for days with no trades, days expressed in the journal timezone, and the requirement of LuxAlgo OAuth sign-in. These details inform the agent about data shape and prerequisites without contradicting 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause earns its place: output structure, null behavior, timezone, default month behavior, drill-down alternative, and auth requirement. It is front-loaded with the core resource and then fills in supporting details without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of explaining the return value, and it does so thoroughly: day cells, weekly totals, monthly totals, and null semantics. Combined with read-only annotations and schema-documented parameters, nothing essential is missing for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 `month`, `context`, and `accounts` thoroughly. The description adds one useful default hint ('Omit `month` for the current month') but does not need to compensate for missing parameter documentation, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool returns: one month of the P&L calendar with week rows, day cells, and monthly aggregates. It differentiates itself from journal_get_day by explicitly framing that tool as the day-level drill-down, so an agent can pick the right sibling 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete usage guidance: omit `month` for the current month and use journal_get_day to drill into a single day. It does not enumerate all alternative siblings such as journal_overview or journal_breakdown, but the context for when this calendar view is appropriate is clear.
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 dayARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | The day, YYYY-MM-DD in the journal timezone. | |
| context | Yes | 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." | |
| accounts | No | Journal account ids to scope to (from journal_list_accounts). Omit for every account, archived ones included. Unknown ids are rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses null stats when no trades, which subset of trades is returned, and that notes include ids. Notes OAuth requirement. readOnlyHint and openWorldHint are consistent and the description adds useful null/edge-case behavior beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A dense, front-loaded definition that packs return contents, trade semantics, timezone, use cases, and auth requirement into three sentences without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 what the response contains, including the null-stats edge case and trade classification. It does not describe behavior for nonexistent days, but this is a minor gap given the detail provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already provides 100% parameter documentation. Description adds the journal-timezone clarification for date but does not discuss the optional accounts parameter, so it adds only marginal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it retrieves a single journal day with specific contents (stats, trades, notes). It distinguishes itself from broader journal tools by scoping to one day and explicitly names a related sibling (journal_update_note).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit use cases ('how did Tuesday go', finding note ids for journal_update_note). It does not enumerate exclusions versus siblings like journal_list_trades, but the single-day scope and named workflow make usage clear.
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 tradeARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The trade's `key` exactly as returned by journal_list_trades, journal_get_day, journal_search_notes or journal_add_trade. Never construct one. | |
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, but the description adds valuable behavioral context: it requires authentication (OAuth), which is not captured in annotations. It also spells out the runtime data so the agent knows exactly what fields to expect, including effective values, corrections, hidden flags, per-exit P&L, and annotation types. The only minor gap is lacking explicit note about pagination or absence of side effects, but overall it exceeds the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a bit long but each sentence serves a distinct function: the first defines the output, the second gives the invocation context, and the third covers auth. The information is front-loaded with the core payload, and the style is grammatically dense without being tautological. It could be slightly shortened without losing value, but the structure is logical and weaves all necessary cues together.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description carries the burden of explaining the return payload, which it does thoroughly (fields listed, fills with effective values, hidden flags, P&L, annotations). It also covers the prerequisites (OAuth) and the environment in which the tool should be selected (after list tools, before annotating). There is nothing an agent would need to know that is absent for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters at 100% coverage (according to context signals). The description adds meaningful instructions for the 'key' parameter: "Never construct one" and tells exactly where to obtain it (journal_list_trades, journal_get_day, journal_search_notes, journal_add_trade). This is a practical guardrail beyond the schema. The context parameter's purpose is described but the description doesn't need to repeat schema content; the added guardrail earns a score above the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the resource and action: "One trade in full" with a specific verb (get) and the resource (a single journal trade). It enumerates what is included (summary fields, fills, P&L, annotations), distinguishing it from list-level tools like journal_list_trades and journal_get_day. No ambiguity about what this tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: "After journal_list_trades or journal_get_day when the user asks about a specific trade or before annotating it." This provides a clear contextual trigger and a concrete alternative-avoidance guide. It also mentions the prerequisite of a LuxAlgo account (OAuth), which is an additional usage condition.
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 accountsARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only; the description adds an explicit OAuth sign-in requirement and the empty-list semantic. It also defines the special kind values (sync/import/manual) and states the returned timeZone. No contradiction with readOnlyHint/openWorldHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is ~90 words and front-loads the main purpose before usage guidance, empty-list behavior, and auth. The first sentence is long but packs necessary field and enum context with no filler. Could be broken up for readability, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description lists all returned account fields plus timeZone, and explains the journal terminology. It covers prerequisites (call first, OAuth sign-in), empty-results meaning, and relationship to other journal tools. An agent has everything needed to invoke and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, 'context', has a full schema description covering its usage, so the baseline is 3; the tool description does not add further parameter-level detail. It focuses on output fields rather than input semantics, which is acceptable given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: lists the signed-in user's trade-journal accounts and enumerates the returned fields. It also distinguishes itself from journal siblings by explaining that these ids feed every other journal tool's accounts filter, and clarifies account 'kind' values. No ambiguity about what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs the agent to call this first, and explains why: every other journal tool's accounts filter takes these ids and rejects unknown ones, and journal_add_trade requires a manual or import account. It also notes empty list means no journal yet, guiding next steps. No alternative tool is named, but the dependency chain is made clear.
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 playbooksARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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." | |
| accounts | No | Journal account ids to scope to (from journal_list_accounts). Omit for every account, archived ones included. Unknown ids are rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the readOnlyHint and openWorldHint annotations: it returns items ordered 'most-used first' with counts, covers both open and closed trades, and discloses the OAuth requirement for signing in with a LuxAlgo account. This gives the agent operational expectations that annotations alone do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences with no filler. It front-loads the core purpose, then provides the key usage guidance, an exclusion, and the authentication requirement. Every sentence contributes information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description still conveys the essential return semantics: the list includes every tag, mistake, and playbook id, sorted most-used first, with the number of trades carrying each. Combined with the rich schema and annotations, an agent has enough information to call the tool correctly and interpret its results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 the 'context' and 'accounts' parameters thoroughly. The tool description does not add parameter-level detail, but it does not need to because the schema carries the full semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource ('tags, mistakes and playbook ids') and the action ('list'), and defines the exact scope: the user's annotation vocabulary across all open or closed trades. It also distinguishes itself from trade summaries by stating per-trade tags are not included here, which helps an agent separate it from sibling tools like journal_get_trade.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool: 'Check it before journal_update_trade so new annotations reuse the user's own words instead of minting near-duplicates.' It also states what is not covered here ('Per-trade tags are on each trade summary, not here'), giving the agent clear routing guidance versus alternatives.
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 tradesARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Inclusive end day (YYYY-MM-DD, journal timezone). Overrides `range`. | |
| tag | No | Trades carrying exactly this tag (see journal_list_tags). | |
| from | No | Inclusive start day (YYYY-MM-DD, journal timezone). Overrides `range`. | |
| sort | No | Field to order by; default openedAt. Trades without a value for it come last in either order. | |
| limit | No | Page size, default 25. | |
| order | No | Default desc (largest / latest first); symbol defaults to asc (A→Z). | |
| cursor | No | `nextCursor` from the previous page; keep every other argument identical. | |
| status | No | ||
| symbol | No | One symbol, e.g. 'AAPL' (case-insensitive). | |
| context | Yes | 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." | |
| accounts | No | Journal account ids to scope to (from journal_list_accounts). Omit for every account, archived ones included. Unknown ids are rejected. | |
| direction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite readOnlyHint annotation, the description adds valuable behavioral context: default sort/order, handling of missing sort values, pagination via cursor, and requirement of OAuth sign-in. It also discloses that open trades are always listed, which is not in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured, front-loading the purpose, then covering filtering, sorting, pagination, and examples in a logical flow. Every sentence adds necessary detail without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (12 parameters), the description covers all key aspects: return fields, sorting nuances, filtering, pagination, examples, and explicit contrast with journal_get_trade. No critical missing information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 83% coverage, the description reinforces parameter semantics by clarifying default sort values, the field names used in sorting, and how filters combine. It explains ambiguous aspects like 'from/to' day window applied to open day and that netPnl is after fees.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists journal trade summaries with enumerated fields, default ordering, and explicit mention of what is not included (fills, note text). It differentiates from journal_get_trade by noting that the latter has full details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use this tool (listing trades) versus journal_get_trade for full trade details. Includes filtering, sorting, pagination instructions, and example use cases with specific parameter combinations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
journal_overviewJournal dashboardARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Inclusive end day (YYYY-MM-DD, journal timezone). Overrides `range`. | |
| from | No | Inclusive start day (YYYY-MM-DD, journal timezone). Overrides `range`. | |
| range | No | Named window ending today in the journal timezone. Ignored when from/to are given. | |
| compare | No | Also compute the equal-length window immediately before this one. | |
| context | Yes | 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." | |
| accounts | No | Journal account ids to scope to (from journal_list_accounts). Omit for every account, archived ones included. Unknown ids are rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds meaningful behavioral context beyond that: closed trades bucket by close day in the journal timezone, open positions count toward any window that reaches today, null metrics are not computable yet (e.g. profitFactorIsInfinite), and compare adds a 'previous' equal-length window. It also discloses the OAuth sign-in requirement. This is strong added context, though it doesn't detail the exact response shape (no output schema exists), so 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: it front-loads the core purpose and metric list, then covers windowing, compare, nulls, sibling routing, and auth in a logical order. Every sentence adds information. It is slightly long, but the tool is genuinely complex (many metric groups, multiple windowing modes, sibling tools), so the length is justified. A 5 would require even tighter grouping of the metric enumeration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex read-only dashboard tool with no output schema, the description covers the key things an agent needs: what metrics come back, how windows work, how compare behaves, how nulls are represented, which siblings to use for other questions, and the auth requirement. It does not describe the response structure or pagination, but the metric list is detailed enough to set expectations. The openWorldHint annotation also signals that results may vary, which the description supports with the null-metric note. A 5 would need explicit return-shape or error details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 six parameters. The description adds value beyond the schema by explaining the default window (last 30 days), the semantics of compare ('adds previous — the equal-length window just before'), and the timezone bucketing behavior that affects from/to interpretation. It also clarifies that accounts can be omitted for every account. This exceeds the baseline 3 for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('journal dashboard in one call for a window') and enumerates the exact metric groups returned (performance metrics, Edge Score components, per-day P&L, equity curve, open positions, accounts/settings). It also distinguishes itself from siblings by naming journal_breakdown and journal_list_trades as the tools for different questions. This is a clear, specific definition that an agent can act on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool versus alternatives: 'Use journal_breakdown for where the P&L comes from and journal_list_trades for the trades themselves.' It also gives concrete usage context: defaults to last 30 days, how to request 'all' or explicit from/to, and the compare behavior. This is explicit routing guidance, not just implied context.
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 notesARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Substring to look for in note text, case-insensitive. | |
| to | No | Inclusive end day (YYYY-MM-DD, journal timezone). Overrides `range`. | |
| from | No | Inclusive start day (YYYY-MM-DD, journal timezone). Overrides `range`. | |
| limit | No | Page size, default 25. | |
| cursor | No | `nextCursor` from the previous page; keep every other argument identical. | |
| symbol | No | ||
| context | Yes | 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." | |
| accounts | No | Journal account ids to scope to (from journal_list_accounts). Omit for every account, archived ones included. Unknown ids are rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds valuable behavioral context beyond the annotations: the stream is 'newest first as one stream split by kind', keyset pagination via cursor/nextCursor, case-insensitive filtering, and the OAuth sign-in requirement. It does not describe the exact response shape, but with no output schema and read-only semantics, the disclosed behavior is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that front-loads the core purpose, then packs filters, pagination, and auth into a compact sequence. Every sentence earns its place; there is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with 8 parameters and no output schema, the description covers the essential call semantics: result kinds, filter behavior, pagination, and auth. The only minor gap is that it doesn't describe the exact response envelope (e.g., whether results are wrapped in a data object), but the keyset-pagination mention and the read-only annotations make the tool safely callable without that detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 88%, so the schema already documents most parameters. The description adds meaning beyond the schema by explaining the relationship between `symbol` and the two note kinds (day notes have no symbol and drop out), and by clarifying that `accounts` can be omitted for every account. It also explains the `cursor`/`nextCursor` keyset-pagination pattern, which is not fully captured in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Search the notes feed'), then immediately distinguishes the two result kinds (`notes` vs `tradeNotes`) and names the sibling tools used to update each. This clearly differentiates it from journal_get_day, journal_get_trade, and journal_list_trades, which are the closest siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('Search the notes feed'), what filters are available, and that omitting every filter returns the latest notes. It also names the sibling tools for updating the two note kinds (journal_update_note, journal_update_trade), giving an agent clear routing guidance. The symbol filter caveat ('day notes have no symbol and drop out') is a precise usage condition.
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 noteAIdempotentInspect
Replace a day note's text and/or move it to another day, by note id (from journal_get_day or journal_search_notes). The body is replaced whole — to append, read the current text first and send the full new version. Trade notes are edited with journal_update_trade, not here. Returns the updated note. Requires signing in with a LuxAlgo account (OAuth).
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | The full new text. | |
| date | No | Move the note to this day, YYYY-MM-DD in the journal timezone. | |
| noteId | Yes | The note's `id`. | |
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond annotations: it explains the whole-body replacement semantics ('to append, read the current text first'), the required OAuth authentication, and the return of the updated note. It complements the annotations (readOnlyHint=false, idempotentHint=true) without contradiction, giving the agent essential execution details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each earning its place: purpose and note id source, behavioral replacement note, and routing/alternative plus auth and return. Front-loaded with the core action, no redundancy, and perfectly structured for quick comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for an agent to call this tool correctly: it covers the action, the source of the identifier, the replacement semantics to avoid data loss, the alternative tool, the authentication requirement, and the return value. With full schema coverage and this description, an agent has all necessary information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all parameters with 100% description coverage, so the baseline is 3. The description adds value by clarifying that 'body' is the full new text (reinforcing the replacement behavior), and that 'date' is for moving the note (matching the schema). It also notes the source of noteId, which is not in the schema. This slightly elevates it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool replaces a day note's text and/or moves it to another day, using the note's id. It distinguishes itself from journal_update_trade by explicitly naming the alternative for trade notes, making its purpose unambiguous and easily differentiable from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly specifies when to use this tool (updating existing day notes) and when not to (trade notes via journal_update_trade). It also indicates the source of the note id (from journal_get_day or journal_search_notes), providing clear selection and exclusion criteria.
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 tradeAIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The trade's `key` exactly as returned by journal_list_trades, journal_get_day, journal_search_notes or journal_add_trade. Never construct one. | |
| tags | No | ||
| notes | No | Replaces the trade's note text; null clears it. | |
| rating | No | Execution quality 1–5; null clears it. | |
| addTags | No | Tags to add (existing ones are kept; case-insensitive duplicates are ignored). | |
| context | Yes | 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." | |
| mistakes | No | ||
| reviewed | No | Mark the trade reviewed (true) or not (false). | |
| stopLoss | No | Planned stop price; null clears it. | |
| playbookId | No | Playbook / setup name this trade followed; null clears it. | |
| removeTags | No | Tags to remove (case-insensitive). | |
| addMistakes | No | Mistakes to add. | |
| profitTarget | No | Planned target price; null clears it. | |
| removeMistakes | No | Mistakes to remove (case-insensitive). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, and idempotentHint=true, so the mutation and idempotency profile is covered. The description adds valuable context beyond that: whole-list replacement semantics, null-to-clear behavior, the fact that stopLoss is what realized R is measured against, and the OAuth sign-in requirement. It does not contradict the annotations. A small gap is that it doesn't discuss partial-update semantics for fields not mentioned, but the field list and null behavior largely cover it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that front-loads the core purpose, then packs the most decision-relevant semantics (replacement vs. additive, null-clearing, what is not touched, return value, auth) into a compact space. Every sentence earns its place; there is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 key behavioral rules an agent needs: which fields are user-owned, how list replacement works, how to avoid clobbering, null semantics, return value, and auth. It doesn't spell out every parameter's meaning, but the schema covers those at 86%. The main gap is that it doesn't describe error conditions or what happens with invalid keys, but the description is otherwise complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 86%, so the schema already documents most parameters. The description adds meaning beyond the schema by explaining the replacement-vs-add/remove distinction, the null-clears convention, and the relationship between stopLoss and realized R. It also points to journal_list_tags for valid tag vocabulary. This is meaningful added value over the schema, though a few parameters (e.g., reviewed, playbookId) are only lightly elaborated in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Annotate a trade') and immediately scopes it to 'user-owned fields only', which distinguishes it from any trade-mutating sibling. It enumerates the exact fields, so an agent knows precisely what this tool does and what it deliberately does not do (fills, prices, P&L).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: use addTags/removeTags/addMistakes/removeMistakes instead of the whole-list replacement fields when changing a few entries, and check journal_list_tags for existing words. It also states the tool does not touch fills/prices/P&L, which tells the agent not to reach for it for those concerns. This is strong routing guidance relative to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
journal_write_noteWrite a journal noteAInspect
Add a new note to a trading day — any day, traded or not; date is YYYY-MM-DD in the journal timezone. Days hold any number of notes, so this never overwrites: to change an existing note use journal_update_note, and for a note about one specific trade use journal_update_trade's notes. Returns the note with its id. Requires signing in with a LuxAlgo account (OAuth).
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The note text (plain text or markdown). | |
| date | Yes | The day the note belongs to, YYYY-MM-DD in the journal timezone. | |
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by disclosing that the operation never overwrites because days can hold multiple notes, that it returns the note with its id, and that OAuth sign-in with a LuxAlgo account is required. These are non-obvious behavioral traits that help an agent set expectations, and nothing contradicts 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with each earning its place: the core action and scope, the distinction from alternatives, and the return/auth information. Front-loaded and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with three parameters and no output schema, the description covers the key contextual facts: non-destructive append behavior, return value, auth requirement, and clear sibling routing. The schema handles parameter details, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description need not repeat parameter details; it only reinforces the date format/timezone, which is already in the schema. It does not add meaning for body or context beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Add a new note to a trading day') and immediately distinguishes scope: any day, traded or not, and never overwrites. It explicitly separates itself from journal_update_note and journal_update_trade's notes, making the tool's purpose unambiguous among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use ('any day, traded or not') and when-not-to-use: 'to change an existing note use journal_update_note, and for a note about one specific trade use journal_update_trade's notes'. This directly routes the agent to the correct alternative based on the task.
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 conceptARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Exact concept slug, e.g. 'rsi' or 'order-blocks' — from search or list results | |
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the agent knows this is a safe read operation. The description adds useful context about the return format (markdown write-up with definition, formula, trader interpretation, indicator implementations) and the requirement for an exact slug. However, it doesn't disclose behavior like error cases for invalid slugs or whether the markdown is rendered or raw, but the annotations cover the safety profile, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero waste. The main purpose is front-loaded, the usage condition is stated clearly, and the prerequisite/routing is at the end. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a read-only retrieval tool with 100% schema coverage and annotations covering the safety profile. The description explains what the tool returns, when to use it, and how to get the required slug. The only minor gap is not describing error behavior for invalid slugs, but that's not essential for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description adds context for the slug parameter by explaining it must be the exact slug and pointing to search/list tools, which is helpful. The context parameter is fully documented in the schema with detailed instructions, so the description doesn't need to add more. Baseline 3 is correct 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Explain'), a specific resource ('a trading concept'), and the exact content of the write-up (definition, formula, how traders read it, indicator implementations). It also distinguishes itself from sibling tools by noting it returns the full markdown write-up, which is distinct from library_get_family, library_get_indicator, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use it: 'Use for any "what is X / how does X work" question.' It also gives a clear prerequisite and routing instruction: 'Needs the exact slug — find it with library_search or library_list_concepts.' This tells the agent exactly when to call this tool versus its siblings.
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 hubARead-onlyInspect
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Family key, e.g. 'smc-ict' | |
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so no safety disclosure is needed. The description adds useful behavioral detail beyond the schema: the output is markdown, contains a written overview, and includes a complete concept roster, which helps the agent set expectations for the returned content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single tight sentence with an em-dash clarification and a short usage clause. Every part earns its place: what the tool returns, in what format, and when to use it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only retrieval tool with two well-documented parameters and no output schema, the description fully covers the purpose, the content of the result, and the invocation context. An agent has enough information to select and call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 both 'key' and 'context' clearly, including an enum for 'key'. The description reinforces the concept with examples like 'smc-ict' and 'Wyckoff' but does not add substantial meaning beyond the schema, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: retrieving a family's hub page as markdown, including the written overview and complete concept roster. It also gives concrete examples ('SMC', 'Wyckoff'), making it distinguishable from sibling tools like library_get_concept and library_list_families.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this after library_list_families or when the user asks about a whole area like 'SMC' or 'Wyckoff'. It does not explicitly state when not to use it or name an alternative like library_get_concept, so it stops short of full exclusion guidance.
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 indicatorARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Indicator slug, e.g. 'tri-star' | |
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and openWorldHint=true, covering the safety model. The description adds output-content details but no additional behavioral traits such as side effects, prerequisites, or rate limits, which is adequate given the read-only annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste: the first lists the contained details and routes code requests to a sibling, the second states the usage trigger. Purpose and routing are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-item getter with a fully documented schema, the description covers what is returned, when to use it, and how to obtain source code. It does not point to list/search siblings, but that gap is minor for this tool's role.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: both slug and context have descriptions, with slug given an example. The tool description reinforces that slug identifies a specific indicator but does not add meaning beyond the schema for either parameter; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb+resource: 'Details for one indicator' and enumerates the contained fields. It distinguishes from library_get_source_code by explicitly routing code-fetching to that sibling, making the tool's scope unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives a usage condition: 'Use when the user asks about a specific indicator' and points to library_get_source_code for code retrieval. It does not mention alternatives like library_get_concept or library_list_indicators, so it lacks full exclusions but provides clear context.
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 codeARead-onlyInspect
The full, working source code of a Library indicator (works on TradingView). Kept separate from library_get_indicator because sources are long — call it only when the user wants the code itself.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Indicator slug | |
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=true, covering the safety profile. The description adds that sources are long and that the tool returns the full working code, but it does not disclose additional behavioral details such as output size limits or formatting. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads what the tool returns, and then gives essential routing guidance. Every sentence earns its place and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple read-only retrieval tool with two well-documented parameters and no output schema. The description explains what is returned, when to use it, and why it is separate from a sibling, which is sufficient for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the slug and context parameters are already documented. The description does not add any meaning beyond the schema, which is the baseline case where the schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title and description clearly state this tool returns the full, working source code of a Library indicator. It explicitly distinguishes itself from library_get_indicator by noting the source is kept separate because it is long, so an agent can tell exactly what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'call it only when the user wants the code itself.' It also names the alternative library_get_indicator and explains the separation, making the decision between siblings unambiguous.
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 conceptsARead-onlyInspect
Browse every trading and technical-analysis concept in the Library — paginated, optionally one family. Use to enumerate a topic area or find slugs for library_get_concept; for keyword lookup prefer library_search.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Default 0 | |
| family | No | ||
| context | Yes | 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." | |
| page_size | No | Default 50 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description does not need to repeat safety. It adds useful behavior: pagination and optional family filtering. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste; the core purpose is front-loaded and the usage guidance is compact and direct.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a paginated list tool with an optional family filter, the description covers the purpose, usage, and pagination. Without an output schema, it does not describe the return format, but that is not critical for a browse/enumerate tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, with descriptions for context, page, and page_size, and an enum for family. The description adds 'optionally one family' which clarifies family usage but does not meaningfully supplement the schema's parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'browse' and the resource 'every trading and technical-analysis concept in the Library,' and it explicitly differentiates from siblings like library_search and library_get_concept by mentioning their purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('enumerate a topic area or find slugs for library_get_concept') and when not to ('for keyword lookup prefer library_search'), naming the alternative tool directly.
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 familiesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, covering safety. The description adds useful behavioral context by specifying what is returned (17 families, counts, hub links) and the tool's top-level scope. It does not mention ordering, pagination, or exact response structure, so it adds moderate but not rich behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core identity ('top-level taxonomy'), contents (17 families, counts, hub links), and usage context ('natural first call') are all front-loaded and every phrase earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with one well-documented parameter, the description gives enough to understand what the tool returns and when to call it. The absence of an output schema is mitigated by the concrete enumeration of returned elements; no critical information is missing for a first-orientation call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single context parameter, and the schema provides a thorough explanation of that parameter. The description does not need to repeat it; a baseline 3 is appropriate since the description adds no extra parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the resource (Library's top-level taxonomy), the operation (list families), and concrete contents (17 families with concept counts and hub links). It stops short of explicitly differentiating from siblings like library_list_concepts or library_get_family, though 'top-level taxonomy' and 'natural first call' imply its distinct role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'natural first call for orientation' gives a clear when-to-use signal, positioning it before more specific library tools. It does not name alternatives or exclusions, but the orientation guidance is sufficient for a simple read-only listing tool.
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 indicatorsARead-onlyInspect
Browse the indicator catalog with filters and server-side sorting (newest first by default). Filter by family, concept slug (implementations of one concept), tags (ids from library_list_tags, AND-combined), trading platform, or plan tier. Use for structured browsing — 'latest indicators', 'everything in the volatility family', 'indicators implementing liquidity sweeps'; for keyword discovery prefer library_search.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Default 0 | |
| sort | No | Default: date | |
| tags | No | Tag ids (from library_list_tags); an indicator must carry every tag | |
| text | No | Server-side text filter | |
| tier | No | Only indicators included in this LuxAlgo plan tier | |
| family | No | ||
| concept | No | Concept slug — only indicators linked to this concept, e.g. 'rsi' | |
| context | Yes | 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." | |
| platform | No | Trading platform the indicator supports, e.g. 'metatrader' | |
| direction | No | ||
| page_size | No | Default 24 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and openWorldHint, and the description adds useful behavioral context: server-side sorting, newest-first default, AND-combined tag filtering, and the set of supported filter dimensions. It does not mention pagination behavior, but the schema already documents page and page_size defaults.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three well-structured sentences: the first states the core behavior, the second enumerates filter dimensions, and the third gives usage examples and the sibling alternative. No wasted words; all content is decision-relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 11-parameter browsing tool, the description effectively covers the primary filtering dimensions, ordering behavior, and the main alternative. It omits a few available parameters like text, direction, and pagination, but those are well-documented in the schema and the description provides enough context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (82%), so the schema carries most parameter meaning. The description echoes family, concept, tags, platform, and tier filters, and adds the 'AND-combined' tag semantics, though those are largely already present in the schema. It adds modest semantic value but not significant new parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Browse') with a clear resource ('indicator catalog') and immediately distinguishes this tool from the sibling library_search. It conveys a listing/filtering purpose that is distinct from search, concepts, families, and tags tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('structured browsing') with concrete examples like 'latest indicators' and 'everything in the volatility family', and names the alternative ('library_search') for keyword discovery. This gives an agent clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
library_list_tagsList indicator tagsARead-onlyInspect
The Library's indicator tag vocabulary (behavioral traits like 'Volatility', 'Trailing-Stop', 'Repainting Functionality'). Returns ids to pass as the tags filter of library_list_indicators — tags are orthogonal to the concept-family taxonomy.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers safety, and the description adds useful behavior not in annotations: the tool returns ids intended for filtering and clarifies the relationship to the concept-family taxonomy. For a simple read-only list, this is sufficient 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. The first names the resource and examples, and the second gives the downstream use and taxonomy relationship.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity read-only list with one generic parameter, the description covers what is returned (ids), how to use them (tags filter of library_list_indicators), and how tags relate to the taxonomy. No output schema exists, but the return semantics are sufficiently stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter is context, which is fully documented in the schema with a generic analytics instruction. The tool description adds no domain-specific parameter semantics, but with 100% schema coverage the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as 'The Library's indicator tag vocabulary', gives concrete examples of tags, and states the output is ids for the tags filter of library_list_indicators. It also distinguishes itself from concept/family taxonomy tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly connects the tool to its downstream use: obtaining tag ids to pass as the tags filter of library_list_indicators. It also notes that tags are orthogonal to the concept-family taxonomy, helping avoid confusion with library_list_concepts or library_list_families. It stops short of explicit when-not-to-use language.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
library_searchSearch the LuxAlgo LibraryARead-onlyInspect
Search the LuxAlgo Library — the encyclopedia of trading and technical analysis. One query over 800+ concepts (alias-aware: 'stochastics' finds Stochastic Oscillator) and 800+ ready-to-use indicators. Start here whenever you have a name, informal term, or topic; results carry slugs for the get tools plus canonical URLs for citation.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Limit to 'concepts' (explanations) or 'indicators' (implementations); default all | |
| limit | No | Max results (default 10) | |
| query | Yes | A concept, indicator name, alias, or topic — e.g. 'order blocks', 'mean reversion', 'stochastics' | |
| family | No | Narrow to one concept family | |
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds meaningful behavioral context: alias-aware matching, the fact that results carry slugs and canonical URLs, and the scope of the search (800+ concepts and indicators). It doesn't describe pagination or result ordering, but for a search tool with readOnlyHint, the added context is sufficient to push above baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero filler. The first sentence front-loads the core purpose and scope, and the second sentence adds the usage directive and output value. Every clause earns its place: 'alias-aware,' '800+,' 'slugs for the get tools,' and 'canonical URLs for citation' all convey distinct, useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with readOnlyHint and openWorldHint annotations, the description covers the essential decision points: what it searches, when to use it, and what the results contain. It doesn't describe result format or ordering, but no output schema exists and the description's mention of slugs and URLs gives an agent enough to know what to expect. The only minor gap is not stating that results are paginated or how to control it, but the limit parameter in the schema covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 five parameters. The description adds the alias-aware behavior and the 'start here' guidance, which enriches the query parameter's meaning, but it doesn't add detail about type, limit, or family beyond what the schema provides. Baseline 3 is appropriate because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search'), a specific resource ('the LuxAlgo Library'), and the scope ('800+ concepts' and '800+ ready-to-use indicators'). It also distinguishes itself from sibling get/list tools by saying 'results carry slugs for the get tools plus canonical URLs for citation,' which tells an agent this is the entry point for discovery rather than retrieval. The alias-aware note ('stochastics' finds Stochastic Oscillator) further clarifies the tool's unique value.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Start here whenever you have a name, informal term, or topic,' which is a clear when-to-use directive. It also implies the alternative: once you have slugs, use the get tools (library_get_concept, library_get_indicator, etc.). This is strong routing guidance that helps an agent choose between library_search and the many sibling library 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 accountARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds meaningful behavioral context beyond that: it requires signing in with a LuxAlgo account via OAuth, which is important for an agent to communicate or handle correctly. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: it states what the tool returns, when to use it, and the auth prerequisite. The most important information is front-loaded, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only account-info tool, the description provides the resource scope, example data categories, use cases, and auth requirement. There is no output schema, but the description's list of plan tier, entitlements, and profile basics gives a reasonable sense of what to expect. It could mention return format, but that is not critical for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the only parameter, context, has a detailed description in the schema. The tool description does not add parameter-level meaning beyond the schema, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (the signed-in user's LuxAlgo account) and lists its contents: plan tier, entitlements, and profile basics. It also states concrete use cases, though it reads more as a noun-phrase description than a verb-led action, and it does not explicitly contrast with the sibling tools (which are mostly unrelated data or library tools).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool to tailor answers to plan limits or when the user asks what plan they are on. This gives clear context for when to invoke it, although it does not discuss exclusions or alternatives—likely unnecessary given the sibling set.
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 rulesetARead-onlyInspect
Fetch one directory challenge's complete ruleset (ChallengeSpec), adapted from the live LuxAlgo directory: evaluation steps (profit targets in percent units of the initial account, minimum trading days, time limits); the daily-loss rule with its exact semantics (basis = measured from prior-day balance vs prior-day equity; limitBasis = whether a pct limit is a fixed allowance of the initial balance or recomputed daily from the anchor; evaluation = breached on an intraday touch vs only at the close; includesOpenPnl = whether floating P&L can breach it); the max-loss rule and its drawdown mode (How the max-loss floor behaves - the single most consequential rule difference between firms. 'static-initial': floor fixed at initial balance minus the limit; never moves (classic CFD two-step). 'trailing-realized-eod': floor ratchets up with end-of-day balance highs; intraday highs do not move it. 'trailing-intraday-unrealized': floor trails the peak unrealized equity intraday and never stops trailing (futures-style; the most-miscalculated rule in the industry: it cuts pass probability dramatically). 'trailing-locks-at-initial': trails intraday peak equity until the floor reaches the initial balance, then freezes (common futures variant). Locking is also composable: locksAtInitial adds the same lock to an EOD trail, and lockOffsetAmount shifts the lock level to initial balance + that amount (e.g. 100 models 'stops trailing $100 above the start').); per-step consistency rules (steps[].consistency.maxBestDayProfitPct - SIMULATED: one outsized day effectively raises the target until the best-day share complies); fees (price, one-time vs monthly billing, reset fee, activation fee, refundable-on-pass); funded terms (profit split percent, payout frequency, first-payout minimum days, and funded.payoutRules - SIMULATED payout gating: minWinningDays, winningDayMinProfit, per-payout caps maxPayoutPctOfProfit/maxPayoutAmount, bufferAmount, and a windowed consistencyMaxBestDayPct gate); flagsNotSimulated (rules the entry declares but the engine does not simulate - material caveats to relay to the user); and sources (the firm-page citation when the directory serves one). The result also carries provenance and inferredFields - every rule read from free text instead of a structured column is named there; relay them and treat the firm's page as authoritative. The returned challenge object is exactly the shape the simulation tools accept as inline spec: copy it, change a rule, and re-simulate to quantify how a rule variation moves pass probability and EV. UNITS: every *Pct rule field and every percent-mode risk value is in PERCENT UNITS (5 = 5%, 0.5 = 0.5%). The one exception is winRate, which is a FRACTION in [0, 1] (0.55 = 55% winners). Probabilities in results are fractions in [0, 1]. DATA SOURCE & PROVENANCE: firm data comes live from LuxAlgo's public, keyless prop-firm directory API - the data behind luxalgo.com/prop-firms (origin overridable via the LUXALGO_APP_ORIGIN env var). Rule semantics are used verbatim where the directory serves structured rule columns; where it serves only free text, semantics are inferred ONLY when one reasonable reading exists, and every inferred field is disclosed in inferredFields (provenance 'directory+inferred') - relay those to the user next to any numbers. Challenges whose loss rules cannot be established are refused as not simulatable rather than guessed. Firms change rules; each firm's own page is always authoritative. NOTE: this returns the simulatable encoding of one challenge's rules; the directory listing with every captured field, plus live offers, is propfirms_get and propfirms_search_challenges.
| Name | Required | Description | Default |
|---|---|---|---|
| firmId | Yes | Directory firm id or firm name from propfirms_list_simulatable, e.g. 'ftmo'. | |
| context | Yes | 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." | |
| challengeId | Yes | Directory challenge id from propfirms_list_simulatable. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, and the description adds substantial non-redundant context: live data source (LuxAlgo public keyless API with env-var origin override), inference behavior with `inferredFields` disclosure, refusal of challenges whose loss rules cannot be established, the simulated-vs-declared distinction (flagsNotSimulated), and the caveat that each firm's page is authoritative. It even discloses a non-obvious behavioral trait: 'one outsized day effectively raises the target until the best-day share complies'. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very long (roughly 450 words) but every block earns its place: rule semantics, drawdown modes, units, provenance, and sibling routing are all consequential for correct use. The main purpose is front-loaded in the first sentence. It is dense rather than padded, though it approaches the upper bound of reasonable length; slightly tighter phrasing on the drawdown-mode enumeration would improve it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the full burden of explaining return values, and it does so exhaustively: it enumerates every rule category in the ChallengeSpec, explains unit conventions (percent vs fraction, with winRate called out as the exception), describes provenance/inferredFields, covers refusal behavior, and clarifies how results feed downstream simulation tools. Given the tool's genuine complexity and zero output-schema support, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds no parameter-specific semantics beyond the schema; firmId and challengeId are already documented in the schema as originating from propfirms_list_simulatable. The extensive units guidance applies to return values rather than parameters, so the description does not need to compensate for any schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Fetch one directory challenge's complete ruleset (ChallengeSpec)'. It clearly scopes the tool to a single challenge's simulatable encoding and explicitly differentiates from siblings in the final sentence: 'the directory listing with every captured field, plus live offers, is propfirms_get and propfirms_search_challenges'. An agent can distinguish this from the sibling prop-firm tools 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit use case: the returned `challenge` object is exactly the shape simulation tools accept as inline `spec`, so an agent can copy, modify, and re-simulate. It names alternatives and their scope (propfirms_get and propfirms_search_challenges for listings/offers), states prerequisites (ids come from propfirms_list_simulatable), and even specifies the refusal behavior for unsimulatable challenges. When-to-use and when-not-to-use are both explicit.
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 traderARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | 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. | |
| paths | No | Monte 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. | |
| avgWinR | Yes | Average winning trade in R-multiples, i.e. multiples of the amount risked per trade (1.5 = winners average 1.5x the risk). | |
| context | Yes | 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." | |
| winRate | Yes | 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. | |
| winStdR | No | Standard deviation of winner sizes in R (0 = every winner is exactly avgWinR). Default 0. Adding spread makes streak damage more realistic. | |
| avgLossR | No | Average 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. | |
| lossStdR | No | Standard deviation of loser sizes in R (0 = every loser is exactly avgLossR). Default 0. | |
| riskMode | No | 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. | |
| riskValue | Yes | 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. | |
| attemptCap | No | Maximum challenge attempts per path before that path gives up. Default 25. Journey statistics (expected attempts/cost, P(funded)) are censored at this cap. | |
| challenges | Yes | The challenges to simulate this trader across (1-12 entries; 2+ for a meaningful comparison). Mix dataset references and inline specs freely. | |
| tradesPerDay | Yes | Average trades per simulated trading day. More trades per day means more ways to hit the daily loss limit within a single day. | |
| simulateFunded | No | 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. | |
| fundedHorizonDays | No | 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. | |
| tradesPerDayModel | No | '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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, the description adds substantial behavioral context: results are ordered by EV for specific inputs and are not endorsements, determinism depends on seed, flagsNotSimulated can make numbers optimistic, consistency and payout gating are simulated, and results are distributions under assumptions. It also instructs how to present results, which is unusually useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with labeled sections (UNITS, DETERMINISM, ASSUMPTIONS) and front-loads the core purpose in the first sentence. There is mild redundancy around 'not a ranking' and repeated emphasis on assumptions, but each section carries meaningful operational guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description enumerates the returned row fields (perAttemptPassProbability, fundedProbability, expectedAttempts, expectedCost, evTotal, pEvPositive, daysToFundedP50, flagsNotSimulated) and explains how to interpret them. Combined with the caveats about assumptions and determinism, an agent has enough to invoke the tool and present results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds valuable cross-cutting semantics beyond the schema: unit conventions (percent units vs. winRate as a fraction), the role of seed in reproducibility, the meaning of flagsNotSimulated, and the importance of reporting assumptions alongside numbers. Most parameter-level detail is already in the schema, but the description enriches interpretation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Simulate the SAME trader across several challenges ... and return one row per challenge sorted by expected value.' It also clearly distinguishes this from a ranking and from propfirms_simulate, so an agent can tell it apart from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this when comparing multiple challenges under identical trader inputs, and it explicitly routes to propfirms_simulate for full per-challenge distributions ('For full per-challenge distributions run propfirms_simulate on the interesting rows'). It does not enumerate exclusions against every sibling, but the key alternative is named.
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 firmARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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." | |
| propfirmId | Yes | Public firm slug, e.g. 'ftmo' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as readOnly and openWorld, and the description adds meaningful behavioral details beyond that: uncaptured null fields are omitted, and challenges reference applicable offers via offerIds into the firm-level offers list. This clarifies response shape and entity relationships in a way annotations cannot.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core purpose and content list, followed by routing and data-model notes. Every sentence contributes either invocation guidance, alternative routing, or behavioral detail; the length is justified by the dossier's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup with only two fully documented parameters and no output schema, the description is complete: it names the input source, enumerates returned content, explains null omission and referencing behavior, and routes to relevant siblings. Nothing critical is missing for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with propfirmId already described as a 'Public firm slug'. The description adds useful operational guidance by reinforcing lookup-by-slug and explicitly directing the agent to propfirms_search to discover valid slugs, which goes beyond the schema's static description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: returns a single prop firm's 'full dossier by slug' and enumerates exactly what that dossier contains (profile, challenges, offers, written overview). It also names the sibling propfirms_search for slug lookup, so an agent can tell it apart from related search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly indicates when to use the tool (to retrieve a full dossier by slug) and explicitly points to alternatives: 'Find slugs with propfirms_search' and 'use propfirms_pass_rates' for pass odds. It lacks explicit exclusionary guidance such as 'do not use for challenge-only lookups', but the 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_list_simulatableList prop firms and challengesARead-onlyInspect
List the prop firms in the live LuxAlgo directory together with every simulatable challenge (challengeId, display name, account size, currency, price, and its rule-semantics provenance). Call this first to discover the firmId + challengeId pairs accepted by propfirms_challenge_rules, propfirms_simulate, propfirms_optimal_risk, propfirms_compare and propfirms_simulate_trades. Challenges whose loss-rule semantics cannot be established are listed under notSimulatable instead of being guessed. The listing is data, not endorsement: firms are alphabetical - no recommendation or ranking is implied, and none should be presented. DATA SOURCE & PROVENANCE: firm data comes live from LuxAlgo's public, keyless prop-firm directory API - the data behind luxalgo.com/prop-firms (origin overridable via the LUXALGO_APP_ORIGIN env var). Rule semantics are used verbatim where the directory serves structured rule columns; where it serves only free text, semantics are inferred ONLY when one reasonable reading exists, and every inferred field is disclosed in inferredFields (provenance 'directory+inferred') - relay those to the user next to any numbers. Challenges whose loss rules cannot be established are refused as not simulatable rather than guessed. Firms change rules; each firm's own page is always authoritative. NOTE: this lists only the firms and challenges whose rules the engine can encode honestly. The full directory — every visible firm with platforms, prices, payout terms, and live offers/promo codes — is served by propfirms_search, propfirms_search_challenges, and propfirms_search_offers.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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." | |
| productType | No | Optional filter to one instrument class. Omit to list every firm. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses data provenance, live-data behavior, origin overridability, inference policy with inferredFields disclosure, refusal to guess loss rules, alphabetical non-endorsement, and that firm pages remain authoritative. This is rich behavioral context that materially changes how an agent should interpret results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but structured into a clear first-sentence summary, usage guidance, data-source section, and differentiation note. The main redundancy is the not-simulatable policy being stated twice, but each remaining sentence carries distinct value, so the overall structure is still strong.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 returned fields, the notSimulatable collection, and inferredFields provenance. It also explains when to call this tool versus the search siblings新材料, how data is sourced, and how to handle inference caveats. An agent has enough context to call it and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters, including the productType enum and the meaning of omitting it. The description adds no additional parameter-level semantics, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: it lists prop firms and their simulatable challenges from the live LuxAlgo directory, enumerating the exact fields returned. It also explicitly distinguishes itself from propfirms_search tools by stating it only lists honestly encodable firms and challenges.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It instructs the agent to call this tool first to discover valid firmId + challengeId pairs for five sibling tools, and explicitly says the full directory is served by propfirms_search, propfirms_search_challenges, and propfirms_search_offers. It also gives clear when-not-to-use guidance by noting challenges with unestablishable loss rules are not simulated or guessed.
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 tradeARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Grid end, same units as min. Default 3 (= 3% per trade for percent modes). | |
| min | No | Grid 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). | |
| seed | No | 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. | |
| spec | No | 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. | |
| step | No | 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. | |
| paths | No | Monte 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. | |
| firmId | No | Directory firm id or firm name (e.g. 'ftmo' or 'FTMO'); discover with propfirms_list_simulatable. Must be paired with challengeId. Mutually exclusive with `spec`. | |
| avgWinR | Yes | Average winning trade in R-multiples, i.e. multiples of the amount risked per trade (1.5 = winners average 1.5x the risk). | |
| context | Yes | 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." | |
| winRate | Yes | 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. | |
| winStdR | No | Standard deviation of winner sizes in R (0 = every winner is exactly avgWinR). Default 0. Adding spread makes streak damage more realistic. | |
| avgLossR | No | Average 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. | |
| lossStdR | No | Standard deviation of loser sizes in R (0 = every loser is exactly avgLossR). Default 0. | |
| riskMode | No | 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. | |
| attemptCap | No | Maximum challenge attempts per path before that path gives up. Default 25. Journey statistics (expected attempts/cost, P(funded)) are censored at this cap. | |
| challengeId | No | Directory challenge id; discover with propfirms_list_simulatable. Must be paired with firmId. Mutually exclusive with `spec`. | |
| tradesPerDay | Yes | Average trades per simulated trading day. More trades per day means more ways to hit the daily loss limit within a single day. | |
| simulateFunded | No | 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. | |
| fundedHorizonDays | No | 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. | |
| tradesPerDayModel | No | '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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, the description discloses common random numbers for smooth curves, byte-identical reproducibility with seed, cost scaling with grid size, assumption flags and disclaimer, and that results are distributions, not promises. This is substantial behavioral context an agent needs to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but tightly organized into labeled sections (UNITS, DETERMINISM, ASSUMPTIONS) and front-loaded with the core purpose and result semantics. Every sentence adds operational or interpretive value; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining results, and it does: it names the key output fields (bestByPassProbability, bestByEv, diverges, assumptions.flags, assumptions.disclaimer), clarifies probability units, explains reproducibility, and warns about cost. This is sufficient for an agent to call the tool and interpret the response correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 valuable cross-parameter semantics: percent units for Pct fields and percent-mode risks, winRate as a fraction, grid defaults and units by riskMode, and the explicit note that riskValue is not a parameter here. It does not enumerate all 20 parameters, but the schema already documents those.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific operation: sweep risk-per-trade over a grid, run full journey simulations, and report two named optima (bestByPassProbability and bestByEv). It clearly distinguishes this from generic simulation or pass-rate tools by focusing on risk optimization, even without explicitly naming a sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use context (grid optimization), explicit reporting requirements (never present one number, report both optima and trade-off), and practical iteration guidance (coarse grid first, then refine). It notes an exclusion (parametric trader only, riskValue not a parameter), though it does not explicitly name a sibling tool for single-point simulation.
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 archetypeARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| firmId | Yes | Directory firm id (propfirmId, e.g. 'ftmo') or firm name — from propfirms_list_simulatable. | |
| context | Yes | 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." | |
| challengeId | No | One challenge id. Omit to compute every simulatable challenge the firm has. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark the tool as readOnly and openWorld, and the description adds valuable behavioral context: results are deterministic per ruleset, cached, cheap to call, computed from encoded rules, and not a ranking. It discloses the reference archetypes and risk assumptions, the provenance handling for inferred fields, and the caveat to check lastVerified. This goes 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the key purpose and differentiation. It includes a long enumeration of return values und caveats, but each detail supports correct interpretation and prevents misuse. Slightly long, but justified given the complexity and absence of an output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the full burden of explaining return values, and it does so thoroughly: probabilities, confidence intervals, expected attempts, cost, EV, payout, blowup probability, assumption flags, and provenance. It also explains relevant caveats about reference odds, authoritative firm pages, and where to go for personal simulations and live offers. Nothing critical is missing for an agent to decide whether and how to call this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input parameters are already well documented. The description adds meaning to the overall computation, such as archetype win rates and output dimensions, but it does not add much parameter-specific guidance beyond what the schema provides. The baseline of 3 is appropriate because the schema carries the parameter documentation burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific purpose: computing reference challenge pass rates per archetype using the same engine and reference assumptions. Clearly distinguishes itself from propfirms_simulate and propfirms_simulate_trades by emphasizing 'reference odds' rather than personal statistics. The title and description align and identify the exact deliverable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool vs alternatives: use it for orientation and comparison, but use propfirms_simulate or propfirms_simulate_trades for the user's own statistics. It also directs the agent to propfirms_get and propfirms_search_offers for full profiles and live offers, and warns that a firm's page is authoritative. This is exemplary routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propfirms_searchSearch prop firmsARead-onlyInspect
Search LuxAlgo's prop-firm catalog (proprietary trading firms offering funded accounts). Combine firm filters (platforms, markets, payment/payout methods, country availability, Trustpilot, year founded) with nested challenge filters (account size, price, steps, profit split, trading rules) and offer filters — a firm matches when at least one of its challenges/offers matches all of them. Omit every filter to list all firms. Use include to nest the matching challenges, live offers, and the written overview; for one firm's full dossier prefer propfirms_get. Uncaptured (null) fields are omitted from results; nested challenges reference offers via offerIds into the firm-level offers list. This tool returns directory data (what exists and on what terms), not outcomes: for simulated pass odds on a challenge found here, use propfirms_pass_rates or propfirms_simulate with its firm and challenge ids.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort key (default name) | |
| text | No | Case-insensitive search over firm name and slug, e.g. 'ftmo' | |
| steps | No | Exact evaluation step count (1 = instant/funded, 2 = two-step, …) | |
| context | Yes | 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." | |
| include | No | Extra payloads to nest on each firm (only children matching the filters are returned) | |
| offerId | No | Public offer ids | |
| currency | No | Account currencies, e.g. ['usd', 'eur'] | |
| interval | No | Challenge fee intervals, e.g. 'one-time', 'monthly' | |
| priceMax | No | Maximum challenge fee (inclusive) | |
| priceMin | No | Minimum challenge fee (inclusive) | |
| stepsMax | No | Maximum step count (ignored when steps is set) | |
| stepsMin | No | Minimum step count (ignored when steps is set) | |
| direction | No | Sort direction; each sort key has a sensible default | |
| offerText | No | Case-insensitive search over promo code and offer descriptions | |
| pageIndex | No | 0-based page index (default 0) | |
| promoCode | No | Case-insensitive substring of the promo code | |
| isFeatured | No | Only featured offers when true | |
| maxLossMax | No | Upper bound on the overall-loss limit magnitude | |
| propfirmId | No | Public firm slugs, e.g. ['ftmo'] | |
| autoTrading | No | Whether automated trading (EAs/bots) is allowed | |
| availableIn | No | Country names the firm must NOT restrict, e.g. ['United States'] | |
| challengeId | No | Public challenge ids | |
| copyTrading | No | Whether copy trading is allowed | |
| countryIso2 | No | ISO-2 headquarters countries, e.g. ['GB', 'US'] | |
| discountMax | No | Maximum discount value | |
| discountMin | No | Minimum discount value | |
| maxLossMode | No | Drawdown modes; challenges without a captured mode never match | |
| newsTrading | No | Whether news trading is allowed | |
| dailyLossMax | No | Upper bound on the daily-loss limit magnitude (smaller = stricter) | |
| pageQuantity | No | Page size (default 50, max 100) | |
| productTypes | No | Product types the firm must offer at least one of, e.g. 'CFD', 'Futures' | |
| challengeName | No | Case-insensitive substring of the challenge name | |
| payoutMethods | No | Payout methods the firm must offer at least one of, e.g. 'Bank Transfer', 'Crypto' | |
| accountSizeMax | No | Maximum account size (inclusive) | |
| accountSizeMin | No | Minimum account size (inclusive) | |
| hasActiveOffer | No | When true, the firm must currently have a live (active, unexpired) offer | |
| includeExpired | No | When true, ended offers are not hidden (default false) | |
| maxLeverageMin | No | Minimum max leverage | |
| maxYearFounded | No | Inclusive maximum year founded | |
| minYearFounded | No | Inclusive minimum year founded | |
| paymentMethods | No | Payment methods the firm must accept at least one of, e.g. 'Crypto', 'PayPal' | |
| profitSplitMin | No | Minimum trader profit-split percent | |
| weekendHolding | No | Whether holding over the weekend is allowed | |
| includeInactive | No | When true, inactive offers are not hidden (default false) | |
| isFeeRefundable | No | Whether the challenge fee is refundable | |
| overnightHolding | No | Whether holding overnight is allowed | |
| stoplossRequired | No | Whether a stop loss is required | |
| tradingPlatforms | No | Platforms the firm must offer at least one of, e.g. 'MT5', 'cTrader', 'TradingView' | |
| discountIsPercent | No | true for percent discounts, false for absolute amounts | |
| minTradingDaysMax | No | Maximum required minimum trading days (finds less-strict challenges) | |
| tradedMarketTypes | No | Markets the firm must offer at least one of, e.g. 'forex', 'indices', 'commodities' | |
| isPreferredPartner | No | Only LuxAlgo preferred-partner firms when true | |
| minTrustPilotCount | No | Minimum Trustpilot review count | |
| minTrustPilotScore | No | Minimum Trustpilot score |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry readOnlyHint and openWorldHint, so the safety profile is covered. The description adds substantial behavioral detail beyond annotations: the conjunctive filter matching rule, that include only returns children matching the filters, that null fields are omitted, and the offerIds linkage into the firm-level offers list. These are non-obvious behaviors an agent must know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the main verb and resource, then logically structured: core semantics, simplest usage, sibling routing, data quirks, and scope limitation. Each sentence earns its place; the length is justified by the complexity of a 54-parameter search tool and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexityaine, no output schema, and only read-only/open-world annotations, the description covers what an agent needs: matching rules, include behavior, null-field omission, offerId referencing, and a clear warning that outcomes are out of scope. Nothing essential for selecting or invoking the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by grouping the 54 parameters into firm, challenge, and offer filter categories and by explaining the 'at least one challenge/offer matches all filters' semantics that applies across all params. It also clarifies the include parameter's behavior beyond the schema. Individual parameter meanings remain left to the schema, which is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb ('Search') and resource ('LuxAlgo's prop-firm catalog'), then defines the matching semantics precisely: a firm matches when at least one challenge/offer matches all filters. It explicitly distinguishes itself from propfirms_get, propfirms_pass_rates, and propfirms_simulate, so an agent can tell them apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use guidance: 'Omit every filter to list all firms', and routes to alternatives explicitly ('for one firm's full dossier prefer propfirms_get', 'for simulated pass odds ... use propfirms_pass_rates or propfirms_simulate'). Also clarifies scope boundaries by stating this returns directory data, not outcomes.
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 challengesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort key (default accountSize descending) | |
| text | No | Case-insensitive search over challenge name and firm name/slug | |
| steps | No | Exact evaluation step count (1 = instant/funded, 2 = two-step, …) | |
| context | Yes | 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." | |
| include | No | Pass ['offers'] to attach live offers that apply to each challenge | |
| interval | No | Challenge fee intervals, e.g. 'one-time', 'monthly' | |
| priceMax | No | Maximum challenge fee (inclusive) | |
| priceMin | No | Minimum challenge fee (inclusive) | |
| stepsMax | No | Maximum step count (ignored when steps is set) | |
| stepsMin | No | Minimum step count (ignored when steps is set) | |
| direction | No | Sort direction; each sort key has a sensible default | |
| pageIndex | No | 0-based page index (default 0) | |
| maxLossMax | No | Upper bound on the overall-loss limit magnitude | |
| propfirmId | No | Public firm slugs, e.g. ['ftmo'] | |
| autoTrading | No | Whether automated trading (EAs/bots) is allowed | |
| availableIn | No | Country names the firm must NOT restrict, e.g. ['United States'] | |
| challengeId | No | Public challenge ids | |
| copyTrading | No | Whether copy trading is allowed | |
| maxLossMode | No | Drawdown modes; challenges without a captured mode never match | |
| newsTrading | No | Whether news trading is allowed | |
| dailyLossMax | No | Upper bound on the daily-loss limit magnitude (smaller = stricter) | |
| pageQuantity | No | Page size (default 50, max 100) | |
| productTypes | No | Product types the firm must offer at least one of, e.g. 'CFD', 'Futures' | |
| challengeName | No | Case-insensitive substring of the challenge name | |
| accountSizeMax | No | Maximum account size (inclusive) | |
| accountSizeMin | No | Minimum account size (inclusive) | |
| maxLeverageMin | No | Minimum max leverage | |
| profitSplitMin | No | Minimum trader profit-split percent | |
| weekendHolding | No | Whether holding over the weekend is allowed | |
| isFeeRefundable | No | Whether the challenge fee is refundable | |
| overnightHolding | No | Whether holding overnight is allowed | |
| stoplossRequired | No | Whether a stop loss is required | |
| tradingPlatforms | No | Platforms the firm must offer at least one of, e.g. 'MT5', 'cTrader', 'TradingView' | |
| minTradingDaysMax | No | Maximum required minimum trading days (finds less-strict challenges) | |
| tradedMarketTypes | No | Markets the firm must offer at least one of, e.g. 'forex', 'indices', 'commodities' | |
| isPreferredPartner | No | Only LuxAlgo preferred-partner firms when true |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses important behaviors: 'Uncaptured (null) rule fields are omitted from results and never match filters' and 'This returns each challenge's listed rules and terms, not outcomes.' It also explains the include offers behavior (deduplicated top-level offers list, offerIds referencing applicable offers) and notes that firm-wide offers are included, adding significant transparency about what the tool does and does not do.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is comprehensive yet well-structured: it front-loads the core purpose, then lists the filtering capabilities, usage patterns, behavioral nuances, and follow-up tools. Each sentence serves a distinct purpose—no filler or redundancy—and the flow from 'what' to 'how' to 'what next' is logical and efficient for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's high complexity (36 parameters, no output schema), the description is highly complete. It covers the search scope, filtering dimensions, two primary usage modes (propfirmId vs. challengeId), the include offers feature, null-field handling, and what the tool does NOT return (outcomes), while pointing to related tools for simulation and validation. An agent has everything needed to invoke it correctly without additional inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3/all parameters are already documented. The description adds meaning beyond the schema by explaining the behavior of propfirmId and challengeId (list one firm vs. fetch specific ones) and elaborating on the include parameter's behavior (deduplicated top-level offers list, offerIds). This extra context justifies a slight elevation above the baseline, though the schema remains the primary source of parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Search') and resource ('funded-account challenges') plus scope ('across all visible prop firms'), and immediately clarifies the difference between listing one firm's challenges via propfirmId and fetching specific ones via challengeId. It also explicitly contrasts with related tools by saying 'to simulate a challenge found here pass its ids to propfirms_simulate or propfirms_pass_rates', distinguishing this search tool from its simulation and validation siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear, actionable usage guidance: 'Pass propfirmId to list one firm's challenges, or challengeId to fetch specific ones.' It also explains the include=['offers'] behavior and explicitly routes the agent to sibling tools for simulation or strategy screening, leaving no ambiguity about when to use this tool versus alternatives.
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 offersARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort key (default: featured first, then discount) | |
| text | No | Case-insensitive search over promo code, descriptions, and firm name/slug | |
| context | Yes | 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." | |
| offerId | No | Public offer ids | |
| isActive | No | Defaults to live offers only; pass false to look at inactive offers | |
| direction | No | Sort direction; each sort key has a sensible default | |
| offerText | No | Case-insensitive search over promo code and offer descriptions | |
| pageIndex | No | 0-based page index (default 0) | |
| promoCode | No | Case-insensitive substring of the promo code | |
| isFeatured | No | Only featured offers when true | |
| propfirmId | No | Public firm slugs, e.g. ['ftmo'] | |
| challengeId | No | Public challenge ids; an offer matches when it applies to at least one (all-challenges offers match that firm's challenges) | |
| discountMax | No | Maximum discount value | |
| discountMin | No | Minimum discount value | |
| pageQuantity | No | Page size (default 50, max 100) | |
| includeExpired | No | When true, ended offers are not hidden (default false) | |
| includeInactive | No | When true, inactive offers are not hidden (default false) | |
| discountIsPercent | No | true for percent discounts, false for absolute amounts |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and openWorldHint=true, annotations already cover the safety profile. The description adds meaningful behavioral context: default filtering to live offers, the effect of challengeId (firm-wide offers included), and the result fields each offer carries. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: what the tool searches, the default filter, key narrowing parameters, and the guaranteed output fields. Front-loaded with the core purpose, no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 18 parameters and no output schema, the description covers the essential default behavior and output shape, while the fully described schema covers all parameters. It could mention pagination or filtering flags, but those are documented in the schema, so the description is sufficient for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 restates propfirmId and challengeId semantics already present in the schema and does not add deeper meaning for other parameters. It earns the baseline but nothing more.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search') and resource ('promotional offers across prop firms'), clearly identifying what the tool does. It does not explicitly name sibling tools or distinguish itself from propfirms_search or propfirms_search_challenges, though the resource type is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful context about default behavior ('defaults to live offers only') and explains when to use the propfirmId and challengeId filters. It does not explicitly state when to use this tool over alternatives or provide exclusions, so usage guidance is implied rather than direct.
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 challengeARead-onlyInspect
Monte Carlo-simulate a trader with the given statistics through a prop-firm challenge and (by default) a funded horizon. Answers: "What is my chance of passing per attempt, and of ever getting funded? How many attempts and how much total money should I expect? Is this challenge positive expected value for me, and which rule actually kills my attempts?" Identify the challenge EITHER by directory reference (firmId + challengeId, discovered via propfirms_list_simulatable; firmId accepts the directory id or the firm's name) OR by a full inline spec object - the exact shape propfirms_challenge_rules returns, so you can fetch a directory entry, change one rule, and re-simulate to model rule variations. Provide exactly one of the two forms; providing both or neither is an error. Directory references need network access; inline specs are fully offline. The trader is described by flattened parametric fields (one clean design used across all tools): winRate (a FRACTION 0-1), avgWinR/avgLossR and optional winStdR/lossStdR in R-multiples (sizes relative to the amount risked per trade), tradesPerDay with a 'fixed' or 'poisson' day model, and risk sizing via riskMode + riskValue (percent units for percent modes). If you have the user's raw trade series rather than summary stats, prefer propfirms_simulate_trades - it preserves streaks. Returns structuredContent with the full SimResult: perAttempt.passProbability with a Wilson 95% CI and per-step pass rates plus a failure breakdown by rule (daily-loss vs max-loss vs time-limit - which tells the user WHAT to fix); journey.fundedProbability, attempts and cost distributions (cost includes prices, resets, monthly billing, activation, minus refunds), costGivenFunded and daysToFunded; perAttempt.avgDaysWhenPassed/avgDaysWhenFailed and perAttempt.stagnationDays (the longest run of days without a new equity high per attempt - the dead time between progress, which grows sharply as risk per trade shrinks); funded-stage payout distributions plus funded.payoutProbability (P(at least one payout | funded)) and funded.daysToFirstPayout - with payout gating these can be the deciding numbers, since getting funded is not the same as getting paid; ev.evTotal (mean payouts minus costs) with evStandardError and pPositive; drawdown stats; and assumptions (the fully-resolved spec/profile/options the engine actually ran, plus flags and disclaimer). Histogram arrays are omitted unless includeHistograms=true. A compact human summary is returned as text alongside. SIMULATED RULES (engine v1): consistency rules (steps[].consistency) and funded payout gating (funded.payoutRules) are actually SIMULATED, not merely flagged - a distinguishing feature of this engine. Consistency uses a rational stop rule (the trader stops a day once more profit cannot help and keeps trading until the best-day share complies - flag 'consistency-stop-rule'); payouts follow a maximum-withdrawal model (withdraw everything the rules allow above buffer/caps, never below the loss floor; balances and floors carry across payouts - flag 'funded-withdrawal-model'); a funded consistency gate is checked per payout window (flag 'funded-consistency-window-approximated'). The pre-1.0 flag id 'funded-payout-resets-account' no longer exists. UNITS: every *Pct rule field and every percent-mode risk value is in PERCENT UNITS (5 = 5%, 0.5 = 0.5%). The one exception is winRate, which is a FRACTION in [0, 1] (0.55 = 55% winners). Probabilities in results are fractions in [0, 1]. DETERMINISM: identical inputs including seed reproduce byte-identical results on any platform. Include the seed and path count when reporting numbers so users can reproduce them exactly; re-run with a few different seeds to gauge Monte Carlo spread. ASSUMPTIONS: every result carries assumptions.flags - dataset-declared rules the engine does NOT simulate (e.g. scaling plans or soft daily lockouts, which make real odds worse than simulated) plus engine simplifications - and assumptions.disclaimer. These are material: always surface the flags and the disclaimer to the user alongside the numbers, never just the headline probability. Results are distributions under stated assumptions, not promises. DATA SOURCE & PROVENANCE: firm data comes live from LuxAlgo's public, keyless prop-firm directory API - the data behind luxalgo.com/prop-firms (origin overridable via the LUXALGO_APP_ORIGIN env var). Rule semantics are used verbatim where the directory serves structured rule columns; where it serves only free text, semantics are inferred ONLY when one reasonable reading exists, and every inferred field is disclosed in inferredFields (provenance 'directory+inferred') - relay those to the user next to any numbers. Challenges whose loss rules cannot be established are refused as not simulatable rather than guessed. Firms change rules; each firm's own page is always authoritative. Composes with any broker-statistics tool: if another MCP server exposes round-trip statistics (winRate, avgWin, avgLoss) or a raw R-multiple series from the user's real trades, feed them here to answer "given my actual trading, what are my odds on this challenge and what risk should I use?". Convert currency statistics to R-multiples by dividing by the average amount risked per trade: winRate stays a fraction, avgWinR = avgWin / avgRisk, avgLossR = |avgLoss| / avgRisk.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | 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. | |
| spec | No | 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. | |
| paths | No | Monte 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. | |
| firmId | No | Directory firm id or firm name (e.g. 'ftmo' or 'FTMO'); discover with propfirms_list_simulatable. Must be paired with challengeId. Mutually exclusive with `spec`. | |
| avgWinR | Yes | Average winning trade in R-multiples, i.e. multiples of the amount risked per trade (1.5 = winners average 1.5x the risk). | |
| context | Yes | 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." | |
| winRate | Yes | 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. | |
| winStdR | No | Standard deviation of winner sizes in R (0 = every winner is exactly avgWinR). Default 0. Adding spread makes streak damage more realistic. | |
| avgLossR | No | Average 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. | |
| lossStdR | No | Standard deviation of loser sizes in R (0 = every loser is exactly avgLossR). Default 0. | |
| riskMode | No | 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. | |
| riskValue | Yes | 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. | |
| attemptCap | No | Maximum challenge attempts per path before that path gives up. Default 25. Journey statistics (expected attempts/cost, P(funded)) are censored at this cap. | |
| challengeId | No | Directory challenge id; discover with propfirms_list_simulatable. Must be paired with firmId. Mutually exclusive with `spec`. | |
| tradesPerDay | Yes | Average trades per simulated trading day. More trades per day means more ways to hit the daily loss limit within a single day. | |
| simulateFunded | No | 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. | |
| fundedHorizonDays | No | 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. | |
| includeHistograms | No | Include 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. | |
| tradesPerDayModel | No | '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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint and openWorldHint, and the description adds substantial context beyond them: determinism with seed, assumptions.flags and disclaimer that must be surfaced, data provenance and inference disclosure, refusal of non-simulatable challenges, and engine v1 details (consistency simulated, withdrawal model). No contradiction; far exceeds annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very long but well-structured with clear sections (SIMULATED RULES, UNITS, DETERMINISM, ASSUMPTIONS, DATA SOURCE). Core purpose is front-loaded. While verbose, every section earns its place given the tool's complexity; a 5 would require tighter prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 19 parameters, nested objects, and no output schema, the description is exceptionally complete: it details the returned SimResult fields (perAttempt, journey, funded, ev), explains assumptions flags and disclaimer, determinism, data source and provenance, and composition with other tools. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaning to key parameters: winRate is a fraction not percent, riskValue uses percent units, R-multiples definitions, tradesPerDay model choices, and warns winRate is the most impactful input. It doesn't exhaustively describe all 19 but provides significant semantic context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Monte Carlo-simulate'), a resource ('a trader through a prop-firm challenge'), and explicitly distinguishes itself from propfirms_simulate_trades (raw trade series) and propfirms_list_simulatable (discovery). It clearly answers the core question set (pass probability, funded probability, attempts, cost, EV) and identifies the challenge by directory ref or inline spec.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: prefer simulate_trades when raw trade series exist; use directory references when network is available, inline specs offline; states exactly one form required and error if both/neither; explains how to feed stats from other tools (conversion to R-multiples). This is comprehensive alternative routing.
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 seriesARead-onlyInspect
Simulate a challenge by resampling the trader's OWN R-multiple trade series with a stationary block bootstrap instead of a win-rate model. WHY THIS BEATS WIN-RATE MATH: challenge rules are breached by streaks, not by averages - a daily-loss limit dies to a cluster of losses inside one day, and a trailing drawdown dies to a losing streak right after an equity peak. Real trade series are streaky (autocorrelation, volatility clustering, edge that comes and goes), and the stationary bootstrap resamples contiguous blocks of the actual series (geometric length, mean blockMeanLength, default 5 trades), so the trader's real streak structure survives into every simulated day. A parametric model with identical summary statistics shuffles trades independently and therefore understates breach risk for streaky traders. Use propfirms_simulate when only summary stats are available; use this whenever the actual trades are. Provide the series as rSeries (array of R-multiples: each trade's P&L divided by the amount risked on it), rSeriesText (pasted JSON/CSV/whitespace text, optional 'R' suffix per value), or one of the timestamped-log inputs below; exactly one of the four, at least 10 trades, 100+ strongly recommended. Returns the same full SimResult as propfirms_simulate (structuredContent, histograms off by default) plus a text summary that also reports the sample's win rate and mean R. TIMESTAMPED LOGS: tradeLogText accepts a pasted CSV/TSV trade log with a header row (open time and R required; close time and direction optional; loose header names are matched; timestamps without an offset are read as UTC). The R-series and, unless tradesPerDay is passed, the trades-per-day rate are derived from the log, and parse warnings are surfaced in the text output. NEWS WINDOWS: with a timestamped input, newsFilter runs the simulation TWICE on the same seed and options, once on the full history and once without the trades opened inside configurable windows around scheduled releases (a built-in recurring-template calendar of high- and medium-impact events across USD, EUR, GBP, JPY, AUD, CAD, CHF, NZD, plus optional custom event times). The returned SimResult is the news-avoided scenario; structuredContent.newsComparison carries both scenarios' pass probability, funded probability and EV, the excluded-trade count, and a calendar caveat that must be relayed verbatim. PORTFOLIO MODE: tradeLogTexts (2 to 5 logs) merges several timestamped histories into one chronological series and simulates the combined account, so cross-strategy loss clustering survives. Overlap across the histories is ALWAYS analyzed and attached as structuredContent.portfolioOverlap; the text summary carries the audit-risk verdict, and a 'high' verdict is an explicit warning that a prop firm may audit or refuse payouts for correlated accounts. SIMULATED RULES (engine v1): consistency rules (steps[].consistency) and funded payout gating (funded.payoutRules) are actually SIMULATED, not merely flagged - a distinguishing feature of this engine. Consistency uses a rational stop rule (the trader stops a day once more profit cannot help and keeps trading until the best-day share complies - flag 'consistency-stop-rule'); payouts follow a maximum-withdrawal model (withdraw everything the rules allow above buffer/caps, never below the loss floor; balances and floors carry across payouts - flag 'funded-withdrawal-model'); a funded consistency gate is checked per payout window (flag 'funded-consistency-window-approximated'). The pre-1.0 flag id 'funded-payout-resets-account' no longer exists. UNITS: every *Pct rule field and every percent-mode risk value is in PERCENT UNITS (5 = 5%, 0.5 = 0.5%). The one exception is winRate, which is a FRACTION in [0, 1] (0.55 = 55% winners). Probabilities in results are fractions in [0, 1]. DETERMINISM: identical inputs including seed reproduce byte-identical results on any platform. Include the seed and path count when reporting numbers so users can reproduce them exactly; re-run with a few different seeds to gauge Monte Carlo spread. ASSUMPTIONS: every result carries assumptions.flags - dataset-declared rules the engine does NOT simulate (e.g. scaling plans or soft daily lockouts, which make real odds worse than simulated) plus engine simplifications - and assumptions.disclaimer. These are material: always surface the flags and the disclaimer to the user alongside the numbers, never just the headline probability. Results are distributions under stated assumptions, not promises. Composes with any broker-statistics tool: if another MCP server exposes round-trip statistics (winRate, avgWin, avgLoss) or a raw R-multiple series from the user's real trades, feed them here to answer "given my actual trading, what are my odds on this challenge and what risk should I use?". Convert currency statistics to R-multiples by dividing by the average amount risked per trade: winRate stays a fraction, avgWinR = avgWin / avgRisk, avgLossR = |avgLoss| / avgRisk.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | 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. | |
| spec | No | 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. | |
| paths | No | Monte 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. | |
| firmId | No | Directory firm id or firm name (e.g. 'ftmo' or 'FTMO'); discover with propfirms_list_simulatable. Must be paired with challengeId. Mutually exclusive with `spec`. | |
| context | Yes | 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." | |
| rSeries | No | 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. | |
| riskMode | No | 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. | |
| riskValue | Yes | 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. | |
| attemptCap | No | Maximum challenge attempts per path before that path gives up. Default 25. Journey statistics (expected attempts/cost, P(funded)) are censored at this cap. | |
| importRisk | No | 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. | |
| newsFilter | No | What-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). | |
| challengeId | No | Directory challenge id; discover with propfirms_list_simulatable. Must be paired with firmId. Mutually exclusive with `spec`. | |
| rSeriesText | No | The 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. | |
| tradeLogText | No | 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. | |
| tradesPerDay | No | Average 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. | |
| tradeLogTexts | No | PORTFOLIO 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. | |
| simulateFunded | No | 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. | |
| blockMeanLength | No | 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. | |
| fundedHorizonDays | No | 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. | |
| includeHistograms | No | Include 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. | |
| tradesPerDayModel | No | '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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, the description discloses material behavior: consistency rules and payout gating are truly simulated, newsFilter runs the simulation twice on the same seed, portfolio mode merges logs and attaches overlap analysis, results carry assumptions.flags/disclaimer that must be surfaced, and identical inputs plus seed reproduce byte-identical results. No contradiction with annotations exists; the description substantially extends them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but tightly organized into labeled sections (TIMESTAMPED LOGS, NEWS WINDOWS, PORTFOLIO MODE, SIMULATED RULES, UNITS, DETERMINISM, ASSUMPTIONS), each carrying load-bearing information. The core mechanism and sibling differentiation are front-loaded in the first sentences, and the promotional 'WHY THIS BEATS WIN-RATE MATH' section earns its place by explaining when bootstrap resampling matters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 21-parameter tool with nested objects and no output schema, the description covers all input alternatives and their mutual exclusions, defaults (seed 42, paths 10k, blockMeanLength 5), output contracts (SimResult, structuredContent.newsComparison, portfolioOverlap, text summary with win rate/mean R), and required reporting obligations (relay calendar caveat verbatim, surface assumptions flags, include seed). No operationally relevant gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds meaning the schema lacks: blockMeanLength's operational interpretation (1 = i.i.d. destroys streaks, raise toward 10 for long regimes), tradesPerDay being required with rSeries but derived from timestamped logs, importRisk never applied silently, unit conventions for riskValue vs winRate, and the definition of R-multiples tied to rSeries. This cross-parameter guidance is essential for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Simulate a challenge by resampling the trader's OWN R-multiple trade series with a stationary block bootstrap instead of a win-rate model.' It clearly distinguishes this tool from its sibling propfirms_simulate by naming the alternative and the input type it requires (actual trades vs summary stats), so an agent can select it correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is given: 'Use propfirms_simulate when only summary stats are available; use this whenever the actual trades are.' It also states data requirements (at least 10 trades, 100+ strongly recommended), input mutual exclusions (exactly one of rSeries, rSeriesText, tradeLogText, tradeLogTexts), and when tradesPerDay is required vs derived. This fully covers selection and invocation conditions.
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 challengesARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| firm | No | Restrict to one firm by propfirmId or name (e.g. 'ftmo'). | |
| seed | No | 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. | |
| paths | No | Monte 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. | |
| avgWinR | No | Average winning trade in R-multiples, i.e. multiples of the amount risked per trade (1.5 = winners average 1.5x the risk). | |
| context | Yes | 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." | |
| rSeries | No | The 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. | |
| winRate | No | 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. | |
| winStdR | No | Standard deviation of winner sizes in R (0 = every winner is exactly avgWinR). Default 0. Adding spread makes streak damage more realistic. | |
| avgLossR | No | Average 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. | |
| lossStdR | No | Standard deviation of loser sizes in R (0 = every loser is exactly avgLossR). Default 0. | |
| priceMax | No | Only challenges costing at most this. | |
| riskMode | No | 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. | |
| riskValue | Yes | 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. | |
| attemptCap | No | Maximum challenge attempts per path before that path gives up. Default 25. Journey statistics (expected attempts/cost, P(funded)) are censored at this cap. | |
| productType | No | Restrict the screen to one instrument class. | |
| rSeriesText | No | The same series as pasted text (JSON, CSV, or whitespace separated, optional 'R' suffix). Mutually exclusive with rSeries. | |
| tradesPerDay | Yes | Average trades per simulated trading day. More trades per day means more ways to hit the daily loss limit within a single day. | |
| accountSizeMax | No | Only challenges with at most this account size. | |
| accountSizeMin | No | Only challenges with at least this account size. | |
| simulateFunded | No | 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. | |
| blockMeanLength | No | Bootstrap mean block length in trades. Default 5. Only used with rSeries/rSeriesText. | |
| fundedHorizonDays | No | 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. | |
| minPassPerAttempt | No | The 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. | |
| requirePositiveEv | No | Additionally require expected value (payouts minus all fees over the funded horizon) above zero. Default false. | |
| tradesPerDayModel | No | '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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnly and openWorld; the description adds a wealth of behavioral detail beyond that: the honesty frame (not a ranking, excluded challenges counted, flags relayed), deterministic per-seed results, refusal of scopes >40 challenges, and that live discounts are not applied. This fully covers the safety and reproducibility profile the annotations omit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place. It front-loads the purpose and strategy-input options, then covers the honesty frame and performance notes. It is well-paragraphed and dense; for 25 parameters it avoids redundancy and stays focused. A minor deduction for length, but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description details the returned fields (pass probability, CI, P(funded), expected attempts/cost, EV, P(EV>0), assumption flags, rule semantics). It also explains scoping, simulation cost, determinism, and related tools. An agent has everything needed to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real value beyond the schema: it explains the bar's semantics and reporting requirement, recommends preferring rSeries over winRate, and warns that winRate is easily overestimated. It also clarifies interaction effects (risk sizing moves numbers) and mentions the funded horizon scaling EV. These are meaningful additions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a direct answer to the user's question ('which challenges would MY strategy actually pass?') and states the resource (every simulatable challenge in the live directory) and the action (simulate and split by a bar). It explicitly names sibling tools (propfirms_optimal_risk, propfirms_search_challenges, etc.) for differentiation, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly frames the tool as a multi-challenge screening tool and points to propfirms_optimal_risk for a focused sweep afterwards. It also gives practical guidance like 'scopes above 40 challenges are refused' and 'narrow the scope instead.' It does not explicitly state 'when not to use this,' but the alternative and the condition are implied strongly enough.
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 datasetsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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." | |
| dataset | No | One dataset for the detailed view; omit to list all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds behavioral detail about the output (row count, freshness, live-tree vs deep-history coverage, ticker-searchability) and the detailed-view contents, which goes beyond annotations and helps set expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences that move from catalog scope to return values to usage guidance, with no filler. The first sentence is long, but every item in the list earns its place by naming a dataset category; the actionable advice is saved for the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a metadata/list tool, the description covers the dataset set, summary fields, the detailed view, and its relationship to trackers_query. With annotations supplying the read-only/open-world profile and no output schema, the description is sufficiently complete for correct invocation; minor details like pagination are not essential here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the baseline is 3, but the description adds meaning beyond the schema by explaining what the dataset parameter provides (full field roster, filterable paths, caveats, per-year coverage, source health, dump URLs). This helps agents decide whether to pass a dataset or omit it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly names the resource ('Market Trackers catalog') and the action ('Lists'), and enumerates the dataset types and returned metadata (row count, freshness, years, ticker-searchability). It also references trackers_query, letting an agent distinguish this discovery tool from the query tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to pass the optional dataset ('Pass dataset for the full field roster...') and instructs agents to 'read it before composing trackers_query filters', giving a concrete precondition for using a sibling tool. This provides clear routing without ambiguity.
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 rowsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Order by event date (default newest) | |
| text | No | Case-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 | |
| limit | No | Rows to return (default 25, max 100) | |
| where | No | Exact 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 | |
| offset | No | Rows to skip, for paging (default 0) | |
| ticker | No | Trading symbol, case-insensitive (e.g. 'NVDA'); matches the dataset's ticker field(s). Only datasets flagged tickerSearchable carry tickers. | |
| context | Yes | 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." | |
| dataset | Yes | Dataset id, from trackers_datasets |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, it reveals the underlying data source (the dumps' latest.json), the meaning of 'latest' (last daily publish), and a major availability limitation for patents. It does not detail pagination or return shape, but the annotations already establish safety and volatility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each adding value: a precise definition, a use-case illustration, and an exclusion with a fallback. The 'cheapest way' phrase is a bit promotional but still communicates intended use.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 8-parameter tool with no output schema, the description supplies the key usage context, the semantic of 'latest', and the critical patent exclusion. It does not describe result fields, but the schema is thorough and the rows return shape is inferable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter is well documented in the schema. The description only summarizes the ticker/text filters and points to textPaths in trackers_datasets, adding little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool returns: the newest ingestion day's rows from the last daily publish, optionally filtered by ticker or text. It also distinguishes the tool from the trackers_query sibling by explicitly excluding snapshot-only datasets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use case ('the cheapest way to see what is new') and an explicit when-not-to-use with the alternative: 'Not available for snapshot-only bulk datasets (patents); use trackers_query there.' This is strong routing guidance.
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 datasetARead-onlyInspect
Search one Market Trackers dataset by ticker, free text, exact field values, and event-date range, with paging and newest/oldest ordering. Data is read from year-sharded CC0 dumps: pass years (or since/until) to choose which years to read — default is the newest year with data. Deep-history years (see archiveYears in trackers_datasets) can be tens of MB compressed each, so read them one or two at a time; the tool refuses selections over its byte budget and says how to narrow. Every row carries provenance.sourceUrl (the SEC filing, disclosure, award, or record it came from). Examples: insider purchases at NVDA in 2024 → dataset insider-transactions, ticker NVDA, years [2024], where {code: 'P'}; a senator's trades → congress-trades, text 'Tuberville'; who lobbied on a bill → lobbying-filings, text 'H.R.1234'.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Order by event date (default newest) | |
| text | No | Case-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 | |
| limit | No | Rows to return (default 25, max 100) | |
| since | No | Earliest event date (YYYY-MM-DD, YYYY-MM or YYYY), inclusive | |
| until | No | Latest event date, inclusive | |
| where | No | Exact 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 | |
| years | No | Event years to read (max 8); default is the newest year with data. Prefer one year at a time for deep-history datasets. | |
| offset | No | Rows to skip, for paging (default 0) | |
| ticker | No | Trading symbol, case-insensitive (e.g. 'NVDA'); matches the dataset's ticker field(s). Only datasets flagged tickerSearchable carry tickers. | |
| context | Yes | 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." | |
| dataset | Yes | Dataset id, from trackers_datasets |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds substantial behavioral context beyond annotations: year-sharded CC0 dumps, the default to the newest year, the byte-budget refusal mechanism, and the provenance field (sourceUrl). It also warns about the cost of deep-history years. This is rich behavioral disclosure that goes far 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single well-organized paragraph that front-loads the core purpose, then adds operational details (year sharding, byte budget, provenance), and concludes with three concise examples. Every sentence contributes value, and the structure makes it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite 11 parameters, nested objects, and no output schema, the description covers essential call context: data source, filtering options, paging/ordering, byte-budget constraints, and provenance. It includes enough examples to guide an agent in common use cases. Nothing critical is missing for an agent to decide when and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for all 11 parameters, so the baseline is 3. The description adds meaningful semantic context: it explains how `years` and `since`/`until` interact with the sharded dumps, advises on deep-history years, and illustrates `where` with concrete examples (e.g., {code: 'P'}). It also clarifies that `ticker` only applies to tickerSearchable datasets. This elevates it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search one Market Trackers dataset' and enumerates the search dimensions (ticker, free text, exact field values, event-date range, paging, ordering). It clearly differentiates from sibling tools like trackers_datasets (metadata), trackers_latest, and trackers_ticker by focusing on dataset-wide search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance on year selection, including the byte-budget refusal and advice to read deep-history years one or two at a time. It provides three concrete examples (insider purchases, senator trades, lobbying filings) that map search patterns to datasets and filters. However, it does not explicitly contrast with sibling tools or state when NOT to use this tool, though the examples imply the appropriate scenarios.
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 TrackersARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Event year to read (default: the current year) | |
| limit | No | Newest rows to include per dataset (default 5) | |
| ticker | Yes | Trading symbol, e.g. 'NVDA' | |
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds meaningful behavior beyond that: it returns per-dataset match counts plus newest rows, and discloses that oversized deep-history archive years are skipped and readable via trackers_query. It could mention limits or error behavior, but this is solid supplemental disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: core scope first, then dataset enumeration, then return shape, then the skipped-years behavior. The dataset list is long but earns its place by defining the tool's breadth. No redundant filler; the only slightly extraneous phrase is 'a public-record dossier from primary sources,' but it adds useful framing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does well to explain the return shape (per-dataset match counts and newest rows) and the skipped-archive handling. It covers defaults and the sibling tool for deep history. It doesn't specify exact output formatting or failure cases, but for a read-only fan-out tool the essential expectations are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents ticker, year, limit, and context. The description reinforces the year default and hints at the limit concept via 'newest rows of each,' but it doesn't add significant parameter-level detail beyond the schema. A baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'One ticker across every ticker-bearing Market Trackers dataset for one year.' It enumerates the dataset categories and states exactly what is returned (per-dataset match counts with newest rows). This clearly distinguishes it from siblings like trackers_query, trackers_latest, and trackers_datasets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete usage context: it defaults to the current year and covers a broad one-ticker scan across many datasets. It also names the alternative for skipped deep-history years ('listed under skipped with the trackers_query call that reads them'). It doesn't explicitly contrast with trackers_latest or trackers_datasets, but the ticker-scoped fan-out purpose is clear enough.
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.
13 tool updates
- Added
journal_add_trade - Added
journal_breakdown - Added
journal_calendar - Added
journal_get_day - Added
journal_get_trade - Added
journal_list_accounts - Added
journal_list_tags - Added
journal_list_trades - Added
journal_overview - Added
journal_search_notes - Added
journal_update_note - Added
journal_update_trade - Added
journal_write_note
1 tool update
- Added
luxalgo_account
28 tool updates
- Changed
edge_presets2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
- Changed
edge_report2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
- Changed
edge_symbols2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
- Changed
library_get_concept2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
- Changed
library_get_family2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
- Changed
library_get_indicator2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
- Changed
library_get_source_code2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
- Changed
library_list_concepts3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\"" - added
Input schema / properties / page / maximumAdded value: +9007199254740991
- Changed
library_list_families2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
- Changed
library_list_indicators3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\"" - added
Input schema / properties / page / maximumAdded value: +9007199254740991
- Changed
library_list_tags2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
- Changed
library_search2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
- Changed
propfirms_challenge_rules2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
- Changed
propfirms_compare22 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / properties / challenges / items / additionalPropertiesRemoved value: -false - changed
Input schema / properties / challenges / items / properties / spec / additionalPropertiesPrevious value: -trueNew value: +{} - added
Input schema / properties / challenges / items / properties / spec / properties / constraints / propertyNamesAdded value: +{ + "type": "string" +} - changed
Input schema / properties / challenges / items / properties / spec / properties / dailyLoss / anyOfPrevious 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" + } +] - changed
Input schema / properties / challenges / items / properties / spec / properties / fees / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / challenges / items / properties / spec / properties / funded / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / challenges / items / properties / spec / properties / funded / properties / dailyLoss / anyOfPrevious 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" + } +] - added
Input schema / properties / challenges / items / properties / spec / properties / funded / properties / firstPayoutMinDays / maximumAdded value: +9007199254740991 - changed
Input schema / properties / challenges / items / properties / spec / properties / funded / properties / maxLoss / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / challenges / items / properties / spec / properties / funded / properties / payoutRules / additionalPropertiesPrevious value: -trueNew value: +{} - added
Input schema / properties / challenges / items / properties / spec / properties / funded / properties / payoutRules / properties / minWinningDays / maximumAdded value: +9007199254740991 - changed
Input schema / properties / challenges / items / properties / spec / properties / maxLoss / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / challenges / items / properties / spec / properties / sources / items / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / challenges / items / properties / spec / properties / steps / items / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / challenges / items / properties / spec / properties / steps / items / properties / consistency / anyOfPrevious 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" + } +] - changed
Input schema / properties / challenges / items / properties / spec / properties / steps / items / properties / dailyLoss / anyOfPrevious 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" + } +] - changed
Input schema / properties / challenges / items / properties / spec / properties / steps / items / properties / maxDays / anyOfPrevious value: -[ - { - "exclusiveMinimum": 0, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / challenges / items / properties / spec / properties / steps / items / properties / maxLoss / additionalPropertiesPrevious value: -trueNew value: +{} - added
Input schema / properties / challenges / items / properties / spec / properties / steps / items / properties / minTradingDays / maximumAdded value: +9007199254740991 - changed
Input schema / properties / context / descriptionPrevious 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.\"" - changed
Input schema / properties / seed / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -]New value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "string" + } +]
- Changed
propfirms_get2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
- Changed
propfirms_list_simulatable2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
- Changed
propfirms_optimal_risk21 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\"" - changed
Input schema / properties / seed / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -]New value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "string" + } +] - changed
Input schema / properties / spec / additionalPropertiesPrevious value: -trueNew value: +{} - added
Input schema / properties / spec / properties / constraints / propertyNamesAdded value: +{ + "type": "string" +} - changed
Input schema / properties / spec / properties / dailyLoss / anyOfPrevious 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" + } +] - changed
Input schema / properties / spec / properties / fees / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / funded / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / funded / properties / dailyLoss / anyOfPrevious 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" + } +] - added
Input schema / properties / spec / properties / funded / properties / firstPayoutMinDays / maximumAdded value: +9007199254740991 - changed
Input schema / properties / spec / properties / funded / properties / maxLoss / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / funded / properties / payoutRules / additionalPropertiesPrevious value: -trueNew value: +{} - added
Input schema / properties / spec / properties / funded / properties / payoutRules / properties / minWinningDays / maximumAdded value: +9007199254740991 - changed
Input schema / properties / spec / properties / maxLoss / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / sources / items / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / steps / items / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / steps / items / properties / consistency / anyOfPrevious 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" + } +] - changed
Input schema / properties / spec / properties / steps / items / properties / dailyLoss / anyOfPrevious 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" + } +] - changed
Input schema / properties / spec / properties / steps / items / properties / maxDays / anyOfPrevious value: -[ - { - "exclusiveMinimum": 0, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / spec / properties / steps / items / properties / maxLoss / additionalPropertiesPrevious value: -trueNew value: +{} - added
Input schema / properties / spec / properties / steps / items / properties / minTradingDays / maximumAdded value: +9007199254740991
- Changed
propfirms_pass_rates2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
- Changed
propfirms_search13 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\"" - added
Input schema / properties / maxYearFounded / maximumAdded value: +9007199254740991 - added
Input schema / properties / maxYearFounded / minimumAdded value: +-9007199254740991 - added
Input schema / properties / minYearFounded / maximumAdded value: +9007199254740991 - added
Input schema / properties / minYearFounded / minimumAdded value: +-9007199254740991 - added
Input schema / properties / pageIndex / maximumAdded value: +9007199254740991 - added
Input schema / properties / steps / maximumAdded value: +9007199254740991 - added
Input schema / properties / steps / minimumAdded value: +-9007199254740991 - added
Input schema / properties / stepsMax / maximumAdded value: +9007199254740991 - added
Input schema / properties / stepsMax / minimumAdded value: +-9007199254740991 - added
Input schema / properties / stepsMin / maximumAdded value: +9007199254740991 - added
Input schema / properties / stepsMin / minimumAdded value: +-9007199254740991
- Changed
propfirms_search_challenges9 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\"" - added
Input schema / properties / pageIndex / maximumAdded value: +9007199254740991 - added
Input schema / properties / steps / maximumAdded value: +9007199254740991 - added
Input schema / properties / steps / minimumAdded value: +-9007199254740991 - added
Input schema / properties / stepsMax / maximumAdded value: +9007199254740991 - added
Input schema / properties / stepsMax / minimumAdded value: +-9007199254740991 - added
Input schema / properties / stepsMin / maximumAdded value: +9007199254740991 - added
Input schema / properties / stepsMin / minimumAdded value: +-9007199254740991
- Changed
propfirms_search_offers3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\"" - added
Input schema / properties / pageIndex / maximumAdded value: +9007199254740991
- Changed
propfirms_simulate21 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\"" - changed
Input schema / properties / seed / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -]New value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "string" + } +] - changed
Input schema / properties / spec / additionalPropertiesPrevious value: -trueNew value: +{} - added
Input schema / properties / spec / properties / constraints / propertyNamesAdded value: +{ + "type": "string" +} - changed
Input schema / properties / spec / properties / dailyLoss / anyOfPrevious 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" + } +] - changed
Input schema / properties / spec / properties / fees / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / funded / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / funded / properties / dailyLoss / anyOfPrevious 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" + } +] - added
Input schema / properties / spec / properties / funded / properties / firstPayoutMinDays / maximumAdded value: +9007199254740991 - changed
Input schema / properties / spec / properties / funded / properties / maxLoss / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / funded / properties / payoutRules / additionalPropertiesPrevious value: -trueNew value: +{} - added
Input schema / properties / spec / properties / funded / properties / payoutRules / properties / minWinningDays / maximumAdded value: +9007199254740991 - changed
Input schema / properties / spec / properties / maxLoss / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / sources / items / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / steps / items / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / steps / items / properties / consistency / anyOfPrevious 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" + } +] - changed
Input schema / properties / spec / properties / steps / items / properties / dailyLoss / anyOfPrevious 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" + } +] - changed
Input schema / properties / spec / properties / steps / items / properties / maxDays / anyOfPrevious value: -[ - { - "exclusiveMinimum": 0, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / spec / properties / steps / items / properties / maxLoss / additionalPropertiesPrevious value: -trueNew value: +{} - added
Input schema / properties / spec / properties / steps / items / properties / minTradingDays / maximumAdded value: +9007199254740991
- Changed
propfirms_simulate_trades22 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\"" - removed
Input schema / properties / newsFilter / additionalPropertiesRemoved value: -false - changed
Input schema / properties / seed / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -]New value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "string" + } +] - changed
Input schema / properties / spec / additionalPropertiesPrevious value: -trueNew value: +{} - added
Input schema / properties / spec / properties / constraints / propertyNamesAdded value: +{ + "type": "string" +} - changed
Input schema / properties / spec / properties / dailyLoss / anyOfPrevious 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" + } +] - changed
Input schema / properties / spec / properties / fees / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / funded / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / funded / properties / dailyLoss / anyOfPrevious 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" + } +] - added
Input schema / properties / spec / properties / funded / properties / firstPayoutMinDays / maximumAdded value: +9007199254740991 - changed
Input schema / properties / spec / properties / funded / properties / maxLoss / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / funded / properties / payoutRules / additionalPropertiesPrevious value: -trueNew value: +{} - added
Input schema / properties / spec / properties / funded / properties / payoutRules / properties / minWinningDays / maximumAdded value: +9007199254740991 - changed
Input schema / properties / spec / properties / maxLoss / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / sources / items / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / steps / items / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Input schema / properties / spec / properties / steps / items / properties / consistency / anyOfPrevious 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" + } +] - changed
Input schema / properties / spec / properties / steps / items / properties / dailyLoss / anyOfPrevious 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" + } +] - changed
Input schema / properties / spec / properties / steps / items / properties / maxDays / anyOfPrevious value: -[ - { - "exclusiveMinimum": 0, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / spec / properties / steps / items / properties / maxLoss / additionalPropertiesPrevious value: -trueNew value: +{} - added
Input schema / properties / spec / properties / steps / items / properties / minTradingDays / maximumAdded value: +9007199254740991
- Changed
propfirms_validate_strategy3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\"" - changed
Input schema / properties / seed / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -]New value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "string" + } +]
- Changed
trackers_datasets2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
- Changed
trackers_latest4 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\"" - added
Input schema / properties / offset / maximumAdded value: +9007199254740991 - added
Input schema / properties / where / propertyNamesAdded value: +{ + "type": "string" +}
- Changed
trackers_query7 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\"" - added
Input schema / properties / offset / maximumAdded value: +9007199254740991 - removed
Input schema / properties / until / $refRemoved value: -"#/properties/since" - added
Input schema / properties / until / patternAdded value: +"^\\d{4}(-\\d{2}(-\\d{2})?)?$" - added
Input schema / properties / until / typeAdded value: +"string" - added
Input schema / properties / where / propertyNamesAdded value: +{ + "type": "string" +}
- Changed
trackers_ticker2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / context / descriptionPrevious 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.\""
7 tool updates
- Added
edge_presets - Added
edge_report - Added
edge_symbols - Added
trackers_datasets - Added
trackers_latest - Added
trackers_query - Added
trackers_ticker
21 tool updates
- Changed
library_get_concept3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "slug" -]New value: +[ + "slug", + "context" +]
- Changed
library_get_family3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "key" -]New value: +[ + "key", + "context" +]
- Changed
library_get_indicator3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "slug" -]New value: +[ + "slug", + "context" +]
- Changed
library_get_source_code3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "slug" -]New value: +[ + "slug", + "context" +]
- Changed
library_list_concepts3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - added
Input schema / requiredAdded value: +[ + "context" +]
- Changed
library_list_families2 fields changed- added
Input schema / properties / contextAdded 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" +} - added
Input schema / requiredAdded value: +[ + "context" +]
- Changed
library_list_indicators3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - added
Input schema / requiredAdded value: +[ + "context" +]
- Changed
library_list_tags2 fields changed- added
Input schema / properties / contextAdded 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" +} - added
Input schema / requiredAdded value: +[ + "context" +]
- Changed
library_search3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "query" -]New value: +[ + "query", + "context" +]
- Changed
propfirms_challenge_rules3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "firmId", - "challengeId" -]New value: +[ + "firmId", + "challengeId", + "context" +]
- Changed
propfirms_compare3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "challenges", - "winRate", - "avgWinR", - "tradesPerDay", - "riskValue" -]New value: +[ + "challenges", + "winRate", + "avgWinR", + "tradesPerDay", + "riskValue", + "context" +]
- Changed
propfirms_get3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "propfirmId" -]New value: +[ + "propfirmId", + "context" +]
- Changed
propfirms_list_simulatable3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - added
Input schema / requiredAdded value: +[ + "context" +]
- Changed
propfirms_optimal_risk3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "winRate", - "avgWinR", - "tradesPerDay" -]New value: +[ + "winRate", + "avgWinR", + "tradesPerDay", + "context" +]
- Changed
propfirms_pass_rates3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "firmId" -]New value: +[ + "firmId", + "context" +]
- Changed
propfirms_search3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - added
Input schema / requiredAdded value: +[ + "context" +]
- Changed
propfirms_search_challenges3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - added
Input schema / requiredAdded value: +[ + "context" +]
- Changed
propfirms_search_offers3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - added
Input schema / requiredAdded value: +[ + "context" +]
- Changed
propfirms_simulate3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "winRate", - "avgWinR", - "tradesPerDay", - "riskValue" -]New value: +[ + "winRate", + "avgWinR", + "tradesPerDay", + "riskValue", + "context" +]
- Changed
propfirms_simulate_trades5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - changed
Input schema / properties / importRisk / descriptionPrevious 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." - changed
Input schema / properties / tradeLogText / descriptionPrevious 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." - changed
Input schema / requiredPrevious value: -[ - "riskValue" -]New value: +[ + "riskValue", + "context" +]
- Changed
propfirms_validate_strategy3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / contextAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "tradesPerDay", - "riskValue" -]New value: +[ + "tradesPerDay", + "riskValue", + "context" +]
4 tool updates
- Changed
propfirms_compare14 fields changed- changed
Input schema / properties / challenges / items / properties / spec / descriptionPrevious 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." - changed
Input schema / properties / challenges / items / properties / spec / properties / fees / descriptionPrevious value: -"Fees — everything that goes into expected total cost."New value: +"Fees - everything that goes into expected total cost." - changed
Input schema / properties / challenges / items / properties / spec / properties / flagsNotSimulated / descriptionPrevious 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." - changed
Input schema / properties / challenges / items / properties / spec / properties / funded / properties / maxLoss / properties / mode / descriptionPrevious 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')." - changed
Input schema / properties / challenges / items / properties / spec / properties / funded / properties / payoutRules / descriptionPrevious 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." - changed
Input schema / properties / challenges / items / properties / spec / properties / maxLoss / properties / mode / descriptionPrevious 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')." - changed
Input schema / properties / challenges / items / properties / spec / properties / steps / items / properties / consistency / descriptionPrevious 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." - changed
Input schema / properties / challenges / items / properties / spec / properties / steps / items / properties / maxLoss / properties / mode / descriptionPrevious 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')." - changed
Input schema / properties / fundedHorizonDays / descriptionPrevious 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." - changed
Input schema / properties / riskMode / descriptionPrevious 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." - changed
Input schema / properties / riskValue / descriptionPrevious 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." - changed
Input schema / properties / seed / descriptionPrevious 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." - changed
Input schema / properties / simulateFunded / descriptionPrevious 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." - changed
Input schema / properties / winRate / descriptionPrevious 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."
- Changed
propfirms_optimal_risk14 fields changed- changed
Input schema / properties / fundedHorizonDays / descriptionPrevious 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." - changed
Input schema / properties / riskMode / descriptionPrevious 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." - changed
Input schema / properties / seed / descriptionPrevious 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." - changed
Input schema / properties / simulateFunded / descriptionPrevious 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." - changed
Input schema / properties / spec / descriptionPrevious 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." - changed
Input schema / properties / spec / properties / fees / descriptionPrevious value: -"Fees — everything that goes into expected total cost."New value: +"Fees - everything that goes into expected total cost." - changed
Input schema / properties / spec / properties / flagsNotSimulated / descriptionPrevious 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." - changed
Input schema / properties / spec / properties / funded / properties / maxLoss / properties / mode / descriptionPrevious 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')." - changed
Input schema / properties / spec / properties / funded / properties / payoutRules / descriptionPrevious 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." - changed
Input schema / properties / spec / properties / maxLoss / properties / mode / descriptionPrevious 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')." - changed
Input schema / properties / spec / properties / steps / items / properties / consistency / descriptionPrevious 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." - changed
Input schema / properties / spec / properties / steps / items / properties / maxLoss / properties / mode / descriptionPrevious 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')." - changed
Input schema / properties / step / descriptionPrevious 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." - changed
Input schema / properties / winRate / descriptionPrevious 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."
- Changed
propfirms_simulate14 fields changed- changed
Input schema / properties / fundedHorizonDays / descriptionPrevious 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." - changed
Input schema / properties / riskMode / descriptionPrevious 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." - changed
Input schema / properties / riskValue / descriptionPrevious 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." - changed
Input schema / properties / seed / descriptionPrevious 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." - changed
Input schema / properties / simulateFunded / descriptionPrevious 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." - changed
Input schema / properties / spec / descriptionPrevious 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." - changed
Input schema / properties / spec / properties / fees / descriptionPrevious value: -"Fees — everything that goes into expected total cost."New value: +"Fees - everything that goes into expected total cost." - changed
Input schema / properties / spec / properties / flagsNotSimulated / descriptionPrevious 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." - changed
Input schema / properties / spec / properties / funded / properties / maxLoss / properties / mode / descriptionPrevious 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')." - changed
Input schema / properties / spec / properties / funded / properties / payoutRules / descriptionPrevious 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." - changed
Input schema / properties / spec / properties / maxLoss / properties / mode / descriptionPrevious 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')." - changed
Input schema / properties / spec / properties / steps / items / properties / consistency / descriptionPrevious 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." - changed
Input schema / properties / spec / properties / steps / items / properties / maxLoss / properties / mode / descriptionPrevious 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')." - changed
Input schema / properties / winRate / descriptionPrevious 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."
- Changed
propfirms_simulate_trades17 fields changed- changed
Input schema / properties / blockMeanLength / descriptionPrevious 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." - changed
Input schema / properties / fundedHorizonDays / descriptionPrevious 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." - added
Input schema / properties / importRiskAdded 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" +} - changed
Input schema / properties / rSeries / descriptionPrevious 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." - changed
Input schema / properties / riskMode / descriptionPrevious 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." - changed
Input schema / properties / riskValue / descriptionPrevious 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." - changed
Input schema / properties / seed / descriptionPrevious 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." - changed
Input schema / properties / simulateFunded / descriptionPrevious 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." - changed
Input schema / properties / spec / descriptionPrevious 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." - changed
Input schema / properties / spec / properties / fees / descriptionPrevious value: -"Fees — everything that goes into expected total cost."New value: +"Fees - everything that goes into expected total cost." - changed
Input schema / properties / spec / properties / flagsNotSimulated / descriptionPrevious 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." - changed
Input schema / properties / spec / properties / funded / properties / maxLoss / properties / mode / descriptionPrevious 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')." - changed
Input schema / properties / spec / properties / funded / properties / payoutRules / descriptionPrevious 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." - changed
Input schema / properties / spec / properties / maxLoss / properties / mode / descriptionPrevious 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')." - changed
Input schema / properties / spec / properties / steps / items / properties / consistency / descriptionPrevious 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." - changed
Input schema / properties / spec / properties / steps / items / properties / maxLoss / properties / mode / descriptionPrevious 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')." - changed
Input schema / properties / tradeLogText / descriptionPrevious 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 tool updates
- Added
propfirms_challenge_rules - Added
propfirms_compare - Added
propfirms_list_simulatable - Added
propfirms_optimal_risk - Added
propfirms_pass_rates - Added
propfirms_simulate - Added
propfirms_simulate_trades - Added
propfirms_validate_strategy
6 tool updates
- Changed
library_list_indicators4 fields changed- added
Input schema / properties / conceptAdded value: +{ + "description": "Concept slug — only indicators linked to this concept, e.g. 'rsi'", + "type": "string" +} - added
Input schema / properties / platformAdded value: +{ + "description": "Trading platform the indicator supports, e.g. 'metatrader'", + "type": "string" +} - added
Input schema / properties / tagsAdded value: +{ + "description": "Tag ids (from library_list_tags); an indicator must carry every tag", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / tierAdded value: +{ + "description": "Only indicators included in this LuxAlgo plan tier", + "enum": [ + "essential", + "premium", + "ultimate", + "ultra" + ], + "type": "string" +}
- Added
library_list_tags - Added
propfirms_get - Added
propfirms_search - Added
propfirms_search_challenges - Added
propfirms_search_offers
8 tool updates
- First observed
library_get_concept - First observed
library_get_family - First observed
library_get_indicator - First observed
library_get_source_code - First observed
library_list_concepts - First observed
library_list_families - First observed
library_list_indicators - First observed
library_search
Related MCP Connectors
Crypto market signals, technical indicators, and sentiment analysis for AI agents.
Pay-per-call trading intelligence for AI agents: live market regime, trading signals, composite conv
AI crypto signals, whale positions, 19 technical indicators, derivatives, screener and backtests
Live crypto market signals for AI agents: perp liquidations, funding, OI positioning, yield, FX.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceEnables 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.-
- AlicenseAqualityAmaintenancePre-computed financial market intelligence for AI agents. Stocks, crypto, and ETFs.9114 npm5MIT
- AlicenseAqualityCmaintenanceReal-time crypto intelligence for AI agents. Technical analysis, liquidation heatmaps, sentiment, and funding rates for 50+ Hyperliquid perpetuals via x402 micropayments.1551 PyPI1MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to perform cryptocurrency trading analysis and execution with 38+ tools including real-time market data, technical indicators, risk management, and support for both paper trading and live execution on Hyperliquid.7MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.