Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

proofread.law

NPM · PROOFREAD-MCP · SCANNED SEP 26

Check US and Swiss case citations against open registers of court opinions, from any MCP client.

Available components

71 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 31 of 95 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
Schema Quality & AI Usability66
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 4399 tokens (~314/item across 14 items; 14 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management20
  • Stability observed for 6 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the proofread.law MCP server?

proofread.law runs locally as an npm package, launched with npx -y proofread-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · proofread-mcp

# add to Claude Code
claude mcp add data-alchemy-labs-proofread-mcp -- npx -y proofread-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "data-alchemy-labs-proofread-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "proofread-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "data-alchemy-labs-proofread-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "proofread-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add data-alchemy-labs-proofread-mcp -- npx -y proofread-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "data-alchemy-labs-proofread-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "proofread-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add data-alchemy-labs-proofread-mcp --command npx --arg -y --arg proofread-mcp
# ~/.hermes/config.yaml
mcp_servers:
  data-alchemy-labs-proofread-mcp:
    command: "npx"
    args: ["-y", "proofread-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "data-alchemy-labs-proofread-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "proofread-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add data-alchemy-labs-proofread-mcp -t stdio -c npx -a -y proofread-mcp
// mcp.json
{
  "mcpServers": {
    "data-alchemy-labs-proofread-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "proofread-mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 25 Sept 26 +1
    • Schema quality: 3931 → 4399 ▼ functional
    • Package version: 0.2.0 → 0.3.0 functional
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 24 Sept 26 +15
    • Malware scan: unverified → pass ▲ security
  • 23 Sept 26 −14
    • Malware scan: pass → unverified ▼ security
    • Schema quality: 2461 → 3931 ▼ functional
    • Destructive annotations: pass → 100 functional
    • Package version: 0.1.4 → 0.2.0 functional
  • 22 Sept 26 +15
    • Malware scan: unverified → pass ▲ security
  • 21 Sept 26 −14
    • Malware scan: pass → unverified ▼ security
    • Stability: unverified → 0.03 ▲ functional
    • Package version: 0.1.3 → 0.1.4 functional
  • 20 Sept 26 68

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 26 Sept 2026 · Analysed npm/proofread-mcp@0.3.0

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm

Background: How many MCP packages publish verified provenance →

Dependencies 95 packages
Packages resolved 95
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 14 exposed · ~4,036 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
billing_link ~204

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).

NameTypeReqDescription
planstring–payg (pay as you go), solo or firm.

No output schema declared.

No examples provided.

check_citations ~398

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.

NameTypeReqDescription
deepboolean–Also check whether each cited opinion supports the sentence it is cited for. Slower, opt-in, 3 per month on the free tier.
textstringyesThe text to check, as written (paragraphs, footnotes, a whole brief). Pasted text is fine.

No output schema declared.

No examples provided.

check_document ~386

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.

NameTypeReqDescription
deepboolean–Also check whether each cited opinion supports the sentence it is cited for. Slower, opt-in, 3 per month on the free tier.
pathstringyesAbsolute path to a .pdf, .docx, .txt or .md file on this machine.

No output schema declared.

No examples provided.

coverage ~179

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.

NameTypeReqDescription
jurisdictionstring–Which register to describe. Default 'us'. 'ch' for Swiss case law.

No output schema declared.

No examples provided.

delete_brief ~170

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).

NameTypeReqDescription
idstringyesThe id of the brief to delete, from save_brief or list_briefs.

No output schema declared.

No examples provided.

get_brief ~253

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).

NameTypeReqDescription
idstringyesThe brief id from save_brief or list_briefs.
include_textboolean–Return the saved text (default true). false returns only the report.
versioninteger–An earlier version number from the versions list; omit for the latest.

No output schema declared.

No examples provided.

list_briefs ~167

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).

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

render_report ~170

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.

NameTypeReqDescription
reportobject–A full report JSON as returned by POST /verify, if you have one instead of an id.
report_idstring–The 'Report id' from a previous check_citations or check_document result.

No output schema declared.

No examples provided.

resolve_citation ~370

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.

NameTypeReqDescription
citationstringyesOne citation string. A case name and year around it are fine; only the reporter citation is resolved.

No output schema declared.

No examples provided.

resolve_citations ~269

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.

NameTypeReqDescription
citesarrayyesCitation strings, one per entry, up to 500.

No output schema declared.

No examples provided.

save_brief ~361

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).

NameTypeReqDescription
textstringyesThe full text of the brief, as written (paragraphs, footnotes, the whole draft).
titlestring–A name the user will recognise in list_briefs, e.g. 'Motion to dismiss, Smith v. Jones'.

No output schema declared.

No examples provided.

sign_up ~269

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.

NameTypeReqDescription
agent_namestringyesA name for this agent or client (1 to 64 characters: letters, digits, spaces, dots, hyphens, underscores), e.g. 'Claude Desktop'.
emailstringyesThe account owner's real email address. Ask the user for it; do not invent one.

No output schema declared.

No examples provided.

suggest_cases ~411

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.

NameTypeReqDescription
domainstring–Only this field of law (civil, criminal, public or social), in the same order as the full list. Default all.
kinteger–Number of rows, 1 to 50. Default 10.
langstring–The answer's language: de, fr, it or en. Default: the query's language.
querystringyesA Swiss federal statute article, e.g. 'Art. 41 OR' or 'art. 9 Cst.', or a paragraph that cites one (up to 20,000 characters).

No output schema declared.

No examples provided.

update_brief ~429

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).

NameTypeReqDescription
idstringyesThe brief id from save_brief or list_briefs.
recheckboolean–Re-run the check on the saved text without editing it, e.g. after the register was updated.
textstring–The whole edited text of the brief. It replaces the latest version; the previous one is kept.
titlestring–A new name for the brief.

No output schema declared.

No examples provided.

Common questions

What is the proofread.law MCP server?

proofread.law is an MCP server listed in the public MCP registry as io.github.Data-Alchemy-Labs/proofread-mcp. Check US and Swiss case citations against open registers of court opinions, from any MCP client. This page covers its npm package (proofread-mcp).

Is the proofread.law MCP server safe to use?

proofread.law scores 71 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 26 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the proofread.law MCP server expose?

proofread.law exposes 14 tools: check_citations, check_document, resolve_citation, resolve_citations, coverage, and 9 more. Their descriptions and schemas cost roughly 4,036 tokens of context every time the server is loaded.

Is the proofread.law MCP server still maintained?

proofread.law is still listed as active in the MCP registry. We last reached this channel on 26 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the proofread.law MCP server under?

proofread.law declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.