Skip to main content
Glama
Vaquill-AI

Vaquill-AI/vaquill-mcp

Official
by Vaquill-AI

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.

Discord

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_here

Claude 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_here

Still 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.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Linux: ~/.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

search_us_statutes

Hybrid semantic + keyword search; filter by corpusType, state, titleNumber, chapter, year, and more.

get_us_statute_section

Section metadata by actId (citation, hierarchy, official-source links).

get_us_statute_section_text

Full HTML + plain text of a section.

get_sections_batch

Metadata for up to 50 sections in one call.

resolve_statute_citation

Resolve a Bluebook citation (e.g. 42 U.S.C. § 1983) straight to its section.

list_statute_divisions

Browse the statutory hierarchy one level at a time.

list_statutes_coverage

Self-describing coverage matrix: which corpora exist in which jurisdiction.

Reading a section in context

Tool

Description

get_section_neighbors

The sections immediately before and after, in statutory order.

get_section_definitions

The defined terms that govern a section, from its chapter's definitions section.

get_section_cited_by

Which USC/CFR sections cross-reference this one (the inverse of crossReferences).

get_section_cross_state

Provisions in other states addressing the same subject, ranked by similarity.

get_section_changes

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

list_boards

The watchable sources (Federal Register, CFR, a state's statutes, ...).

create_watch

Subscribe to a board via webhook (HMAC-SHA256 signed) or email.

list_watches, update_watch, delete_watch

Manage your subscriptions.

test_watch

Send a synthetic delivery to verify signing, auth and reachability.

list_watch_changes

What changed on a watched source. Metadata only, and safe to poll.

get_watch_change_diff

Before/after text for one change, as whole documents.

list_watch_deliveries

Per-attempt webhook delivery log (90 days).

Utility

Tool

Description

get_pricing

Live API credit pricing (free, no auth).

search

Generic one-string corpus search returning {id, title, url}.

fetch

Generic one-string retrieval returning {id, title, text, url, metadata}.

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

vaquill://guide

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.

vaquill://us/coverage

Coverage matrix: every corpusType and its per-jurisdiction counts. Free.

vaquill://in/filters

The filter vocabulary the India corpus actually holds. Free.

vaquill://pricing

Live credit pricing. Free.

Prompts (workflows, with the traps built in):

Prompt

What it encodes

good_law_check(citation)

actStatus vs goodLawStatus vs amendmentHistory, and why unknown means unchecked rather than current.

fifty_state_survey(topic, states)

Check coverage first, so "no such law" and "not in our corpus" are never conflated.

whats_changed(since, corpus, state)

Change capture is observation, not effect; an empty result is not "nothing was amended".

cite_check(text)

Batch-resolve rather than looping, then verify the passage's claims against each section.

old_code_citation(citation)

India: map IPC/CrPC to the BNS/BNSS provision in force since 1 July 2024 before answering.

indian_provision_check(question)

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 above

Same API key, same credit balance as the US endpoint.

Tool

Description

search_acts

Search Indian legislation down to the section.

list_acts

Browse and filter enactments by jurisdiction, regulator, year, status.

list_act_filters

The filter vocabulary the corpus actually holds, with counts.

get_act_text

Source links (text, PDF, HTML) for one enactment.

get_act_amendments

Amendment history: what changed, by which Act, effective when.

search / fetch

The same generic pair described above, over Indian legislation.

get_corresponding_provisions

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

VAQUILL_API_KEY

Yes

-

API key (vq_key_...) from vaquill.ai

VAQUILL_BASE_URL

No

https://api.vaquill.ai

API base URL

VAQUILL_TIMEOUT

No

120

Request timeout in seconds

VAQUILL_JURISDICTION

No

US

stdio server only. US or IN. Selects the OpenAPI document, and therefore the whole tool set. The hosted server ignores it and serves both jurisdictions on separate paths.

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

HOST

No

0.0.0.0

Listen address

PORT

No

8000

Listen port

VAQUILL_PUBLIC_URL

With OAuth

-

This server's public URL (https://mcp.vaquill.ai). Becomes the OAuth issuer and the resource in the protected-resource document, which Claude requires to match the URL the user typed, path included.

VAQUILL_INTERNAL_SECRET

With OAuth

-

Shared secret for resolving an OAuth user to their vq_key_. Must equal MCP_INTERNAL_SECRET on the API. Without it an OAuth caller authenticates and then fails at the first tool call.

VAQUILL_OAUTH_UPSTREAM_JWKS_URI

With OAuth

-

https://<project-ref>.supabase.co/auth/v1/.well-known/jwks.json. Empty keys means the project is still on symmetric HS256 and no token will verify.

VAQUILL_OAUTH_UPSTREAM_ISSUER

With OAuth

-

https://<project-ref>.supabase.co/auth/v1

VAQUILL_OAUTH_AUTHORIZE_URL

With OAuth

-

https://<project-ref>.supabase.co/auth/v1/oauth/authorize

VAQUILL_OAUTH_TOKEN_URL

With OAuth

-

https://<project-ref>.supabase.co/auth/v1/oauth/token

VAQUILL_OAUTH_CLIENT_ID

With OAuth

-

The STATIC client registered upstream. Dynamic client registration stays off; this server is itself the DCR/CIMD facade.

VAQUILL_OAUTH_CLIENT_SECRET

With OAuth

-

Secret for that client

VAQUILL_OAUTH_ALGORITHM

No

ES256

Must match the upstream signing key. RS256 if the project was migrated to RSA.

VAQUILL_OAUTH_AUDIENCE

No

authenticated

Expected aud on upstream tokens

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-mcp

Tests

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 runs

CI (.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.py

How 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 tools
create_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoNarrow 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.
stateNoBoard'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.
channelNowebhook
corpusTypeYesBoard'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.
webhookUrlNoRequired when channel is webhook or both.
webhookAuthNoOptional 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.
emailAddressNoRequired when channel is email or both.
webhookSecretNoOptional 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

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 WatchA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
watch_idYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

fetchFetchA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 PricingA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ChangesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax changes to return on this page.
orderNo`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_idYesSection 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.
sinceIdNoReturn 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.
beforeIdNoReturn 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.
changeKindNoFilter to these kinds. Repeat the parameter to pass several (`?changeKind=amended&changeKind=removed`). Omit for all three.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ByA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum citing sections to return.
act_idYesSection 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 StateA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum states to return, one provision each.
act_idYesSection 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 DefinitionsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
act_idYesSection 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 NeighborsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many sections to return on EACH side.
act_idYesSection 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 BatchA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actIdsYesSection 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 SectionA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
act_idYesSection 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 TextA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
asOfNoReturn 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_idYesSection 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.
formatNoWhich 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
structuredNoWhen true, also return `markdown` and a `subsections` tree parsed from the text for pincite addressing. Same cost.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 DiffA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
watch_idYes
change_idYes

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 BoardsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax boards to return. The default covers the whole registry today; check `total` rather than assuming it always will.
stateNoOnly 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`.
offsetNoNumber of boards to skip, for paging.
corpusTypeNoOnly 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

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 DivisionsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoState code identifier, e.g. `tx_pe` (browse `/us/statutes/divisions` with `corpusType=STATE&state=<code>` to list them).
partNoPart identifier to drill into (CFR).
stateNo2-letter jurisdiction code, required for STATE and REGULATION. Case-insensitive.
chapterNoChapter identifier to drill into (USC and state codes).
corpusTypeYesCorpus to browse: USC, CFR, STATE, or REGULATION.
titleNumberNoUSC/CFR title number to drill into.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 CoverageA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ChangesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax changes to return.
orderNo`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
sinceNoReturn 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.
sinceIdNoReturn 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.
beforeIdNoReturn 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_idYes
changeKindNoFilter to these kinds. Repeat the parameter to pass several (`?changeKind=added&changeKind=amended`). Omit for all three.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 DeliveriesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax deliveries to return.
watch_idYes

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 WatchesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax watches to return.
offsetNoNumber of watches to skip, for paging.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 CitationA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
citeYesA Bluebook citation string, e.g. '42 U.S.C. 1983' or '16 C.F.R. 444.1'.
stateNoOptional 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.
corpusTypeNoOptional 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 BatchA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoOptional 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.
citationsYesBluebook 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.
corpusTypeNoOptional corpus to resolve every citation WITHIN: `STATE`, `REGULATION`, `STATE_RULES`, `CONSTITUTION`, `STATE_CONSTITUTION`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

search_us_statutesSearch Us StatutesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoRestrict 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.
partNoOne 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.
limitNoNumber of results to return per page.
queryYesSearch query in natural language.
stateNoJurisdiction. 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.
agencyNoFederal 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.
fieldsNoReturn 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.
offsetNoHow 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`.
sourceNoThe 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.
yearToNoOnly 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.
chapterNoOne 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.
yearFromNoOnly 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.
actStatusNoPositively 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.
matchTypeNo`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
corpusTypeNoRestrict 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.
includeBodyNoReturn 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.
publishedToNoOnly return Federal Register documents published on or before this date.
titleNumberNoFilter 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).
changedSinceNoOnly 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.
documentTypeNoFederal 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.
excerptCharsNoCharacters 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.
publishedFromNoOnly 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.
excludeRepealedNoDrop 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
watch_idYes

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoReplace 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.
isActiveNoPause (false) or resume (true) the watch.
watch_idYes
webhookUrlNoNew webhook URL. Only valid on a webhook/both channel watch. Re-validated against the SSRF blocklist. Cannot be cleared.
webhookAuthNoReplace 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.
emailAddressNoNew email address. Only valid on an email/both channel watch. Cannot be cleared.
webhookSecretNoNew signing secret, or empty string to stop signing deliveries. Only valid on a webhook/both channel watch.

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 24 tool updatesv0.4.0
    • Changedcreate_watch11 fields changed
      • removedInput schema / properties / channel / title
        Removed value: -"Channel"
      • changedInput schema / properties / corpusType / description
        Previous 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."
      • removedInput schema / properties / corpusType / title
        Removed value: -"Corpustype"
      • removedInput schema / properties / emailAddress / title
        Removed value: -"Emailaddress"
      • addedInput schema / properties / scope
        Added 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"
        +    }
        +  ]
        +}
      • changedInput schema / properties / state / description
        Previous 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."
      • removedInput schema / properties / state / title
        Removed value: -"State"
      • changedInput schema / properties / webhookAuth / anyOf
        Previous 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"
        +  }
        +]
      • changedInput schema / properties / webhookSecret / description
        Previous 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."
      • removedInput schema / properties / webhookSecret / title
        Removed value: -"Webhooksecret"
      • removedInput schema / properties / webhookUrl / title
        Removed value: -"Webhookurl"
    • Changeddelete_watch1 field changed
      • removedInput schema / properties / watch_id / title
        Removed value: -"Watch Id"
    • Addedfetch
    • Addedget_section_changes
    • Addedget_section_cited_by
    • Addedget_section_cross_state
    • Addedget_section_definitions
    • Changedget_section_neighbors3 fields changed
      • changedInput schema / properties / act_id / description
        Previous 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."
      • removedInput schema / properties / act_id / title
        Removed value: -"Act Id"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
    • Changedget_sections_batch2 fields changed
      • changedInput schema / properties / actIds / description
        Previous 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."
      • removedInput schema / properties / actIds / title
        Removed value: -"Actids"
    • Changedget_us_statute_section2 fields changed
      • changedInput schema / properties / act_id / description
        Previous 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."
      • removedInput schema / properties / act_id / title
        Removed value: -"Act Id"
    • Changedget_us_statute_section_text8 fields changed
      • changedInput schema / properties / act_id / description
        Previous 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."
      • removedInput schema / properties / act_id / title
        Removed value: -"Act Id"
      • addedInput schema / properties / asOf
        Added 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"
        +  ]
        +}
      • changedInput schema / properties / format / description
        Previous 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."
      • changedInput schema / properties / format / enum
        Previous value: -[
        -  "both",
        -  "html",
        -  "plain"
        -]New value: +[
        +  "both",
        +  "html",
        +  "plain",
        +  "content"
        +]
      • changedInput schema / properties / format / examples
        Previous value: -[
        -  "plain"
        -]New value: +[
        +  "content"
        +]
      • removedInput schema / properties / format / title
        Removed value: -"Format"
      • removedInput schema / properties / structured / title
        Removed value: -"Structured"
    • Changedget_watch_change_diff2 fields changed
      • removedInput schema / properties / change_id / title
        Removed value: -"Change Id"
      • removedInput schema / properties / watch_id / title
        Removed value: -"Watch Id"
    • Changedlist_boards6 fields changed
      • addedInput schema / properties / corpusType
        Added 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"
        +  ]
        +}
      • changedInput schema / properties / limit / default
        Previous value: -200New value: +500
      • changedInput schema / properties / limit / description
        Previous 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."
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / offset / title
        Removed value: -"Offset"
      • addedInput schema / properties / state
        Added 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"
        +  ]
        +}
    • Changedlist_statute_divisions6 fields changed
      • removedInput schema / properties / chapter / title
        Removed value: -"Chapter"
      • removedInput schema / properties / code / title
        Removed value: -"Code"
      • removedInput schema / properties / corpusType / title
        Removed value: -"Corpustype"
      • removedInput schema / properties / part / title
        Removed value: -"Part"
      • removedInput schema / properties / state / title
        Removed value: -"State"
      • removedInput schema / properties / titleNumber / title
        Removed value: -"Titlenumber"
    • Removedlist_statutes_laws
    • Changedlist_watch_changes7 fields changed
      • addedInput schema / properties / beforeId
        Added 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."
        +}
      • removedInput schema / properties / changeKind / title
        Removed value: -"Changekind"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / order / title
        Removed value: -"Order"
      • removedInput schema / properties / since / title
        Removed value: -"Since"
      • removedInput schema / properties / sinceId / title
        Removed value: -"Sinceid"
      • removedInput schema / properties / watch_id / title
        Removed value: -"Watch Id"
    • Changedlist_watch_deliveries2 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / watch_id / title
        Removed value: -"Watch Id"
    • Changedlist_watches2 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / offset / title
        Removed value: -"Offset"
    • Changedresolve_statute_citation3 fields changed
      • removedInput schema / properties / cite / title
        Removed value: -"Cite"
      • addedInput schema / properties / corpusType
        Added 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"
        +  ]
        +}
      • addedInput schema / properties / state
        Added 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"
        +  ]
        +}
    • Addedresolve_statute_citations_batch
    • Addedsearch
    • Changedsearch_us_statutes38 fields changed
      • addedInput schema / properties / actStatus
        Added 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"
        +  ]
        +}
      • addedInput schema / properties / agency
        Added 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"
        +  ]
        +}
      • addedInput schema / properties / changedSince
        Added 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"
        +  ]
        +}
      • changedInput schema / properties / chapter / description
        Previous 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."
      • removedInput schema / properties / chapter / title
        Removed value: -"Chapter"
      • changedInput schema / properties / code / description
        Previous 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."
      • removedInput schema / properties / code / title
        Removed value: -"Code"
      • changedInput schema / properties / corpusType / anyOf
        Previous 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"
        +  }
        +]
      • changedInput schema / properties / corpusType / description
        Previous 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."
      • removedInput schema / properties / corpusType / title
        Removed value: -"Corpustype"
      • addedInput schema / properties / documentType
        Added 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"
        +  ]
        +}
      • removedInput schema / properties / excerptChars / title
        Removed value: -"Excerptchars"
      • addedInput schema / properties / excludeRepealed
        Added 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"
        +}
      • changedInput schema / properties / fields / description
        Previous 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."
      • changedInput schema / properties / fields / enum
        Previous 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"
        +]
      • removedInput schema / properties / fields / title
        Removed value: -"Fields"
      • addedInput schema / properties / includeBody
        Added 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"
        +}
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • changedInput schema / properties / matchType / description
        Previous 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."
      • addedInput schema / properties / matchType / examples
        Added value: +[
        +  "phrase"
        +]
      • removedInput schema / properties / matchType / title
        Removed value: -"Matchtype"
      • changedInput schema / properties / offset / description
        Previous 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`."
      • removedInput schema / properties / offset / title
        Removed value: -"Offset"
      • changedInput schema / properties / part / description
        Previous 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."
      • removedInput schema / properties / part / title
        Removed value: -"Part"
      • addedInput schema / properties / publishedFrom
        Added 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"
        +  ]
        +}
      • addedInput schema / properties / publishedTo
        Added 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"
        +  ]
        +}
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • changedInput schema / properties / source / description
        Previous 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."
      • changedInput schema / properties / source / enum
        Previous 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"
        +]
      • removedInput schema / properties / source / title
        Removed value: -"Source"
      • changedInput schema / properties / state / description
        Previous 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."
      • removedInput schema / properties / state / title
        Removed value: -"State"
      • removedInput schema / properties / titleNumber / title
        Removed value: -"Titlenumber"
      • changedInput schema / properties / yearFrom / description
        Previous 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."
      • removedInput schema / properties / yearFrom / title
        Removed value: -"Yearfrom"
      • changedInput schema / properties / yearTo / description
        Previous 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."
      • removedInput schema / properties / yearTo / title
        Removed value: -"Yearto"
    • Changedtest_watch1 field changed
      • removedInput schema / properties / watch_id / title
        Removed value: -"Watch Id"
    • Changedupdate_watch8 fields changed
      • removedInput schema / properties / emailAddress / title
        Removed value: -"Emailaddress"
      • removedInput schema / properties / isActive / title
        Removed value: -"Isactive"
      • addedInput schema / properties / scope
        Added 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"
        +    }
        +  ]
        +}
      • removedInput schema / properties / watch_id / title
        Removed value: -"Watch Id"
      • changedInput schema / properties / webhookAuth / anyOf
        Previous 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"
        +  }
        +]
      • changedInput schema / properties / webhookAuth / description
        Previous 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."
      • removedInput schema / properties / webhookSecret / title
        Removed value: -"Webhooksecret"
      • removedInput schema / properties / webhookUrl / title
        Removed value: -"Webhookurl"
  2. 24 tool updatesv0.2.0
    • Addedcreate_watch
    • Addeddelete_watch
    • Removedget_act_text
    • Removedget_amendments
    • Addedget_section_neighbors
    • Addedget_sections_batch
    • Changedget_us_statute_section1 field changed
      • changedInput schema / properties / act_id / description
        Previous 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."
    • Changedget_us_statute_section_text3 fields changed
      • changedInput schema / properties / act_id / description
        Previous 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."
      • addedInput schema / properties / format
        Added 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"
        +}
      • addedInput schema / properties / structured
        Added 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"
        +}
    • Addedget_watch_change_diff
    • Addedlist_boards
    • Removedlist_legislation
    • Addedlist_statute_divisions
    • Removedlist_statutes_codes_api_v1_statutes_codes_get
    • Addedlist_statutes_coverage
    • Addedlist_statutes_laws
    • Removedlist_statutes_states_api_v1_statutes_states_get
    • Addedlist_watch_changes
    • Addedlist_watch_deliveries
    • Addedlist_watches
    • Addedresolve_statute_citation
    • Removedsearch_legislation
    • Changedsearch_us_statutes16 fields changed
      • addedInput schema / properties / chapter
        Added 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"
        +}
      • addedInput schema / properties / code
        Added 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"
        +}
      • changedInput schema / properties / corpusType / anyOf
        Previous 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"
        +  }
        +]
      • changedInput schema / properties / corpusType / description
        Previous 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."
      • addedInput schema / properties / excerptChars
        Added 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"
        +}
      • addedInput schema / properties / fields
        Added 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"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Number of results to return."New value: +"Number of results to return per page."
      • addedInput schema / properties / matchType
        Added 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"
        +}
      • addedInput schema / properties / offset
        Added 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"
        +}
      • addedInput schema / properties / part
        Added 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"
        +}
      • addedInput schema / properties / source
        Added 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"
        +}
      • changedInput schema / properties / state / anyOf
        Previous value: -[
        -  {
        -    "maxLength": 2,
        -    "minLength": 2,
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / state / description
        Previous 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."
      • addedInput schema / properties / state / enum
        Added 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"
        +]
      • addedInput schema / properties / yearFrom
        Added 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"
        +}
      • addedInput schema / properties / yearTo
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maximum": 2100,
        +      "minimum": 1700,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Only return sections whose version year is <= this.",
        +  "examples": [
        +    2026
        +  ],
        +  "title": "Yearto"
        +}
    • Addedtest_watch
    • Addedupdate_watch
  3. 10 tool updatesv0.1.0
    • First observedget_act_text
    • First observedget_amendments
    • First observedget_pricing
    • First observedget_us_statute_section
    • First observedget_us_statute_section_text
    • First observedlist_legislation
    • First observedlist_statutes_codes_api_v1_statutes_codes_get
    • First observedlist_statutes_states_api_v1_statutes_states_get
    • First observedsearch_legislation
    • First observedsearch_us_statutes

TDQS

A4.1/5.0

Scored across 25 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count3/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers