{"serverId":"mcp-registry/com.firmfax/prop-firm-data","tools":[{"name":"compare_firms","fixed":{"name":"compare_firms","description":"Two firms side by side. Reports each figure with its evidence state and whether the pair is comparable at all: a field neither firm records is not a tie, and a field only one records is not a win. No per-field winner is declared, because the direction of \"better\" for several of these is a judgement the published scoring model already makes; each firm's grade is returned alongside so the verdict comes from that model rather than from this tool.","inputSchema":{"type":"object","required":["a","b"],"properties":{"a":{"type":"string","description":"First firm slug."},"b":{"type":"string","description":"Second firm slug."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":186,"tokensAfter":186},{"name":"find_firms","fixed":{"name":"find_firms","description":"Firms matching every criterion given. A firm whose record does not carry a criterion is never counted as a match and never silently dropped: it is returned separately under unknown, with the field that could not be tested. Absence is common here, so read counts before treating the matched list as the answer.","inputSchema":{"type":"object","properties":{"assetClass":{"enum":["forex","futures","crypto"],"type":"string","description":"Firms recorded as offering this. 21 of 71 records name no asset class and are returned as unknown."},"maxResetFee":{"type":"number","description":"Reset fee at or below this. 56 of 71 record no fee."},"maxActivationFee":{"type":"number","description":"Activation fee at or below this. 42 of 71 record no fee."},"maxConsistencyPct":{"type":"number","description":"Consistency rule at or below this. 28 of 71 record none."},"maxDailyLossLimit":{"type":"number","description":"Daily loss limit at or below this, in the unit dailyLossLimitUnit names. 31 of 71 record none."},"maxMinTradingDays":{"type":"number","description":"Minimum trading days at or below this, counted as minTradingDaysUnit names. 16 of 71 record none."},"dailyLossLimitUnit":{"enum":["percent","usd"],"type":"string","description":"The unit maxDailyLossLimit is in. Daily loss limits are recorded in percent at some firms and in dollars at others, and the two are never compared: a firm recorded in the other unit is returned under unknown with its unit named."},"maxMinDaysToPayout":{"type":"number","description":"Minimum days to first payout at or below this, counted as minDaysToPayoutUnit names. 26 of 71 record none."},"minTradingDaysUnit":{"enum":["calendar_days","trading_days","winning_days"],"type":"string","description":"What maxMinTradingDays counts: calendar_days, trading_days or winning_days. A minimum is compared only with minimums counted the same way; a firm counting another way, or stating no unit, is returned under unknown with what it counts named."},"minDaysToPayoutUnit":{"enum":["calendar_days","trading_days","winning_days"],"type":"string","description":"What maxMinDaysToPayout counts: calendar_days, trading_days or winning_days. A wait is compared only with waits counted the same way; a firm counting another way, or stating no unit, is returned under unknown with what it counts named."},"minTradingDaysMinProfit":{"type":"number","description":"With winning_days only: the profit a day must reach to count. A firm whose winning days carry a different profit bar is returned under unknown."},"minDaysToPayoutMinProfit":{"type":"number","description":"With winning_days only: the profit a day must reach to count. A firm whose winning days carry a different profit bar is returned under unknown."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":772,"tokensAfter":772},{"name":"get_evidence","fixed":{"name":"get_evidence","description":"The stored reading behind a figure: the verbatim quote, the page it came from, and the date we read it. Answers \"we hold none\" explicitly rather than returning an empty list. `outcome` is load-bearing: a `contradicted`, `contradiction` or `absent` row records what we read, not a figure we publish. Use get_firm for the published figure.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","description":"The firm slug, e.g. \"topstep\"."},"field":{"type":"string","description":"One field path, e.g. \"rules.dailyLossLimit\". Omit for every field we hold for this firm."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":182,"tokensAfter":182},{"name":"get_firm","fixed":{"name":"get_firm","description":"One prop trading firm. Every figure states whether we hold evidence for it, and a firm whose score range spans more than one band carries no letter grade at all.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","description":"The firm slug, e.g. \"topstep\"."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":94,"tokensAfter":94},{"name":"get_rule_changes","fixed":{"name":"get_rule_changes","description":"The dated record of what changed, newest first. Every entry states its KIND, and most of this tape is FirmFax correcting its own data rather than a firm changing its rules. Read counts before describing industry activity: a total taken across kinds overstates it.","inputSchema":{"type":"object","properties":{"kind":{"enum":["firm","record","withdrawn"],"type":"string","description":"firm = the firm changed a rule. record = FirmFax corrected its own data. withdrawn = we published an entry and then retracted it."},"slug":{"type":"string","description":"Limit to one firm. Omit for every firm."},"limit":{"type":"number","description":"How many entries to return, newest first. Default 50."},"since":{"type":"string","description":"ISO date, e.g. \"2026-08-01\". Entries dated on or after it."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":234,"tokensAfter":234},{"name":"list_firms","fixed":{"name":"list_firms","description":"Every firm slug and name. Carries no figures, so nothing here needs evidence.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":46,"tokensAfter":46}],"toolsChanged":6,"tokensSaved":0,"todo":[],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}