Reference
SDK & MCP
Two first-party ways to consume the API beyond raw REST: a typed TypeScript client, and narrow MCP tools for agent frameworks.
TypeScript SDK
@jubal/lawfirm-sdk tracks the OpenAPI spec and covers both data domains:
import { LawfirmClient } from "@jubal/lawfirm-sdk";
const client = new LawfirmClient({ apiKey: process.env.LAWFIRM_API_KEY! });
// Attorney & firm data
const matches = await client.attorneys.lookup({ name: "smith", jurisdiction: "FL" });
const firm = await client.firms.getById(matches[0].attorney.currentFirmId!);
// Point-in-time statute text — verify a citation against the law
// in force on the matter's operative date, not today's law.
const section = await client.statutes.lookup({
jurisdiction: "fl",
citation: "768.28",
asOf: "2020-03-14",
});
console.log(section.provenance.versionLabel); // "2018"
// As-of-scoped full-text search
const hits = await client.statutes.search({ q: "sovereign immunity tort", asOf: "2020-03-14" });Errors throw with the API's status and message; the response types re-export from @jubal/lawfirm-types, so your application code and the wire format can't drift.
MCP tools
The same surface is exposed as narrow, well-named MCP tools for agent use — your agent does the reasoning, the tools supply verifiable ground truth with provenance attached:
lookup_attorney,search_attorneys,lookup_firm,find_attorneys_at_firm,list_firm_attorneysverify_bar_admission,get_attorney_assertionslookup_law,get_law_text,search_law
Tool definitions ship in @jubal/lawfirm-mcp; the Anthropic registry listing is coming. Design rule: tools are narrow and named for what they answer— no generic “query” escape hatch — because agents pick better tools when the names carry the semantics.