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"}'{
"jsonrpc": "2.0",
"error": {
"code": -32001,
"message": "Authorization: Bearer <api key> required"
},
"id": null
}{
"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.
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.
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.
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.
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.