proofread-mcp 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -7
- package/dist/client.d.ts +1 -1
- package/dist/client.js +1 -1
- package/dist/resolve_format.js +55 -11
- package/dist/resolve_format.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +1 -1
- package/dist/types.d.ts +3 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -38,7 +38,13 @@ What it cannot do: resolve Westlaw (WL) or Lexis identifiers, check statutes, re
|
|
|
38
38
|
|
|
39
39
|
Needs Node 20 or newer. No install step is required; `npx` fetches [proofread-mcp from npm](https://www.npmjs.com/package/proofread-mcp).
|
|
40
40
|
|
|
41
|
-
### Claude Desktop
|
|
41
|
+
### Claude Desktop (extension bundle)
|
|
42
|
+
|
|
43
|
+
Download `proofread-mcp-<version>.mcpb` from the [latest GitHub release](https://github.com/Data-Alchemy-Labs/proofread-mcp/releases/latest) and open it with Claude Desktop (double-click, or Settings, Extensions, Install Extension). The bundle carries the server and its dependencies and uses the Node runtime that ships with Claude Desktop, so nothing else has to be installed. The only setting is the optional API key, stored by Claude Desktop as a sensitive value and passed to the server as `PROOFREAD_API_KEY`.
|
|
44
|
+
|
|
45
|
+
To build the bundle yourself: `scripts/build-mcpb.sh` (needs `npx @anthropic-ai/mcpb`) writes `build/proofread-mcp-<version>.mcpb` from `manifest.json`, `icon.png` and the npm package contents.
|
|
46
|
+
|
|
47
|
+
### Claude Desktop (config file)
|
|
42
48
|
|
|
43
49
|
Edit `claude_desktop_config.json` (Settings, Developer, Edit Config):
|
|
44
50
|
|
|
@@ -148,12 +154,16 @@ There is also a limit of 20 requests an hour per IP (more on paid plans). When a
|
|
|
148
154
|
|
|
149
155
|
`.docx` upload and unlimited checks need a paid plan. See [proofread.law/pricing](https://proofread.law/pricing).
|
|
150
156
|
|
|
151
|
-
## Privacy
|
|
157
|
+
## Privacy Policy
|
|
158
|
+
|
|
159
|
+
The full policy is at [proofread.law/privacy](https://proofread.law/privacy). What applies to this server:
|
|
152
160
|
|
|
153
|
-
- The text or file goes to proofread.law
|
|
154
|
-
-
|
|
155
|
-
- Deep check (`deep: true`) is opt-in
|
|
156
|
-
-
|
|
161
|
+
- **What is collected.** The text or file you check leaves your machine and goes to proofread.law's own server (`PROOFREAD_API`, default `https://proofread.law`), over HTTPS, in the request that checks it. `sign_up` sends the account owner's email address and the agent name you give it. Nothing else is sent: no conversation history, no other files, no telemetry.
|
|
162
|
+
- **Use and storage on proofread.law.** The input is processed in memory and discarded when the report is returned; no copy is written to disk. The log line per request carries the kind of input, its size, the number of citations, the tier counts and the time taken, never a citation, a party name or a word of text. With an account, proofread.law keeps the email address, the plan, a monthly count of checks and a hash of each API key.
|
|
163
|
+
- **Third parties.** A citation string the register cannot resolve may be looked up in CourtListener's citation API (the citation string only, never prose). Deep check (`deep: true`) is opt-in: the clause before each citation (up to 700 characters) and the cited opinion go to the model judge; that is the only mode in which words from your document leave proofread.law. Sign-in links go through Resend; payments through Stripe, which sees the card and proofread.law does not. Requests pass through Cloudflare's edge in transit.
|
|
164
|
+
- **Retention.** Inputs and reports: none. Account records: until the owner asks for deletion at privacy@proofread.law.
|
|
165
|
+
- **This server.** It stores nothing on disk. It keeps the last 50 reports in memory so `render_report` can be called with a short id; they are gone when the process exits. The API key lives in your MCP client's configuration (Claude Desktop stores the extension's key as a sensitive setting); a key from `sign_up` is held in memory for the session and shown to you once so you can store it. It is sent only to `PROOFREAD_API`, as an `Authorization: Bearer` header. If a deep-check stream stops before every citation was judged, the tool answers with an error that says how many were checked; it never presents a partial deep check as a finished one.
|
|
166
|
+
- **Contact.** Data Alchemy Labs, privacy@proofread.law.
|
|
157
167
|
|
|
158
168
|
## The coverage caveat
|
|
159
169
|
|
|
@@ -196,7 +206,7 @@ Layout: `src/client.ts` is the typed HTTP client (`/verify`, `/render`, `/api/co
|
|
|
196
206
|
|
|
197
207
|
## Publishing
|
|
198
208
|
|
|
199
|
-
See [RELEASE.md](RELEASE.md): npm, the MCP Registry (`server.json` is in the repository), Anthropic's connector directory
|
|
209
|
+
See [RELEASE.md](RELEASE.md): npm, the MCP Registry (`server.json` is in the repository), the Claude Desktop extension bundle (`manifest.json`, `scripts/build-mcpb.sh`, attached to each GitHub release) and Anthropic's connector directory.
|
|
200
210
|
|
|
201
211
|
## License
|
|
202
212
|
|
package/dist/client.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Config } from "./config.js";
|
|
2
2
|
import type { CheckoutLink, Coverage, Report, ResolveBatch, ResolveResult, Row, SignupResult } from "./types.js";
|
|
3
|
-
export declare const USER_AGENT = "proofread-mcp/0.1.
|
|
3
|
+
export declare const USER_AGENT = "proofread-mcp/0.1.3 (+https://github.com/Data-Alchemy-Labs/proofread-mcp)";
|
|
4
4
|
export declare const MAX_UPLOAD_BYTES: number;
|
|
5
5
|
export declare const MAX_BATCH_CITES = 500;
|
|
6
6
|
export type FetchLike = (input: string | URL, init?: RequestInit) => Promise<Response>;
|
package/dist/client.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ProofreadError } from "./errors.js";
|
|
2
2
|
import { readSseReport } from "./sse.js";
|
|
3
|
-
export const USER_AGENT = "proofread-mcp/0.1.
|
|
3
|
+
export const USER_AGENT = "proofread-mcp/0.1.3 (+https://github.com/Data-Alchemy-Labs/proofread-mcp)";
|
|
4
4
|
export const MAX_UPLOAD_BYTES = 10 * 1024 * 1024;
|
|
5
5
|
export const MAX_BATCH_CITES = 500;
|
|
6
6
|
/** A default check answers in seconds; a deep check runs 1 to 2 s per citation, four in parallel, up to 15 minutes server-side. */
|
package/dist/resolve_format.js
CHANGED
|
@@ -40,14 +40,14 @@ export function formatResolveLine(r) {
|
|
|
40
40
|
case "ambiguous":
|
|
41
41
|
return `- AMBIGUOUS: ${cite} ${matches(r)}; best: ${r.case ? caseLine(r.case) : "none"}`;
|
|
42
42
|
case "not_found":
|
|
43
|
-
return `-
|
|
43
|
+
return `- ${label(r)}: ${cite}; ${why(r)}`;
|
|
44
44
|
case "known_cite":
|
|
45
45
|
return `- KNOWN CITATION: ${cite} is not held as an opinion, but other opinions cite it as ${knownAs(r)}`;
|
|
46
46
|
case "unresolvable":
|
|
47
47
|
return `- CANNOT VERIFY: ${cite} is a Westlaw/Lexis identifier; open registers cannot resolve it`;
|
|
48
48
|
case "beyond_register":
|
|
49
49
|
case "unverifiable":
|
|
50
|
-
return `-
|
|
50
|
+
return `- ${label(r)}: ${cite}; ${why(r)}`;
|
|
51
51
|
case "unparsed":
|
|
52
52
|
return `- NO CITATION RECOGNISED: ${JSON.stringify(r.cite)}`;
|
|
53
53
|
default:
|
|
@@ -82,15 +82,14 @@ function headline(r) {
|
|
|
82
82
|
case "ambiguous":
|
|
83
83
|
return `AMBIGUOUS: ${cite} ${matches(r)}; the best match is ${c ? caseLine(c) : "unclear"}. Candidates:`;
|
|
84
84
|
case "not_found":
|
|
85
|
-
return
|
|
86
|
-
"A missing entry is a register fact with a coverage qualifier (below), not proof that the case does not exist; check the citation in another source.";
|
|
85
|
+
return `${label(r)}: ${cite}. ${why(r)}`;
|
|
87
86
|
case "known_cite":
|
|
88
87
|
return `KNOWN CITATION: ${cite} is not held as an opinion, but other opinions cite it as ${knownAs(r)}. The register cannot show the opinion itself; check it in another source.`;
|
|
89
88
|
case "unresolvable":
|
|
90
89
|
return `CANNOT VERIFY: ${cite} is a Westlaw/Lexis identifier. Open registers cannot resolve it; check it in Westlaw or Lexis.`;
|
|
91
90
|
case "beyond_register":
|
|
92
91
|
case "unverifiable":
|
|
93
|
-
return
|
|
92
|
+
return `${label(r)}: ${cite}. ${why(r)}`;
|
|
94
93
|
case "unparsed":
|
|
95
94
|
return `NO CITATION RECOGNISED in ${JSON.stringify(r.cite)}. Reporter citations look like '590 U.S. 644' (volume, reporter, page).`;
|
|
96
95
|
default:
|
|
@@ -130,14 +129,55 @@ function volumeHeld(cov) {
|
|
|
130
129
|
return `no part of ${cov.reporter} volume ${cov.volume} is held`;
|
|
131
130
|
return `${cov.reporter} volume ${cov.volume} is held${n}`;
|
|
132
131
|
}
|
|
133
|
-
|
|
132
|
+
/** The API's reason for an unverifiable / beyond_register / not_found answer, as a short label after the status word. */
|
|
133
|
+
const REASON_LABEL = {
|
|
134
|
+
recent: "recent, unverified",
|
|
135
|
+
volume_thin: "held only in part",
|
|
136
|
+
volume_newer_than_register: "newer than the register",
|
|
137
|
+
reporter_absent: "reporter not held",
|
|
138
|
+
page_absent: "not in the register",
|
|
139
|
+
};
|
|
140
|
+
function label(r) {
|
|
141
|
+
const word = STATUS_WORD[r.status] ?? String(r.status).toUpperCase();
|
|
142
|
+
const extra = r.reason ? REASON_LABEL[r.reason] ?? r.reason.replace(/_/g, " ") : undefined;
|
|
143
|
+
return extra && extra.toUpperCase() !== word ? `${word} (${extra})` : word;
|
|
144
|
+
}
|
|
145
|
+
const NOT_A_VERDICT = "This is a register fact with a coverage qualifier, not proof that the case does not exist; check the citation in another source.";
|
|
146
|
+
/** The API's `note` verbatim when it sends one; else a sentence from `reason`; else (older API) from the coverage block alone. */
|
|
147
|
+
function why(r) {
|
|
148
|
+
if (r.note)
|
|
149
|
+
return sentence(r.note);
|
|
150
|
+
const cov = r.coverage;
|
|
151
|
+
const vol = cov?.reporter && cov.volume ? `${cov.reporter} volume ${cov.volume}` : "this volume";
|
|
152
|
+
const n = cov?.volume_n !== undefined ? ` (${cov.volume_n} case${cov.volume_n === 1 ? "" : "s"})` : "";
|
|
153
|
+
switch (r.reason) {
|
|
154
|
+
case "recent":
|
|
155
|
+
return "The citation is recent; the register may hold the case without this citation attached. Resolve with the case name and court, or check at the source.";
|
|
156
|
+
case "volume_thin":
|
|
157
|
+
return `${vol} is held only in part${n}, so a missing page is a weak claim. ${NOT_A_VERDICT}`;
|
|
158
|
+
case "volume_newer_than_register":
|
|
159
|
+
return `${vol} is newer than the register${cov?.max_volume !== undefined ? `, which runs to volume ${cov.max_volume}` : ""}. ${NOT_A_VERDICT}`;
|
|
160
|
+
case "reporter_absent":
|
|
161
|
+
return `The register does not hold ${cov?.reporter ? `the ${cov.reporter} reporter` : "this reporter"}. ${NOT_A_VERDICT}`;
|
|
162
|
+
case "page_absent":
|
|
163
|
+
return `${vol} is held${n} but has no case at this page. ${NOT_A_VERDICT}`;
|
|
164
|
+
default:
|
|
165
|
+
return `${legacyWhy(r)} ${NOT_A_VERDICT}`;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** Older API answers (no reason, no note): say only what the coverage block supports. */
|
|
169
|
+
function legacyWhy(r) {
|
|
170
|
+
const cov = r.coverage;
|
|
134
171
|
if (!cov?.reporter)
|
|
135
|
-
return "this reporter is not
|
|
172
|
+
return "The register cannot see this citation: the reporter is not held.";
|
|
173
|
+
const vol = `${cov.reporter} volume ${cov.volume ?? "?"}`;
|
|
136
174
|
if (cov.beyond_max && cov.max_volume !== undefined)
|
|
137
|
-
return `${
|
|
138
|
-
if (cov.
|
|
139
|
-
return `
|
|
140
|
-
|
|
175
|
+
return `${vol} is newer than the register, which runs to volume ${cov.max_volume}.`;
|
|
176
|
+
if (cov.register_coverage === "volume_absent")
|
|
177
|
+
return `No part of ${vol} is held.`;
|
|
178
|
+
if (r.status === "not_found")
|
|
179
|
+
return `${vol} is held but has no case at this page.`;
|
|
180
|
+
return `${vol} is held, but this citation could not be attached to a case.`;
|
|
141
181
|
}
|
|
142
182
|
/** The coverage of the volume that was asked for, so a not_found inside a thin volume reads as the weak claim it is. */
|
|
143
183
|
function describeCoverage(cov) {
|
|
@@ -147,4 +187,8 @@ function describeCoverage(cov) {
|
|
|
147
187
|
const runs = cov.max_volume !== undefined ? `; the register runs to ${cov.reporter} volume ${cov.max_volume}` : "";
|
|
148
188
|
return held ? `Register coverage: ${held}${runs}.` : undefined;
|
|
149
189
|
}
|
|
190
|
+
function sentence(text) {
|
|
191
|
+
const t = text.trim();
|
|
192
|
+
return /[.!?]$/.test(t) ? t : `${t}.`;
|
|
193
|
+
}
|
|
150
194
|
//# sourceMappingURL=resolve_format.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve_format.js","sourceRoot":"","sources":["../src/resolve_format.ts"],"names":[],"mappings":"AAEA,8IAA8I;AAC9I,MAAM,CAAC,MAAM,WAAW,GAAkC;IACxD,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,qBAAqB;IAChC,YAAY,EAAE,eAAe;IAC7B,eAAe,EAAE,eAAe;IAChC,UAAU,EAAE,gBAAgB;IAC5B,YAAY,EAAE,eAAe;IAC7B,QAAQ,EAAE,wBAAwB;CACnC,CAAC;AAEF,4HAA4H;AAC5H,MAAM,UAAU,aAAa,CAAC,CAAgB;IAC5C,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IACjB,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,IAAI,MAAM,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3E,IAAI,CAAC,CAAC,GAAG;YAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtG,CAAC;IACD,MAAM,GAAG,GAAG,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,CAAC,kBAAkB;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,iBAAiB,CAAC,CAAgB;IAChD,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC;IACpC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,YAAY,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,IAAK,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,qBAAqB,WAAW,CAAC,CAAC,CAAC,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAChL,KAAK,WAAW;YACd,OAAO,gBAAgB,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC3F,KAAK,WAAW;YACd,OAAO,
|
|
1
|
+
{"version":3,"file":"resolve_format.js","sourceRoot":"","sources":["../src/resolve_format.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
2
2
|
import { type Client } from "./client.js";
|
|
3
3
|
import { type Config } from "./config.js";
|
|
4
4
|
export declare const SERVER_NAME = "proofread-mcp";
|
|
5
|
-
export declare const SERVER_VERSION = "0.1.
|
|
5
|
+
export declare const SERVER_VERSION = "0.1.3";
|
|
6
6
|
export declare const INSTRUCTIONS: string;
|
|
7
7
|
export interface ServerOptions {
|
|
8
8
|
config?: Config;
|
package/dist/server.js
CHANGED
|
@@ -3,7 +3,7 @@ import { createClient } from "./client.js";
|
|
|
3
3
|
import { configFromEnv } from "./config.js";
|
|
4
4
|
import { tools } from "./tools/index.js";
|
|
5
5
|
export const SERVER_NAME = "proofread-mcp";
|
|
6
|
-
export const SERVER_VERSION = "0.1.
|
|
6
|
+
export const SERVER_VERSION = "0.1.3";
|
|
7
7
|
export const INSTRUCTIONS = "proofread.law checks US case citations against an open register of about 10 million court opinions. " +
|
|
8
8
|
"Tiers: red = check this (the register holds something concrete that disagrees), orange = cannot verify (nothing to check against; not evidence either way), " +
|
|
9
9
|
"green = found, white = deep check (does the opinion support the sentence; a review queue, not a verdict). " +
|
package/dist/types.d.ts
CHANGED
|
@@ -115,6 +115,9 @@ export interface ResolveResult {
|
|
|
115
115
|
candidates: ResolveCase[];
|
|
116
116
|
coverage: ResolveCoverage | null;
|
|
117
117
|
match?: "exact" | "pincite";
|
|
118
|
+
/** On unverifiable, beyond_register and not_found: why, and a ready sentence. Older API answers carry neither. */
|
|
119
|
+
reason?: "recent" | "volume_thin" | "reporter_absent" | "volume_newer_than_register" | "page_absent" | string;
|
|
120
|
+
note?: string;
|
|
118
121
|
known_as?: {
|
|
119
122
|
name: string;
|
|
120
123
|
year?: number;
|
package/package.json
CHANGED