Bindinglaw

MCP server

Six tools, narrow on purpose.

https://mcp.binding.law speaks streamable HTTP and is stateless — every POST is a self-contained JSON-RPC exchange. It takes the same Authorization: Bearer key as the REST API, and each tool is a thin wrapper over the REST endpoint behind it, so scopes, metering and response shapes cannot drift apart.

Connect it

The server is remote HTTP; there is nothing to install and nothing to run locally. Claude Code can add it in one command. Claude Desktop configures stdio servers, so it reaches a remote server through the mcp-remote shim.

claude mcp add --transport http binding-law https://mcp.binding.law \
  --header "Authorization: Bearer $BINDING_API_KEY"

Put the key in the environment rather than the config file — a token on a command line lands in shell history, and a token in a committed .mcp.json lands in your repository.

Or call it directly

It is an ordinary JSON-RPC endpoint. POST only: a GET is answered 405 with JSON-RPC error -32000, because GET and DELETE are session operations and this server holds no sessions. A POST without a bearer token is 401 with -32001.

curl -X POST "https://mcp.binding.law" \
  -H "Authorization: Bearer $BINDING_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
401 · POST without a token
{
  "jsonrpc": "2.0",
  "error": {
    "code": -32001,
    "message": "Authorization: Bearer <api key> required"
  },
  "id": null
}
405 · GET
{
  "jsonrpc": "2.0",
  "error": {
    "code": -32000,
    "message": "Stateless server: POST only"
  },
  "id": null
}

law_coverage

Which jurisdictions and corpora are served, their temporal basis, coverage floors and section counts. No arguments. Free — it bills nothing, and it is the tool to call before deciding whether a verification is possible at all. A jurisdiction and corpus absent from the list is not carried, and lookups against it return not_carried.

law_quality

Our own audit of the corpus: where our data is thinner or coarser than it should be. Use it to decide how much weight to put on a jurisdiction before grounding an answer on it. This audits our data, not the law. Free.

ParameterMeaning
jurisdictionoptionalstring (2)
Two-letter jurisdiction code — this tool's schema requires exactly two characters. Omit for every corpus.
historyoptionalboolean
Include the last 30 audit runs, to see whether quality is improving.

lookup_law

Authoritative text of a statute, regulation, rule, instruction or guidance section as it was in force on a date, with full provenance — source URL, retrieval time, content hash, version. Wraps GET /v1/law/lookup.

ParameterMeaning
jurisdictionrequiredstring
us or a state code like ca, tx, fl.
citationoptionalstring
The normalized citation key. key is accepted as an alias, because search_law results carry the same value under citation.key and agents kept passing it back under that name. One of the two is required; neither is an isError result carrying missing_fields.
keyoptionalstring
Alias of citation.
corpusoptionalenum
One of statutes (default), regulations, guidance, jury_instructions, rules, guidelines.
asOfoptionaldate
YYYY-MM-DD. The text as it was in force on that date; defaults to today.

get_law_text

The compact variant of lookup_law — body text, catchline, history and permalink, for quote comparison. Identical arguments and identical miss semantics. Wraps GET /v1/law/text.

search_law

Ranked full-text search with highlighted snippets, point-in-time scoped. The search is lexical: reformulate a natural-language question into statutory keywords and try variants. Wraps GET /v1/law/search.

ParameterMeaning
qrequiredstring
Web syntax: quoted phrases, OR, -negation.
jurisdictionoptionalstring
One code, a comma list, or all. This tool defaults to all, where the REST endpoint defaults to fl.
corpusoptionalenum
One of statutes (default), regulations, guidance, jury_instructions, rules, guidelines.
asOfoptionaldate
YYYY-MM-DD. The text as it was in force on that date; defaults to today.
limitoptionalinteger
1 to 25.

Corpus routing. If corpus is omitted and the query names the CFR, the search runs against regulations and the response says so — an agent that searched the default statutes corpus for a 42 C.F.R. question could not see that the controlling text existed one corpus over. If corpus is omitted, nothing is inferred, and the result is empty, the response says that too and names where regulations and agency manuals actually live.

lookup_citation

Resolve case citations — 347 U.S. 483, 999 F.3d 1, 100 So. 3d 200— to the cases they name, from a local copy of CourtListener’s citation index. Returns, per citation, a status in CourtListener’s vocabulary (200 found, 300 ambiguous, 404 not found, 400 unknown reporter) and the matching cases with court, date and CourtListener URL. Resolution only: it does not say whether the case is still good law. Wraps POST /v1/law/citations/lookup.

ParameterMeaning
textrequiredstring
One or more citations, one per line. Up to 64,000 characters.

How a miss reaches the model

A 404 from the REST layer is passed through as the tool result rather than raised as a failure, because an explicit miss is information. When the code is not_carried, the server merges a steering note into the JSON body under note, telling the model not to hunt the open web on binding.law’s authority and to say the source is not carried instead.

The note rides inside the body rather than as a second content item on purpose: several MCP clients surface only the first text item to the model, and a note nobody sees is no note. The errors page has the full distinction and why it exists.

Bindinglaw

Point-in-time US law with the receipt attached. Source URL, retrieval time, content hash, and validity dates on every answer.

curl api.binding.law/v1/law/coverage

© 2026 binding.law · a Jubal, Inc. productAttorneys and firms never pay. Ever.