omitly-mcp 5.4.0 → 5.5.0

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.
@@ -0,0 +1,364 @@
1
+ /**
2
+ * omitly#1841 phase B: the child process that does ALL the pdf-lib work of the
3
+ * five page tools (design 4.2), so a hostile PDF can hang or crash this process
4
+ * and nothing else.
5
+ *
6
+ * Protocol: one JSON line on stdin (the request), one JSON line on stdout (the
7
+ * response, at most 1 MiB, never PDF bytes). The child takes ALL its settings from
8
+ * the request (the server starts it with an empty environment). It writes only
9
+ * the temp names the server issued, create-exclusive, under the output folder the
10
+ * server confined. It never places a final file; the server does.
11
+ *
12
+ * Lifetime: the pdf-lib work runs in a `worker_thread`; this process's main thread
13
+ * stays free so that it can (a) exit when stdin ends, which is how a child dies
14
+ * with the server even while pdf-lib is stuck in a synchronous loop, and (b) exit
15
+ * on its own at `timeoutMs` + 5 s.
16
+ *
17
+ * One file serves both roles: the entry point in the child process, and the
18
+ * script of the worker thread. Importing it (tests) runs neither.
19
+ */
20
+ import { closeSync, fstatSync, openSync, readFileSync, realpathSync, unlinkSync, writeSync } from "node:fs";
21
+ import * as path from "node:path";
22
+ import { Worker, isMainThread, parentPort, workerData } from "node:worker_threads";
23
+ import { fileURLToPath, pathToFileURL } from "node:url";
24
+ import { composePages, extractPagesTo, openRangeExtractor } from "./compose.js";
25
+ import { isEncryptedError } from "./docFacts.js";
26
+ import { pdfInfo } from "./info.js";
27
+ import { mergePdfs } from "./merge.js";
28
+ import { EditRefusal } from "./refusals.js";
29
+ export const TEMP_NAME = /^\.omitly-tmp-[0-9a-f]{16}-[0-9]{1,3}\.pdf$/;
30
+ export const MAX_REQUEST_BYTES = 1024 * 1024;
31
+ export const MAX_RESPONSE_BYTES = 1024 * 1024;
32
+ const MAX_PAGES = 10_000;
33
+ const fail = (code, extra = {}) => ({
34
+ v: 1,
35
+ ok: false,
36
+ code,
37
+ ...extra,
38
+ });
39
+ function isIntArray(v, min, max) {
40
+ return Array.isArray(v) && v.length <= MAX_PAGES && v.every((n) => Number.isInteger(n) && n >= min && n <= max);
41
+ }
42
+ function parseRequest(raw) {
43
+ const r = raw;
44
+ if (!r || typeof r !== "object" || r.v !== 1)
45
+ return null;
46
+ if (!["info", "merge", "extract", "split", "compose"].includes(r.op))
47
+ return null;
48
+ if (!Array.isArray(r.inputs) || r.inputs.length < 1 || r.inputs.length > 50)
49
+ return null;
50
+ if (!r.inputs.every((p) => typeof p === "string" && path.isAbsolute(p)))
51
+ return null;
52
+ if (r.op !== "merge" && r.inputs.length !== 1)
53
+ return null;
54
+ if (typeof r.outDir !== "string" || !path.isAbsolute(r.outDir))
55
+ return null;
56
+ if (!Array.isArray(r.temps) || r.temps.length > 100 || !r.temps.every((t) => typeof t === "string" && TEMP_NAME.test(t)))
57
+ return null;
58
+ const caps = r.caps;
59
+ if (!caps || !Number.isSafeInteger(caps.perFileBytes) || !Number.isSafeInteger(caps.totalBytes) || caps.perFileBytes < 1 || caps.totalBytes < 1)
60
+ return null;
61
+ if (!Number.isSafeInteger(r.timeoutMs) || r.timeoutMs < 1)
62
+ return null;
63
+ return r;
64
+ }
65
+ /** Writes one temp file the server issued: create-exclusive, size-capped while writing. */
66
+ function writeTemp(req, index, bytes, written) {
67
+ const temp = req.temps[index];
68
+ if (temp === undefined)
69
+ throw new EditRefusal("failed");
70
+ if (bytes.length > req.caps.totalBytes || written.total + bytes.length > req.caps.totalBytes) {
71
+ throw new EditRefusal("output_too_large");
72
+ }
73
+ const file = path.join(req.outDir, temp);
74
+ // The server passes the folder as a confined REAL path. If it is not one any more (swapped
75
+ // for a symlink since), write nothing. A swap between this check and the open below remains
76
+ // possible and is a stated residual (see edit-tools.ts); hostile local users are out of scope.
77
+ try {
78
+ if (realpathSync(req.outDir) !== req.outDir)
79
+ throw new EditRefusal("failed");
80
+ }
81
+ catch {
82
+ throw new EditRefusal("failed");
83
+ }
84
+ let fd;
85
+ try {
86
+ fd = openSync(file, "wx", 0o600);
87
+ }
88
+ catch {
89
+ throw new EditRefusal("write_failed");
90
+ }
91
+ try {
92
+ const CHUNK = 1024 * 1024;
93
+ let off = 0;
94
+ while (off < bytes.length) {
95
+ const n = Math.min(CHUNK, bytes.length - off);
96
+ if (written.total + n > req.caps.totalBytes)
97
+ throw new EditRefusal("output_too_large");
98
+ writeSync(fd, bytes, off, n);
99
+ off += n;
100
+ written.total += n;
101
+ }
102
+ closeSync(fd);
103
+ }
104
+ catch (e) {
105
+ try {
106
+ closeSync(fd);
107
+ }
108
+ catch {
109
+ /* already closed */
110
+ }
111
+ try {
112
+ unlinkSync(file);
113
+ }
114
+ catch {
115
+ /* the server removes issued names too */
116
+ }
117
+ throw e instanceof EditRefusal ? e : new EditRefusal("write_failed");
118
+ }
119
+ return { temp, byteSize: bytes.length };
120
+ }
121
+ /** Open an input for reading, but only if it is still the confined REAL path the server passed:
122
+ * a path that has since become (or sits behind) a symlink is refused, as for the output folder.
123
+ * A swap between this check and the open remains possible (stated residual, edit-tools.ts). */
124
+ function openInput(p) {
125
+ let same = false;
126
+ try {
127
+ same = realpathSync(p) === p;
128
+ }
129
+ catch {
130
+ same = false;
131
+ }
132
+ if (!same)
133
+ throw new EditRefusal("failed");
134
+ return openSync(p, "r");
135
+ }
136
+ /** Open, check and read one input. The server confined the path; this re-reads it. */
137
+ function readInput(req, index) {
138
+ const inputIndex = req.op === "merge" ? index + 1 : undefined;
139
+ const fd = openInput(req.inputs[index]);
140
+ try {
141
+ const st = fstatSync(fd);
142
+ if (!st.isFile())
143
+ throw new EditRefusal("not_a_file", { inputIndex });
144
+ if (st.size > req.caps.perFileBytes)
145
+ throw new EditRefusal("too_large", { inputIndex });
146
+ const bytes = readFileSync(fd);
147
+ if (!bytes.subarray(0, 1024).includes("%PDF-"))
148
+ throw new EditRefusal("not_pdf", { inputIndex });
149
+ return bytes;
150
+ }
151
+ finally {
152
+ closeSync(fd);
153
+ }
154
+ }
155
+ /** Size and type checks for every input BEFORE any is read (merge: the total). */
156
+ function checkInputs(req) {
157
+ let total = 0;
158
+ req.inputs.forEach((p, i) => {
159
+ const inputIndex = req.op === "merge" ? i + 1 : undefined;
160
+ let fd;
161
+ try {
162
+ fd = openInput(p);
163
+ }
164
+ catch (e) {
165
+ if (e instanceof EditRefusal)
166
+ throw e; // not a confined real path any more: `failed`
167
+ throw new EditRefusal("not_a_file", { inputIndex });
168
+ }
169
+ try {
170
+ const st = fstatSync(fd);
171
+ if (!st.isFile())
172
+ throw new EditRefusal("not_a_file", { inputIndex });
173
+ if (st.size > req.caps.perFileBytes)
174
+ throw new EditRefusal("too_large", { inputIndex });
175
+ total += st.size;
176
+ if (req.op === "merge" && total > req.caps.totalBytes)
177
+ throw new EditRefusal("too_large", { inputIndex });
178
+ }
179
+ finally {
180
+ closeSync(fd);
181
+ }
182
+ });
183
+ }
184
+ const FIXED_ROTATIONS = new Set([0, 90, 180, 270]);
185
+ function parseCompose(params) {
186
+ const layout = params?.layout;
187
+ if (!Array.isArray(layout) || layout.length < 1 || layout.length > MAX_PAGES)
188
+ return null;
189
+ const out = [];
190
+ for (const e of layout) {
191
+ if (e && typeof e === "object" && "blank" in e) {
192
+ if (e.blank !== true || !["previous", "A4", "Letter"].includes(e.size))
193
+ return null;
194
+ out.push({ blank: true, size: e.size });
195
+ }
196
+ else if (e && Number.isInteger(e.source) && e.source >= 1 && e.source <= 1e9 && FIXED_ROTATIONS.has(e.rotate)) {
197
+ out.push({ source: e.source, rotate: e.rotate });
198
+ }
199
+ else
200
+ return null;
201
+ }
202
+ return out;
203
+ }
204
+ /** Runs one request. Never throws a message out: every failure is a code. */
205
+ export async function runRequest(req) {
206
+ try {
207
+ checkInputs(req);
208
+ const written = { total: 0 };
209
+ const params = req.params;
210
+ switch (req.op) {
211
+ case "info": {
212
+ const info = await pdfInfo(readInput(req, 0));
213
+ return { v: 1, ok: true, meta: { info }, parts: [], warnings: [], lost: [] };
214
+ }
215
+ case "merge": {
216
+ if (req.temps.length !== 1)
217
+ return fail("failed");
218
+ const r = await mergePdfs(req.inputs.length, (i) => readInput(req, i));
219
+ const part = writeTemp(req, 0, r.bytes, written);
220
+ return { v: 1, ok: true, meta: { pageCount: r.pageCount, pageCounts: r.pageCounts }, parts: [part], warnings: r.warnings, lost: r.lost };
221
+ }
222
+ case "extract": {
223
+ if (req.temps.length !== 1 || !isIntArray(params?.pages, 0, 1e9) || params.pages.length < 1)
224
+ return fail("failed");
225
+ const r = await extractPagesTo(readInput(req, 0), params.pages);
226
+ const part = writeTemp(req, 0, r.bytes, written);
227
+ return { v: 1, ok: true, meta: { pageCount: r.pageCount }, parts: [part], warnings: r.warnings, lost: r.lost };
228
+ }
229
+ case "split": {
230
+ const ranges = params?.ranges;
231
+ if (!Array.isArray(ranges) || ranges.length < 1 || ranges.length !== req.temps.length)
232
+ return fail("failed");
233
+ let total = 0;
234
+ for (const r of ranges) {
235
+ if (!isIntArray(r, 0, 1e9) || r.length < 1)
236
+ return fail("failed");
237
+ total += r.length;
238
+ }
239
+ if (total > MAX_PAGES)
240
+ return fail("too_many_pages");
241
+ const bytes = readInput(req, 0);
242
+ const parts = [];
243
+ const pageCounts = [];
244
+ const lost = new Set();
245
+ const warnings = new Set();
246
+ // Parsed once; each range is a full default-deny extraction from that parse.
247
+ const extractor = await openRangeExtractor(bytes);
248
+ for (let i = 0; i < ranges.length; i++) {
249
+ const r = await extractor.extract(ranges[i]);
250
+ parts.push(writeTemp(req, i, r.bytes, written));
251
+ pageCounts.push(r.pageCount);
252
+ r.lost.forEach((l) => lost.add(l));
253
+ r.warnings.forEach((w) => warnings.add(w));
254
+ }
255
+ return { v: 1, ok: true, meta: { pageCounts }, parts, warnings: [...warnings], lost: [...lost] };
256
+ }
257
+ case "compose": {
258
+ const layout = parseCompose(params);
259
+ if (!layout || req.temps.length !== 1)
260
+ return fail("failed");
261
+ const r = await composePages(readInput(req, 0), layout);
262
+ const part = writeTemp(req, 0, r.bytes, written);
263
+ return { v: 1, ok: true, meta: { pageCount: r.pageCount, layout: r.layout }, parts: [part], warnings: r.warnings, lost: r.lost };
264
+ }
265
+ }
266
+ }
267
+ catch (e) {
268
+ if (e instanceof EditRefusal) {
269
+ const d = e.detail;
270
+ return fail(e.code, {
271
+ ...(typeof d.item === "number" ? { item: d.item } : {}),
272
+ ...(d.pageCount !== undefined ? { pageCount: d.pageCount } : {}),
273
+ ...(d.inputIndex !== undefined ? { inputIndex: d.inputIndex } : {}),
274
+ });
275
+ }
276
+ if (isEncryptedError(e))
277
+ return fail("encrypted");
278
+ return fail("failed");
279
+ }
280
+ }
281
+ // ---------------------------------------------------------------------------
282
+ // Process roles
283
+ // ---------------------------------------------------------------------------
284
+ const SELF = fileURLToPath(import.meta.url);
285
+ function isEntry() {
286
+ const entry = process.argv[1];
287
+ if (entry === undefined)
288
+ return false;
289
+ try {
290
+ return import.meta.url === pathToFileURL(realpathSync(entry)).href;
291
+ }
292
+ catch {
293
+ return false;
294
+ }
295
+ }
296
+ function heapLimitMb() {
297
+ for (const a of process.execArgv) {
298
+ const m = /^--max-old-space-size=(\d+)$/.exec(a);
299
+ if (m)
300
+ return Number(m[1]);
301
+ }
302
+ return undefined;
303
+ }
304
+ function respondAndExit(resp, code) {
305
+ let line = JSON.stringify(resp) + "\n";
306
+ if (Buffer.byteLength(line) > MAX_RESPONSE_BYTES)
307
+ line = JSON.stringify(fail("failed")) + "\n";
308
+ process.stdout.write(line, () => process.exit(code));
309
+ }
310
+ function childMain() {
311
+ let buf = "";
312
+ let started = false;
313
+ // Tied to the server: when its end of stdin closes, so do we.
314
+ process.stdin.on("end", () => process.exit(0));
315
+ process.stdin.on("close", () => process.exit(0));
316
+ process.stdin.on("error", () => process.exit(0));
317
+ process.stdin.setEncoding("utf8");
318
+ process.stdin.on("data", (chunk) => {
319
+ if (started)
320
+ return;
321
+ buf += chunk;
322
+ if (buf.length > MAX_REQUEST_BYTES)
323
+ return respondAndExit(fail("failed"), 3);
324
+ const nl = buf.indexOf("\n");
325
+ if (nl === -1)
326
+ return;
327
+ started = true;
328
+ let req = null;
329
+ try {
330
+ req = parseRequest(JSON.parse(buf.slice(0, nl)));
331
+ }
332
+ catch {
333
+ req = null;
334
+ }
335
+ if (!req)
336
+ return respondAndExit(fail("failed"), 3);
337
+ // The child's own backstop, in case the server is gone and stdin never ends.
338
+ setTimeout(() => process.exit(2), req.timeoutMs + 5000);
339
+ const mb = heapLimitMb();
340
+ let answered = false;
341
+ const worker = new Worker(SELF, {
342
+ workerData: req,
343
+ ...(mb ? { resourceLimits: { maxOldGenerationSizeMb: mb } } : {}),
344
+ });
345
+ worker.on("message", (resp) => {
346
+ answered = true;
347
+ respondAndExit(resp, 0);
348
+ });
349
+ worker.on("error", () => process.exit(1));
350
+ worker.on("exit", () => {
351
+ if (!answered)
352
+ process.exit(1);
353
+ });
354
+ });
355
+ }
356
+ if (isMainThread) {
357
+ if (isEntry())
358
+ childMain();
359
+ }
360
+ else if (parentPort) {
361
+ const port = parentPort;
362
+ runRequest(workerData).then((resp) => port.postMessage(resp), () => port.postMessage(fail("failed")));
363
+ }
364
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/pdf-edit/worker.ts"],"names":[],"mappings":"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"}
package/dist/usage.js CHANGED
@@ -36,6 +36,8 @@ import { chmodSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
36
36
  import { randomUUID } from "node:crypto";
37
37
  import * as os from "node:os";
38
38
  import * as path from "node:path";
39
+ /** Marketing-site URL carrying the acquisition tag the website records as source "mcp" (omitly#1854). Every user-facing link from this package to omitly.app uses it. */
40
+ export const OMITLY_SITE_URL = "https://omitly.app/?via=mcp";
39
41
  export const DEFAULT_FREE_CAP = 10;
40
42
  export function stateDir() {
41
43
  return process.env.OMITLY_STATE_DIR || path.join(os.homedir(), ".omitly");
@@ -149,7 +151,7 @@ export function freeCapRefusal(tool, o) {
149
151
  cap: o.cap,
150
152
  message: `Free-tier limit reached: ${o.cap} free redaction checks per month, counted locally on this machine (nothing is uploaded). ` +
151
153
  `The count resets next month. For unlimited checking — plus actual removal, independent verification and a tamper-evident certificate — ` +
152
- `activate the Omitly engine: https://omitly.app. verify_redaction remains free and uncapped. verify_seal needs the native engine.`,
154
+ `activate the Omitly engine: ${OMITLY_SITE_URL} \u2014 verify_redaction remains free and uncapped. verify_seal needs the native engine.`,
153
155
  };
154
156
  }
155
157
  /** One-line banner prepended to every free (unlicensed, wasm-served) leak
package/dist/usage.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omitly-mcp",
3
- "version": "5.4.0",
3
+ "version": "5.5.0",
4
4
  "type": "module",
5
5
  "description": "Model Context Protocol server exposing Omitly's local, verifiable PDF redaction to AI agents. Redaction runs on-device — documents are never uploaded.",
6
6
  "keywords": [
@@ -15,7 +15,7 @@
15
15
  "privacy"
16
16
  ],
17
17
  "license": "SEE LICENSE IN LICENSE",
18
- "homepage": "https://omitly.app/pdf-redaction-mcp",
18
+ "homepage": "https://omitly.app/pdf-redaction-mcp/?via=mcp",
19
19
  "mcpName": "io.github.omitly/omitly-mcp",
20
20
  "repository": {
21
21
  "type": "git",
@@ -39,6 +39,7 @@
39
39
  "start": "node dist/index.js",
40
40
  "dev": "tsc --watch",
41
41
  "test": "npm run build:wasm && tsc && node --test \"dist/**/*.test.js\"",
42
+ "fuzz": "node fuzz/edit-tools.fuzz.mjs",
42
43
  "prepublishOnly": "npm run build",
43
44
  "mcpb:prep": "npm run build:wasm && node mcpb/scripts/copy-wasm.mjs && cp LICENSE mcpb/LICENSE && npm --prefix mcpb ci",
44
45
  "mcpb:validate": "npx -y @anthropic-ai/mcpb@2.1.2 validate mcpb/manifest.json",
@@ -46,6 +47,7 @@
46
47
  },
47
48
  "dependencies": {
48
49
  "@modelcontextprotocol/sdk": "^1.32.1",
50
+ "pdf-lib": "1.17.1",
49
51
  "zod": "^4.6.7"
50
52
  },
51
53
  "devDependencies": {
package/skill/SKILL.md CHANGED
@@ -19,7 +19,7 @@ and are trivially recoverable. These tools find what is still there, on the
19
19
  user's machine, and report it without ever showing the raw value. This skill
20
20
  diagnoses. It does not remove data unless a native Omitly engine is configured
21
21
  (see "Redacting"), which the public install does not include; removal for real,
22
- with a tamper-evident audit seal, is the Omitly desktop app (https://omitly.app).
22
+ with a tamper-evident audit seal, is the Omitly desktop app (https://omitly.app/?via=mcp).
23
23
 
24
24
  ## Hard rules
25
25
 
@@ -139,5 +139,5 @@ user: "I redacted this in Preview — can I send it to the other side?"
139
139
  → say plainly: do not send until this is fixed; the image-only page needs the
140
140
  desktop app (it can OCR scanned pages) or a person
141
141
  → hand off: removal for real, with a tamper-evident audit seal, is the Omitly
142
- desktop app — https://omitly.app
142
+ desktop app — https://omitly.app/?via=mcp
143
143
  ```
Binary file