Live deals Claim deals

For software

Machine interface

FirmFax serves its prop firm dataset over the Model Context Protocol, so an assistant can read the record for a firm directly. Every figure states whether we hold evidence for it, and a figure we cannot source is a state on the wire rather than a blank.

Last updated 2026-09-10

71

firms served

2

tools exposed

0

keys, accounts or signups

The endpoint

URL https://firmfax.com/api/mcp
Method POST only. A GET is answered 405: there is no page there.
Transport JSON-RPC 2.0 over HTTP. Protocol version 2024-11-05.
Server name firmfax version 1.0.0
Authentication None. There is no key to request and no account to create.

A JSON-RPC error is carried inside the envelope with a 200, because a caller inside another product sees a tool result rather than a status line, and an HTTP error there reads as a network fault rather than as an answer.

Tools

get_firm

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.

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "The firm slug, e.g. \"topstep\"."
    }
  },
  "required": [
    "slug"
  ]
}

list_firms

Every firm slug and name. Carries no figures, so nothing here needs evidence.

{
  "type": "object",
  "properties": {}
}

Every figure is one of three states

Shape Means Notes
{ value, quote, sourceUrl, asOf } Evidenced A figure we can quote from a page the firm itself publishes. The quote and the URL travel with it, so a product presenting this can cite the firm rather than cite us.
{ status: 'unevidenced', unverifiedValue, checked } Held, nothing behind it A figure we hold with no published source read for it. Most of the dataset is here today. The number is under unverifiedValue and never under value, so reading .value across a response returns only evidenced figures and lifting an unsourced one has to be deliberate.
{ status: 'not_recorded', checked } Absent No value at all. Never null, never 0, never an omitted key. checked lists the pages that were read, so a caller can see the search was real.

01

What this is

FirmFax publishes its dataset over the Model Context Protocol as well as over this website. An assistant or other software can request the record for any of the 71 firms directly and present it inside a product that is not this one. The records are the same records: the same figures, the same scores, the same dated sources.

There is no API key, no account and no signup. The endpoint is a single POST route speaking JSON-RPC 2.0. It is read-only: nothing it exposes writes anything, and it holds no state about who called it.

02

Why the shapes are awkward

Every field is an object and there are no bare numbers anywhere. That is deliberate and it is the reason this interface exists in the form it does. A tool response is rendered inside a product we cannot see, by a template we do not control, so a null on the wire becomes "None" or "$0" in somebody else's interface and the absence disappears.

This site's first rule is that a missing value is not a claim. On a page that can be enforced by a renderer. Over a wire it has to be enforced by the shape, because there is no renderer of ours between the data and the reader. So an absent figure is a positive state with its own name, not a blank, and a figure with no source behind it carries its number under a key no shared template reaches by accident.

03

Where the grade is withheld

A letter grade is published only where the range behind the score sits inside one band. Where the range spans two, what is published in place of a letter is the range itself and the facts that would close it. Today 24 of 71 firms withhold a letter on that basis.

Abstention is the absence of the letter key, not a value in it. A caller reading grade.letter gets only firms where a letter is genuinely published: there is no null, no empty string and no "N/A" to mishandle. Where the letter is absent, range and closedBy are populated instead, so the abstention is actionable rather than merely blank.

04

Commission links in responses

Responses can carry commission-bearing links, on the same terms as the links on this website. 25 of the 71 firms pay us and they are the same 25 named on the disclosure page; the other 46 carry no offer object at all. No firm pays for its record to be served or for its link to be included in a response, and the scoring model cannot read commercial terms.

Where an offer is present it carries this sentence with it, in the same record: “FirmFax may earn a commission if you sign up through this link. Ranking and scoring cannot read commercial terms: the scoring model has no access to the affiliate data.” A link that arrives without it is not a shape this interface can produce. What that cannot do is put the disclosure in front of you: a product receiving this data decides how to render it and may shorten or omit that statement entirely. That is a property of publishing to machines rather than to readers.

Calling it

curl -X POST https://firmfax.com/api/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Clients that take a remote MCP server accept the URL above directly. Clients that expect a local command can reach it through any stdio-to-HTTP bridge; nothing here depends on which.

How the scores are computed is on the methodology page, and what is and is not paid for is on the disclosure. Both describe this interface on the same terms as the website, because it serves the same records.