proofread-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PROOFREAD_API | No | Base URL, for a self-hosted or test instance. | https://proofread.law |
| PROOFREAD_API_KEY | No | A Firm plan API key (`pl_...`), sent as `Authorization: Bearer`. Without it the free tier applies. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| check_citationsA | Check every case citation in a text against proofread.law's register of about 10 million US court opinions (CourtListener bulk data). Use it on a draft brief, memo, letter or any prose that cites cases, before the citations are relied on. Returns the coverage statement, counts per tier, one line per row that needs a human (red = check this: the register holds something concrete that disagrees, such as a different case at that citation or quoted words not in the opinion; orange = cannot verify: nothing to check against, such as a Westlaw/Lexis identifier or a volume newer than the register), the number of citations found, and a report id for render_report. Cannot: resolve Westlaw (WL) or Lexis identifiers, check statutes, regulations or secondary sources, or say whether a case is still good law. A red row means 'check this', never 'this case does not exist'; an orange row means the register has nothing to check against, which is not evidence either way. deep=true also asks, for each found citation, whether the opinion supports the sentence it is cited for (white rows). It is slower (1 to 2 s per citation), opt-in because the clause before each citation is sent to a model judge, limited to 3 per month on the free tier, and its answers are a review queue, not a verdict. Free tier: 20 checks a month. Without an API key the free tier applies per IP address; a key from sign_up (free tier) identifies the account, and a paid-plan key lifts the limits. |
| check_documentA | Check every case citation in a document on disk (PDF, DOCX, TXT or Markdown, up to 10 MB) against proofread.law's register of about 10 million US court opinions. The file is read here and uploaded to proofread.law, which extracts the text in memory, checks it and discards it. Returns the same compact result as check_citations: coverage statement, counts per tier, one line per red (check this) or orange (cannot verify) row, the number of citations found, and a report id for render_report. Scanned PDFs without a text layer, encrypted PDFs and legacy .doc files cannot be read; .docx needs a paid plan. Cannot: resolve Westlaw (WL) or Lexis identifiers, check statutes, regulations or secondary sources, or say whether a case is still good law. A red row means 'check this', never 'this case does not exist'; an orange row means the register has nothing to check against, which is not evidence either way. deep=true also asks, for each found citation, whether the opinion supports the sentence it is cited for (white rows). It is slower (1 to 2 s per citation), opt-in because the clause before each citation is sent to a model judge, limited to 3 per month on the free tier, and its answers are a review queue, not a verdict. Without an API key the free tier applies per IP address; a key from sign_up (free tier) identifies the account, and a paid-plan key lifts the limits. |
| resolve_citationA | Look up a single case citation (for example '590 U.S. 644', or 'Bostock v. Clayton County, 590 U.S. 644 (2020)') in proofread.law's register and answer: is there a case at this citation, which one (name, court, date, parallel citations, link), and how complete the register is for that volume. This is a register lookup of the citation, not a comparison with the case name you have: if the case it returns is not the one you expected, the citation points elsewhere. Statuses: found; ambiguous (several entries, candidates listed); not in the register (a register fact with a coverage qualifier, never proof that the case does not exist); cannot verify (a Westlaw/Lexis identifier, or a volume the register cannot see yet); known citation (other opinions cite it, the opinion itself is not held); no citation recognised. Use it when one citation is in doubt; use check_citations for prose, and resolve_citations for a list. Cannot: resolve Westlaw (WL) or Lexis identifiers, check statutes, regulations or secondary sources, or say whether a case is still good law. A red row means 'check this', never 'this case does not exist'; an orange row means the register has nothing to check against, which is not evidence either way. Counts against the resolve quota (1,000 a month free), not the check quota. Without an API key the free tier applies per IP address; a key from sign_up (free tier) identifies the account, and a paid-plan key lifts the limits. |
| resolve_citationsA | Look up up to 500 case citation strings in proofread.law's register in one call and get one line per citation, in input order: found (the case, court, date, link), ambiguous, not in the register (a register fact with a coverage qualifier, never proof that the case does not exist), cannot verify (Westlaw/Lexis identifier, or a volume the register cannot see yet), known citation, or no citation recognised. Use it for a table of authorities or any list of citations you already have; use check_citations for prose (it also checks names and quotations). Cannot: resolve Westlaw (WL) or Lexis identifiers, check statutes, regulations or secondary sources, or say whether a case is still good law. A red row means 'check this', never 'this case does not exist'; an orange row means the register has nothing to check against, which is not evidence either way. Each citation counts against the resolve quota (1,000 a month free), not the check quota. Without an API key the free tier applies per IP address; a key from sign_up (free tier) identifies the account, and a paid-plan key lifts the limits. |
| coverageA | The coverage statement (which opinions the register holds, its date, its known gaps, what is not checked: Westlaw/Lexis identifiers, statutes, regulations, secondary sources) and the storage notice (a checked text is not stored; only a brief the user saves with save_brief is kept, encrypted in their account). Pass jurisdiction 'ch' for the Swiss register instead (BGE/ATF/DTF, Federal Supreme Court dockets, the federal courts and the 26 cantons), which also lists the courts held and the share of the live index each covers. Call it when a user asks what the check covers, how current it is, or what happens to their text. Free, not counted as a check. |
| render_reportA | Turn a finished check into a markdown diligence report: header, coverage and storage notices, a summary table sorted check-this, cannot-verify, support, found, and a detail block per flagged row with the register evidence. Use it when the user wants a report to keep or attach to the file, or when the compact result was cut short. Pass the report_id returned by check_citations or check_document (ids live in this server's memory until it exits), or the full report JSON from proofread.law's /verify endpoint. Free, not counted. |
| suggest_casesA | Swiss law only. Give a Swiss federal statute article ('Art. 41 OR', 'art. 41 CO', 'Art. 8 ZGB', 'art. 9 Cst.') or a paragraph that cites one, and get the leading Federal Supreme Court cases (BGE/ATF/DTF) the court cites with that article, as cases to read. The query needs a statute article: there is no free-text search, and a query without one answers that no article was recognised. Federal acts only; cantonal law is not covered. The answer is one ranked list, each case labelled with its field of law; the domain filter keeps the same order within one field. Each row has the citation, date, field, rank, the quoted passage (regeste or consideration), the decision's link, a link to check the citation on proofread.law, and any later change of practice (a changed precedent is listed with its flag, never left out; a row without a flag is not evidence that its practice still holds). A suggestion has not been checked against the user's sentence; to check a citation, use check_citations. The answer comes back in the query's language (German, French or Italian; lang='en' for English). During the trial phase it needs a paid-plan or trial API key; each answered query counts as one resolve. |
| save_briefA | Save a brief (or any draft that cites cases) to the user's proofread.law account and check its citations in the same call. Use it when the user asks to keep a draft and come back to it, or to start the edit-and-recheck loop: save once, then after each round of edits call update_brief with the id. Returns the brief id, the coverage statement, counts per tier, one line per row that needs attention (red = check this: the register holds something concrete that disagrees; orange = cannot verify: nothing to check against, not evidence either way), and a report id for render_report. Only call it when the user wants the draft saved; to check without saving, use check_citations. Each call saves a new brief and counts as one check. Cannot: resolve Westlaw (WL) or Lexis identifiers, check statutes, regulations or secondary sources, or say whether a case is still good law. A red row means 'check this', never 'this case does not exist'; an orange row means the register has nothing to check against, which is not evidence either way. Saving is opt-in: nothing is saved unless save_brief or update_brief is called (check_citations and check_document never save anything). A saved brief is stored encrypted in the user's proofread.law account until delete_brief removes it, and needs an API key (PROOFREAD_API_KEY, or one from sign_up). |
| list_briefsA | List the briefs saved in the user's proofread.law account: id, title, when each was last saved and checked, the number of citations, the counts per tier from its latest check, and the number of versions kept. Use it to find a brief's id when the user refers to a draft by name, before get_brief, update_brief or delete_brief. It only reads: this tool saves nothing and runs no check. Saving is opt-in: nothing is saved unless save_brief or update_brief is called (check_citations and check_document never save anything). A saved brief is stored encrypted in the user's proofread.law account until delete_brief removes it, and needs an API key (PROOFREAD_API_KEY, or one from sign_up). |
| get_briefA | Get one brief saved in the user's proofread.law account: its saved text, the latest report (coverage statement, counts per tier, the rows that need attention, a report id for render_report) and the versions kept. Use it to pick up where the user left off, or to get the exact saved text before editing it for update_brief. include_text=false returns the report without the text (a long brief is long). Pass version to read an earlier version's text and counts instead of the latest. It only reads: this tool saves nothing and runs no check. Saving is opt-in: nothing is saved unless save_brief or update_brief is called (check_citations and check_document never save anything). A saved brief is stored encrypted in the user's proofread.law account until delete_brief removes it, and needs an API key (PROOFREAD_API_KEY, or one from sign_up). |
| update_briefA | Save an edited version of a brief saved in the user's proofread.law account and re-check it. This is the loop for fixing flagged citations: edit the text (the citation, case name or quotation a row points at, or take the citation out), call update_brief with the whole edited text, and read the changes: which flags were resolved (flagged before, not flagged now), which flags are new, how many rows are unchanged, and then every row that still needs attention. Repeat until every remaining row has been reviewed by the user. Send the full text, not a diff or an excerpt: it becomes the latest version, and the previous version is kept (get_brief lists the versions). recheck=true re-runs the check on the saved text without editing it, e.g. after the register was updated. A changed text or a recheck counts as one check and keeps a new version; a title alone renames the brief without a check and is not counted. Cannot: resolve Westlaw (WL) or Lexis identifiers, check statutes, regulations or secondary sources, or say whether a case is still good law. A red row means 'check this', never 'this case does not exist'; an orange row means the register has nothing to check against, which is not evidence either way. Saving is opt-in: nothing is saved unless save_brief or update_brief is called (check_citations and check_document never save anything). A saved brief is stored encrypted in the user's proofread.law account until delete_brief removes it, and needs an API key (PROOFREAD_API_KEY, or one from sign_up). |
| delete_briefA | Permanently delete a brief and all its saved versions from the user's proofread.law account. The deletion is permanent: it cannot be undone and the text cannot be recovered afterwards. Only call it when the user asks to delete that brief; if the id is in any doubt, confirm it with list_briefs first. Deleting runs no check. Saving is opt-in: nothing is saved unless save_brief or update_brief is called (check_citations and check_document never save anything). A saved brief is stored encrypted in the user's proofread.law account until delete_brief removes it, and needs an API key (PROOFREAD_API_KEY, or one from sign_up). |
| sign_upA | Open a proofread.law account for its owner and get an API key, in one call (POST /agent/signup). Use it when the user wants their own quota instead of the anonymous per-IP free tier, or before billing_link. The email must be the account OWNER's real inbox (placeholder domains are rejected); the owner receives one confirmation email and nothing else. The key is shown once: this server adopts it for the rest of this session, and the user should put it in PROOFREAD_API_KEY in their MCP configuration so it survives a restart. Never send the key anywhere but proofread.law. Calling again with the same address while the account is unconfirmed and unpaid rotates the key; a confirmed or paying account answers 409 (the owner manages keys at https://proofread.law/account). Free tier per account: 20 checks, 3 deep checks, 1,000 resolves a month; 5 sign-ups an hour per client. |
| billing_linkA | Get a Stripe Checkout link that upgrades this API key's account to a paid plan (POST /agent/checkout-link). Use it when a check answers 'needs the ... plan' (402) or 'monthly allowance used' (429), or when the user asks to upgrade. Needs an API key (PROOFREAD_API_KEY, or one from sign_up). Plans: payg = pay as you go (no monthly fee; per check and per deep-checked citation), solo = monthly, firm = monthly with more keys; current prices at https://proofread.law/pricing. Give the link to the account owner to open in a browser; the plan is live within a minute of payment. No charge happens until the owner pays. An account that already has a subscription answers 409 (the owner changes plans in the billing portal at https://proofread.law/account). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 14 tools
Tools are mostly distinct: check_citations vs check_document differ by input type (text vs file), resolve_citation vs resolve_citations differ by count, and suggest_cases offers a different domain. The cluster of citation tools could be confused, but descriptions clearly separate prose checking, list resolution, single lookup, and Swiss suggestions. Brief CRUD and account tools are unambiguous.
Most tools follow a verb_noun pattern (check_citations, resolve_citations, list_briefs, save_brief, render_report), with a few exceptions like 'coverage' (noun) and 'sign_up' (phrasal verb). The pattern is predictable and readable, with only minor deviations.
14 tools is well within the ideal range for this domain. Each tool has a clear purpose: checking, resolving, saving, managing, reporting, and account setup. No redundancy or bloat; the count matches the feature set.
The tool set covers the full lifecycle: checking citations in text and files, resolving single and batch citations, suggesting Swiss cases, managing saved briefs (CRUD), generating reports, and handling account quotas. Minor gaps exist, like no direct tool to check statutes or regulations, but those are explicitly out of scope, so the surface is appropriately complete.