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_attorneys
  • verify_bar_admission, get_attorney_assertions
  • lookup_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.