Vaquill-AI/vaquill-mcp
OfficialThis server provides AI assistants with access to legal research tools—searching, reading, resolving, and tracking official US federal/state law and, via a separate endpoint, Indian legislation.
Search US primary law (USC, CFR, state statutes/regulations, constitutions, court rules, Federal Register, agency guidance) with semantic/keyword queries and filters by jurisdiction, corpus, title, chapter, date, status, and more.
Retrieve section metadata and full text (HTML, plain text, or split content) for US statutes and regulations.
Resolve Bluebook citations (e.g.,
42 U.S.C. 1983) to exact sections, singly or in batches.Browse statutory hierarchies division-by-division and get batch metadata for up to 50 sections.
Read sections in context: neighbors, governing definitions, cross-references, cross-state parallels, and observed changes over time.
Set up law-change alerts by subscribing to watchable boards (Federal Register, CFR, state statutes, etc.) with webhook/email delivery, signing, outbound auth, and delivery logs.
Inspect watch changes and before/after diffs for watched sources.
Get live pricing information and generic search/fetch convenience tools for clients requiring the standard pair.
Access Indian legislation (Central and State Acts plus regulator instruments) through a separate
/inendpoint, including amendment history and mapping repealed criminal codes to new ones.Use built-in resources (coverage, filters, guide, pricing) and prompts for workflows like good-law checks, fifty-state surveys, and citation verification.
vaquill-mcp
MCP server for Vaquill legal research API. Covers US federal and 50-state primary law: USC, CFR, state statutes and regulations, state and US constitutions, court rules, the Federal Register, executive orders, and agency guidance. Search primary law, resolve statutory citations, browse the hierarchy, and ground answers in official sources, all from your AI tools.
Quick Start
Prerequisites
Sign up at vaquill.ai to get your API key.
Claude.ai (Web)
No installation needed. Add as a remote MCP server from Customize > Connectors > Add custom connector:
Option A: Bearer token (recommended)
Open the Request headers section of the same dialog and add the credential there:
URL: https://mcp.vaquill.ai/mcp
Header name: Authorization
Header value: Bearer vq_key_your_key_hereClaude sends the value exactly as you type it and adds no scheme of its own, so the value
field holds Bearer vq_key_... and not Authorization: Bearer vq_key_....
Option B: API key in the URL (compatibility)
https://mcp.vaquill.ai/s/vq_key_your_key_hereStill live, and still the only form that works where a client cannot send a header at all. Prefer Option A everywhere else: a credential in a URL is recorded in server logs, proxies and browsing history, which is why Anthropic's connector guidance advises against it and the MCP specification prohibits it.
Available on Claude Pro, Max, Team, and Enterprise plans. The Request headers section is in beta and is enabled per account, it accepts a short allowlist of header names, and it holds at most four. On Team and Enterprise an owner adds the connector under Organization settings first.
Claude Desktop
Open the config file from Settings > Developer > Edit Config:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"vaquill": {
"command": "uvx",
"args": ["vaquill-mcp"],
"env": {
"VAQUILL_API_KEY": "vq_key_your_key_here"
}
}
}
}For Indian legislation, add --jurisdiction IN. One process serves one
corpus, so run two entries if you want both:
{
"mcpServers": {
"vaquill": {
"command": "uvx",
"args": ["vaquill-mcp"],
"env": { "VAQUILL_API_KEY": "vq_key_your_key_here" }
},
"vaquill-india": {
"command": "uvx",
"args": ["vaquill-mcp", "--jurisdiction", "IN"],
"env": { "VAQUILL_API_KEY": "vq_key_your_key_here" }
}
}
}Quit Claude completely and reopen it. It does not reload the file.
Claude Code
Remote (no install):
claude mcp add --transport http --scope user vaquill \
https://mcp.vaquill.ai/mcp \
--header "Authorization: Bearer vq_key_your_key_here"Local (via uvx):
claude mcp add --scope user vaquill -e VAQUILL_API_KEY=vq_key_your_key_here \
-- uvx vaquill-mcp--scope user registers the server for every project; the default is the current directory
only. -e stores the key with the registration, so it survives Claude Code being launched
from an IDE, which an export in your shell profile does not. Both --header and -e are
variadic, so they have to come after the server name.
Cursor
Edit ~/.cursor/mcp.json for every project, or .cursor/mcp.json for one.
Remote:
{
"mcpServers": {
"vaquill": {
"url": "https://mcp.vaquill.ai/mcp",
"headers": {
"Authorization": "Bearer vq_key_your_key_here"
}
}
}
}Local (via uvx):
{
"mcpServers": {
"vaquill": {
"command": "uvx",
"args": ["vaquill-mcp"],
"env": {
"VAQUILL_API_KEY": "vq_key_your_key_here"
}
}
}
}VS Code (Copilot)
Add to .vscode/mcp.json. For every project instead of one, run the
MCP: Open User Configuration command and use the same shape there.
Remote:
{
"inputs": [
{
"type": "promptString",
"id": "vaquill-authorization",
"description": "Authorization header value",
"password": true
}
],
"servers": {
"vaquill": {
"type": "http",
"url": "https://mcp.vaquill.ai/mcp",
"headers": {
"Authorization": "${input:vaquill-authorization}"
}
}
}
}The credential goes in a prompt rather than in the file, so the file is safe to commit. VS Code asks for it on first start and remembers it. Restart the server after saving, or the tools will not appear.
Local (via uvx):
{
"servers": {
"vaquill": {
"type": "stdio",
"command": "uvx",
"args": ["vaquill-mcp"],
"env": {
"VAQUILL_API_KEY": "vq_key_your_key_here"
}
}
}
}Windsurf
Add to ~/.codeium/windsurf/mcp_config.json.
Remote:
{
"mcpServers": {
"vaquill": {
"serverUrl": "https://mcp.vaquill.ai/mcp",
"headers": {
"Authorization": "Bearer vq_key_your_key_here"
}
}
}
}Windsurf uses serverUrl for a remote server, not url, and interpolates ${env:VAR} if you
would rather read the credential from the environment.
Local (via uvx):
{
"mcpServers": {
"vaquill": {
"command": "uvx",
"args": ["vaquill-mcp"],
"env": {
"VAQUILL_API_KEY": "vq_key_your_key_here"
}
}
}
}Related MCP server: lawyer-mcp
Available Tools
Tools are generated from the live Vaquill API's OpenAPI spec at startup, so the
set always matches the current API. For the authoritative, up-to-date list and
per-call credit costs, run the free get_pricing tool or inspect your MCP
client's tool list. The main groups (representative tools shown):
US statutes & regulations
USC, CFR, all 50 state codes, constitutions, state court rules, the Federal Register, and agency guidance.
Tool | Description |
| Hybrid semantic + keyword search; filter by |
| Section metadata by |
| Full HTML + plain text of a section. |
| Metadata for up to 50 sections in one call. |
| Resolve a Bluebook citation (e.g. |
| Browse the statutory hierarchy one level at a time. |
| Self-describing coverage matrix: which corpora exist in which jurisdiction. |
Reading a section in context
Tool | Description |
| The sections immediately before and after, in statutory order. |
| The defined terms that govern a section, from its chapter's definitions section. |
| Which USC/CFR sections cross-reference this one (the inverse of |
| Provisions in other states addressing the same subject, ranked by similarity. |
| What our refreshes observed changing on this section over time. |
Law change alerts
Subscribe to a corpus source and get a webhook or email when it changes.
Subscribing, polling and inspecting deliveries are all free; only
get_watch_change_diff is metered, because it is the only one that returns
section text.
Tool | Description |
| The watchable sources (Federal Register, CFR, a state's statutes, ...). |
| Subscribe to a board via webhook (HMAC-SHA256 signed) or email. |
| Manage your subscriptions. |
| Send a synthetic delivery to verify signing, auth and reachability. |
| What changed on a watched source. Metadata only, and safe to poll. |
| Before/after text for one change, as whole documents. |
| Per-attempt webhook delivery log (90 days). |
Utility
Tool | Description |
| Live API credit pricing (free, no auth). |
| Generic one-string corpus search returning |
| Generic one-string retrieval returning |
search and fetch exist because ChatGPT's deep research and company-knowledge
connectors match a corpus server by those exact names and their single-string
signature, and refuse to work without them. They are thin wrappers over the
typed tools above, which any client that can call them should prefer: the typed
ones filter by jurisdiction, corpus, date and status, and these two do not.
fetch is deliberately lenient about its id, accepting an act_id, a citation
URL, a bare path, or a Bluebook citation such as 42 U.S.C. 1983.
Resources and prompts
This server is not only tools. An MCP server generated from an OpenAPI document publishes one tool per endpoint and nothing else; these two primitives are where the knowledge that is not in the API lives, and neither costs anything in the per-turn tool budget.
Resources (read, don't call):
Resource | Contents |
| How to use the corpus correctly: identifier rules, what "still good law" actually means here, what an empty change list does and does not tell you, and where the cost is. Not backed by any endpoint. |
| Coverage matrix: every corpusType and its per-jurisdiction counts. Free. |
| The filter vocabulary the India corpus actually holds. Free. |
| Live credit pricing. Free. |
Prompts (workflows, with the traps built in):
Prompt | What it encodes |
|
|
| Check coverage first, so "no such law" and "not in our corpus" are never conflated. |
| Change capture is observation, not effect; an empty result is not "nothing was amended". |
| Batch-resolve rather than looping, then verify the passage's claims against each section. |
| India: map IPC/CrPC to the BNS/BNSS provision in force since 1 July 2024 before answering. |
| India: read the filter vocabulary first, and state the amendment caveat correctly. |
Indian legislation
A separate endpoint on the same host. Central and State Acts plus the instruments of the principal regulators (SEBI, RBI, MCA, IRDAI, TRAI, DGFT): 22,265 enactments and 1,098,577 individually addressable sections.
https://mcp.vaquill.ai/in/mcp with Authorization: Bearer vq_key_your_key_here
https://mcp.vaquill.ai/in/s/vq_key_your_key_here key in the path, as aboveSame API key, same credit balance as the US endpoint.
Tool | Description |
| Search Indian legislation down to the section. |
| Browse and filter enactments by jurisdiction, regulator, year, status. |
| The filter vocabulary the corpus actually holds, with counts. |
| Source links (text, PDF, HTML) for one enactment. |
| Amendment history: what changed, by which Act, effective when. |
| The same generic pair described above, over Indian legislation. |
| Map a repealed criminal code to its 2023 replacement (IPC to BNS, CrPC to BNSS). |
One endpoint serves one jurisdiction, deliberately. The US and India
OpenAPI documents are disjoint, and each app derives its entire tool set from
one of them, so nothing under /mcp or /s/ can expose an Indian tool and
nothing under /in/ can expose a US one. The mount path selects an app; it
does not filter one, so there is no per-request check to get wrong. That also keeps an integrator's context window
to the jurisdiction they actually work in.
Environment Variables
Variable | Required | Default | Description |
| Yes | - | API key ( |
| No |
| API base URL |
| No |
| Request timeout in seconds |
| No |
| stdio server only. |
Hosted server only
The variables below apply to vaquill-mcp-remote (the deployment behind
mcp.vaquill.ai) and are ignored by the stdio server.
OAuth is OFF unless the whole VAQUILL_OAUTH_* group is set, and the server
behaves exactly as it did before OAuth existed. A PARTIAL group raises at
startup rather than serving a half-built discovery document, because Claude
caches discovery globally by URL for about five minutes across all users, so a
wrong one outlives the misconfiguration that produced it.
Variable | Required | Default | Description |
| No |
| Listen address |
| No |
| Listen port |
| With OAuth | - | This server's public URL ( |
| With OAuth | - | Shared secret for resolving an OAuth user to their |
| With OAuth | - |
|
| With OAuth | - |
|
| With OAuth | - |
|
| With OAuth | - |
|
| With OAuth | - | The STATIC client registered upstream. Dynamic client registration stays off; this server is itself the DCR/CIMD facade. |
| With OAuth | - | Secret for that client |
| No |
| Must match the upstream signing key. |
| No |
| Expected |
The only redirect URI registered upstream is https://mcp.vaquill.ai/auth/callback.
Do NOT also register Claude's (https://claude.ai/api/mcp/auth_callback) or Claude
Code's loopback: this server proxies the flow, so the upstream never sees them, and
the ephemeral-port matching RFC 8252 requires is handled here.
Example Usage
Once configured, you can ask your AI assistant things like:
"What does 17 CFR 240.10b-5 say about insider trading?"
"Resolve 42 U.S.C. § 1983 to its section and show the full text"
"Find California statutes on tenant repair obligations"
"Browse the Texas statutory codes, then drill into the Penal Code"
Development
# Clone and install
git clone https://github.com/Vaquill-AI/vaquill-mcp.git
cd vaquill-mcp
uv sync --all-extras
# Run locally
VAQUILL_API_KEY=vq_key_... uv run vaquill-mcpTests
The suite needs no API key and no network access. Every test runs against the
checked-in OpenAPI fixtures in tests/fixtures/, and tests/conftest.py makes
any unmocked HTTP call raise, so a clone plus uv sync is the whole setup.
uv sync --extra dev --extra remote
uv run pytest # 407 tests
uv run pytest -W error::DeprecationWarning # what CI runsCI (.github/workflows/test.yml) runs two jobs, and they are deliberately not
redundant. test runs the suite against the locked environment on Python
3.10-3.13. wheel builds the package, installs it into a fresh venv without
the lockfile, and runs the same suite there. The second reproduces what a
customer gets from uvx vaquill-mcp: a lockfile does not constrain anyone
installing the published wheel, so a dependency shipping a breaking major shows
up in that job and nowhere else.
# Test with FastMCP inspector
uv run fastmcp dev src/vaquill_mcp/server.pyHow It Works
This package is a thin MCP wrapper around the Vaquill Developer API. At startup, it fetches the OpenAPI spec from the live API and auto-generates MCP tools using FastMCP. Tool names are derived automatically from each endpoint's OpenAPI operation id, so new API endpoints show up as clean, ready-to-use tools with no package update; key descriptions are refined for optimal LLM performance.
Because the spec is fetched at startup (not bundled), tools automatically reflect any API changes without a package update.
Credits & Pricing
API calls consume credits. The credit costs in the tables above are current at
the time of writing; the get_pricing tool and each tool's own description
always reflect the live price, so treat those as authoritative if they differ.
1 credit = $0.01 USD
License
MIT
Community
Questions, ideas, or want to contribute? Join the Vaquill community on Discord.
Available Tools
25 toolscreate_watchCreate WatchAInspect
Subscribe to a board so a change to that source notifies you. Delivery is by webhook (HMAC-SHA256 signed) or email, fired when the source's existing refresh finds real changes -- nothing is crawled on your behalf and there is no real-time trigger. channel is immutable once set; to change it, delete and recreate.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Narrow the alert to one citation instead of a whole source. Three mutually exclusive forms. Hierarchy prefix: `{"title": "21", "part": "314"}`, where every level set must match and `title` is required whenever a narrower level is set. Exact section: `{"actId": "CFR_T21_P314_S314_50"}`, validated at create time and the only form EVERY source accepts, including flat ones. Named source: `{"source": "fdic_fil"}`, accepted on `agency_guidance`, `agency_manuals` and `cfr` only. Omit to watch the whole source. | |
| state | No | Board's state, 2-letter and case-insensitive. For a federal board (USC, eCFR, the Federal Register) pass `federal` or omit entirely; the two are equivalent. Must otherwise match the `state` list_boards returned for this corpusType. | |
| channel | No | webhook | |
| corpusType | Yes | Board's corpus_type (e.g. `state`, `state_regulation`, `federal_register`, `agency_guidance`), matched case-insensitively so `USC` / `CFR` work too. Call list_boards for the authoritative list: this is a growing set, not a fixed enum, and not every corpus is a watchable board. | |
| webhookUrl | No | Required when channel is webhook or both. | |
| webhookAuth | No | Optional outbound credential sent on every delivery, so your gateway can authenticate us with the header it already reads. Independent of `webhookSecret`: set neither, either, or both. Only valid on a webhook or both channel watch. | |
| emailAddress | No | Required when channel is email or both. | |
| webhookSecret | No | Optional signing secret, stored encrypted and never returned. Every delivery then carries `X-Vaquill-Signature: sha256=<hex>`, an HMAC-SHA256 of the raw request body bytes keyed with this secret. Verify over the raw body before parsing JSON, constant-time. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the minimal annotations by disclosing important behavior: delivery is HMAC-SHA256 signed, notifications fire only when the existing refresh finds real changes, nothing is crawled, and there is no real-time trigger. It also exposes the immutability constraint on channel and directs the agent to delete and recreate to change it. This is rich, behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: purpose, delivery/trigger behavior, and the immutability caveat. Important constraints are front-loaded and no redundant wording or restatement of the tool name appears.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of 8 parameters and no output schema, the description supplies the most decision-critical context: notification timing, delivery methods, and the channel immutability rule. It does not describe what a successful create returns, such as a watch ID, which would be helpful, but the rich per-parameter schema descriptions compensate for most remaining gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high at 88%, so the schema carries most parameter meaning. The description adds genuinely new parameter-level semantics by stating that channel is immutable once set and that changing it requires delete and recreate, which is not in the schema. This goes beyond the baseline expected from a high-coverage schema, though most other parameter details are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Subscribe to a board so a change to that source notifies you.' It clearly defines the tool as watch creation and distinguishes it from siblings like update_watch, delete_watch, and list_watches by focusing on the notification-subscription action. It also adds key delivery specifics (webhook/email) that make the tool's role concrete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong context for when to use it: when a board needs to be watched and notifications are desired, with explicit clarification that delivery only happens on real changes found during existing refreshes. However, it does not explicitly name alternatives or state when not to use it, such as 'to modify an existing watch, use update_watch instead.' Usage is implied rather than directly contrasted with sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_watchDelete WatchADestructiveInspect
Delete a watch you own. Immediate and permanent, and its delivery history goes with it. To stop notifications without losing the config or history, prefer update_watch with isActive false.
| Name | Required | Description | Default |
|---|---|---|---|
| watch_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint: true), the description discloses the nature of the destruction: deletion is 'immediate and permanent' and 'its delivery history goes with it.' This cascading data-loss warning is precisely the behavioral context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero waste: core action, irreversible consequence, and alternative routing. The most critical fact (permanence/history loss) is front-loaded in the second sentence, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a single-parameter destructive tool: it covers the action, scope, consequences, and the safer alternative, and annotations carry the destructiveness profile. The only gap is unstated failure behavior (e.g., nonexistent or unowned watch_id), which is minor given the strong ownership constraint already expressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate, and it adds a meaningful constraint — the watch must be one the caller owns. However, it never explicitly mentions watch_id or explains where to obtain it, leaving that inference to the agent; it partially compensates but does not fully document the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb-resource pair — 'Delete a watch you own' — and immediately differentiates from update_watch, which merely deactivates. The ownership scope and permanence make this unmistakably distinct from create_watch, test_watch, and list_watches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative (update_watch with isActive false) and states the exact condition for choosing it over deletion: when the user wants to stop notifications without losing the config or history. This is textbook when-to-use/when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchFetchARead-onlyInspect
Fetch the full text of one US law section by the id from a search result, returning {id, title, text, url, metadata}. Also accepts a citation URL, a bare path, or a Bluebook citation such as '42 U.S.C. 1983'. Present for clients that require the standard search/fetch pair; prefer get_us_statute_section_text if available. Charged as a section lookup plus a body read.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering non-mutation, the description adds meaningful behavior: it discloses the billing implication ('charged as a section lookup plus a body read') and the acceptance of citation URLs, bare paths, or Bluebook citations. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: primary function with return shape, alternative accepted inputs, and usage/billing context. The most essential action is front-loaded, and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a single parameter, an output schema, and a readOnly annotation. The description covers the input sources, return type, preferred alternative, and billing impact, leaving no significant operational gap for an agent selecting or invoking the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides no description for the single 'id' parameter (0% coverage), so the description compensates by explaining that the id comes from a search result and may also be a citation URL, bare path, or Bluebook citation. This gives an agent usable meaning for the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a precise verb and resource: 'Fetch the full text of one US law section by the id from a search result.' It also specifies the return shape and lists alternative accepted inputs, making the tool's purpose unmistakable and distinct from siblings like get_us_statute_section_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: it is intended for clients requiring the standard search/fetch pair, and it explicitly prefers get_us_statute_section_text when available. It does not enumerate exclusion conditions for other sibling tools, but it names the main alternative and the rationale for using this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pricingGet PricingARead-onlyInspect
Current API credit pricing: per-endpoint credit costs and the credit-to-currency conversion rate (1 credit = $0.01 USD). Free, and no authentication required. Use to check what a call will cost before making it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation already declares readOnlyHint=true, and the description adds useful behavioral context beyond that: the endpoint is free and requires no authentication. This helps an agent know there are no side effects or auth prerequisites, which is valuable for a simple lookup tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences that front-load the core resource and immediately state the most actionable facts: pricing, conversion rate, free usage, no auth, and when to use it. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only pricing lookup with an output schema available, the description covers everything an agent needs: what the tool returns, cost-free invocation, no auth barrier, and intended use. No important contextual gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the description does not need to document parameter meaning. The baseline of 4 applies, and the description does not introduce any conflicting parameter-related information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as current API credit pricing, including per-endpoint costs and the credit-to-currency conversion rate. It is immediately distinguishable from all sibling tools, which focus on statutes, watches, search, and sections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: 'Use to check what a call will cost before making it.' It also notes the tool is free and requires no authentication. It does not explicitly name alternatives or exclusions, but none are needed for this unique pricing endpoint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_section_changesGet Section ChangesARead-onlyInspect
What our refreshes have observed changing on one section over time: when it was added, amended or removed, newest first. This is our capture history, not the publisher's -- an empty list means we recorded no change, never that the section was never amended. For the publisher's own history, read amendmentHistory on the section.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max changes to return on this page. | |
| order | No | `desc` (default) is newest first, the natural reading order for a history. Use `asc` to replay a section's life forward, or when catching up from a cursor. | desc |
| act_id | Yes | Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable from a citation but the CHAPTER is not, so hand-built ids usually 404. | |
| sinceId | No | Return only changes with an `id` greater than this: the cursor for polling forward into new changes. Ids are a monotonic sequence, so this is exact, immune to clock skew, and cannot drop two changes that share a timestamp. Carry `cursor` forward. | |
| beforeId | No | Return only changes with an `id` less than this: the cursor for walking BACK through history, which is what a newest-first reader needs. Pass the smallest `id` on your last page. | |
| changeKind | No | Filter to these kinds. Repeat the parameter to pass several (`?changeKind=amended&changeKind=removed`). Omit for all three. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals safety, and the description adds valuable behavioral context beyond that: empty results mean no recorded change, not absence of publisher amendments. It also clarifies the data source ('our capture history, not the publisher's'), which is an important interpretative caveat an agent needs to avoid drawing wrong conclusions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. The core behavior and ordering are in the first sentence, and the critical caveat plus alternative are in the second. Every sentence earns its place and information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and all 6 parameters are documented with high coverage, the description needs only to clarify higher-level intent and data interpretation. It does exactly that, including the empty-list caveat and the distinction from publisher history. An agent has everything necessary to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already well-documented in the schema. The description does not add parameter-specific meaning, but the baseline of 3 is appropriate because the schema carries the full semantic load and the description does not need to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool returns: observed changes to one section over time, with kinds (added, amended, removed) and ordering (newest first). It clearly distinguishes this from the publisher's history by explicitly pointing to amendmentHistory, which prevents confusion with sibling tools related to watch changes or publisher metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit alternative: 'For the publisher's own history, read amendmentHistory on the section.' It also clarifies when this tool is appropriate — for our refreshes' capture history — and warns against misinterpreting empty results as proof that the section was never amended. This is strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_section_cited_byGet Section Cited ByARead-onlyInspect
The USC and CFR sections whose text cross-references a given section: the inverse of the crossReferences already returned on a section lookup. Use to find where a definition or requirement is actually invoked, or to gauge how load-bearing a provision is across the code.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum citing sections to return. | |
| act_id | Yes | Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable from a citation but the CHAPTER is not, so hand-built ids usually 404. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile, and the description adds meaningful context about the inverse relationship to crossReferences. However, it does not disclose operational details such as pagination behavior, empty-result handling, or whether both USC and CFR results are always returned together; the schema covers limit, but the description itself adds no behavioral caveats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with the core result front-loaded and the intended use cases following immediately. Every clause earns its place, and there is no redundant restating of the tool name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema, the readOnlyHint annotation, and the existence of an output schema, the description is nearly complete. It explains the inverse relationship and offers clear use cases. A small gap is the lack of any mention of the limit parameter or general response shape, but those are already covered by structured fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline applies. The description text itself adds no parameter-level meaning, but the act_id schema entry provides valuable guidance about not hand-building IDs and explains why doing so usually causes 404s. This is sufficient given the high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description precisely defines the tool as returning USC and CFR sections whose text cross-references a given section, explicitly framing it as the inverse of the crossReferences field on a section lookup. This clearly distinguishes it from related section tools such as get_section_neighbors or get_section_definitions without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides concrete use cases: finding where a definition or requirement is actually invoked, or gauging how load-bearing a provision is across the code. It does not explicitly state when not to use the tool or name alternatives, but the context is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_section_cross_stateGet Section Cross StateARead-onlyInspect
Provisions in OTHER states that address the same subject as a given state statute section, ranked by similarity. State statutes only. Use for fifty-state surveys, multi-jurisdiction compliance, or to check whether a client's home-state rule is typical or an outlier.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum states to return, one provision each. | |
| act_id | Yes | Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable from a citation but the CHAPTER is not, so hand-built ids usually 404. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, so the read-only nature is covered. The description adds valuable behavioral context beyond annotations: results are ranked by similarity, limited to state statutes, and describe cross-state subject matching. This helps an agent understand what to expect from the response.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two purposeful sentences: the first defines the core function and ranking behavior, the second gives real-world use cases. No filler or redundancy, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with a clear output schema, 100% parameter schema coverage, and an explicit statement of scope and ranking behavior, the description is complete. Agents have enough context to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both 'act_id' and 'limit' are described with examples and format details. The tool description does not need to repeat parameter semantics since the schema fully carries that burden. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: returns provisions in OTHER states addressing the same subject as a given state statute section, ranked by similarity. It explicitly scopes to state statutes and distinguishes itself from sibling tools like get_section_neighbors or get_section_cited_by by emphasizing cross-state comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit use cases: fifty-state surveys, multi-jurisdiction compliance, and checking whether a home-state rule is typical or an outlier. It does not explicitly name alternatives or state when not to use the tool, but the use-case guidance clearly signals appropriate invocation contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_section_definitionsGet Section DefinitionsARead-onlyInspect
The term definitions that govern a section, parsed from its chapter's definitions section. Use whenever a provision turns on a term of art ('covered entity', 'security', 'employer') and you need the statute's own definition rather than the ordinary meaning.
| Name | Required | Description | Default |
|---|---|---|---|
| act_id | Yes | Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable from a citation but the CHAPTER is not, so hand-built ids usually 404. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, and the description aligns with that. The description adds behavioral context by explaining that definitions are parsed from the chapter's definitions section, which is useful for interpretation. It does not cover edge cases like missing definitions, but that is not critical for this simple read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: one sentence states the purpose and source, a second provides usage guidance with examples. Every sentence earns its place, with no redundant phrasing or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one documented parameter and an output schema, the description fully covers what the tool does, how the output is derived, and when to invoke it. An agent has enough context to select and call it correctly without additional information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description covers 100% of the single parameter act_id, including format, example, and a warning about hand-building IDs. The tool description itself adds no parameter-level detail, but the schema already does the heavy lifting, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool returns: term definitions that govern a section, parsed from its chapter's definitions section. It distinguishes itself from sibling tools like get_section_changes or get_section_text by focusing on definitions of terms of art, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool: whenever a provision depends on a term of art and the statute's own definition is needed rather than the ordinary meaning. This clear condition, with examples like 'covered entity' and 'security', effectively routes the agent to the correct tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_section_neighborsGet Section NeighborsARead-onlyInspect
The sections immediately before and after a given section within its own chapter or code, in statutory order. Use to read a provision in context, to find a definitions or penalties sibling, or to check whether the operative language continues into the next section.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many sections to return on EACH side. | |
| act_id | Yes | Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable from a citation but the CHAPTER is not, so hand-built ids usually 404. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds useful context about statutory ordering and chapter scope, but does not disclose further behavioral details such as behavior when no neighbors exist or whether the result includes the given section itself. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two focused sentences. The core behavior is front-loaded, and the second sentence gives concrete use cases without fluff. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the read-only annotation, full schema coverage, an output schema, and clear use-case guidance, the description is complete enough for an agent to select and invoke the tool correctly. The act_id assembly warning closes the main correctness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by warning agents not to hand-assemble act_id: 'the title and section are derivable from a citation but the CHAPTER is not, so hand-built ids usually 404.' This is valuable practical guidance that prevents invocation errors.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (get) and resource (sections immediately before and after a given section), and specifies the ordering and scope: 'within its own chapter or code, in statutory order.' This distinguishes it from sibling tools like get_section_changes or get_section_cited_by without needing to inspect schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly identifies when to use this tool: 'to read a provision in context, to find a definitions or penalties sibling, or to check whether the operative language continues into the next section.' It does not explicitly mention when not to use it or name alternatives, but the use cases are concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sections_batchGet Sections BatchARead-onlyInspect
Metadata for up to 50 sections in one call, by a list of act_ids. Same fields as get_us_statute_section. Use instead of looping that tool when you already hold several act_ids, for example every result of one search. Sections that are not found are skipped and not charged.
| Name | Required | Description | Default |
|---|---|---|---|
| actIds | Yes | Section identifiers from a prior search, up to 50 per call. Duplicates are collapsed and order is preserved. DO NOT BUILD THESE FROM A CITATION: the chapter/article segments exist only in the data, so assembled ids miss. To start from a citation, use resolve_statute_citation. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses that missing sections are silently skipped and are not charged, which materially affects how an agent should interpret partial results. The schema description also reveals duplicate collapsing and order preservation, adding important behavior not present in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences carry the core purpose, a cross-reference to the single-section sibling, and the key usage rule, with no filler. The most decision-relevant facts are front-loaded in the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Together with the detailed schema and an existing output schema, the description covers what data is returned, when to choose it, how to identify sections, and what happens when IDs are missing. No significant gap remains for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers actIds with examples, min/max counts, duplicate/order behavior, and a warning against constructing IDs from citations, so the tool description itself adds little parameter meaning. This matches the baseline of 3 for high schema-description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a concrete operation (get metadata for up to 50 sections) and the required resource identifier (act_ids), making the tool's scope immediately clear. It also distinguishes itself from get_us_statute_section by positioning itself as the batch equivalent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this instead of looping get_us_statute_section when several act_ids are already available, and gives a concrete example. The parameter schema further adds an exclusion: do not synthesize IDs from citations, and names resolve_statute_citation as the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_us_statute_sectionGet Us Statute SectionARead-onlyInspect
Metadata for one US statute, regulation or rule section by act_id: citation, title hierarchy, breadcrumb, amendment history, and links to HTML, PDF and XML. Does NOT include the section text -- use get_us_statute_section_text for that. Good for confirming you have the right section before paying for its full body.
| Name | Required | Description | Default |
|---|---|---|---|
| act_id | Yes | Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable from a citation but the CHAPTER is not, so hand-built ids usually 404. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates a safe read operation, and the description adds value by disclosing what is NOT included (section text) and what is included (HTML/PDF/XML links, history). The 'before paying for its full body' note gives useful operational context about cost/effort. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: first states the core output, second clarifies the key exclusion and redirects to the right tool, third summarizes the ideal use case. No filler, front-loaded, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single required parameter, the readOnlyHint annotation, and the presence of an output schema, the description fully covers what the tool does, what it does not do, when to use it, and which sibling to use instead. There is no obvious missing context needed for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already explains act_id with an example and formatting guidance. The tool description itself does not add parameter-level details, but it does not need to because the schema is thorough. The baseline of 3 is appropriate since the schema carries the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states that the tool returns metadata for a single statute/regulation/rule section keyed by act_id, specifying concrete contents like citation, hierarchy, breadcrumb, and amendment history. It explicitly excludes full section text and names a sibling tool that provides it, so it is sharply differentiated from get_us_statute_section_text and other siblings without needing to open schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use guidance: use it to confirm the correct section before retrieving the full body, and explicitly says to use get_us_statute_section_text when section text is needed. This is direct, actionable routing among alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_us_statute_section_textGet Us Statute Section TextARead-onlyInspect
The full text of a US statute, regulation or rule section by act_id. Returns styled HTML (with cross-references and paragraph numbering as officially published) and plain text. Use when you need the actual statutory language to quote, draft against, or analyze rather than just cite.
| Name | Required | Description | Default |
|---|---|---|---|
| asOf | No | Return the section's text as it stood on this date (`YYYY-MM-DD`) instead of today's. Same cost. **This is a reconstruction, not an archive.** The corpus holds one current text per citation; an earlier one is rebuilt from the before-side of the first change we OBSERVED after your date. The `asOf` block on the response says which version you got (`source`), what it rests on (`basisChangeId`), how far back the evidence reaches (`observedFrom`), and whether the answer is bounded by when capture began rather than by the law (`isBounded`). Read `isBounded` before citing the text. A section that did not exist yet returns `available: false` with `asOf.existed: false`, which is a real answer and is charged. A section we know changed but cannot rebuild returns `source: "unavailable"` and IS refunded, because you asked for a historical text and did not get one. | |
| act_id | Yes | Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable from a citation but the CHAPTER is not, so hand-built ids usually 404. | |
| format | No | Which representations to return. A long section carries the same text twice by default, so `plain` or `html` roughly halves the payload. Cost is unchanged: the fetch is the same either way. `content` omits `html` and `plain` entirely and returns only the split fields (`content`, `sourceCredit`, `notes`). Use it when you want the operative text and nothing else: on `17 U.S.C. § 107` that is about 1 KB instead of 30 KB over the wire, for the same price. Only United States Code sections can be split, so for any other corpus `content` returns no text at all -- check `content` for null and fall back to `plain` if you are not sure which corpus you have. | both |
| structured | No | When true, also return `markdown` and a `subsections` tree parsed from the text for pincite addressing. Same cost. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so safety is already covered. The description adds behavioral detail about return representations—styled HTML with cross-references and paragraph numbering, plus plain text—which goes beyond the annotation. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It front-loads the core function, then adds output details and a clear usage directive. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich parameter schema, readOnly annotation, and presence of an output schema, the description is complete enough for an agent to select and invoke the tool correctly. Complex behaviors like asOf reconstruction are documented in the schema, so the main description does not need to repeat them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already thoroughly documents all parameters including asOf, format, and structured. The description only mentions act_id and adds no extra parameter-level meaning beyond what the schema provides, warranting the baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves the full text of a US statute, regulation, or rule section by act_id, and specifies the output formats: styled HTML and plain text. It also differentiates the tool from citation-only or metadata-focused siblings by emphasizing actual statutory language for quoting, drafting, or analysis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit use case: 'Use when you need the actual statutory language to quote, draft against, or analyze rather than just cite.' This provides clear context for when to choose this tool, though it does not enumerate exclusions or name alternative sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_watch_change_diffGet Watch Change DiffARead-onlyInspect
The full text of a changed section BEFORE and AFTER one specific change, as whole documents ready to diff. Only meaningful where hasDiff is true on the change list. A missing side is not an error: hasBefore and hasAfter say which text is present, so render 'diff unavailable' rather than treating null as a failure. Unlike the rest of the law-change tools this one returns section text, so check its cost before looping over a change list.
| Name | Required | Description | Default |
|---|---|---|---|
| watch_id | Yes | ||
| change_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, it discloses important behavior: a missing side is not an error, hasBefore/hasAfter indicate presence, and null should be rendered as 'diff unavailable' rather than treated as failure. It also surfaces cost and output-format differences from siblings. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler. Core behavior is front-loaded, followed by edge-case semantics and a practical cost warning. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately conveys the return shape (before/after documents, hasBefore/hasAfter flags), the hasDiff precondition, and the null-handling behavior. It could be slightly more explicit about the exact response fields and the meaning of watch_id, but it is largely complete for a capable agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% parameter description coverage, and the description does not explicitly define watch_id or change_id. However, 'one specific change' and 'change list' provide meaningful context for change_id, and the parameter names are self-descriptive enough to partially compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns full section text before and after one specific change, ready to diff. It also distinguishes itself from sibling law-change tools by noting it returns section text and only applies where hasDiff is true.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit guidance on when the tool is meaningful (hasDiff true), how to handle missing sides, and a cost warning before looping. However, it does not name specific alternative tools, only implies them with 'Unlike the rest of the law-change tools'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_boardsList BoardsARead-onlyInspect
List every watchable board: a tracked corpus source such as the Federal Register, the CFR, or one state's statutes, with its refresh cadence. A board is identified by corpusType plus state (state is null for federal). Use to discover what can be subscribed to before calling create_watch.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max boards to return. The default covers the whole registry today; check `total` rather than assuming it always will. | |
| state | No | Only boards for this jurisdiction. Pass `federal` for the boards that have no state (USC, eCFR, the Federal Register). Omit for no jurisdiction filter -- which is NOT the same as `federal`. | |
| offset | No | Number of boards to skip, for paging. | |
| corpusType | No | Only boards for this corpus type, matched case-insensitively so the uppercase spelling used by the statutes endpoints (`CFR`) finds the board (`cfr`). An unknown value is an empty page with `total: 0`, not an error. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes this is a safe read operation. The description adds useful behavioral context beyond that: boards are tracked corpus sources, the result includes refresh cadence, and board identity depends on corpusType plus state with state null for federal. This is meaningful semantic context without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences cover the core action, the domain model, and the intended use case with no filler. 'List every watchable board' is front-loaded, and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich parameter schema and readOnly annotation, the description is largely complete for a listing/discovery tool. There is no output schema, so a tiny bit more detail about the returned board shape could help, but the mention of refresh cadence and the connection to create_watch give sufficient context for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter, including state's special 'federal' meaning and corpusType case-insensitivity. The description adds no parameter-level details beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List every watchable board,' then defines what a board is with concrete examples. It also clarifies the identity model (corpusType plus state) and ties the tool to subscription discovery, which separates it from sibling tools like list_watches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use it 'to discover what can be subscribed to before calling create_watch,' giving a clear when-to-use context. It does not explicitly name alternatives or state when not to use it, but the discovery-before-subscription framing provides enough routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_statute_divisionsList Statute DivisionsARead-onlyInspect
Walk the statutory hierarchy: list the child divisions (titles, chapters, parts, or sections) under any level, in statutory order. Use to browse a code structurally when you do not yet know the section number, or to enumerate everything under a chapter.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | State code identifier, e.g. `tx_pe` (browse `/us/statutes/divisions` with `corpusType=STATE&state=<code>` to list them). | |
| part | No | Part identifier to drill into (CFR). | |
| state | No | 2-letter jurisdiction code, required for STATE and REGULATION. Case-insensitive. | |
| chapter | No | Chapter identifier to drill into (USC and state codes). | |
| corpusType | Yes | Corpus to browse: USC, CFR, STATE, or REGULATION. | |
| titleNumber | No | USC/CFR title number to drill into. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile. The description adds useful behavioral context beyond that: it operates at any hierarchy level, returns children in statutory order, and is iterative ('walk'). This is meaningful added transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence states the core operation and ordering; the second gives the use cases. Every phrase earns its place and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the readOnlyHint annotation, the exhaustive schema with 100% coverage, an output schema, and a clear description, nothing an agent needs to call this correctly is missing. The hierarchy-walking behavior and use cases are fully conveyed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline of 3 applies. The description does not add parameter-level meaning, but the schema itself fully documents each parameter with examples and corpus-specific notes, so no compensation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise action ('list the child divisions') and a specific resource (the statutory hierarchy: titles, chapters, parts, or sections). It also distinguishes itself from search-like tools by explicitly framing the purpose as structural browsing rather than known-section lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context: use this to browse a code when you do not yet know the section number, or to enumerate everything under a chapter. It does not explicitly name alternatives or state when not to use it, but the implied usage boundary is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_statutes_coverageList Statutes CoverageARead-onlyInspect
Self-describing coverage matrix: every corpusType we hold and its per-jurisdiction section counts. Use before answering a jurisdiction question to check whether we actually cover that state and that body of law, so you can say so instead of searching a corpus that does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds useful context about the tool representing a coverage matrix rather than performing any mutation. However, it does not describe response shape beyond 'section counts,' which is minor since the tool is read-only and parameterless.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose and then the usage context. Every sentence earns its place with no redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, a read-only annotation, and no output schema, the description sufficiently explains what the tool returns and when to invoke it. The coverage matrix and per-jurisdiction counts are enough for an agent to understand the response conceptually.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema has 100% coverage with an empty properties object, so there are no parameter semantics to explain. The description reinforces that the tool needs no inputs to return the full coverage matrix.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists a coverage matrix with every corpusType and per-jurisdiction section counts. This is a specific verb-resource pairing and distinguishes it from sibling list tools like list_statute_divisions or list_boards.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool before answering a jurisdiction question to verify coverage, and to avoid searching a nonexistent corpus. This gives the agent clear contextual guidance and an implicit alternative action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_watch_changesList Watch ChangesARead-onlyInspect
What a watched source added, amended or removed: section identifier, citation, title and detection time, newest first. Metadata only, never section text. Covers the board's whole captured history, not just since you subscribed. Safe to poll: it writes nothing and cannot suppress or double-fire a delivery. Page with sinceId and the returned cursor.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max changes to return. | |
| order | No | `desc` (default) is newest first, for showing a recent-activity list. Use `asc` when catching up from a cursor: walking forward means a page that hits `limit` leaves the gap at a known end. | desc |
| since | No | Return only changes detected strictly after this ISO-8601 timestamp. Coarser than `sinceId` (a single refresh writes many rows at the same instant), but useful when all you kept was the `detectedAt` from a webhook body. Both may be combined. | |
| sinceId | No | Return only changes with an `id` greater than this. The cursor to build on: ids are a monotonic sequence, so this is exact, immune to clock skew, and cannot drop two changes that share a timestamp. Carry `meta.cursor` forward from your last page. | |
| beforeId | No | Return only changes with an `id` below this: the cursor for walking BACK through history, where `sinceId` walks forward into new ones. Pass the smallest `id` on your last page. | |
| watch_id | Yes | ||
| changeKind | No | Filter to these kinds. Repeat the parameter to pass several (`?changeKind=added&changeKind=amended`). Omit for all three. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral detail beyond the readOnlyHint annotation: it writes nothing, cannot suppress or double-fire a delivery, returns metadata only, never section text, and covers the entire captured history. This gives an agent a solid understanding of side effects and scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, then adds scope, safety, and paging guidance in a logical order. Every sentence earns its place and there is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity with seven parameters and no output schema, the description covers key needed context: what is returned, the metadata-only guarantee, history scope, safety, and cursor-based pagination. It does not detail every parameter, but the rich schema descriptions fill that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 86%, so the schema already documents parameters thoroughly. The description reinforces the paging pattern with sinceId and the returned cursor, but does not add much semantic meaning beyond what the schema provides. This meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists what a watched source added, amended, or removed, with specific fields and ordering. It also distinguishes itself from related watch/section tools by emphasizing metadata only and never section text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong usage context: it is safe to poll, covers the board's whole history rather than just since subscription, and explains paging with sinceId and the returned cursor. It does not explicitly name alternatives or exclusion criteria, but the context is clear enough for an agent to select this tool appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_watch_deliveriesList Watch DeliveriesARead-onlyInspect
Per-attempt delivery log for one watch: status code, error and attempt number, retained 90 days. Webhook watches only -- an email-only watch always returns an empty list, because email sends are not logged per attempt. Use to debug a webhook that is not arriving.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max deliveries to return. | |
| watch_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses retention (90 days), webhook-only logging, and the empty-list behavior for email-only watches. This materially shapes agent expectations about empty results despite the read-only safety signal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences carry purpose, scope, constraints, and usage intent with no filler, and the most important scoping claim is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description covers the essential return content (status code, error, attempt number), retention, and the empty case. It does not specify ordering or any additional response fields, so it is strong but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents limit, and the description adds only implicit meaning for watch_id via 'for one watch.' It does not elaborate on limit or provide richer guidance for either parameter, so with 50% schema coverage the description does only partial compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States it is a per-attempt delivery log for one watch and enumerates its content (status code, error, attempt number), so an agent can distinguish it from list_watches and list_watch_changes. The webhook-only qualification further narrows the resource and behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the intended use: 'debug a webhook that is not arriving,' and tells agents not to expect results for email-only watches. It does not name a specific alternative sibling, so it falls just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_watchesList WatchesARead-onlyInspect
List the board watches you own, with their board, channel, destination, active state and the outcome of the last delivery attempt. Use to find a watchId for the other watch tools.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max watches to return. | |
| offset | No | Number of watches to skip, for paging. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read operation. The description adds meaningful context by enumerating what is returned (board, channel, destination, active state, last delivery outcome) and the ownership scope ('you own'). This exceeds what the annotation alone provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight, purposeful sentences. The first explains the resource and returned fields; the second gives the practical purpose. No filler, no repetition of schema details, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with no output schema, the description covers what the agent needs: the resource, scope, returned fields, and how to use the output. Pagination parameters are documented in the schema, and the annotation covers safety. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both limit and offset fully documented in the input schema. The description does not add parameter-specific guidance, but it does not need to because the schema already explains the pagination semantics clearly. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') with a clear resource ('board watches you own') and enumerates the exact fields returned. It also states the primary purpose of the result ('find a watchId'), which distinguishes it from sibling watch-related tools like list_watch_changes and list_watch_deliveries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool: to find a watchId for the other watch tools. It does not provide explicit negative guidance about when not to use it, but the stated use case is clear enough to avoid obvious confusion with sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_statute_citationResolve Statute CitationARead-onlyInspect
Resolve a Bluebook citation string ('42 U.S.C. 1983', '16 C.F.R. 444.1', 'Cal. Code Regs. tit. 22, 76227') to the exact section, confirmed, with an official source link and the act_id. Use this whenever the user gives you a citation rather than a question -- it is far more reliable than searching for the citation text.
| Name | Required | Description | Default |
|---|---|---|---|
| cite | Yes | A Bluebook citation string, e.g. '42 U.S.C. 1983' or '16 C.F.R. 444.1'. | |
| state | No | Optional 2-letter jurisdiction to resolve WITHIN, e.g. `tx`. Some citation forms are shared: `8 CCR 1206-2` is Colorado and `22 CCR 76227` is California. A constraint, not a hint: a citation naming a different jurisdiction returns `resolved: false` rather than being forced into this one. | |
| corpusType | No | Optional corpus to resolve WITHIN: `STATE`, `REGULATION`, `STATE_RULES`, `CONSTITUTION`, `STATE_CONSTITUTION`. Narrows a citation whose form several corpora share; like `state`, a citation belonging to another corpus resolves to nothing instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that the tool does not mutate anything. The description adds useful behavioral detail by stating the output includes a confirmed exact section, official source link, and act_id. It does not disclose failure behavior like unresolved citations, but the parameter schema and output schema help fill that gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is just two sentences, with the core action and output front-loaded and the usage guidance in a compact second sentence. Every part earns its place, and there is no filler or redundant restating of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the full parameter schema coverage, the readOnlyHint annotation, and the existence of an output schema, the description is sufficiently complete for an agent to select and invoke the tool correctly. Critical semantics like jurisdiction constraints are already covered in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter already has rich examples and explanations, including the 'constraint, not a hint' nuance for state and corpusType. The description itself adds little parametric meaning beyond what the schema provides, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action ('resolve') and a specific resource (Bluebook citation strings), and specifies the outcome: exact section, confirmed, with an official source link and act_id. It distinguishes from search-style tools by saying it is for citations rather than questions, but it does not distinguish itself from the closely named sibling resolve_statute_citations_batch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool whenever the user provides a citation rather than a question, and explains it is more reliable than searching for citation text. This gives clear usage context, though it does not mention exclusions or the batch sibling as an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_statute_citations_batchResolve Statute Citations BatchARead-onlyInspect
Resolve up to 50 Bluebook citations in one call, returning the same confirmed section, official source link and act_id as the single-citation tool. Use when a document or answer cites several provisions: one call is far cheaper in both credits and latency than looping the single-citation tool.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Optional two-letter jurisdiction to resolve every citation WITHIN. Applies to the whole batch: a batch spanning jurisdictions should omit it and let each citation name its own. Same semantics as the single-citation route -- a constraint, not a hint. | |
| citations | Yes | Bluebook citation strings, up to 50 per call. Duplicates are collapsed and order preserved, so `results` lines up with the de-duplicated input. Priced PER CITATION at the single-resolve rate: batching is a round-trip and latency win, not a discount. | |
| corpusType | No | Optional corpus to resolve every citation WITHIN: `STATE`, `REGULATION`, `STATE_RULES`, `CONSTITUTION`, `STATE_CONSTITUTION`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes non-mutating behavior, so the description does not need to restate that. It adds useful context beyond the annotation: the call returns the same confirmed section, official source link, and act_id as the single-citation tool, and it is cheaper in credits and latency. Schema notes about duplicate collapsing further enrich behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. The first sentence states capability and return parity; the second gives the use case and cost rationale. All information is front-loaded and relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to enumerate return fields. It covers the essential operational context: batch size, equivalence to the single tool, and the efficiency trade-off. An agent has enough information to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already explains each parameter, including examples and the meaning of state, citations, and corpusType. The tool description adds no new parameter-level detail, but that is acceptable given the high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Resolve up to 50 Bluebook citations in one call.' It also explicitly names the single-citation sibling and clarifies the batch variant's scope, so an agent can immediately distinguish it from resolve_statute_citation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states exactly when to use the tool: 'Use when a document or answer cites several provisions.' It also explains the benefit over the alternative and names that alternative ('looping the single-citation tool'), giving clear selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearchARead-onlyInspect
Generic corpus search over US primary law, returning {id, title, url} records for citation. Present so this server works in clients that require the standard search/fetch pair. If you can call search_us_statutes, prefer it: it filters by jurisdiction, corpus, date and status, which this cannot. Pair with fetch to read a result.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, so safety is covered. The description adds context beyond the annotation: this tool exists for compatibility with clients requiring the standard search/fetch pair, and it lacks filtering capabilities. This is meaningful behavioral context without contradicting the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The description front-loads the core function, then provides compatibility context, a routing preference, and a pairing instruction. Every sentence contributes actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the existing readOnlyHint annotation, and the presence of an output schema, the description is complete. It covers what the tool searches, what it returns, when to use the alternative, and how to consume results with `fetch`.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter `query` has 0% schema description coverage, and the description does not explicitly define query syntax or expected formatting. However, the description's statement of 'generic corpus search over US primary law' makes the query's purpose clear enough for a single simple string parameter, though it does not fully compensate for the absent schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('search'), an explicit resource ('US primary law'), and the output shape (`{id, title, url}`). It explicitly distinguishes itself from `search_us_statutes`, so an agent can tell them apart without inspecting either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent when to prefer `search_us_statutes` over this tool and why, and instructs pairing with `fetch` to read results. This is clear routing guidance with conditions and an alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_us_statutesSearch Us StatutesARead-onlyInspect
Semantic + keyword search across US primary law: the United States Code (USC), the Code of Federal Regulations (CFR), and all 50 states' statutes, regulations, constitutions and court rules. Use for any 'what does the law say' question. Filter by corpusType and titleNumber. Returns sections with citation, hierarchy and official source links. The returned act_id (e.g. 'USC_T42_C21_S1983') feeds every other statute tool -- do not hand-build one, they usually 404.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Restrict to specific state statutory codes, e.g. `tx_pe` for the Texas Penal Code. Values are the `actId`s from list_statute_divisions. List allowed, across states. The only way to scope below a whole jurisdiction: `state=tx` alone searches all ~15 Texas codes. | |
| part | No | One or more parts within a title, e.g. `240` for 17 C.F.R. Part 240. The CFR counterpart to `chapter`: pass a hit's `parent.part` back. Pair with `titleNumber`; an unpaired part is rejected. | |
| limit | No | Number of results to return per page. | |
| query | Yes | Search query in natural language. | |
| state | No | Jurisdiction. A 2-letter code for one of the 52 supported US jurisdictions (50 states + DC + PR), or `federal` for USC / CFR / Constitution / federal rules. Pass a list to search several at once. Case-insensitive. Omit to search every jurisdiction. | |
| agency | No | Federal Register agency slug, e.g. `environmental-protection-agency`. Pass a list to match any of several. Applies to `FEDERAL_REGISTER` and `EXECUTIVE_ACTION`; other corpora carry no agency, so combining this with them returns nothing. | |
| fields | No | Return only these result fields, e.g. `["title", "excerpt"]`. A result carries 40+ fields, most null on any given row. `actId` and `citation` are always included. Unknown names are rejected 422. Omit for the full object. | |
| offset | No | How many results to skip, for paging. Every page of a query is cut from one ranking, so results never repeat or go missing between pages. The deepest reachable result is `offset` + `limit`; check `hasMore`. | |
| source | No | The named body of law within a `corpusType` that folds several together: `FEDERAL_RULES` into `frcp`/`fre`/`sct`, `CFR` into `far`/`dfars`, `AGENCY_GUIDANCE` into ~34 agency sources. Every result carries its own `source`, so a hit's value can be passed straight back. | |
| yearTo | No | Only sections last amended in or before this year. This filters the LAST amendment, so a section amended in 2025 is excluded by `yearTo=2024` even though it existed in 2024. A currency filter, not point-in-time retrieval. | |
| chapter | No | One or more chapters within a title or code, e.g. `21` for USC Title 42 Chapter 21. Pass a hit's `parent.chapter` back to search its neighbors. Chapter numbers repeat across titles, so pair with `titleNumber` (USC) or `code` (state); an unpaired chapter is rejected. | |
| yearFrom | No | Only sections last amended in or after this year; pair with `yearTo` for a window. Tracks the publisher's own amendment credit, not when we rebuilt the corpus. About a fifth of sections carry no credit and are excluded once either bound is set. | |
| actStatus | No | Positively scope to raw publisher statuses: `repealed` for dead law only, `in_force` for sections affirmatively marked current. The inverse of `excludeRepealed`, and what a compliance diff asking what was LOST needs. Combining a dead status with `excludeRepealed: true` is rejected 422. | |
| matchType | No | `any` (default) is hybrid semantic + keyword ranking, for natural-language questions. `all` requires every query term; `phrase` matches an exact phrase, for a defined term. To pull up one section, pass its citation as the query and it resolves to that section at rank 1. | any |
| corpusType | No | Restrict to one corpus, or several as a list. Federal: `USC`, `CFR`, `CONSTITUTION`, `FEDERAL_RULES`, `FEDERAL_REGISTER`, `EXECUTIVE_ACTION`, `SENTENCING_GUIDELINES`, `US_TAX_TREATY`, `SESSION_LAW` (Statutes at Large, as enacted). Pair with `state`: `STATE`, `REGULATION`, `STATE_RULES`, `STATE_CONSTITUTION`, `STATE_AGENCY_GUIDANCE`. Omit for all. | |
| includeBody | No | Return the full text of every hit inline, on each result's `body`, instead of making you fetch it per section afterwards. **Why it exists.** Search returns a ranking preview, so the documented flow was search then one `/section/{actId}/body` call per hit. Measured 2026-09-02 that is about 2s for the search plus about 3s for each body, so a page of five sections cost six round trips to put real law on screen. This collapses it to one. **Cost**: the 4-credit search PLUS the ordinary 6-credit body price for each row that actually returns text. Ten rows with text is 4 + 60 = 64 credits. A row whose text cannot be resolved comes back with `body: null` and is NOT charged, so read `creditsConsumed` rather than computing it from `limit` -- it is the same price as fetching them yourself, so this buys latency, not a discount. ⚠️ It multiplies with `limit`. `limit: 50` with this set is 304 credits in a single call. Page deliberately. Prefer this over raising `excerptChars`: the excerpt is windowed around the match and can begin mid-section, dropping a leading subsection marker, so it is not safe to quote. `body` is the publisher's text. | |
| publishedTo | No | Only return Federal Register documents published on or before this date. | |
| titleNumber | No | Filter by USC/CFR title number (e.g., 17 for SEC, 42 for civil rights). Only meaningful for `USC`/`CFR`; ignored for state corpora whose titles are alphabetic (e.g. Texas `pe` = Penal Code). | |
| changedSince | No | Only sections we OBSERVED changing on or after this date (`YYYY-MM-DD`). Observed, not effective: the date we saw it, an upper bound on when it took effect. Capture began long after the corpus did and events sweep at 24 months, so empty means no captured change, never that nothing was amended. | |
| documentType | No | Federal Register document stage: `final` (a rule in force), `proposed` (an NPRM), or `presidential` (a Presidential Document, the `EXECUTIVE_ACTION` corpus). Previously visible only as an `actId` prefix (`FR_RULE_` vs `FR_PRORULE_`) with no way to filter. | |
| excerptChars | No | Characters of matching text to include in each result's `excerpt`. The excerpt is a ranking preview; use `/us/statutes/section/{actId}/body` for the full text. Default 500. | |
| publishedFrom | No | Only return Federal Register documents published on or after this date (`YYYY-MM-DD`). This is the PUBLICATION date, which is not the same as `yearFrom`: that filters the version year of a section. | |
| excludeRepealed | No | Drop sections whose own status says they are not operative (repealed, renumbered, transferred, expired, superseded, omitted, and the rest). Removes what we KNOW is dead; it does not promise the remainder is good law. Read `goodLawStatus` per result to tell them apart: `good_law` is checked, `unknown` is unchecked. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering the safety profile, the description adds genuinely useful behavioral context beyond the annotation: the corpus scope searched, the hybrid semantic+keyword behavior, the return shape (citation, hierarchy, official source links), and the downstream consequence that hand-built act_ids 'usually 404.' No contradiction with the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences that front-load scope, then usage, then returns and downstream workflow — every sentence earns its place for a tool with 23 parameters. The one redundant element is 'Filter by corpusType and titleNumber,' which the schema already covers, and the structure is otherwise tight and highly scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists and 100% param coverage, the description need not explain return values or parameter details. It covers scope, invocation trigger, key filters, return shape, and the act_id handoff to sibling tools — the essential selection and invocation context. The only gap is not routing the agent away from this tool when a citation is already in hand (resolve_statute_citation), and not disambiguating from the generic 'search' sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 even with no param info in the description. The description only echoes 'Filter by corpusType and titleNumber,' which is already thoroughly documented in the schema. It adds no new meaning about parameter formats, defaults, or edge cases; the schema carries the entire burden as expected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (search), a precise resource (US primary law: USC, CFR, and all 50 states' statutes, regulations, constitutions and court rules), and the hybrid semantic+keyword mechanism. The closing sentence positions it relative to its siblings — the returned act_id 'feeds every other statute tool' — so an agent can tell this is the statute-search entry point, distinct from resolve_statute_citation, get_us_statute_section, or the generic 'search' sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use trigger: "Use for any 'what does the law say' question," which is clear context for an agent facing 24 siblings. It also gives post-call guidance (pass act_id to other statute tools, never hand-build one). However, it never names a when-not-to-use alternative, such as resolve_statute_citation when a citation is already known, so it stops short of the fully explicit routing that earns a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_watchTest WatchAInspect
Send a synthetic notification to a watch's destination to verify signing, outbound auth and reachability before relying on it. Test deliveries are deliberately not persisted, so they never appear in list_watch_deliveries and never move the watch's last-notified timestamp. Rate limited by a short cooldown.
| Name | Required | Description | Default |
|---|---|---|---|
| watch_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond the annotations: test deliveries are intentionally not persisted, they never appear in list_watch_deliveries, they do not update the watch's last-notified timestamp, and there is a rate-limiting cooldown. This goes well beyond the bare readOnlyHint and destructiveHint values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each carrying distinct information: purpose, persistence behavior, and rate limiting. The main action is front-loaded, and there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool, the description covers purpose, non-persistence, timestamp behavior, and rate limiting. The only notable gap is the lack of any indication about the response format or how success/failure is reported, but the description gives enough context to understand the tool's role and side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only a string-typed watch_id with no description and 0% coverage. The description connects this parameter to 'a watch's destination,' giving minimal semantic context. However, it does not explain the expected ID format, how to obtain a valid watch_id, or any constraints, so it only partially compensates for the missing schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('send a synthetic notification'), the target resource ('a watch's destination'), and the intent ('verify signing, outbound auth and reachability'). It also differentiates from related tools like list_watch_deliveries by explicitly stating test deliveries are not persisted.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'before relying on it' gives clear timing and use-case context. It also clarifies the behavioral contrast with list_watch_deliveries by saying test deliveries never appear there. It lacks explicit exclusions or alternative tool guidance, but for a focused test operation this is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_watchUpdate WatchAInspect
Change a watch's destination, signing secret, outbound auth, or active state. Set isActive false to pause notifications while keeping the watch's config and history. The channel itself cannot be changed.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Replace the alert's narrowing. Three mutually exclusive forms. Hierarchy prefix: `{"title": "21", "part": "314"}`, where every level set must match and `title` is required whenever a narrower level is set. Exact section: `{"actId": "CFR_T21_P314_S314_50"}`, the only form EVERY source accepts. Named source: `{"source": "fdic_fil"}`, on `agency_guidance`, `agency_manuals` and `cfr` only. Omitting the field leaves the current scope unchanged. | |
| isActive | No | Pause (false) or resume (true) the watch. | |
| watch_id | Yes | ||
| webhookUrl | No | New webhook URL. Only valid on a webhook/both channel watch. Re-validated against the SSRF blocklist. Cannot be cleared. | |
| webhookAuth | No | Replace the outbound credential config, sent as a WHOLE object rather than field by field: a scheme without a credential is not a partial edit, it is a broken config. `{"scheme": "none"}` removes auth. Keeping the scheme and omitting `secret` retains the stored credential. | |
| emailAddress | No | New email address. Only valid on an email/both channel watch. Cannot be cleared. | |
| webhookSecret | No | New signing secret, or empty string to stop signing deliveries. Only valid on a webhook/both channel watch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-read-only, non-destructive operation, and the description adds useful behavioral context beyond that: pausing via isActive preserves config and history. It also discloses the channel-immutability constraint. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: the first states the core action, the second explains the pause behavior, and the third states a key limitation. Information is front-loaded and there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool, the description gives a solid overview but omits the scope field, which is a significant modifiable watch property according to the schema. Since there is no output schema and the description is the main selection signal, this omission leaves an identifiable gap, even though the rich param schema partially compensates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (86%), so the schema already carries most parameter meaning. The description adds mild semantic grouping ('destination, signing secret, outbound auth, or active state') but does not clarify parameter behaviors beyond schema. It also silently omits the scope parameter, which the schema documents in detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Change') and a clear resource ('a watch'), and lists the main modifiable aspects: destination, signing secret, outbound auth, and active state. It also adds a useful limitation ('The channel itself cannot be changed'). However, it omits 'scope' as a modifiable field, so the enumeration is not fully exhaustive.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when modifying watch settings and gives a concrete use case: 'Set isActive false to pause notifications while keeping the watch's config and history.' It also states an exclusion ('The channel itself cannot be changed'). However, it never names alternatives like create_watch, delete_watch, or test_watch, nor does it explicitly say when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
24 tool updates
v0.4.0- Changed
create_watch11 fields changed- removed
Input schema / properties / channel / titleRemoved value: -"Channel" - changed
Input schema / properties / corpusType / descriptionPrevious value: -"Board's corpus_type (e.g. `state`, `state_regulation`, `federal_register`, `agency_guidance`). Call GET /boards first for the authoritative, current list -- corpus_type is a growing set as new corpora are added, not a fixed enum."New value: +"Board's corpus_type (e.g. `state`, `state_regulation`, `federal_register`, `agency_guidance`), matched case-insensitively so `USC` / `CFR` work too. Call list_boards for the authoritative list: this is a growing set, not a fixed enum, and not every corpus is a watchable board." - removed
Input schema / properties / corpusType / titleRemoved value: -"Corpustype" - removed
Input schema / properties / emailAddress / titleRemoved value: -"Emailaddress" - added
Input schema / properties / scopeAdded value: +{ + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Narrow the alert to one citation instead of a whole source. Three mutually exclusive forms. Hierarchy prefix: `{\"title\": \"21\", \"part\": \"314\"}`, where every level set must match and `title` is required whenever a narrower level is set. Exact section: `{\"actId\": \"CFR_T21_P314_S314_50\"}`, validated at create time and the only form EVERY source accepts, including flat ones. Named source: `{\"source\": \"fdic_fil\"}`, accepted on `agency_guidance`, `agency_manuals` and `cfr` only. Omit to watch the whole source.", + "examples": [ + { + "part": "314", + "title": "21" + } + ] +} - changed
Input schema / properties / state / descriptionPrevious value: -"Board's state (lowercase 2-letter), or omit for a federal board. Must match the `state` GET /boards returned for this corpusType."New value: +"Board's state, 2-letter and case-insensitive. For a federal board (USC, eCFR, the Federal Register) pass `federal` or omit entirely; the two are equivalent. Must otherwise match the `state` list_boards returned for this corpusType." - removed
Input schema / properties / state / titleRemoved value: -"State" - changed
Input schema / properties / webhookAuth / anyOfPrevious value: -[ - { - "description": "How a delivery should authenticate itself to your endpoint.\n\nSEPARATE FROM `webhookSecret`, and the distinction is the point.\n`webhookSecret` signs the body so you can prove it is intact and ours.\nThis sends a credential so your gateway can reject anything else before\nit reaches your handler. Most integrations want the second, many want\nboth, and the two are set independently.", - "properties": { - "headerName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Header to send the credential on. Required for `header`, and rejected for every other scheme. Cannot be `Authorization` (use `bearer`/`basic`), a transport header, or one of ours.", - "examples": [ - "X-Api-Key" - ], - "title": "Headername" - }, - "scheme": { - "default": "none", - "description": "`bearer` sends `Authorization: Bearer <secret>`. `basic` sends `Authorization: Basic <secret>` with the secret already base64-encoded by you. `header` sends `<headerName>: <secret>`, for gateways that read something like `X-Api-Key`. `none` removes any credential currently stored.", - "enum": [ - "none", - "bearer", - "basic", - "header" - ], - "title": "Scheme", - "type": "string" - }, - "secret": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The credential value. Stored encrypted and never returned. Required when setting a scheme for the first time or changing scheme; on PATCH you may omit it to keep the stored one while changing only `headerName`.", - "title": "Secret" - } - }, - "title": "WebhookAuthRequest", - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "How a delivery should authenticate itself to your endpoint.\n\nSEPARATE FROM `webhookSecret`, and the distinction is the point.\n`webhookSecret` signs the body so you can prove it is intact and ours.\nThis sends a credential so your gateway can reject anything else before\nit reaches your handler. Most integrations want the second, many want\nboth, and the two are set independently.", + "properties": { + "headerName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Header to send the credential on. Required for `header`, and rejected for every other scheme. Cannot be `Authorization` (use `bearer`/`basic`), a transport header, or one of ours.", + "examples": [ + "X-Api-Key" + ] + }, + "scheme": { + "default": "none", + "description": "`bearer` sends `Authorization: Bearer <secret>`. `basic` sends `Authorization: Basic <secret>` with the secret already base64-encoded by you. `header` sends `<headerName>: <secret>`, for gateways that read something like `X-Api-Key`. `none` removes any credential currently stored.", + "enum": [ + "none", + "bearer", + "basic", + "header" + ], + "type": "string" + }, + "secret": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The credential value. Stored encrypted and never returned. Required when setting a scheme for the first time or changing scheme; on PATCH you may omit it to keep the stored one while changing only `headerName`." + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Input schema / properties / webhookSecret / descriptionPrevious value: -"Optional signing secret, stored encrypted and never returned. When set, every delivery carries an `X-Vaquill-Signature: sha256=<hex>` header: HMAC-SHA256 of the raw request body bytes, keyed with this secret. To verify, compute the same HMAC over the raw body you received (before parsing JSON) and compare it, constant-time, to the hex digest after `sha256=`."New value: +"Optional signing secret, stored encrypted and never returned. Every delivery then carries `X-Vaquill-Signature: sha256=<hex>`, an HMAC-SHA256 of the raw request body bytes keyed with this secret. Verify over the raw body before parsing JSON, constant-time." - removed
Input schema / properties / webhookSecret / titleRemoved value: -"Webhooksecret" - removed
Input schema / properties / webhookUrl / titleRemoved value: -"Webhookurl"
- Changed
delete_watch1 field changed- removed
Input schema / properties / watch_id / titleRemoved value: -"Watch Id"
- Added
fetch - Added
get_section_changes - Added
get_section_cited_by - Added
get_section_cross_state - Added
get_section_definitions - Changed
get_section_neighbors3 fields changed- changed
Input schema / properties / act_id / descriptionPrevious value: -"Section identifier. Encodes the citation's hierarchy: `USC_T42_C21_S1983` is Title 42, Chapter 21, Section 1983, the section a lawyer writes as 42 U.S.C. § 1983. Take it from a `/us/statutes/search` result rather than assembling it: the title and section are derivable from a citation, but the CHAPTER is not, so hand-built ids usually 404."New value: +"Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable from a citation but the CHAPTER is not, so hand-built ids usually 404." - removed
Input schema / properties / act_id / titleRemoved value: -"Act Id" - removed
Input schema / properties / limit / titleRemoved value: -"Limit"
- Changed
get_sections_batch2 fields changed- changed
Input schema / properties / actIds / descriptionPrevious value: -"Section identifiers from a prior `/us/statutes/search` response. Up to 50 per call. Duplicates are collapsed, and order is preserved in the response. Each id encodes the citation's hierarchy: `USC_T42_C21_S1983` is Title 42, Chapter 21, Section 1983. The chapter is not derivable from a citation, so take ids from search results rather than assembling them."New value: +"Section identifiers from a prior search, up to 50 per call. Duplicates are collapsed and order is preserved. DO NOT BUILD THESE FROM A CITATION: the chapter/article segments exist only in the data, so assembled ids miss. To start from a citation, use resolve_statute_citation." - removed
Input schema / properties / actIds / titleRemoved value: -"Actids"
- Changed
get_us_statute_section2 fields changed- changed
Input schema / properties / act_id / descriptionPrevious value: -"Section identifier. Encodes the citation's hierarchy: `USC_T42_C21_S1983` is Title 42, Chapter 21, Section 1983, the section a lawyer writes as 42 U.S.C. § 1983. Take it from a `/us/statutes/search` result rather than assembling it: the title and section are derivable from a citation, but the CHAPTER is not, so hand-built ids usually 404."New value: +"Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable from a citation but the CHAPTER is not, so hand-built ids usually 404." - removed
Input schema / properties / act_id / titleRemoved value: -"Act Id"
- Changed
get_us_statute_section_text8 fields changed- changed
Input schema / properties / act_id / descriptionPrevious value: -"Section identifier. Encodes the citation's hierarchy: `USC_T42_C21_S1983` is Title 42, Chapter 21, Section 1983, the section a lawyer writes as 42 U.S.C. § 1983. Take it from a `/us/statutes/search` result rather than assembling it: the title and section are derivable from a citation, but the CHAPTER is not, so hand-built ids usually 404."New value: +"Section identifier, e.g. `USC_T42_C21_S1983` (Title 42, Chapter 21, Section 1983, written 42 U.S.C. 1983). Take it from a search result rather than assembling it: the title and section are derivable from a citation but the CHAPTER is not, so hand-built ids usually 404." - removed
Input schema / properties / act_id / titleRemoved value: -"Act Id" - added
Input schema / properties / asOfAdded value: +{ + "anyOf": [ + { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Return the section's text as it stood on this date (`YYYY-MM-DD`) instead of today's. Same cost.\n\n**This is a reconstruction, not an archive.** The corpus holds one current text per citation; an earlier one is rebuilt from the before-side of the first change we OBSERVED after your date. The `asOf` block on the response says which version you got (`source`), what it rests on (`basisChangeId`), how far back the evidence reaches (`observedFrom`), and whether the answer is bounded by when capture began rather than by the law (`isBounded`). Read `isBounded` before citing the text.\n\nA section that did not exist yet returns `available: false` with `asOf.existed: false`, which is a real answer and is charged. A section we know changed but cannot rebuild returns `source: \"unavailable\"` and IS refunded, because you asked for a historical text and did not get one.", + "examples": [ + "2026-01-15" + ] +} - changed
Input schema / properties / format / descriptionPrevious value: -"Which representations to return. A long section carries the same text twice by default, so `plain` or `html` roughly halves the payload. Cost is unchanged: the fetch is the same either way."New value: +"Which representations to return. A long section carries the same text twice by default, so `plain` or `html` roughly halves the payload. Cost is unchanged: the fetch is the same either way.\n\n`content` omits `html` and `plain` entirely and returns only the split fields (`content`, `sourceCredit`, `notes`). Use it when you want the operative text and nothing else: on `17 U.S.C. § 107` that is about 1 KB instead of 30 KB over the wire, for the same price. Only United States Code sections can be split, so for any other corpus `content` returns no text at all -- check `content` for null and fall back to `plain` if you are not sure which corpus you have." - changed
Input schema / properties / format / enumPrevious value: -[ - "both", - "html", - "plain" -]New value: +[ + "both", + "html", + "plain", + "content" +] - changed
Input schema / properties / format / examplesPrevious value: -[ - "plain" -]New value: +[ + "content" +] - removed
Input schema / properties / format / titleRemoved value: -"Format" - removed
Input schema / properties / structured / titleRemoved value: -"Structured"
- Changed
get_watch_change_diff2 fields changed- removed
Input schema / properties / change_id / titleRemoved value: -"Change Id" - removed
Input schema / properties / watch_id / titleRemoved value: -"Watch Id"
- Changed
list_boards6 fields changed- added
Input schema / properties / corpusTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Only boards for this corpus type, matched case-insensitively so the uppercase spelling used by the statutes endpoints (`CFR`) finds the board (`cfr`). An unknown value is an empty page with `total: 0`, not an error.", + "examples": [ + "state_regulation" + ] +} - changed
Input schema / properties / limit / defaultPrevious value: -200New value: +500 - changed
Input schema / properties / limit / descriptionPrevious value: -"Max boards to return."New value: +"Max boards to return. The default covers the whole registry today; check `total` rather than assuming it always will." - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - added
Input schema / properties / stateAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Only boards for this jurisdiction. Pass `federal` for the boards that have no state (USC, eCFR, the Federal Register). Omit for no jurisdiction filter -- which is NOT the same as `federal`.", + "enum": [ + "federal", + "al", + "ak", + "az", + "ar", + "ca", + "co", + "ct", + "de", + "dc", + "fl", + "ga", + "hi", + "id", + "il", + "in", + "ia", + "ks", + "ky", + "la", + "me", + "md", + "ma", + "mi", + "mn", + "ms", + "mo", + "mt", + "ne", + "nv", + "nh", + "nj", + "nm", + "ny", + "nc", + "nd", + "oh", + "ok", + "or", + "pa", + "pr", + "ri", + "sc", + "sd", + "tn", + "tx", + "ut", + "vt", + "va", + "wa", + "wv", + "wi", + "wy" + ], + "examples": [ + "tx" + ] +}
- Changed
list_statute_divisions6 fields changed- removed
Input schema / properties / chapter / titleRemoved value: -"Chapter" - removed
Input schema / properties / code / titleRemoved value: -"Code" - removed
Input schema / properties / corpusType / titleRemoved value: -"Corpustype" - removed
Input schema / properties / part / titleRemoved value: -"Part" - removed
Input schema / properties / state / titleRemoved value: -"State" - removed
Input schema / properties / titleNumber / titleRemoved value: -"Titlenumber"
- Removed
list_statutes_laws - Changed
list_watch_changes7 fields changed- added
Input schema / properties / beforeIdAdded value: +{ + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "Return only changes with an `id` below this: the cursor for walking BACK through history, where `sinceId` walks forward into new ones. Pass the smallest `id` on your last page." +} - removed
Input schema / properties / changeKind / titleRemoved value: -"Changekind" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / order / titleRemoved value: -"Order" - removed
Input schema / properties / since / titleRemoved value: -"Since" - removed
Input schema / properties / sinceId / titleRemoved value: -"Sinceid" - removed
Input schema / properties / watch_id / titleRemoved value: -"Watch Id"
- Changed
list_watch_deliveries2 fields changed- removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / watch_id / titleRemoved value: -"Watch Id"
- Changed
list_watches2 fields changed- removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / offset / titleRemoved value: -"Offset"
- Changed
resolve_statute_citation3 fields changed- removed
Input schema / properties / cite / titleRemoved value: -"Cite" - added
Input schema / properties / corpusTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Optional corpus to resolve WITHIN: `STATE`, `REGULATION`, `STATE_RULES`, `CONSTITUTION`, `STATE_CONSTITUTION`. Narrows a citation whose form several corpora share; like `state`, a citation belonging to another corpus resolves to nothing instead.", + "examples": [ + "REGULATION" + ] +} - added
Input schema / properties / stateAdded value: +{ + "anyOf": [ + { + "maxLength": 2, + "minLength": 2, + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Optional 2-letter jurisdiction to resolve WITHIN, e.g. `tx`. Some citation forms are shared: `8 CCR 1206-2` is Colorado and `22 CCR 76227` is California. A constraint, not a hint: a citation naming a different jurisdiction returns `resolved: false` rather than being forced into this one.", + "examples": [ + "tx" + ] +}
- Added
resolve_statute_citations_batch - Added
search - Changed
search_us_statutes38 fields changed- added
Input schema / properties / actStatusAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Positively scope to raw publisher statuses: `repealed` for dead law only, `in_force` for sections affirmatively marked current. The inverse of `excludeRepealed`, and what a compliance diff asking what was LOST needs. Combining a dead status with `excludeRepealed: true` is rejected 422.", + "enum": [ + "abolished", + "deleted", + "expired", + "in_force", + "inactive", + "not_funded", + "not_yet_effective", + "omitted", + "proposed", + "recodified", + "recompiled", + "rejected", + "relocated", + "removed", + "renumbered", + "repealed", + "rescinded", + "reserved", + "revoked", + "superseded", + "terminated", + "transferred", + "unconstitutional", + "vacant", + "vetoed", + "withdrawn" + ], + "examples": [ + "repealed" + ] +} - added
Input schema / properties / agencyAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Federal Register agency slug, e.g. `environmental-protection-agency`. Pass a list to match any of several. Applies to `FEDERAL_REGISTER` and `EXECUTIVE_ACTION`; other corpora carry no agency, so combining this with them returns nothing.", + "examples": [ + "environmental-protection-agency" + ] +} - added
Input schema / properties / changedSinceAdded value: +{ + "anyOf": [ + { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Only sections we OBSERVED changing on or after this date (`YYYY-MM-DD`). Observed, not effective: the date we saw it, an upper bound on when it took effect. Capture began long after the corpus did and events sweep at 24 months, so empty means no captured change, never that nothing was amended.", + "examples": [ + "2026-08-01" + ] +} - changed
Input schema / properties / chapter / descriptionPrevious value: -"Scope a search to one or more chapters within a title or code, e.g. `21` for USC Title 42 Chapter 21. This is the search-side of the `parent` object on each result: pass a hit's `parent.chapter` straight back to search that hit's neighbors. Chapter numbers repeat across titles, so pair it with `titleNumber` (USC) or `code` (state); an unpaired chapter is rejected. String or list."New value: +"One or more chapters within a title or code, e.g. `21` for USC Title 42 Chapter 21. Pass a hit's `parent.chapter` back to search its neighbors. Chapter numbers repeat across titles, so pair with `titleNumber` (USC) or `code` (state); an unpaired chapter is rejected." - removed
Input schema / properties / chapter / titleRemoved value: -"Chapter" - changed
Input schema / properties / code / descriptionPrevious value: -"Restrict to specific state statutory codes, e.g. `tx_pe` for the Texas Penal Code. Values are the `actId`s returned by `GET /us/statutes/divisions?corpusType=STATE&state=XX`, so the browse output can be fed straight back in. Pass a list to search several codes, across states if you like (`[\"tx_pe\", \"ca_pen\"]`). This is the only way to scope below a whole jurisdiction: `state=tx` alone searches all ~15 Texas codes at once."New value: +"Restrict to specific state statutory codes, e.g. `tx_pe` for the Texas Penal Code. Values are the `actId`s from list_statute_divisions. List allowed, across states. The only way to scope below a whole jurisdiction: `state=tx` alone searches all ~15 Texas codes." - removed
Input schema / properties / code / titleRemoved value: -"Code" - changed
Input schema / properties / corpusType / anyOfPrevious value: -[ - { - "enum": [ - "USC", - "CFR", - "STATE", - "CONSTITUTION", - "FEDERAL_RULES", - "STATE_CONSTITUTION", - "STATE_RULES", - "EXECUTIVE_ACTION", - "REGULATION", - "FEDERAL_REGISTER", - "AGENCY_GUIDANCE", - "SENTENCING_GUIDELINES", - "US_TAX_TREATY", - "STATE_AGENCY_GUIDANCE" - ], - "type": "string" - }, - { - "items": { - "enum": [ - "USC", - "CFR", - "STATE", - "CONSTITUTION", - "FEDERAL_RULES", - "STATE_CONSTITUTION", - "STATE_RULES", - "EXECUTIVE_ACTION", - "REGULATION", - "FEDERAL_REGISTER", - "AGENCY_GUIDANCE", - "SENTENCING_GUIDELINES", - "US_TAX_TREATY", - "STATE_AGENCY_GUIDANCE" - ], - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "USC", + "CFR", + "STATE", + "CONSTITUTION", + "FEDERAL_RULES", + "STATE_CONSTITUTION", + "STATE_RULES", + "EXECUTIVE_ACTION", + "REGULATION", + "FEDERAL_REGISTER", + "AGENCY_GUIDANCE", + "SENTENCING_GUIDELINES", + "US_TAX_TREATY", + "STATE_AGENCY_GUIDANCE", + "SESSION_LAW" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "USC", + "CFR", + "STATE", + "CONSTITUTION", + "FEDERAL_RULES", + "STATE_CONSTITUTION", + "STATE_RULES", + "EXECUTIVE_ACTION", + "REGULATION", + "FEDERAL_REGISTER", + "AGENCY_GUIDANCE", + "SENTENCING_GUIDELINES", + "US_TAX_TREATY", + "STATE_AGENCY_GUIDANCE", + "SESSION_LAW" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Input schema / properties / corpusType / descriptionPrevious value: -"Restrict to one corpus, or to several by passing a list (`\"corpusType\": [\"USC\", \"CFR\"]`). One of: `USC` (United States Code), `CFR` (Code of Federal Regulations), `STATE` (state statutory codes; call `/us/statutes/coverage` for the list of ingested jurisdictions), `CONSTITUTION` (U.S. Constitution), `FEDERAL_RULES` (FRCP / FRCrP / FRE / FRAP / FRBP), `STATE_CONSTITUTION` (state constitutions; call `/us/statutes/coverage` for the current jurisdiction list), `STATE_RULES` (state court rules; see `/us/statutes/coverage`), `EXECUTIVE_ACTION` (Federal Register Presidential Documents), `REGULATION` (state administrative regulations; pair with `state`), `FEDERAL_REGISTER` (Federal Register agency rules, final and proposed), `AGENCY_GUIDANCE` (agency guidance: SSA rulings, IRS notices, revenue rulings and procedures). Omit to search across all corpora."New value: +"Restrict to one corpus, or several as a list. Federal: `USC`, `CFR`, `CONSTITUTION`, `FEDERAL_RULES`, `FEDERAL_REGISTER`, `EXECUTIVE_ACTION`, `SENTENCING_GUIDELINES`, `US_TAX_TREATY`, `SESSION_LAW` (Statutes at Large, as enacted). Pair with `state`: `STATE`, `REGULATION`, `STATE_RULES`, `STATE_CONSTITUTION`, `STATE_AGENCY_GUIDANCE`. Omit for all." - removed
Input schema / properties / corpusType / titleRemoved value: -"Corpustype" - added
Input schema / properties / documentTypeAdded value: +{ + "anyOf": [ + { + "enum": [ + "final", + "proposed", + "presidential" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Federal Register document stage: `final` (a rule in force), `proposed` (an NPRM), or `presidential` (a Presidential Document, the `EXECUTIVE_ACTION` corpus). Previously visible only as an `actId` prefix (`FR_RULE_` vs `FR_PRORULE_`) with no way to filter.", + "examples": [ + "final" + ] +} - removed
Input schema / properties / excerptChars / titleRemoved value: -"Excerptchars" - added
Input schema / properties / excludeRepealedAdded value: +{ + "default": false, + "description": "Drop sections whose own status says they are not operative (repealed, renumbered, transferred, expired, superseded, omitted, and the rest). Removes what we KNOW is dead; it does not promise the remainder is good law. Read `goodLawStatus` per result to tell them apart: `good_law` is checked, `unknown` is unchecked.", + "examples": [ + true + ], + "type": "boolean" +} - changed
Input schema / properties / fields / descriptionPrevious value: -"Return only these result fields, e.g. `[\"title\", \"excerpt\"]`. A result carries 40+ fields and most are null on any given row, so a full page of 50 ships a lot of nulls. `actId` and `citation` are always included, because a row without them cannot be used or attributed. Unknown names are rejected with 422 so a typo does not silently drop a field you needed. Omit for the full object."New value: +"Return only these result fields, e.g. `[\"title\", \"excerpt\"]`. A result carries 40+ fields, most null on any given row. `actId` and `citation` are always included. Unknown names are rejected 422. Omit for the full object." - changed
Input schema / properties / fields / enumPrevious value: -[ - "actId", - "actStatus", - "amendmentYears", - "amendmentsCount", - "breadcrumb", - "chapter", - "chapterName", - "citation", - "citationShort", - "corpusType", - "crossReferencesCfr", - "crossReferencesUsc", - "currencyNote", - "displayPath", - "docxUrl", - "excerpt", - "externalUrl", - "federalRegisterCitations", - "frCommentsCloseOn", - "frCorrectionOf", - "frCorrections", - "frDocketIds", - "frEffectiveOn", - "frRegulationIdNumbers", - "frRegulationsDotGovUrl", - "frRelatedDocuments", - "frSignificant", - "goodLawStatus", - "govInfoHtmlUrl", - "govInfoPdfUrl", - "granuleId", - "htmlUrl", - "implementingRegulations", - "issueDate", - "lastAmendedYear", - "packageId", - "parent", - "part", - "partName", - "pdfUrl", - "popularName", - "publicLaws", - "relevanceScore", - "renumberedTo", - "sectionNumber", - "sectionTitle", - "source", - "sourceCredit", - "state", - "stateHtmlUrl", - "statutoryAuthority", - "subchapter", - "subchapterName", - "subpart", - "subpartName", - "textUrl", - "title", - "titleName", - "titleNumber", - "transferredTo", - "xmlUrl", - "year" -]New value: +[ + "abstract", + "actId", + "actStatus", + "action", + "adoptingCitations", + "agencies", + "agencySlugs", + "alternateCitations", + "amendmentHistory", + "amendmentNote", + "amendmentYears", + "amendmentsCount", + "articleName", + "articleNumber", + "audience", + "body", + "breadcrumb", + "caseName", + "chapter", + "chapterName", + "citation", + "citationShort", + "committeeNote", + "corpusType", + "crossReferencesCfr", + "crossReferencesUsc", + "currencyNote", + "currencyYear", + "currentThrough", + "datesText", + "displayLabel", + "displayPath", + "documentNumber", + "documentSubtype", + "documentTypeLabel", + "docxUrl", + "edition", + "effectiveDate", + "excerpt", + "expirationDate", + "externalUrl", + "federalRegisterCitations", + "frCommentsCloseOn", + "frCorrectionOf", + "frCorrections", + "frDocketIds", + "frEffectiveOn", + "frEndPage", + "frRegulationIdNumbers", + "frRegulationsDotGovUrl", + "frRelatedDocuments", + "frSignificant", + "frStartPage", + "frVolume", + "goodLawStatus", + "govInfoHtmlUrl", + "govInfoPdfUrl", + "granuleId", + "history", + "htmlUrl", + "implementingRegulations", + "issueDate", + "issuingAgency", + "languageCode", + "lastAmendedDate", + "lastAmendedYear", + "lawImplemented", + "licenseNote", + "originalEnactmentDate", + "packageId", + "parent", + "part", + "partName", + "pdfUrl", + "popularName", + "president", + "priorEffectiveDates", + "program", + "publicLawCites", + "publicLaws", + "publicationDate", + "publisherKey", + "referencedShortTitles", + "relatedCitations", + "releaseDate", + "relevanceScore", + "renumberedTo", + "requesters", + "rescindedOn", + "reviewDate", + "ruleSet", + "ruleSetCode", + "sectionNumber", + "sectionTitle", + "settlementAmount", + "signingDate", + "source", + "sourceCharEnd", + "sourceCharStart", + "sourceCredit", + "sourceNote", + "sourcePageEnd", + "sourcePageStart", + "state", + "stateHtmlUrl", + "statutoryAuthority", + "subchapter", + "subchapterName", + "subject", + "subjectNumber", + "subpart", + "subpartName", + "subtitle", + "subtitleName", + "supersededBy", + "supersedes", + "supersessionActions", + "textUrl", + "title", + "titleName", + "titleNumber", + "topLevelTitle", + "topics", + "transferredTo", + "versionId", + "volume", + "wordCount", + "xmlUrl", + "year" +] - removed
Input schema / properties / fields / titleRemoved value: -"Fields" - added
Input schema / properties / includeBodyAdded value: +{ + "default": false, + "description": "Return the full text of every hit inline, on each result's `body`, instead of making you fetch it per section afterwards.\n\n**Why it exists.** Search returns a ranking preview, so the documented flow was search then one `/section/{actId}/body` call per hit. Measured 2026-09-02 that is about 2s for the search plus about 3s for each body, so a page of five sections cost six round trips to put real law on screen. This collapses it to one.\n\n**Cost**: the 4-credit search PLUS the ordinary 6-credit body price for each row that actually returns text. Ten rows with text is 4 + 60 = 64 credits. A row whose text cannot be resolved comes back with `body: null` and is NOT charged, so read `creditsConsumed` rather than computing it from `limit` -- it is the same price as fetching them yourself, so this buys latency, not a discount.\n\n⚠️ It multiplies with `limit`. `limit: 50` with this set is 304 credits in a single call. Page deliberately.\n\nPrefer this over raising `excerptChars`: the excerpt is windowed around the match and can begin mid-section, dropping a leading subsection marker, so it is not safe to quote. `body` is the publisher's text.", + "examples": [ + true + ], + "type": "boolean" +} - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / matchType / descriptionPrevious value: -"Controls exact vs. semantic matching, so there is no need for a separate keyword-only search mode. `any` (default) is hybrid semantic + keyword ranking and suits natural-language questions. Use `all` for strict keyword matching (every query term must appear in the text) or `phrase` for an exact-phrase match, e.g. a defined term or a statutory phrase, when you want lexical precision. To pull up one specific section, pass its citation as the query (e.g. `42 U.S.C. § 1983`, `Cal. Civ. Code § 1950.5`) and it resolves to that section at rank 1."New value: +"`any` (default) is hybrid semantic + keyword ranking, for natural-language questions. `all` requires every query term; `phrase` matches an exact phrase, for a defined term. To pull up one section, pass its citation as the query and it resolves to that section at rank 1." - added
Input schema / properties / matchType / examplesAdded value: +[ + "phrase" +] - removed
Input schema / properties / matchType / titleRemoved value: -"Matchtype" - changed
Input schema / properties / offset / descriptionPrevious value: -"How many results to skip, for paging. Every page of a given query is cut from one ranking, so results never repeat or go missing between pages, and a later page costs no more than the first. The deepest reachable result is `offset` + `limit`; check `hasMore` to know when there is nothing further."New value: +"How many results to skip, for paging. Every page of a query is cut from one ranking, so results never repeat or go missing between pages. The deepest reachable result is `offset` + `limit`; check `hasMore`." - removed
Input schema / properties / offset / titleRemoved value: -"Offset" - changed
Input schema / properties / part / descriptionPrevious value: -"Scope a search to one or more parts within a title, e.g. `240` for 17 C.F.R. Part 240. The CFR counterpart to `chapter`: pass a hit's `parent.part` straight back to search within that part. Pair it with `titleNumber`; an unpaired part is rejected. String or list."New value: +"One or more parts within a title, e.g. `240` for 17 C.F.R. Part 240. The CFR counterpart to `chapter`: pass a hit's `parent.part` back. Pair with `titleNumber`; an unpaired part is rejected." - removed
Input schema / properties / part / titleRemoved value: -"Part" - added
Input schema / properties / publishedFromAdded value: +{ + "anyOf": [ + { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Only return Federal Register documents published on or after this date (`YYYY-MM-DD`). This is the PUBLICATION date, which is not the same as `yearFrom`: that filters the version year of a section.", + "examples": [ + "2024-01-01" + ] +} - added
Input schema / properties / publishedToAdded value: +{ + "anyOf": [ + { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Only return Federal Register documents published on or before this date.", + "examples": [ + "2024-12-31" + ] +} - removed
Input schema / properties / query / titleRemoved value: -"Query" - changed
Input schema / properties / source / descriptionPrevious value: -"Scope to one or more of the following. The named source within `corpusType`, for corpora that fold several independently filterable bodies of law into one token.\n\n`FEDERAL_RULES` sources: `frcp` (Federal Rules of Civil Procedure), `frcrp` (Federal Rules of Criminal Procedure), `fre` (Federal Rules of Evidence), `frap` (Federal Rules of Appellate Procedure), `frbp` (Federal Rules of Bankruptcy Procedure), `sct` (Rules of the Supreme Court of the United States).\n\n`CFR` sources: `far` (Federal Acquisition Regulation (48 C.F.R. ch. 1)), `dfars` (Defense Federal Acquisition Regulation Supplement (48 C.F.R. ch. 2)) (both are already part of `CFR`; this only splits the existing Title 48 data by chapter, it does not add new sections).\n\n`AGENCY_GUIDANCE` sources: `agency_guidance` (General agency guidance), `administrative_guidance` (Synthesized administrative guidance (e.g. SALT cap, CTC, 401(k) limits)), `ssa_ruling` (Social Security Administration Rulings), `irs_rev_proc` (IRS Revenue Procedures), `irs_notice` (IRS Notices), `irs_rev_rul` (IRS Revenue Rulings), `irs_announcement` (IRS Announcements), `merger_guidelines` (DOJ & FTC Merger Guidelines (2023)), `doj_leniency` (DOJ Antitrust Division Leniency Policy), `copyright_circular` (US Copyright Office Circulars), `doj_justice_manual` (DOJ Justice Manual), `uscis_policy_manual` (USCIS Policy Manual), `mpep` (USPTO Manual of Patent Examining Procedure (MPEP)), `tmep` (USPTO Trademark Manual of Examining Procedure (TMEP)), `cftc_staff_letter` (CFTC Staff Letters (no-action, exemptive, interpretative; 2008-present)), `fincen_ruling` (FinCEN Administrative Rulings), `fincen_guidance` (FinCEN Guidance (alerts, advisories, notices, bulletins, fact sheets)), `frb_sr_letter` (Federal Reserve Supervision and Regulation (SR) / Consumer Affairs (CA) Letters), `occ_bulletin` (OCC Bulletins), `occ_interpretive_letter` (OCC Interpretive Letters), `fdic_fil` (FDIC Financial Institution Letters (FILs)), `dfars_pgi` (DFARS PGI (Procedures, Guidance, and Information)), `nlrb_gc_memo` (NLRB General Counsel Memoranda), `nlrb_advice_memo` (NLRB Division of Advice Memoranda (rolling 10-year window, not the full archive)), `cpsc_advisory_opinion` (CPSC Office of General Counsel Advisory Opinions (historical, 1970s-2012)), `cpsc_secg` (CPSC Small Entity Compliance Guides), `bis_advisory_opinion` (BIS (Bureau of Industry and Security) Advisory Opinions), `ddtc_commodity_jurisdiction` (DDTC (Directorate of Defense Trade Controls) Commodity Jurisdiction Determinations), `ddtc_guidance` (DDTC (Directorate of Defense Trade Controls) Policy Guidance Documents), `hhs_ocr_hipaa_faq` (HHS Office for Civil Rights HIPAA FAQs), `hhs_ocr_hipaa_guidance` (HHS Office for Civil Rights HIPAA Guidance Materials), `hhs_ocr_resolution_agreement` (HHS Office for Civil Rights HIPAA Resolution Agreements and Civil Money Penalties), `fcc_declaratory_ruling` (FCC (Federal Communications Commission) Declaratory Rulings), `ferc_policy_statement` (FERC (Federal Energy Regulatory Commission) Policy Statements), `doe_appliance_guidance` (DOE Appliance Standards Guidance and FAQs). Every result carries its own `source`, so you can pass a hit's value straight back. An unrecognized value is rejected with 422."New value: +"The named body of law within a `corpusType` that folds several together: `FEDERAL_RULES` into `frcp`/`fre`/`sct`, `CFR` into `far`/`dfars`, `AGENCY_GUIDANCE` into ~34 agency sources. Every result carries its own `source`, so a hit's value can be passed straight back." - changed
Input schema / properties / source / enumPrevious value: -[ - "administrative_guidance", - "agency_guidance", - "bis_advisory_opinion", - "cftc_staff_letter", - "copyright_circular", - "cpsc_advisory_opinion", - "cpsc_secg", - "ddtc_commodity_jurisdiction", - "ddtc_guidance", - "dfars", - "dfars_pgi", - "doe_appliance_guidance", - "doj_justice_manual", - "doj_leniency", - "far", - "fcc_declaratory_ruling", - "fdic_fil", - "ferc_policy_statement", - "fincen_guidance", - "fincen_ruling", - "frap", - "frb_sr_letter", - "frbp", - "frcp", - "frcrp", - "fre", - "hhs_ocr_hipaa_faq", - "hhs_ocr_hipaa_guidance", - "hhs_ocr_resolution_agreement", - "irs_announcement", - "irs_notice", - "irs_rev_proc", - "irs_rev_rul", - "merger_guidelines", - "mpep", - "nlrb_advice_memo", - "nlrb_gc_memo", - "occ_bulletin", - "occ_interpretive_letter", - "sct", - "ssa_ruling", - "tmep", - "uscis_policy_manual" -]New value: +[ + "administrative_guidance", + "agency_guidance", + "bis_advisory_opinion", + "cftc_staff_letter", + "copyright_circular", + "cpsc_advisory_opinion", + "cpsc_secg", + "ddtc_commodity_jurisdiction", + "ddtc_guidance", + "dfars", + "dfars_pgi", + "doe_appliance_guidance", + "doj_justice_manual", + "doj_leniency", + "far", + "fcc_declaratory_ruling", + "fdic_fil", + "ferc_policy_statement", + "fincen_guidance", + "fincen_ruling", + "frap", + "frb_sr_letter", + "frbp", + "frcp", + "frcrp", + "fre", + "hhs_ocr_hipaa_faq", + "hhs_ocr_hipaa_guidance", + "hhs_ocr_resolution_agreement", + "irs_announcement", + "irs_notice", + "irs_rev_proc", + "irs_rev_rul", + "merger_guidelines", + "mpep", + "nlrb_advice_memo", + "nlrb_gc_memo", + "occ_bulletin", + "occ_interpretive_letter", + "sct", + "ssa_ruling", + "state_insurance_bulletin", + "tmep", + "us_tax_treaty", + "us_tax_treaty_technical_explanation", + "uscis_policy_manual" +] - removed
Input schema / properties / source / titleRemoved value: -"Source" - changed
Input schema / properties / state / descriptionPrevious value: -"Jurisdiction filter. A 2-letter code for one of the 52 supported US jurisdictions (50 states + DC + PR), or `federal` to scope to USC / CFR / Constitution / federal rules. Pass a LIST to search several at once (`\"state\": [\"ca\", \"ny\", \"tx\"]`), which is one call instead of one per jurisdiction. Case-insensitive: `ca` and `CA` both work. An unrecognized value is rejected with 422 rather than silently matching nothing. Omit to search every jurisdiction."New value: +"Jurisdiction. A 2-letter code for one of the 52 supported US jurisdictions (50 states + DC + PR), or `federal` for USC / CFR / Constitution / federal rules. Pass a list to search several at once. Case-insensitive. Omit to search every jurisdiction." - removed
Input schema / properties / state / titleRemoved value: -"State" - removed
Input schema / properties / titleNumber / titleRemoved value: -"Titlenumber" - changed
Input schema / properties / yearFrom / descriptionPrevious value: -"Only return sections whose version year is >= this. Combine with `yearTo` for a window. Sections with no year are excluded once either bound is set."New value: +"Only sections last amended in or after this year; pair with `yearTo` for a window. Tracks the publisher's own amendment credit, not when we rebuilt the corpus. About a fifth of sections carry no credit and are excluded once either bound is set." - removed
Input schema / properties / yearFrom / titleRemoved value: -"Yearfrom" - changed
Input schema / properties / yearTo / descriptionPrevious value: -"Only return sections whose version year is <= this."New value: +"Only sections last amended in or before this year. This filters the LAST amendment, so a section amended in 2025 is excluded by `yearTo=2024` even though it existed in 2024. A currency filter, not point-in-time retrieval." - removed
Input schema / properties / yearTo / titleRemoved value: -"Yearto"
- Changed
test_watch1 field changed- removed
Input schema / properties / watch_id / titleRemoved value: -"Watch Id"
- Changed
update_watch8 fields changed- removed
Input schema / properties / emailAddress / titleRemoved value: -"Emailaddress" - removed
Input schema / properties / isActive / titleRemoved value: -"Isactive" - added
Input schema / properties / scopeAdded value: +{ + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Replace the alert's narrowing. Three mutually exclusive forms. Hierarchy prefix: `{\"title\": \"21\", \"part\": \"314\"}`, where every level set must match and `title` is required whenever a narrower level is set. Exact section: `{\"actId\": \"CFR_T21_P314_S314_50\"}`, the only form EVERY source accepts. Named source: `{\"source\": \"fdic_fil\"}`, on `agency_guidance`, `agency_manuals` and `cfr` only. Omitting the field leaves the current scope unchanged.", + "examples": [ + { + "part": "314", + "title": "21" + } + ] +} - removed
Input schema / properties / watch_id / titleRemoved value: -"Watch Id" - changed
Input schema / properties / webhookAuth / anyOfPrevious value: -[ - { - "description": "How a delivery should authenticate itself to your endpoint.\n\nSEPARATE FROM `webhookSecret`, and the distinction is the point.\n`webhookSecret` signs the body so you can prove it is intact and ours.\nThis sends a credential so your gateway can reject anything else before\nit reaches your handler. Most integrations want the second, many want\nboth, and the two are set independently.", - "properties": { - "headerName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Header to send the credential on. Required for `header`, and rejected for every other scheme. Cannot be `Authorization` (use `bearer`/`basic`), a transport header, or one of ours.", - "examples": [ - "X-Api-Key" - ], - "title": "Headername" - }, - "scheme": { - "default": "none", - "description": "`bearer` sends `Authorization: Bearer <secret>`. `basic` sends `Authorization: Basic <secret>` with the secret already base64-encoded by you. `header` sends `<headerName>: <secret>`, for gateways that read something like `X-Api-Key`. `none` removes any credential currently stored.", - "enum": [ - "none", - "bearer", - "basic", - "header" - ], - "title": "Scheme", - "type": "string" - }, - "secret": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The credential value. Stored encrypted and never returned. Required when setting a scheme for the first time or changing scheme; on PATCH you may omit it to keep the stored one while changing only `headerName`.", - "title": "Secret" - } - }, - "title": "WebhookAuthRequest", - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "How a delivery should authenticate itself to your endpoint.\n\nSEPARATE FROM `webhookSecret`, and the distinction is the point.\n`webhookSecret` signs the body so you can prove it is intact and ours.\nThis sends a credential so your gateway can reject anything else before\nit reaches your handler. Most integrations want the second, many want\nboth, and the two are set independently.", + "properties": { + "headerName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Header to send the credential on. Required for `header`, and rejected for every other scheme. Cannot be `Authorization` (use `bearer`/`basic`), a transport header, or one of ours.", + "examples": [ + "X-Api-Key" + ] + }, + "scheme": { + "default": "none", + "description": "`bearer` sends `Authorization: Bearer <secret>`. `basic` sends `Authorization: Basic <secret>` with the secret already base64-encoded by you. `header` sends `<headerName>: <secret>`, for gateways that read something like `X-Api-Key`. `none` removes any credential currently stored.", + "enum": [ + "none", + "bearer", + "basic", + "header" + ], + "type": "string" + }, + "secret": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The credential value. Stored encrypted and never returned. Required when setting a scheme for the first time or changing scheme; on PATCH you may omit it to keep the stored one while changing only `headerName`." + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Input schema / properties / webhookAuth / descriptionPrevious value: -"Replace the outbound credential config. Sent as a whole object, not field by field: a scheme without a credential is not a partial edit, it is a broken config. Send `{\"scheme\": \"none\"}` to remove auth entirely. Keeping the same scheme and omitting `secret` retains the stored credential, so you can rename a header without re-entering the token."New value: +"Replace the outbound credential config, sent as a WHOLE object rather than field by field: a scheme without a credential is not a partial edit, it is a broken config. `{\"scheme\": \"none\"}` removes auth. Keeping the scheme and omitting `secret` retains the stored credential." - removed
Input schema / properties / webhookSecret / titleRemoved value: -"Webhooksecret" - removed
Input schema / properties / webhookUrl / titleRemoved value: -"Webhookurl"
24 tool updates
v0.2.0- Added
create_watch - Added
delete_watch - Removed
get_act_text - Removed
get_amendments - Added
get_section_neighbors - Added
get_sections_batch - Changed
get_us_statute_section1 field changed- changed
Input schema / properties / act_id / descriptionPrevious value: -"Section identifier (e.g., 'USC_T42_C21_S1983')."New value: +"Section identifier. Encodes the citation's hierarchy: `USC_T42_C21_S1983` is Title 42, Chapter 21, Section 1983, the section a lawyer writes as 42 U.S.C. § 1983. Take it from a `/us/statutes/search` result rather than assembling it: the title and section are derivable from a citation, but the CHAPTER is not, so hand-built ids usually 404."
- Changed
get_us_statute_section_text3 fields changed- changed
Input schema / properties / act_id / descriptionPrevious value: -"Section identifier."New value: +"Section identifier. Encodes the citation's hierarchy: `USC_T42_C21_S1983` is Title 42, Chapter 21, Section 1983, the section a lawyer writes as 42 U.S.C. § 1983. Take it from a `/us/statutes/search` result rather than assembling it: the title and section are derivable from a citation, but the CHAPTER is not, so hand-built ids usually 404." - added
Input schema / properties / formatAdded value: +{ + "default": "both", + "description": "Which representations to return. A long section carries the same text twice by default, so `plain` or `html` roughly halves the payload. Cost is unchanged: the fetch is the same either way.", + "enum": [ + "both", + "html", + "plain" + ], + "examples": [ + "plain" + ], + "title": "Format", + "type": "string" +} - added
Input schema / properties / structuredAdded value: +{ + "default": false, + "description": "When true, also return `markdown` and a `subsections` tree parsed from the text for pincite addressing. Same cost.", + "examples": [ + true + ], + "title": "Structured", + "type": "boolean" +}
- Added
get_watch_change_diff - Added
list_boards - Removed
list_legislation - Added
list_statute_divisions - Removed
list_statutes_codes_api_v1_statutes_codes_get - Added
list_statutes_coverage - Added
list_statutes_laws - Removed
list_statutes_states_api_v1_statutes_states_get - Added
list_watch_changes - Added
list_watch_deliveries - Added
list_watches - Added
resolve_statute_citation - Removed
search_legislation - Changed
search_us_statutes16 fields changed- added
Input schema / properties / chapterAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Scope a search to one or more chapters within a title or code, e.g. `21` for USC Title 42 Chapter 21. This is the search-side of the `parent` object on each result: pass a hit's `parent.chapter` straight back to search that hit's neighbors. Chapter numbers repeat across titles, so pair it with `titleNumber` (USC) or `code` (state); an unpaired chapter is rejected. String or list.", + "examples": [ + "21" + ], + "title": "Chapter" +} - added
Input schema / properties / codeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Restrict to specific state statutory codes, e.g. `tx_pe` for the Texas Penal Code. Values are the `actId`s returned by `GET /us/statutes/divisions?corpusType=STATE&state=XX`, so the browse output can be fed straight back in. Pass a list to search several codes, across states if you like (`[\"tx_pe\", \"ca_pen\"]`). This is the only way to scope below a whole jurisdiction: `state=tx` alone searches all ~15 Texas codes at once.", + "examples": [ + "tx_pe" + ], + "title": "Code" +} - changed
Input schema / properties / corpusType / anyOfPrevious value: -[ - { - "enum": [ - "USC", - "CFR", - "STATE", - "CONSTITUTION", - "FEDERAL_RULES", - "STATE_CONSTITUTION", - "STATE_RULES", - "EXECUTIVE_ACTION" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "USC", + "CFR", + "STATE", + "CONSTITUTION", + "FEDERAL_RULES", + "STATE_CONSTITUTION", + "STATE_RULES", + "EXECUTIVE_ACTION", + "REGULATION", + "FEDERAL_REGISTER", + "AGENCY_GUIDANCE", + "SENTENCING_GUIDELINES", + "US_TAX_TREATY", + "STATE_AGENCY_GUIDANCE" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "USC", + "CFR", + "STATE", + "CONSTITUTION", + "FEDERAL_RULES", + "STATE_CONSTITUTION", + "STATE_RULES", + "EXECUTIVE_ACTION", + "REGULATION", + "FEDERAL_REGISTER", + "AGENCY_GUIDANCE", + "SENTENCING_GUIDELINES", + "US_TAX_TREATY", + "STATE_AGENCY_GUIDANCE" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Input schema / properties / corpusType / descriptionPrevious value: -"Restrict to one corpus. One of: `USC` (United States Code), `CFR` (Code of Federal Regulations), `STATE` (state statutes — 41 states currently ingested), `CONSTITUTION` (U.S. Constitution), `FEDERAL_RULES` (FRCP / FRCrP / FRE / FRAP / FRBP), `STATE_CONSTITUTION` (state constitutions, currently CA/VA/NC/WI), `STATE_RULES` (state court rules, currently CA), `EXECUTIVE_ACTION` (Federal Register Presidential Documents). Omit to search across all corpora."New value: +"Restrict to one corpus, or to several by passing a list (`\"corpusType\": [\"USC\", \"CFR\"]`). One of: `USC` (United States Code), `CFR` (Code of Federal Regulations), `STATE` (state statutory codes; call `/us/statutes/coverage` for the list of ingested jurisdictions), `CONSTITUTION` (U.S. Constitution), `FEDERAL_RULES` (FRCP / FRCrP / FRE / FRAP / FRBP), `STATE_CONSTITUTION` (state constitutions; call `/us/statutes/coverage` for the current jurisdiction list), `STATE_RULES` (state court rules; see `/us/statutes/coverage`), `EXECUTIVE_ACTION` (Federal Register Presidential Documents), `REGULATION` (state administrative regulations; pair with `state`), `FEDERAL_REGISTER` (Federal Register agency rules, final and proposed), `AGENCY_GUIDANCE` (agency guidance: SSA rulings, IRS notices, revenue rulings and procedures). Omit to search across all corpora." - added
Input schema / properties / excerptCharsAdded value: +{ + "default": 500, + "description": "Characters of matching text to include in each result's `excerpt`. The excerpt is a ranking preview; use `/us/statutes/section/{actId}/body` for the full text. Default 500.", + "maximum": 4000, + "minimum": 100, + "title": "Excerptchars", + "type": "integer" +} - added
Input schema / properties / fieldsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array", + "uniqueItems": true + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Return only these result fields, e.g. `[\"title\", \"excerpt\"]`. A result carries 40+ fields and most are null on any given row, so a full page of 50 ships a lot of nulls. `actId` and `citation` are always included, because a row without them cannot be used or attributed. Unknown names are rejected with 422 so a typo does not silently drop a field you needed. Omit for the full object.", + "enum": [ + "actId", + "actStatus", + "amendmentYears", + "amendmentsCount", + "breadcrumb", + "chapter", + "chapterName", + "citation", + "citationShort", + "corpusType", + "crossReferencesCfr", + "crossReferencesUsc", + "currencyNote", + "displayPath", + "docxUrl", + "excerpt", + "externalUrl", + "federalRegisterCitations", + "frCommentsCloseOn", + "frCorrectionOf", + "frCorrections", + "frDocketIds", + "frEffectiveOn", + "frRegulationIdNumbers", + "frRegulationsDotGovUrl", + "frRelatedDocuments", + "frSignificant", + "goodLawStatus", + "govInfoHtmlUrl", + "govInfoPdfUrl", + "granuleId", + "htmlUrl", + "implementingRegulations", + "issueDate", + "lastAmendedYear", + "packageId", + "parent", + "part", + "partName", + "pdfUrl", + "popularName", + "publicLaws", + "relevanceScore", + "renumberedTo", + "sectionNumber", + "sectionTitle", + "source", + "sourceCredit", + "state", + "stateHtmlUrl", + "statutoryAuthority", + "subchapter", + "subchapterName", + "subpart", + "subpartName", + "textUrl", + "title", + "titleName", + "titleNumber", + "transferredTo", + "xmlUrl", + "year" + ], + "examples": [ + [ + "title", + "excerpt", + "state" + ] + ], + "title": "Fields" +} - changed
Input schema / properties / limit / descriptionPrevious value: -"Number of results to return."New value: +"Number of results to return per page." - added
Input schema / properties / matchTypeAdded value: +{ + "default": "any", + "description": "Controls exact vs. semantic matching, so there is no need for a separate keyword-only search mode. `any` (default) is hybrid semantic + keyword ranking and suits natural-language questions. Use `all` for strict keyword matching (every query term must appear in the text) or `phrase` for an exact-phrase match, e.g. a defined term or a statutory phrase, when you want lexical precision. To pull up one specific section, pass its citation as the query (e.g. `42 U.S.C. § 1983`, `Cal. Civ. Code § 1950.5`) and it resolves to that section at rank 1.", + "enum": [ + "any", + "all", + "phrase" + ], + "title": "Matchtype", + "type": "string" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "How many results to skip, for paging. Every page of a given query is cut from one ranking, so results never repeat or go missing between pages, and a later page costs no more than the first. The deepest reachable result is `offset` + `limit`; check `hasMore` to know when there is nothing further.", + "maximum": 70, + "minimum": 0, + "title": "Offset", + "type": "integer" +} - added
Input schema / properties / partAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Scope a search to one or more parts within a title, e.g. `240` for 17 C.F.R. Part 240. The CFR counterpart to `chapter`: pass a hit's `parent.part` straight back to search within that part. Pair it with `titleNumber`; an unpaired part is rejected. String or list.", + "examples": [ + "240" + ], + "title": "Part" +} - added
Input schema / properties / sourceAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Scope to one or more of the following. The named source within `corpusType`, for corpora that fold several independently filterable bodies of law into one token.\n\n`FEDERAL_RULES` sources: `frcp` (Federal Rules of Civil Procedure), `frcrp` (Federal Rules of Criminal Procedure), `fre` (Federal Rules of Evidence), `frap` (Federal Rules of Appellate Procedure), `frbp` (Federal Rules of Bankruptcy Procedure), `sct` (Rules of the Supreme Court of the United States).\n\n`CFR` sources: `far` (Federal Acquisition Regulation (48 C.F.R. ch. 1)), `dfars` (Defense Federal Acquisition Regulation Supplement (48 C.F.R. ch. 2)) (both are already part of `CFR`; this only splits the existing Title 48 data by chapter, it does not add new sections).\n\n`AGENCY_GUIDANCE` sources: `agency_guidance` (General agency guidance), `administrative_guidance` (Synthesized administrative guidance (e.g. SALT cap, CTC, 401(k) limits)), `ssa_ruling` (Social Security Administration Rulings), `irs_rev_proc` (IRS Revenue Procedures), `irs_notice` (IRS Notices), `irs_rev_rul` (IRS Revenue Rulings), `irs_announcement` (IRS Announcements), `merger_guidelines` (DOJ & FTC Merger Guidelines (2023)), `doj_leniency` (DOJ Antitrust Division Leniency Policy), `copyright_circular` (US Copyright Office Circulars), `doj_justice_manual` (DOJ Justice Manual), `uscis_policy_manual` (USCIS Policy Manual), `mpep` (USPTO Manual of Patent Examining Procedure (MPEP)), `tmep` (USPTO Trademark Manual of Examining Procedure (TMEP)), `cftc_staff_letter` (CFTC Staff Letters (no-action, exemptive, interpretative; 2008-present)), `fincen_ruling` (FinCEN Administrative Rulings), `fincen_guidance` (FinCEN Guidance (alerts, advisories, notices, bulletins, fact sheets)), `frb_sr_letter` (Federal Reserve Supervision and Regulation (SR) / Consumer Affairs (CA) Letters), `occ_bulletin` (OCC Bulletins), `occ_interpretive_letter` (OCC Interpretive Letters), `fdic_fil` (FDIC Financial Institution Letters (FILs)), `dfars_pgi` (DFARS PGI (Procedures, Guidance, and Information)), `nlrb_gc_memo` (NLRB General Counsel Memoranda), `nlrb_advice_memo` (NLRB Division of Advice Memoranda (rolling 10-year window, not the full archive)), `cpsc_advisory_opinion` (CPSC Office of General Counsel Advisory Opinions (historical, 1970s-2012)), `cpsc_secg` (CPSC Small Entity Compliance Guides), `bis_advisory_opinion` (BIS (Bureau of Industry and Security) Advisory Opinions), `ddtc_commodity_jurisdiction` (DDTC (Directorate of Defense Trade Controls) Commodity Jurisdiction Determinations), `ddtc_guidance` (DDTC (Directorate of Defense Trade Controls) Policy Guidance Documents), `hhs_ocr_hipaa_faq` (HHS Office for Civil Rights HIPAA FAQs), `hhs_ocr_hipaa_guidance` (HHS Office for Civil Rights HIPAA Guidance Materials), `hhs_ocr_resolution_agreement` (HHS Office for Civil Rights HIPAA Resolution Agreements and Civil Money Penalties), `fcc_declaratory_ruling` (FCC (Federal Communications Commission) Declaratory Rulings), `ferc_policy_statement` (FERC (Federal Energy Regulatory Commission) Policy Statements), `doe_appliance_guidance` (DOE Appliance Standards Guidance and FAQs). Every result carries its own `source`, so you can pass a hit's value straight back. An unrecognized value is rejected with 422.", + "enum": [ + "administrative_guidance", + "agency_guidance", + "bis_advisory_opinion", + "cftc_staff_letter", + "copyright_circular", + "cpsc_advisory_opinion", + "cpsc_secg", + "ddtc_commodity_jurisdiction", + "ddtc_guidance", + "dfars", + "dfars_pgi", + "doe_appliance_guidance", + "doj_justice_manual", + "doj_leniency", + "far", + "fcc_declaratory_ruling", + "fdic_fil", + "ferc_policy_statement", + "fincen_guidance", + "fincen_ruling", + "frap", + "frb_sr_letter", + "frbp", + "frcp", + "frcrp", + "fre", + "hhs_ocr_hipaa_faq", + "hhs_ocr_hipaa_guidance", + "hhs_ocr_resolution_agreement", + "irs_announcement", + "irs_notice", + "irs_rev_proc", + "irs_rev_rul", + "merger_guidelines", + "mpep", + "nlrb_advice_memo", + "nlrb_gc_memo", + "occ_bulletin", + "occ_interpretive_letter", + "sct", + "ssa_ruling", + "tmep", + "uscis_policy_manual" + ], + "examples": [ + "sct" + ], + "title": "Source" +} - changed
Input schema / properties / state / anyOfPrevious value: -[ - { - "maxLength": 2, - "minLength": 2, - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Input schema / properties / state / descriptionPrevious value: -"2-letter state code (lowercase, e.g. `ca`, `tx`, `ny`) used to filter state corpora. Ignored when `corpusType` is `USC`, `CFR`, `CONSTITUTION`, `FEDERAL_RULES`, or `EXECUTIVE_ACTION`."New value: +"Jurisdiction filter. A 2-letter code for one of the 52 supported US jurisdictions (50 states + DC + PR), or `federal` to scope to USC / CFR / Constitution / federal rules. Pass a LIST to search several at once (`\"state\": [\"ca\", \"ny\", \"tx\"]`), which is one call instead of one per jurisdiction. Case-insensitive: `ca` and `CA` both work. An unrecognized value is rejected with 422 rather than silently matching nothing. Omit to search every jurisdiction." - added
Input schema / properties / state / enumAdded value: +[ + "federal", + "al", + "ak", + "az", + "ar", + "ca", + "co", + "ct", + "de", + "dc", + "fl", + "ga", + "hi", + "id", + "il", + "in", + "ia", + "ks", + "ky", + "la", + "me", + "md", + "ma", + "mi", + "mn", + "ms", + "mo", + "mt", + "ne", + "nv", + "nh", + "nj", + "nm", + "ny", + "nc", + "nd", + "oh", + "ok", + "or", + "pa", + "pr", + "ri", + "sc", + "sd", + "tn", + "tx", + "ut", + "vt", + "va", + "wa", + "wv", + "wi", + "wy" +] - added
Input schema / properties / yearFromAdded value: +{ + "anyOf": [ + { + "maximum": 2100, + "minimum": 1700, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "Only return sections whose version year is >= this. Combine with `yearTo` for a window. Sections with no year are excluded once either bound is set.", + "examples": [ + 2020 + ], + "title": "Yearfrom" +} - added
Input schema / properties / yearToAdded value: +{ + "anyOf": [ + { + "maximum": 2100, + "minimum": 1700, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "Only return sections whose version year is <= this.", + "examples": [ + 2026 + ], + "title": "Yearto" +}
- Added
test_watch - Added
update_watch
10 tool updates
v0.1.0- First observed
get_act_text - First observed
get_amendments - First observed
get_pricing - First observed
get_us_statute_section - First observed
get_us_statute_section_text - First observed
list_legislation - First observed
list_statutes_codes_api_v1_statutes_codes_get - First observed
list_statutes_states_api_v1_statutes_states_get - First observed
search_legislation - First observed
search_us_statutes
TDQS
Scored across 25 tools
Nearly every tool targets a distinct resource and action, and the descriptions make the differences clear. The only real ambiguity is the deliberate generic search/fetch fallbacks alongside search_us_statutes and get_us_statute_section_text, but the descriptions explicitly direct agents to prefer the native tools.
The naming is overwhelmingly consistent: snake_case verb_noun with get, list, create, update, delete, resolve, and test. Minor deviations are the bare fallback names 'search' and 'fetch', plus slight inconsistency between 'get_section_changes' and 'get_watch_change_diff', but these do not undermine the overall pattern.
At 25 tools, the server is at the heavy end of the borderline range. There are useful batch and coverage tools, but several compatibility duplicates and fine-grained section lookup variants could likely be consolidated without losing functionality.
The tool surface is remarkably complete for its domain: citation resolution, search, metadata, full text, batch operations, hierarchy browsing, coverage discovery, cross-references, definitions, change history, and a full watch lifecycle including delivery logs and testing. There are no obvious dead ends or missing operations for the stated purpose.
Maintenance
Related MCP Connectors
CourtListener MCP — Free Law Project's CourtListener API (free, no auth required for basic access)
MCP for CourtListener: US federal and state opinions, dockets, judges, plus eCFR regulations.
An MCP server that provides congressional transcripts
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceAn MCP server that provides comprehensive US legislation.13 npm38MIT
- FlicenseAqualityDmaintenanceMCP server for Legalize.dev, enabling AI to query and understand legal frameworks across countries via a structured legislation API.131-
- AlicenseAqualityAmaintenanceAn MCP server for accessing Turkish legislation (laws, regulations, decrees) via the Adalet Bakanligi API, providing search, full-text retrieval, and structured citations.5Apache 2.0
- AlicenseAqualityAmaintenanceMCP server for free U.S. case-law and court-docket search via CourtListener, providing tools for opinion search, docket lookup, citation verification, and more.103 npm1MIT