taxcite
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@taxciteCheck my tax memo for fabricated citations."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
TaxCite — verify tax law citations in AI-drafted writing
Catch fabricated citations, misquoted statutes, and invented case law in U.S. federal tax writing — against the official government sources.
Website · Technical overview · Privacy · Citation grammar
TaxCite is a Model Context Protocol (MCP) server and a command-line tool for tax law citation verification. It retrieves the Internal Revenue Code (26 U.S.C.), Treasury Regulations (26 C.F.R.), IRS guidance from the Internal Revenue Bulletin, and federal case law, and it checks the citations and quotations in AI-drafted tax memoranda against those sources.
It exists because large language models are fluent in the register of tax law and unreliable about its content. TaxCite is a hallucination detector for tax citations: it tells you which citations are real, which quotations are verbatim, and — just as importantly — which it could not check.
⚠️ Experimental research software — read this first
TaxCite is an experimental research tool. It is not tax advice, not legal advice, and not a substitute for professional judgment or a commercial citation service.
It verifies that cited provisions exist and that quoted language matches the official source. It does not judge whether a legal conclusion is correct, whether an authority is on point, or whether a decision is still good law.
No warranty. This software is provided "AS IS", without warranty or condition of any kind, express or implied, and without any guarantee of accuracy, completeness, currency, or fitness for a particular purpose. See the Apache License 2.0, sections 7 and 8. You are responsible for independently verifying every authority you rely on. Do not file, serve, or submit work on the strength of this tool alone.
Why
Language models are fluent in the register of tax law and unreliable about its content. They cite § 162(z), which does not exist. They quote § 162(a) and attribute it to § 162(b). They produce sentences that sound exactly like the Code and appear nowhere in it. Those three failures look identical on the page and need completely different fixes, so TaxCite reports them as three different things.
$ taxcite verify draft.md
| # | Citation | Line | Status | Note |
|---|-----------------|-----:|---------------------------------|---------------------------------------------------------|
| 1 | I.R.C. § 162(a) | 15 | ok: verified, quote_exact | I.R.C. § 162(a) exists |
| 2 | I.R.C. § 162(z) | 46 | ERROR: pinpoint_not_found | § 162 has subsections (a)–(s); no (z) |
| 3 | I.R.C. § 263(a) | 49 | ERROR: verified, quote_misattributed | the quoted language appears at I.R.C. § 61(a) |Related MCP server: LegalCite MCP Server
Quickstart
uv sync --all-extras
uv run taxcite build-index # ~10 s, downloads 8 MB from uscode.house.gov
uv run taxcite verify examples/sample_memo.md # see the planted errors caught
uv run taxcite serve # run the MCP serverUse it from an AI client
TaxCite speaks MCP over stdio.
Claude Code
claude mcp add taxcite -- uv --directory /path/to/taxcite run taxcite serveClaude Desktop — add this to claude_desktop_config.json
(~/Library/Application Support/Claude/ on macOS,
%APPDATA%\Claude\ on Windows); a copy is in
examples/claude_desktop_config.json:
{
"mcpServers": {
"taxcite": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/taxcite", "run", "taxcite", "serve"]
}
}
}Cursor and other MCP clients take the same command and arguments.
Build the index once (uv run taxcite build-index) before starting the server;
otherwise every tool answers "Index not built. Run: taxcite build-index".
To check an installation end to end — the process starts, the transport works, the
tools are registered and answer correctly — run
scripts/smoke_test_mcp.py:
uv run python scripts/smoke_test_mcp.pyTools the server exposes
Tool | What it does |
| The official text of a Code provision, at any depth |
| The same, for a Treasury Regulation, fetched on demand |
| Classify a draft's citations under Treas. Reg. § 1.6662-4 |
| How a provision changed between two dates |
| Full-text search across the Code and the regulations |
| Parse a citation and say whether it exists |
| Look up a decision, and check a passage before quoting it |
| Check a whole draft and return a report |
| What a provision cites, and what cites it |
| Where a term is defined, and what scope the definition has |
| A provision's children, for navigating before fetching |
There are also taxcite://irc/{section} and taxcite://reg/{section} resources, and a
grounded_tax_memo prompt that tells a model to read the law before describing it,
quote only what the tools returned, cite with pinpoints, and verify its own draft
before finishing.
Use it in CI
- uses: rakib-nyc/taxcite@v0.1.0
with:
files: "memos/**/*.md"
fail-on: errorFindings appear as inline annotations on the pull request and as a job summary. A full
workflow is in examples/github-workflow.yml.
The command line
taxcite build-index [--irc/--no-irc] [--regs 1,31,301] [--irb 2023-2026]
[--as-of YYYY-MM-DD] [--force]
taxcite info
taxcite versions [--refresh]
taxcite lookup "§ 162(a)" [--children] [--as-of YYYY-MM-DD] [--json]
taxcite search "ordinary and necessary" [--source irc|reg|all] [--as-of YYYY-MM-DD]
taxcite verify FILE... [--format md|json|github] [--offline] [--as-of YYYY-MM-DD]
[--tax-year 2022] [--fail-on error|warning|never]
taxcite authority FILE... [--tax-year 2022] [--json]
taxcite diff "§ 163(j)" --from 2017-06-30 [--to YYYY-MM-DD]
taxcite xrefs "§ 1411" [--direction outgoing|incoming|both]
taxcite closure "§ 163(j)" [--depth 2] [--limit 25]
taxcite define "gross income" [--at "§ 162(a)"]
taxcite serve
taxcite versionverify exits 0 when nothing reaches the --fail-on threshold, 1 when something does,
and 2 on a usage or runtime error.
Two more that pay for themselves
closure answers "what do I have to have read before this sentence means
anything". Tax provisions are a graph; this walks it outward, nearest first.
taxcite closure "§ 163(j)" --depth 1taxcite lookup shows a temporary regulation's sunset. § 7805(e) expires one three
years after issuance, and the issuance date is in the source credit at the foot of the
section — so citing an expired temporary regulation is a real and catchable error.
Regulations issued before § 7805(e) took effect in November 1988 are reported as
outside it rather than as expired.
define --at catches a mistake competent people make: borrowing a definition from
a section that does not govern yours.
$ taxcite define "trade or business" --at "§ 162(a)"
I.R.C. § 7701(a)(26) (scope: this title)
The term "trade or business" includes the performance of the functions of a
public office.
does not govern: I.R.C. § 513(c) defines "trade or business" for purposes of this
section, which does not reach I.R.C. § 162(a)
does not govern: I.R.C. § 163(j)(7)(A) defines "trade or business" for purposes of
this subsection, which does not reach I.R.C. § 162(a)Privacy, and the diligence record
Your document never leaves your machine. Verification is local, against a local
index. The only thing ever derived from your draft that touches the network is the
section number of a Treasury Regulation that has not been downloaded yet — and
--offline prevents even that, by sealing the process so no code path can make a
request for the rest of the run. docs/privacy.md has the details,
including why I.R.C. § 7216 makes this more than a preference.
IRS OPR Alert 2026-19 applies Circular 230 § 10.22 to AI-assisted work: a practitioner
must review every AI-generated document, including its citations, before it goes out.
--record writes that review down for the engagement file:
taxcite verify memo.md --tax-year 2022 --offline --record diligence.jsonlEach entry names what was checked, against which published sources, when, with which version of the tool, and what was found — identifying the document by SHA-256 hash rather than by content, so the record does not become another copy of privileged text. It also states plainly what it does not establish: that the analysis is right.
What a report looks like
See examples/sample_report.md, the real output for
examples/sample_memo.md — a memo with deliberately planted
errors. Every planted error is caught, and none of the valid citations is flagged.
Court decisions
Case citations used to come back unverifiable whether they were real or invented. The Free Law Project's CourtListener publishes a keyless, open API over several million opinions, so now:
| 1 | Welch v. Helvering, 290 U.S. 111 (1933) | ok: verified | Supreme Court of the
United States |
| 2 | Smith v. Jones, 999 U.S. 999 (2020) | ERROR: not_found | no decision is
reported at 999 U.S. 999 |
| 3 | Welch v. Helvering, 480 U.S. 23 (1987) | ERROR: not_found | 480 U.S. 23 is
Commissioner v. Groetzinger, not Welch
v. Helvering |The third row is the interesting one. A real reporter citation carrying the wrong case name is a distinct failure mode — the benchmark literature counts it separately — and it is invisible to anyone who checks only that the citation resolves.
Quotations from a decision
A real case carrying an invented quotation is the failure that actually shows up in AI-drafted work, and it survives any check that only asks whether the citation resolves. The keyless API serves metadata, not opinion text — but it will answer a narrower question: does this run of words occur in this specific decision? That is a real verification, and a binary search over the opening words of a failing quotation finds where it stops matching:
- Quote: "the standard set up by the statute is not a rule of law; it is rather a
way of life."
- Quote status: quote_exact
every word of this passage occurs in the decision, in order; punctuation and
capitalisation were not compared, because the opinion text is not held locally
- Quote: "the standard set up by the statute is not a rule of law; it is rather a
submarine protocol."
- Quote status: quote_close
the first 17 words of this passage occur in the decision; it stops matching at
"submarine protocol."
- Quote: "quarterly submarine inspection protocols govern the deduction of
periscope costs."
- Quote status: quote_not_found
no run of words from this passage occurs in the decisionThree quotations from the same real case, and three different answers: verbatim, misquoted from word 18, and invented. Those call for three different corrections, and telling them apart is the point.
Two limits, both stated in the report rather than left to be discovered. A phrase
search normalises punctuation and capitalisation away, so a passage that differs only
in punctuation passes — the report says so on every such match. And a decision whose
text was never ingested comes back unverifiable, never quote_not_found: not
finding a passage you never looked for is not evidence.
This is the one check that sends text from your document. The Code and the
regulations are held locally, so quotations from them never leave the machine; court
opinions are not published as a bulk download, so checking a quotation against one
means asking CourtListener whether those words occur in that case. --no-case-quotes
declines it without going fully offline, and --offline blocks it along with
everything else. docs/privacy.md sets out exactly what is sent.
With an API token (COURTLISTENER_TOKEN), TaxCite downloads the opinion text
instead. That upgrades quotation checks to real character-level comparisons, and makes
pinpoints checkable — star pagination says which printed page a passage sits on, so a
genuine passage cited to the wrong page is reported as quote_wrong_pinpoint rather
than passing silently. A token is optional and TaxCite never requires one; get one free
from the Free Law Project. It also removes the transmission described above: with the
opinion in hand, every quotation is checked locally.
Tax Court citations
Tax practice cites the Tax Court more than anything else, and all three of its citation forms needed work that only showed up when the live source was actually asked:
Written | Status before | Now |
| not recognised as a citation at all | parsed and verified |
| not recognised as a citation at all | parsed and verified |
| reported as a decision that does not exist | queried under both spellings |
The third was the serious one. CourtListener stores that decision as
2020 T.C. Memo. 12 — year first — so a citation written the way every practitioner
writes it matched nothing and came back not_found. Being told a real case is
fabricated is worse than being told nothing, and it was happening to the single
most-cited category in tax.
One thing is certain without consulting any source at all, and is now checked before
anything else: a decision cannot have been handed down in a year that has not happened.
T.C. Memo. 2099-999 is an error regardless of what any database says, and fabricated
citations carry impossible years often enough to make this worth saying outright.
There is also a limit that cannot be engineered away: Tax Court coverage in the
citation database is genuinely incomplete — many decisions are indexed with no
citation at all. So a Tax Court citation that is not found now reports unverifiable,
not not_found, and points you at the Tax Court's own search. A miss is not evidence.
What TaxCite will not tell you about a case
Whether a decision has been reversed, vacated, or overruled. Every report containing a case says so in terms.
This is not an oversight, and it is not going to be fixed. Treatment signals — Shepard's, KeyCite — are proprietary editorial products, and no free source publishes one. The obvious substitute does not work: searching the opinions that cite Gregory v. Helvering for the word "overruled" returns 119 results, and Gregory has never been overruled. A tool that flagged a leading case as doubtful on that basis would be worse than one that stayed quiet.
What TaxCite reports instead is citation history, which is a fact rather than a judgment: how many later decisions cite this one, and when they last did.
Welch v. Helvering, 290 U.S. 111 (Supreme Court of the United States) —
cited in 1,401 later decisions, most recently 2026-08-20A case cited a thousand times and again last month is alive. One last cited in 1954 deserves a look before you rely on it. Neither is a treatment determination, and TaxCite does not dress it up as one.
Revenue Rulings, and whether they are still alive
Rulings, Procedures and Notices are ordinary working authority in tax, and they used to be the biggest category TaxCite could only shrug at. The Internal Revenue Bulletin is published free by the IRS, so now it doesn't:
taxcite build-index --irb 2023-2026 # ~500 documents, about a minute| 1 | Rev. Proc. 2025-5 | warning: superseded | Rev. Proc. 2026-5 states that it
supersedes this document |
| 2 | Notice 2024-58 | ok: verified | announces the applicable percentage
under § 613A … |
| 3 | Rev. Rul. 2024-99 | ERROR: not_found | not published in the indexed Bulletins |
| 4 | Rev. Rul. 2019-24 | info: unverifiable | 2019 was not indexed |The last two rows are the point. TaxCite reports not_found only for a year it
indexed in full; for a year it did not index it says unverifiable, because it has
not looked. A tool whose silence you can trust has to distinguish "this does not exist"
from "I do not know".
The Bulletin also states when one document supersedes, obsoletes or revokes another, which makes a citator out of free sources. Those relationships are reported as what the later document says — "Rev. Proc. 2026-5 states that it supersedes this" — not as an adjudicated fact.
Does what you cited actually count?
Treas. Reg. § 1.6662-4(d)(3)(iii) sets out a closed list of what counts as authority for the substantial-authority standard — the thing that keeps the § 6662 accuracy-related penalty off a return position. It says in terms that conclusions in treatises, law review articles and practitioners' opinions are not authority.
taxcite authority memo.md**9 authority · 4 not authority**
| Citation | Type | Counts? | Why |
|----------------------------------|---------------------|---------|-----|
| I.R.C. § 162(a) | statute | yes | applicable provisions of the Code |
| Treas. Reg. § 1.263(a)-4(b)(1) | regulation | yes | regulations construing the statute |
| Rev. Rul. 2019-24 | published ruling | yes | revenue rulings and revenue procedures |
| PLR 202301001 | private ruling | yes | private rulings issued after 1976-10-31 |
| Mertens … § 25.01 | commentary | **NO** | treatises are not authority |
| 85 Tax L. Rev. 123 | commentary | **NO** | legal periodicals are not authority |
| I.R.C. § 162A | statute | **NO** | does not exist |
| I.R.C. § 4 | statute | **NO** | repealed |It applies both date cutoffs the regulation imposes — private rulings after 31 October 1976, actions on decisions and general counsel memoranda after 12 March 1981 — and says so when a document's number carries no year and the cutoff therefore cannot be checked, rather than implying it was.
This classifies; it does not weigh. Whether the weight of authority supporting a position is substantial in relation to the weight against it turns on relevance and persuasiveness, and no program should pretend to judge that.
Time travel
Tax work is retrospective: an examination of the 2022 return turns on the law as it stood in 2022, and current law is the wrong answer. The OLRC publishes a release point for every public law, so any past state of the Code is addressable by date.
taxcite versions # what is available, what is indexed
taxcite build-index --as-of 2017-06-30 # ~90 s, ~70 MB, kept separately
taxcite lookup "§ 163(j)" --as-of 2017-06-30 # the pre-TCJA text
taxcite verify memo.md --as-of 2022-12-31 # check a memo against 2022 law
taxcite diff "§ 163(j)" --from 2017-06-30 # what the TCJA actually diddiff is the one to try first:
# I.R.C. § 163(j): 115-35 → 119-110
68 added · 20 changed · 48 removed · 1 renamed
## I.R.C. § 163(j) — renamed
- **Heading:** ~~Limitation on deduction for interest on certain indebtedness~~
→ **Limitation on business interest**The year matters even without a historical index
The commonest substantive citation error in tax writing is not a fabricated section. It is a real section cited for a year it did not govern.
taxcite verify memo.md --tax-year 2017| 1 | I.R.C. § 199A(a) | ERROR: not_yet_effective | § 199A applies to taxable years
beginning after 2017-12-31, so it did not govern tax year 2017 |
| 2 | I.R.C. § 162(a) | ok: verified | note: an amendment applies only to years after
2017-12-31, so the current text may not be the text for 2017 |Those dates are usually not in the section. Congress leaves "applies to taxable years beginning after December 31, 2017" out of the codified text and puts it in an uncodified provision of the public law, which reaches the Code only as an editorial note. TaxCite indexes those notes separately — they are never quotable as statutory text — and reads the dates out of them.
Historical versions are built on demand and stored one file per release point, so the disk cost is visible and you can delete any of them.
Does it help?
Unmeasured, and said plainly rather than implied. Whether grounding a model in these sources actually reduces bad citations is an empirical question, and this release does not answer it. An evaluation harness exists — the same tax questions answered with and without TaxCite's tools, scored by running the verifier over both sets of answers — but its question set has not yet been reviewed by a subject-matter expert, so it is not published and no numbers are claimed.
Treat every capability described here as demonstrated on worked examples, not as a
benchmarked result. The worked examples are real and reproducible: see
examples/, where a memo with deliberately planted errors is checked and
every planted error is caught.
How it works
flowchart LR
subgraph sources["Official sources"]
USC["uscode.house.gov<br/>USLM XML, Title 26"]
ECFR["ecfr.gov API<br/>26 C.F.R."]
end
subgraph build["taxcite build-index"]
PARSE["stream-parse<br/>lxml iterparse"]
POST["cross-references<br/>defined terms"]
end
DB[("SQLite + FTS5<br/>~/.taxcite/taxcite.db")]
subgraph verify["taxcite verify"]
CITE["extract citations"]
RES["resolve: does it exist?"]
QUOTE["match quotations"]
REP["report: md / json / github"]
end
IFACE["CLI · MCP server · Python API"]
USC --> PARSE --> DB
ECFR --> DB
PARSE --> POST --> DB
CITE --> RES --> QUOTE --> REP
DB --> RES
DB --> QUOTE
DB --> IFACE
REP --> IFACEIndex. The current release point is scraped from the OLRC download page, Title 26 is streamed into SQLite, and two post-passes derive the cross-reference graph and the defined terms. About ten seconds, about 70 MB.
Extract. Citations are pulled out of the prose with a grammar that covers every form in
docs/citation-grammar.md— including§§lists and ranges — while masking code spans and URLs and ignoring "Section 3 of the Agreement".Resolve. Each citation is looked up by its canonical USLM identifier. A miss produces a suggestion: the nearest sections, or the subdivisions the section really has.
Quote. Quoted language is normalised and matched against the cited provision, then the rest of its section, then the whole corpus, so a misquotation, a misplaced pinpoint, a misattribution, and an invention are told apart.
More detail, including where the live sources differ from the spec, is in
docs/architecture.md.
Limitations
Existence and accuracy, not correctness. TaxCite will happily confirm that a provision exists and is quoted correctly inside an argument that is completely wrong. It has no view on whether an authority supports the proposition it is cited for.
No treatment check on cases. Whether a decision was reversed, vacated, or overruled is not checked and cannot be, from a free source. Every report says so.
Case quotations are matched on words, not characters, unless you supply a CourtListener API token. Without one, a passage differing only in punctuation passes.
Tax Court coverage is incomplete at the source, so a Tax Court citation that is not found is reported
unverifiable, not as an error. A miss is not evidence.No state or local tax, no foreign law, no proposed regulations. A
Prop. Treas. Reg.citation resolves against the final regulations, and says so.Statutory notes are not provision text. Effective-date and amendment notes are indexed separately and are never quotable as statute.
Regulations need the network the first time. Reg sections are fetched on demand and cached;
--offlinereports uncached ones assource_unavailable.Unreviewed by a tax professional. No part of this project has been audited by a licensed practitioner.
Data sources
Both sources are works of the United States government and are in the public domain (17 U.S.C. § 105). TaxCite never uses a proprietary source.
Internal Revenue Code — Office of the Law Revision Counsel, U.S. House of Representatives, USLM XML.
Treasury Regulations — Electronic Code of Federal Regulations, Office of the Federal Register and the Government Publishing Office.
TaxCite identifies itself to both with a User-Agent naming this repository, stays under four requests a second, backs off exponentially, and caches everything on disk.
Development
uv sync --all-extras
uv run ruff check . && uv run ruff format --check . && uv run mypy --strict src/ && uv run pytest
uv run pytest -m network # live smoke tests against the government sourcesAll four checks must pass before a change lands. The default test run makes no network
requests; live tests against the government sources are marked network and skipped
unless asked for.
Contributing
Issues and pull requests are welcome at github.com/rakib-nyc/taxcite.
Two rules are not negotiable, because they are what the project is for:
Never fabricate legal text. Test fixtures containing statutory or regulatory language must be real excerpts from official sources, recorded in
tests/fixtures/SOURCES.md. Invented text used for parser mechanics is namedsynthetic_*and is obviously fake.Only official public-domain sources. No proprietary research service is ever scraped, queried, or depended upon.
Citing this project
@software{islam_taxcite_2026,
author = {Islam, Muhammad Rakibul},
title = {TaxCite: citation and quotation verification for U.S. federal tax law},
year = {2026},
version = {0.1.0},
url = {https://github.com/rakib-nyc/taxcite},
license = {Apache-2.0}
}Author and contact
Muhammad Rakibul Islam — questions, corrections, and collaboration: rakib.islam@rutgers.edu
If you find a citation that TaxCite gets wrong — a real authority reported as missing, or a bad one reported as fine — please open an issue. That is the failure mode that matters most, and reports of it are genuinely valuable.
License
Copyright 2026 Muhammad Rakibul Islam.
Licensed under the Apache License, Version 2.0. You may obtain a copy of the
licence at http://www.apache.org/licenses/LICENSE-2.0 or in LICENSE.
Unless required by applicable law or agreed to in writing, software distributed under the licence is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the licence for the specific language governing permissions and limitations.
The statutory, regulatory, and judicial texts TaxCite retrieves are works of the United States government and are in the public domain (17 U.S.C. § 105). They are not covered by this licence and no claim is made to them.
Available Tools
12 toolscheck_authorityA
Classify a draft's citations as authority, or not, for penalty purposes.
Applies Treas. Reg. § 1.6662-4(d)(3)(iii), which lists what counts as authority for the substantial-authority standard under I.R.C. § 6662. Treatises, law review articles and practitioners' opinions are expressly not authority; a position resting on them has a penalty-protection problem. This classifies; it does not weigh.
Args: text: The draft to analyse. tax_year: Also check each authority against this tax year.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| tax_year | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden and does a good job: it reveals the legal rule applied, declares that treatises/law-review articles/practitioner opinions count as non-authority, and states it does not weigh. It could add whether the operation is read-only or how results are returned, but it is substantively transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose statement is front-loaded, and each sentence contributes: legal rule, non-authority examples, non-weighing limitation, and parameter meanings. It is slightly more verbose than necessary, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a legal-domain classification tool with no annotations, the description conveys the key external context, parameter semantics, and an important limitation. The output schema covers return values, so that gap is acceptable. It does not mention edge cases or related sibling tools, which keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: the Args section defines text as 'The draft to analyse' and explains tax_year as checking each authority against that year. This is sufficient for both parameters, though it does not give format constraints or examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Classify a draft's citations as authority, or not, for penalty purposes.' It also narrows the scope to the substantial-authority standard. However, it does not explicitly differentiate the tool from siblings like verify_citations or resolve_citation; it only says it does not weigh, which is more behavioral than a sibling comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states when it applies ('for penalty purposes', citing Treas. Reg. § 1.6662-4(d)(3)(iii)) and gives a clear exclusion: it classifies, it does not weigh. It does not explicitly point to an alternative tool for weighing or verification, so it stops short of full when/alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_caseA
Look up a court decision, and check a passage you mean to quote from it.
Use this before you attribute language to a case. A citation that resolves is not evidence that the words you put in quotation marks are in it, and a quotation that is nearly right is the failure this catches.
Args: citation: The case, e.g. "Welch v. Helvering, 290 U.S. 111 (1933)". quote: A passage to check against the decision. Give the words only; enough of them to be distinctive — a handful is not enough to be sure of.
| Name | Required | Description | Default |
|---|---|---|---|
| quote | No | ||
| citation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It communicates that the tool both retrieves a decision and performs a textual check, and it warns of the specific failure mode it catches (nearly right quotations). However, it does not describe the result format, matching behavior, or edge cases such as partial matches, though an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then provides context and parameter guidance. It is slightly wordy in the middle paragraph, but the rhetorical explanation about citations and quotations earns its place by preventing incorrect usage. Overall it is compact and no sentences are wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter lookup/verification tool, the description is nearly complete. It explains when to use the tool, what each parameter means, and why the check matters. The main omission is clarifying that the quote parameter is optional and that calling with only a citation simply looks up the case; the schema shows the default but the description does not state this behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain both parameters, and it does so well. For citation, it gives a concrete example and identifies it as the case reference. For quote, it explains what to pass ('the words only'), how much is needed ('enough of them to be distinctive'), and warns that 'a handful is not enough to be sure of.' This meaningfully exceeds the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: look up a court decision and check whether a proposed quotation appears in it. It clearly distinguishes this from siblings like resolve_citation (which presumably resolves a citation) and verify_citations (which likely verifies citation accuracy) by framing the tool as a quotation-integrity checker.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Use this before you attribute language to a case.' It also explains why the check is necessary: a resolvable citation does not guarantee the quoted words are in the opinion. It does not name alternative tools or state when not to use them, but the usage context is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_versionsA
Show how a provision changed between two dates.
Args: citation: The provision, e.g. "§ 163(j)". from_date: The earlier date, YYYY-MM-DD. to_date: The later date; current law if omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| to_date | No | ||
| citation | Yes | ||
| from_date | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It clearly implies a read-only operation via 'Show' and transparently documents the default behavior for to_date ('current law if omitted'). It does not discuss edge cases or validation, but the output schema covers return-value details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-sentence purpose statement followed by a tight Args block. Every line earns its place, and the most important info is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All parameters are described with formats and defaults, the operation is clear, and the presence of an output schema covers return-value expectations. For a simple three-parameter comparison tool, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does. It explains all three parameters with formats ('YYYY-MM-DD'), a concrete citation example ('§ 163(j)'), and the meaningful default for to_date. This adds substantial value over the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Show how a provision changed between two dates.' This clearly distinguishes it from siblings like get_irc_provision (current law) and search_tax_law (search), since the focus is temporal comparison of versions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use case is implied by the description, but it never explicitly says when to prefer this tool over alternatives or when not to use it. The sibling list shows nearby tools, but the description itself does not provide routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_definitionA
Find where a term is defined, and what scope the definition has.
Args: term: The term to look up, e.g. "gross income". limit: Maximum number of definitions to return.
| Name | Required | Description | Default |
|---|---|---|---|
| term | Yes | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. It only states the action and result (find definitions and scope) but does not disclose whether the operation is read-only, what happens if no definition is found, any authentication requirements, or the format of the output. This is a significant gap for a tool with no annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, with the purpose stated in one sentence and the Args section providing minimal but sufficient parameter details. There is no fluff or redundant information; every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with only two parameters, and an output schema exists, so the description covers the core purpose and parameter meanings. However, it lacks usage guidance and behavioral details (e.g., read-only nature, error behavior), making it slightly incomplete for a tool with no annotations to fall back on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explains both parameters: 'term' with an example ('gross income') and 'limit' with a clear meaning ('Maximum number of definitions to return'). The schema only provides titles and a default, so the description adds meaningful semantic value that helps an agent understand how to fill in the arguments correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Find') and the resource ('where a term is defined, and what scope the definition has'), making it specific and distinct from sibling tools like search_tax_law, which imply broader searching. An agent can immediately understand what this tool does without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide any guidance on when to use this tool versus alternatives such as search_tax_law or resolve_citation. It lacks explicit context about when this tool is appropriate and when it is not, leaving usage to inference only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cross_referencesA
List what a provision cites, and what cites it.
Args: citation: The provision to look at, e.g. "§ 1411". direction: "outgoing", "incoming", or "both".
| Name | Required | Description | Default |
|---|---|---|---|
| citation | Yes | ||
| direction | No | both |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description is the only safety signal. 'List' clearly signals a read-only operation, and the incoming/outgoing contrast explains the tool's core behavior. It does not address invalid citations, access restrictions, or error behavior, but for a simple query tool this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is one short purposeful sentence followed by two concise parameter entries. It front-loads the primary behavior and contains no filler, repetition, or irrelevant detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with an output schema, the description covers both parameters and the core lookup semantics well. It is complete enough for an agent to select and invoke the tool correctly, though naming sibling alternatives would improve context further.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates: it explains that citation is the provision to inspect and gives a concrete format example ('§ 1411'), and it enumerates the valid direction values ('outgoing', 'incoming', 'both'). This adds meaning well beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states the exact operation ('List') and the object (what a provision cites and what cites it), making the tool's function unambiguous. It is distinct from siblings like resolve_citation or verify_citations because it targets the citation-graph relationship, not resolution or validation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit when-to-use guidance or named alternatives. An agent must infer from the wording that this is for bidirectional cross-reference lookup, but the description does not state when to prefer it over sibling tools like verify_citations or search_tax_law.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_irc_provisionA
Get the official text of an Internal Revenue Code provision.
Args: citation: Any citation form, e.g. "162", "§ 162(a)", "I.R.C. § 7701(a)(30)(A)". include_children: Include the text of every subdivision below it. max_chars: Truncate the text at this length. as_of: Read the law as it stood on this date (YYYY-MM-DD). Tax questions are usually about a past year, and current law is often the wrong answer.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | ||
| citation | Yes | ||
| max_chars | No | ||
| include_children | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It communicates that the tool returns official text, supports historical reads via as_of, includes subdivisions by default, and can truncate output with max_chars. These are meaningful behavioral details beyond the bare operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-line purpose followed by a bullet-style argument list. Every sentence adds value, and the most important practical warning about as_of is included without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All parameters are covered with clear semantics, the purpose is precise, and the output schema exists to describe return values. The description is complete enough for an agent to call the tool correctly, including handling of the important as_of edge case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must fully explain the parameters, and it does. It gives citation format examples, defines include_children, explains max_chars truncation, and provides crucial as_of usage context. This is exemplary compensation for a schema with no descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get the official text of an Internal Revenue Code provision.' This clearly distinguishes it from siblings like get_treasury_reg and search_tax_law, which target different legal materials or operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when the tool is appropriate, especially the as_of guidance that tax questions usually concern past years and current law is often wrong. It does not explicitly contrast this tool with alternatives, but the provided context is strong 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_treasury_regA
Get the official text of a Treasury Regulation.
Args: citation: Any citation form, e.g. "1.162-1", "Treas. Reg. § 1.263(a)-4(b)(1)". include_children: Include the text of every paragraph below it. max_chars: Truncate the text at this length.
| Name | Required | Description | Default |
|---|---|---|---|
| citation | Yes | ||
| max_chars | No | ||
| include_children | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose truncation (max_chars) and recursive child inclusion. It does not state what happens on invalid citations, whether the text is current/authoritative in a dynamic sense, or any other side effects; moderate transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A one-line purpose followed by a terse Args block; every sentence adds information. No filler or repetition of the schema titles.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple text-retrieval tool with an output schema, the description covers function and all parameters well. It is slightly incomplete in not relating itself to sibling citation tools or specifying behavior around max_chars truncation marks, but these are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain all params. It gives concrete citation examples, explains include_children as recursive paragraph text, and defines max_chars as truncation length. This compensates well, though it doesn't detail default behavior or edge cases like an invalid citation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool retrieves the official text of a Treasury Regulation, with citation examples that make the resource unambiguous. It doesn't explicitly distinguish itself from siblings such as get_irc_provision, but the resource type ('Treasury Regulation') is specific enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied: call this when you need the official text of a Treasury Regulation. However, there is no explicit when-not-to-use guidance or mention of alternatives like resolve_citation or get_irc_provision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_subdivisionsA
List a provision's subdivisions, so you can fetch the one you need.
Args: citation: The provision to open up, e.g. "§ 163".
| Name | Required | Description | Default |
|---|---|---|---|
| citation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral disclosure. It only states it lists subdivisions, implying a read-only operation, but it does not mention side effects, error conditions, or any limitations. The agent is left to infer that it's safe and non-destructive, but no explicit disclosure is given.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: two sentences plus an Args block. It front-loads the purpose and gives an example, with no wasted words. Well-structured for quick parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter tool with an output schema, the description covers the essential purpose and parameter. It lacks explicit guidance on when to use it versus siblings, but given the simplicity, it's adequate. The output schema likely handles return value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description compensates well by explaining the citation parameter with a concrete example ('§ 163'). This adds meaningful guidance beyond the schema's bare 'Citation' field, clarifying the expected format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'a provision's subdivisions', which is specific and distinguishes it from fetching a full provision. However, it does not explicitly differentiate from sibling tools like get_irc_provision, so it's clear but not maximally distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'so you can fetch the one you need' implies the tool is a precursor to fetching a specific subdivision, but it does not explicitly state when to use it versus alternatives or mention exclusions. Usage guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reading_closureA
List everything you must read to understand a provision.
Tax provisions are a graph. Before asserting what § 163(j)(1) means, read what it points at. This walks outward, nearest first.
Args: citation: The provision to start from, e.g. "§ 163(j)". depth: How many hops to follow. The transitive closure of the Code is the Code. limit: Maximum number of provisions to return.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| limit | No | ||
| citation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does explain the traversal behavior ('walks outward, nearest first') and the meaning of depth ('How many hops to follow') and warns about the transitive closure ('The transitive closure of the Code is the Code'), which hints at potential depth explosion. However, it does not mention the return format (citations vs. full text), pagination, or any edge cases like cycles. It is transparent about the core algorithm but lacks details on output and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient: it states the purpose first, then the graph context, then the traversal behavior, and then the arguments. Every sentence adds value. It is front-loaded with the primary action and uses minimal words to convey the key concepts. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is moderately complex (graph traversal), but the description covers the purpose, parameters, and traversal order. An output schema exists (as signaled), so the return format may be documented there. The description does not mention edge cases like cycles or what happens if the citation is invalid, but for a tool with a clear use case and an output schema, the coverage is adequate. It is missing a note on what the output looks like, but the output schema likely covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameter descriptions (coverage 0%), so the description must fully explain each parameter. It does so clearly: citation (starting provision, with an example), depth (hops), and limit (max provisions). It also explains the relationship between depth and the graph. This fully compensates for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific verb and resource: 'List everything you must read to understand a provision.' It explains the graph metaphor and the outward traversal, and the example (§ 163(j)) makes the purpose concrete. This is distinct from siblings like get_cross_references, which likely returns direct references, while this tool computes the transitive closure. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear context for use: 'Before asserting what § 163(j)(1) means, read what it points at.' This implies the tool is for gathering reading material before making assertions. However, it does not explicitly contrast with alternatives like get_cross_references or get_irc_provision, nor does it state when NOT to use it. The usage guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_citationA
Parse a citation and say whether the provision it names actually exists.
Args: citation: The citation to check, e.g. "§ 162(z)".
| Name | Required | Description | Default |
|---|---|---|---|
| citation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It does disclose the core read-only behavior: parsing a citation and checking existence. However, it does not mention behavior on malformed citations, whether existence is checked against current law, or exactly what 'exists' means for a provision. The basic predicate is clear, but edge cases are not addressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the main purpose, and contains no filler. The Args section cleanly documents the single parameter with an example. Every sentence contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter validation tool, the description is largely complete: the parameter is explained with an example, the behavior is clear, and an output schema exists so the return shape need not be described. It could be more complete with error expectations, but nothing essential for basic invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only says 'citation' is a string with 0% schema description coverage. The description compensates by labeling the argument as 'The citation to check' and providing a concrete format example, '§ 162(z)'. This gives an agent useful semantic information beyond the schema, though it does not fully enumerate accepted citation formats.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation: 'Parse a citation and say whether the provision it names actually exists.' This names a specific verb, resource, and outcome, making the tool's core purpose understandable. It does not explicitly differentiate itself from sibling tools like verify_citations, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance about when to use this tool instead of alternatives such as get_irc_provision, verify_citations, or check_case. There are no conditions, exclusions, or routing hints; only a parameter example is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_tax_lawA
Search the text of the Code and the regulations.
Args: query: Words or a phrase to look for, e.g. "ordinary and necessary". source: "irc", "reg", or "all". limit: Maximum number of results.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| source | No | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It discloses that the tool searches the text of the Code and regulations terms and that a limit can be applied, but it does not describe result ordering, whether matches are snippets or full provisions, error behavior for invalid source values, or any other side effects. This is thinner than expected for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, followed immediately by a concise Args block. Every line adds useful information, and there is no redundant restatement of the schema or irrelevant detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple search tool with an output schema present alert and all parameters documented in the description, the core invocation guidance is complete. The main gaps are behavioral detail—such as result ranking or error handling—and explicit alternative routing, but those are partially covered by the output schema and the tool's obvious search intent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by explaining all three parameters: query as words or a phrase with an example, source as 'irc', 'reg', or 'all', and limit as maximum number of results. This adds meaning that the bare input schema does not provide, especially for the source parameter, which has no enum in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search') and a clearly bounded resource ('the text of the Code and the regulations'). This distinguishes it from sibling tools like get_irc_provision, get_treasury_reg, and resolve_citation, which are for targeted retrieval or citation resolution rather than free-form full-text search. The purpose is immediately recognizable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need to find text in the Code or regulations by keyword or phrase. However, it does not explicitly state when to prefer this tool over alternatives such as resolve_citation or find_definition, and it gives no 'when not to use' guidance. The usage context is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_citationsA
Check every citation and quotation in a draft against the official sources.
Run this on your own draft before you finish, and fix every error-severity finding.
Args: text: The draft to check, as Markdown or plain text. tax_year: Also flag any provision that did not govern this tax year. Pass it whenever the question is about a particular year, which in tax it usually is.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| tax_year | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that the tool checks all citations and quotations, reports error-severity findings, and can flag provisions that did not govern a given tax year. There is slight ambiguity about whether 'fix' implies mutation, but the read-only 'check' framing is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and each sentence earns its place. The Args section is compact, and the guidance about tax_year is useful rather than redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with an output schema, this description is largely complete. It covers purpose, usage timing, and both parameters. The phrase 'official sources' is somewhat vague, and more detail about the return format would help, but the output schema mitigates that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must define the parameters, and it does. text is described as 'Markdown or plain text', and tax_year is given meaningful semantics: flag non-governing provisions and pass it whenever a specific year is in question.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Describes a specific action ('Check every citation and quotation') against a specific resource ('official sources'), which clearly distinguishes it from sibling search, retrieval, and resolution tools. The purpose is immediately obvious and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use it ('on your own draft before you finish') and gives condition-dependent guidance for tax_year. It does not explicitly name alternatives or exclusions, but the usage context is clear enough.
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.
12 tool updates
v0.1.0- First observed
check_authority - First observed
check_case - First observed
compare_versions - First observed
find_definition - First observed
get_cross_references - First observed
get_irc_provision - First observed
get_treasury_reg - First observed
list_subdivisions - First observed
reading_closure - First observed
resolve_citation - First observed
search_tax_law - First observed
verify_citations
TDQS
Scored across 12 tools
Each tool has a distinct role in the tax-research/verification workflow, and the descriptions clearly separate them. The only mild boundary cases are get_cross_references vs reading_closure and check_case vs verify_citations, but the descriptions make those distinctions usable.
Names mostly follow a clear verb_noun snake_case pattern like get_irc_provision, search_tax_law, and list_subdivisions. reading_closure breaks the verb-first pattern slightly, but the naming is otherwise predictable and consistent.
Twelve tools is well-scoped for a tax-law research and citation-verification server. Each tool contributes to a coherent workflow without redundant entries.
The server covers the core lifecycle well: fetching law, searching, resolving citations, verifying quotations, checking cross-references, comparing versions, and assessing authority. Minor gaps exist for full case-opinion retrieval or administrative guidance, but these do not create dead ends for the apparent purpose.
Maintenance
Related MCP Connectors
Verifies legal citations vs primary sources: existence, quote match, proposition support.
Verify legal citations, case treatment, quotes and whole briefs against 10.7M U.S. opinions
Resolve, search and verify legal citations against the official sources, with provenance.
Verifiable US tax oracle for AI agents: cited, machine-checkable federal and state tax computation
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceValidates legal citations against the CourtListener database to detect hallucinated citations in legal documents.5MIT
- FlicenseNot gradedqualityDmaintenanceVerifies legal case citations against real court records to detect hallucinated or misattributed citations.-
- FlicenseNot gradedqualityBmaintenanceDeterministic legal citation verification for AI-generated legal briefs. Three-layer verification: CourtListener database lookup, quote-match against primary source, and LLM edge-case verification. Free tier available.-

kvasir-legalofficial
FlicenseNot gradedqualityCmaintenanceVerifiable German, Austrian, Swiss and EU law: resolve citations to the wording in force, verify the citations a model produced against the official source, and walk the citation graph.-