Skip to main content
Glama

luxalgo-mcp-server

Find pass- and EV-optimal risk per trade

propfirms_optimal_risk
Read-only

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.

Input Schema

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

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed21 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • changedInput schema / properties / context / description
      Previous value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    • changedInput schema / properties / seed / anyOf
      Previous value: -[
      -  {
      -    "type": "integer"
      -  },
      -  {
      -    "type": "string"
      -  }
      -]New value: +[
      +  {
      +    "maximum": 9007199254740991,
      +    "minimum": -9007199254740991,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / spec / additionalProperties
      Previous value: -trueNew value: +{}
    • addedInput schema / properties / spec / properties / constraints / propertyNames
      Added value: +{
      +  "type": "string"
      +}
    • changedInput schema / properties / spec / properties / dailyLoss / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
      -    "properties": {
      -      "amount": {
      -        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
      -        "exclusiveMinimum": 0,
      -        "type": "number"
      -      },
      -      "basis": {
      -        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
      -        "enum": [
      -          "prior-day-balance",
      -          "prior-day-equity"
      -        ],
      -        "type": "string"
      -      },
      -      "evaluation": {
      -        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
      -        "enum": [
      -          "intraday",
      -          "end-of-day"
      -        ],
      -        "type": "string"
      -      },
      -      "includesOpenPnl": {
      -        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
      -        "type": "boolean"
      -      },
      -      "limitBasis": {
      -        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
      -        "enum": [
      -          "initial-balance",
      -          "anchor"
      -        ],
      -        "type": "string"
      -      },
      -      "pct": {
      -        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 100,
      -        "type": "number"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
      +    "properties": {
      +      "amount": {
      +        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      },
      +      "basis": {
      +        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
      +        "enum": [
      +          "prior-day-balance",
      +          "prior-day-equity"
      +        ],
      +        "type": "string"
      +      },
      +      "evaluation": {
      +        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
      +        "enum": [
      +          "intraday",
      +          "end-of-day"
      +        ],
      +        "type": "string"
      +      },
      +      "includesOpenPnl": {
      +        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
      +        "type": "boolean"
      +      },
      +      "limitBasis": {
      +        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
      +        "enum": [
      +          "initial-balance",
      +          "anchor"
      +        ],
      +        "type": "string"
      +      },
      +      "pct": {
      +        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 100,
      +        "type": "number"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / spec / properties / fees / additionalProperties
      Previous value: -trueNew value: +{}
    • changedInput schema / properties / spec / properties / funded / additionalProperties
      Previous value: -trueNew value: +{}
    • changedInput schema / properties / spec / properties / funded / properties / dailyLoss / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
      -    "properties": {
      -      "amount": {
      -        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
      -        "exclusiveMinimum": 0,
      -        "type": "number"
      -      },
      -      "basis": {
      -        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
      -        "enum": [
      -          "prior-day-balance",
      -          "prior-day-equity"
      -        ],
      -        "type": "string"
      -      },
      -      "evaluation": {
      -        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
      -        "enum": [
      -          "intraday",
      -          "end-of-day"
      -        ],
      -        "type": "string"
      -      },
      -      "includesOpenPnl": {
      -        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
      -        "type": "boolean"
      -      },
      -      "limitBasis": {
      -        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
      -        "enum": [
      -          "initial-balance",
      -          "anchor"
      -        ],
      -        "type": "string"
      -      },
      -      "pct": {
      -        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 100,
      -        "type": "number"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
      +    "properties": {
      +      "amount": {
      +        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      },
      +      "basis": {
      +        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
      +        "enum": [
      +          "prior-day-balance",
      +          "prior-day-equity"
      +        ],
      +        "type": "string"
      +      },
      +      "evaluation": {
      +        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
      +        "enum": [
      +          "intraday",
      +          "end-of-day"
      +        ],
      +        "type": "string"
      +      },
      +      "includesOpenPnl": {
      +        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
      +        "type": "boolean"
      +      },
      +      "limitBasis": {
      +        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
      +        "enum": [
      +          "initial-balance",
      +          "anchor"
      +        ],
      +        "type": "string"
      +      },
      +      "pct": {
      +        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 100,
      +        "type": "number"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / spec / properties / funded / properties / firstPayoutMinDays / maximum
      Added value: +9007199254740991
    • changedInput schema / properties / spec / properties / funded / properties / maxLoss / additionalProperties
      Previous value: -trueNew value: +{}
    • changedInput schema / properties / spec / properties / funded / properties / payoutRules / additionalProperties
      Previous value: -trueNew value: +{}
    • addedInput schema / properties / spec / properties / funded / properties / payoutRules / properties / minWinningDays / maximum
      Added value: +9007199254740991
    • changedInput schema / properties / spec / properties / maxLoss / additionalProperties
      Previous value: -trueNew value: +{}
    • changedInput schema / properties / spec / properties / sources / items / additionalProperties
      Previous value: -trueNew value: +{}
    • changedInput schema / properties / spec / properties / steps / items / additionalProperties
      Previous value: -trueNew value: +{}
    • changedInput schema / properties / spec / properties / steps / items / properties / consistency / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "properties": {
      -      "maxBestDayProfitPct": {
      -        "description": "Maximum share of the step's total profit the best single day may contribute, in PERCENT UNITS (40 = the best day may be at most 40% of total profit).",
      -        "exclusiveMinimum": 0,
      -        "maximum": 100,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "maxBestDayProfitPct"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "maxBestDayProfitPct": {
      +        "description": "Maximum share of the step's total profit the best single day may contribute, in PERCENT UNITS (40 = the best day may be at most 40% of total profit).",
      +        "exclusiveMinimum": 0,
      +        "maximum": 100,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "maxBestDayProfitPct"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / spec / properties / steps / items / properties / dailyLoss / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
      -    "properties": {
      -      "amount": {
      -        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
      -        "exclusiveMinimum": 0,
      -        "type": "number"
      -      },
      -      "basis": {
      -        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
      -        "enum": [
      -          "prior-day-balance",
      -          "prior-day-equity"
      -        ],
      -        "type": "string"
      -      },
      -      "evaluation": {
      -        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
      -        "enum": [
      -          "intraday",
      -          "end-of-day"
      -        ],
      -        "type": "string"
      -      },
      -      "includesOpenPnl": {
      -        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
      -        "type": "boolean"
      -      },
      -      "limitBasis": {
      -        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
      -        "enum": [
      -          "initial-balance",
      -          "anchor"
      -        ],
      -        "type": "string"
      -      },
      -      "pct": {
      -        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 100,
      -        "type": "number"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "description": "Daily loss rule: the daily floor is anchor minus limit, reset at each trading-day boundary. Exactly one of pct/amount must be set.",
      +    "properties": {
      +      "amount": {
      +        "description": "Daily loss limit as a fixed currency amount (alternative to pct).",
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      },
      +      "basis": {
      +        "description": "Anchor today's loss is measured from: prior day's closing balance or closing equity (they differ only with overnight positions). Default 'prior-day-balance'.",
      +        "enum": [
      +          "prior-day-balance",
      +          "prior-day-equity"
      +        ],
      +        "type": "string"
      +      },
      +      "evaluation": {
      +        "description": "'intraday': fails the moment equity touches the daily floor. 'end-of-day': only the close is checked. Default 'intraday'.",
      +        "enum": [
      +          "intraday",
      +          "end-of-day"
      +        ],
      +        "type": "string"
      +      },
      +      "includesOpenPnl": {
      +        "description": "Whether floating (unrealized) P&L counts toward the daily loss, i.e. breach can happen intra-position. Default true.",
      +        "type": "boolean"
      +      },
      +      "limitBasis": {
      +        "description": "What a percentage limit is a percent OF. 'initial-balance': a fixed currency allowance (always e.g. 5% of the starting account). 'anchor': recomputed daily from the day's anchor. Default 'initial-balance'.",
      +        "enum": [
      +          "initial-balance",
      +          "anchor"
      +        ],
      +        "type": "string"
      +      },
      +      "pct": {
      +        "description": "Daily loss limit in PERCENT UNITS (5 = 5%); what it is a percent OF is set by limitBasis. Exactly one of pct/amount.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 100,
      +        "type": "number"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / spec / properties / steps / items / properties / maxDays / anyOf
      Previous value: -[
      -  {
      -    "exclusiveMinimum": 0,
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "exclusiveMinimum": 0,
      +    "maximum": 9007199254740991,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / spec / properties / steps / items / properties / maxLoss / additionalProperties
      Previous value: -trueNew value: +{}
    • addedInput schema / properties / spec / properties / steps / items / properties / minTradingDays / maximum
      Added value: +9007199254740991
  2. Changed3 schema fields changed
    • removedInput schema / additionalProperties
      Removed value: -false
    • addedInput schema / properties / context
      Added value: +{
      +  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "winRate",
      -  "avgWinR",
      -  "tradesPerDay"
      -]New value: +[
      +  "winRate",
      +  "avgWinR",
      +  "tradesPerDay",
      +  "context"
      +]
  3. Changed14 schema fields changed
    • changedInput schema / properties / fundedHorizonDays / description
      Previous value: -"Funded-stage horizon in trading days for the payout/EV simulation. Default 90 (about 4 calendar months). EV scales with this choice — state it when reporting EV."New value: +"Funded-stage horizon in trading days for the payout/EV simulation. Default 90 (about 4 calendar months). EV scales with this choice - state it when reporting EV."
    • changedInput schema / properties / riskMode / description
      Previous value: -"How riskValue is interpreted. 'percent-of-balance' (default): risk compounds with the current balance. 'percent-of-initial': constant currency risk derived from the initial account size — how most prop traders size, since loss limits are fixed in currency. 'fixed-amount': explicit currency risked per 1R."New value: +"How riskValue is interpreted. 'percent-of-balance' (default): risk compounds with the current balance. 'percent-of-initial': constant currency risk derived from the initial account size - how most prop traders size, since loss limits are fixed in currency. 'fixed-amount': explicit currency risked per 1R."
    • changedInput schema / properties / seed / description
      Previous value: -"RNG seed (integer or string). Default 42. Same inputs + seed reproduce byte-identical results — include the seed when reporting so users can reproduce the numbers."New value: +"RNG seed (integer or string). Default 42. Same inputs + seed reproduce byte-identical results - include the seed when reporting so users can reproduce the numbers."
    • changedInput schema / properties / simulateFunded / description
      Previous value: -"Whether to simulate the funded stage (payouts, blowup risk) after passing. Default true — EV is only meaningful with it on; set false to study the evaluation alone."New value: +"Whether to simulate the funded stage (payouts, blowup risk) after passing. Default true - EV is only meaningful with it on; set false to study the evaluation alone."
    • changedInput schema / properties / spec / description
      Previous value: -"Inline challenge ruleset, for challenges not in the directory or for what-if rule edits. Mutually exclusive with firmId/challengeId. Identify the challenge EITHER by directory reference (firmId + challengeId, discovered via propfirms_list_simulatable; firmId accepts the directory id or the firm's name) OR by a full inline `spec` object — the exact shape propfirms_challenge_rules returns, so you can fetch a directory entry, change one rule, and re-simulate to model rule variations. Provide exactly one of the two forms; providing both or neither is an error. Directory references need network access; inline specs are fully offline."New value: +"Inline challenge ruleset, for challenges not in the directory or for what-if rule edits. Mutually exclusive with firmId/challengeId. Identify the challenge EITHER by directory reference (firmId + challengeId, discovered via propfirms_list_simulatable; firmId accepts the directory id or the firm's name) OR by a full inline `spec` object - the exact shape propfirms_challenge_rules returns, so you can fetch a directory entry, change one rule, and re-simulate to model rule variations. Provide exactly one of the two forms; providing both or neither is an error. Directory references need network access; inline specs are fully offline."
    • changedInput schema / properties / spec / properties / fees / description
      Previous value: -"Fees — everything that goes into expected total cost."New value: +"Fees - everything that goes into expected total cost."
    • changedInput schema / properties / spec / properties / flagsNotSimulated / description
      Previous value: -"Honesty channel: ids of rules this entry has that the engine does not simulate (e.g. 'scaling-plan', 'soft-daily-lockout'). Surfaced in every result's assumption flags. Consistency rules and payout gating do NOT belong here — the engine simulates them."New value: +"Honesty channel: ids of rules this entry has that the engine does not simulate (e.g. 'scaling-plan', 'soft-daily-lockout'). Surfaced in every result's assumption flags. Consistency rules and payout gating do NOT belong here - the engine simulates them."
    • changedInput schema / properties / spec / properties / funded / properties / maxLoss / properties / mode / description
      Previous value: -"How the max-loss floor behaves — the single most consequential rule difference between firms. 'static-initial': floor fixed at initial balance minus the limit; never moves (classic CFD two-step). 'trailing-realized-eod': floor ratchets up with end-of-day balance highs; intraday highs do not move it. 'trailing-intraday-unrealized': floor trails the peak unrealized equity intraday and never stops trailing (futures-style; the most-miscalculated rule in the industry: it cuts pass probability dramatically). 'trailing-locks-at-initial': trails intraday peak equity until the floor reaches the initial balance, then freezes (common futures variant). Locking is also composable: locksAtInitial adds the same lock to an EOD trail, and lockOffsetAmount shifts the lock level to initial balance + that amount (e.g. 100 models 'stops trailing $100 above the start')."New value: +"How the max-loss floor behaves - the single most consequential rule difference between firms. 'static-initial': floor fixed at initial balance minus the limit; never moves (classic CFD two-step). 'trailing-realized-eod': floor ratchets up with end-of-day balance highs; intraday highs do not move it. 'trailing-intraday-unrealized': floor trails the peak unrealized equity intraday and never stops trailing (futures-style; the most-miscalculated rule in the industry: it cuts pass probability dramatically). 'trailing-locks-at-initial': trails intraday peak equity until the floor reaches the initial balance, then freezes (common futures variant). Locking is also composable: locksAtInitial adds the same lock to an EOD trail, and lockOffsetAmount shifts the lock level to initial balance + that amount (e.g. 100 models 'stops trailing $100 above the start')."
    • changedInput schema / properties / spec / properties / funded / properties / payoutRules / description
      Previous value: -"Payout gating — SIMULATED (engine v1), not just flagged: a payout happens only when these conditions are met, and on each eligible payout day the trader withdraws the maximum the rules allow (profit above the buffer, under the caps, never below the loss floor); balances and loss floors carry across payouts (see flag 'funded-withdrawal-model'). Omit for ungated payouts."New value: +"Payout gating - SIMULATED (engine v1), not just flagged: a payout happens only when these conditions are met, and on each eligible payout day the trader withdraws the maximum the rules allow (profit above the buffer, under the caps, never below the loss floor); balances and loss floors carry across payouts (see flag 'funded-withdrawal-model'). Omit for ungated payouts."
    • changedInput schema / properties / spec / properties / maxLoss / properties / mode / description
      Previous value: -"How the max-loss floor behaves — the single most consequential rule difference between firms. 'static-initial': floor fixed at initial balance minus the limit; never moves (classic CFD two-step). 'trailing-realized-eod': floor ratchets up with end-of-day balance highs; intraday highs do not move it. 'trailing-intraday-unrealized': floor trails the peak unrealized equity intraday and never stops trailing (futures-style; the most-miscalculated rule in the industry: it cuts pass probability dramatically). 'trailing-locks-at-initial': trails intraday peak equity until the floor reaches the initial balance, then freezes (common futures variant). Locking is also composable: locksAtInitial adds the same lock to an EOD trail, and lockOffsetAmount shifts the lock level to initial balance + that amount (e.g. 100 models 'stops trailing $100 above the start')."New value: +"How the max-loss floor behaves - the single most consequential rule difference between firms. 'static-initial': floor fixed at initial balance minus the limit; never moves (classic CFD two-step). 'trailing-realized-eod': floor ratchets up with end-of-day balance highs; intraday highs do not move it. 'trailing-intraday-unrealized': floor trails the peak unrealized equity intraday and never stops trailing (futures-style; the most-miscalculated rule in the industry: it cuts pass probability dramatically). 'trailing-locks-at-initial': trails intraday peak equity until the floor reaches the initial balance, then freezes (common futures variant). Locking is also composable: locksAtInitial adds the same lock to an EOD trail, and lockOffsetAmount shifts the lock level to initial balance + that amount (e.g. 100 models 'stops trailing $100 above the start')."
    • changedInput schema / properties / spec / properties / steps / items / properties / consistency / description
      Previous value: -"Consistency rule — SIMULATED (engine v1), not just flagged: one outsized day effectively raises the target (total profit must reach best day / pct), and the simulated trader keeps trading — rationally stopping days early when that helps — until the best-day share complies (see flag 'consistency-stop-rule'). null or omitted = no consistency rule."New value: +"Consistency rule - SIMULATED (engine v1), not just flagged: one outsized day effectively raises the target (total profit must reach best day / pct), and the simulated trader keeps trading - rationally stopping days early when that helps - until the best-day share complies (see flag 'consistency-stop-rule'). null or omitted = no consistency rule."
    • changedInput schema / properties / spec / properties / steps / items / properties / maxLoss / properties / mode / description
      Previous value: -"How the max-loss floor behaves — the single most consequential rule difference between firms. 'static-initial': floor fixed at initial balance minus the limit; never moves (classic CFD two-step). 'trailing-realized-eod': floor ratchets up with end-of-day balance highs; intraday highs do not move it. 'trailing-intraday-unrealized': floor trails the peak unrealized equity intraday and never stops trailing (futures-style; the most-miscalculated rule in the industry: it cuts pass probability dramatically). 'trailing-locks-at-initial': trails intraday peak equity until the floor reaches the initial balance, then freezes (common futures variant). Locking is also composable: locksAtInitial adds the same lock to an EOD trail, and lockOffsetAmount shifts the lock level to initial balance + that amount (e.g. 100 models 'stops trailing $100 above the start')."New value: +"How the max-loss floor behaves - the single most consequential rule difference between firms. 'static-initial': floor fixed at initial balance minus the limit; never moves (classic CFD two-step). 'trailing-realized-eod': floor ratchets up with end-of-day balance highs; intraday highs do not move it. 'trailing-intraday-unrealized': floor trails the peak unrealized equity intraday and never stops trailing (futures-style; the most-miscalculated rule in the industry: it cuts pass probability dramatically). 'trailing-locks-at-initial': trails intraday peak equity until the floor reaches the initial balance, then freezes (common futures variant). Locking is also composable: locksAtInitial adds the same lock to an EOD trail, and lockOffsetAmount shifts the lock level to initial balance + that amount (e.g. 100 models 'stops trailing $100 above the start')."
    • changedInput schema / properties / step / description
      Previous value: -"Grid step, same units. Default 0.1. The sweep runs one full simulation per grid point, so (max - min) / step + 1 simulations in total — keep the grid coarse or paths low for a first pass."New value: +"Grid step, same units. Default 0.1. The sweep runs one full simulation per grid point, so (max - min) / step + 1 simulations in total - keep the grid coarse or paths low for a first pass."
    • changedInput schema / properties / winRate / description
      Previous value: -"Probability a trade is a winner, as a FRACTION in [0, 1] (0.55 = 55% winners) — NOT percent units. The most impactful input: traders routinely overestimate it by a few points, which can flip EV negative, so prefer measured stats over self-reported ones."New value: +"Probability a trade is a winner, as a FRACTION in [0, 1] (0.55 = 55% winners) - NOT percent units. The most impactful input: traders routinely overestimate it by a few points, which can flip EV negative, so prefer measured stats over self-reported ones."
  4. Added

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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

With no output schema, the description carries the burden of 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.