omitly-mcp 5.3.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/seal.js CHANGED
@@ -20,6 +20,7 @@ export const SEAL_VERDICTS = [
20
20
  * is accepted only when it equals this exact text, so an engine response can
21
21
  * never smuggle other text into this field. */
22
22
  export const SEAL_ERA_V1_LABEL = "classical-era seal (v1)";
23
+ export const SEAL_KEY_KINDS = ["one_time", "install"];
23
24
  /** omitly#1104: spec §5's overall statuses. */
24
25
  export const AUDIT_V2_OVERALLS = [
25
26
  "pass",
@@ -126,6 +127,13 @@ export function normalizeSealResult(res) {
126
127
  auditV2Recognized: bool(res.auditV2Recognized) ?? false,
127
128
  auditV2ValidationError: str(res.auditV2ValidationError),
128
129
  ...v2,
130
+ // Only beside a v2 report that passed every gate (`auditV2Overall`
131
+ // non-null) over a valid seal; anything else is no claim.
132
+ sealKeyKind: v2.auditV2Overall !== null &&
133
+ verdict !== "seal_invalid" &&
134
+ SEAL_KEY_KINDS.includes(res.sealKeyKind)
135
+ ? res.sealKeyKind
136
+ : null,
129
137
  sealRemoved: res.sealRemoved === true &&
130
138
  verdictRecognized &&
131
139
  (verdict === "seal_invalid" || v2.userVerdict === "cannot_verify"),
@@ -136,6 +144,13 @@ export function normalizeSealResult(res) {
136
144
  export function sealEraLine(res) {
137
145
  return res.sealEraLabel === null ? "" : `\nSeal format: ${res.sealEraLabel}`;
138
146
  }
147
+ /** omitly#1792: the key line printed under a summary, or "" unless the
148
+ * verified seal key is a one-time key. Same wording on every surface. */
149
+ export function sealKeyLine(res) {
150
+ return res.sealKeyKind === "one_time"
151
+ ? "\nSeal key: one-time key — there is no known fingerprint to compare it with."
152
+ : "";
153
+ }
139
154
  /** omitly#1593: the summary line for a removed seal (engine omitly#1591). */
140
155
  export const SEAL_REMOVED_SUMMARY = "⚠️ Seal removed — this file carries a sealed Omitly audit report but no seal: it was " +
141
156
  "re-saved or changed after it was sealed (often by opening and saving it in another app). " +
package/dist/seal.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"seal.js","sourceRoot":"","sources":["../src/seal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seal.js","sourceRoot":"","sources":["../src/seal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * omitly#1641 option (a): serve the shipped Claude skill as an MCP prompt.
3
+ *
4
+ * `skill/SKILL.md` is in every npm tarball (package.json `files`) and is the
5
+ * same file the Claude Code plugin installs, but before this the server never
6
+ * read it, so a Claude Desktop / Cursor / any-MCP-client user had no way to
7
+ * find it. Exposing it as a prompt puts it in the client's own prompt picker.
8
+ *
9
+ * The prompt is READ from the shipped file at runtime, never copied into code,
10
+ * so there is one source of truth: editing SKILL.md changes the prompt, and
11
+ * `skill-prompt.test.ts` asserts the served text equals the file's body.
12
+ *
13
+ * Fail-soft by design: the prompt is a convenience, so a missing or malformed
14
+ * skill file (a dev tree, a repackaged install) skips the prompt with one
15
+ * stderr line and never stops the tools from registering.
16
+ */
17
+ import { readFileSync } from "node:fs";
18
+ import { z } from "zod";
19
+ export const SKILL_PROMPT_NAME = "omitly-redaction";
20
+ /** Where the shipped skill lives relative to the built `dist/` module. */
21
+ export const SKILL_URL = new URL("../skill/SKILL.md", import.meta.url);
22
+ /**
23
+ * Split a SKILL.md into its frontmatter `name` / `description` and its body.
24
+ * Only the two keys the prompt needs are read; `description` may be a YAML
25
+ * folded block (`>-`), which is all the shipped file uses. Returns undefined
26
+ * for anything that does not look like a skill, so the caller can skip.
27
+ */
28
+ export function parseSkill(text) {
29
+ const m = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/.exec(text);
30
+ if (!m)
31
+ return undefined;
32
+ const [, front, rest] = m;
33
+ const lines = front.split(/\r?\n/);
34
+ let name = "";
35
+ let description = "";
36
+ for (let i = 0; i < lines.length; i++) {
37
+ const kv = /^([A-Za-z_-]+):\s*(.*)$/.exec(lines[i]);
38
+ if (!kv)
39
+ continue;
40
+ const [, key, value] = kv;
41
+ let v = value.trim();
42
+ if (/^[>|][+-]?$/.test(v)) {
43
+ const block = [];
44
+ while (i + 1 < lines.length && /^\s+\S/.test(lines[i + 1]))
45
+ block.push(lines[++i].trim());
46
+ v = block.join(" ");
47
+ }
48
+ else {
49
+ v = v.replace(/^(["'])(.*)\1$/, "$2");
50
+ }
51
+ if (key === "name")
52
+ name = v;
53
+ if (key === "description")
54
+ description = v;
55
+ }
56
+ // Drop HTML comments: they are maintainer notes (claims-lint suppressions
57
+ // citing internal issues), invisible in a rendered skill, and must not be
58
+ // sent to a customer's model as prompt text.
59
+ const body = rest
60
+ .replace(/^[ \t]*<!--[\s\S]*?-->[ \t]*\r?\n/gm, "")
61
+ .replace(/<!--[\s\S]*?-->/g, "")
62
+ .trim();
63
+ if (!name || !description || !body)
64
+ return undefined;
65
+ return { name, description, body };
66
+ }
67
+ /** Read and parse the shipped skill; undefined if absent or malformed. */
68
+ export function loadShippedSkill(url = SKILL_URL) {
69
+ let text;
70
+ try {
71
+ text = readFileSync(url, "utf8");
72
+ }
73
+ catch {
74
+ return undefined;
75
+ }
76
+ return parseSkill(text);
77
+ }
78
+ /**
79
+ * Register the skill as the `omitly-redaction` prompt. Returns whether it was
80
+ * registered. The optional `pdfPath` argument is appended as plain text for
81
+ * the model; it is NOT a tool input, so it is not confined here — any tool the
82
+ * model then calls with it goes through paths.ts as usual.
83
+ */
84
+ export function registerSkillPrompt(server, url = SKILL_URL) {
85
+ const skill = loadShippedSkill(url);
86
+ if (!skill) {
87
+ console.error(`[omitly-mcp] skill prompt not registered: ${url.pathname} missing or not a SKILL.md`);
88
+ return false;
89
+ }
90
+ server.registerPrompt(SKILL_PROMPT_NAME, {
91
+ title: "Check a PDF before it leaves the machine",
92
+ description: skill.description,
93
+ argsSchema: {
94
+ pdfPath: z
95
+ .string()
96
+ .optional()
97
+ .describe("Local path of the PDF to check (optional; you will be asked if omitted)"),
98
+ },
99
+ }, ({ pdfPath }) => {
100
+ const p = pdfPath?.trim();
101
+ const text = p
102
+ ? `${skill.body}\n\n---\n\nThe user wants this local PDF checked: ${p}`
103
+ : skill.body;
104
+ return { messages: [{ role: "user", content: { type: "text", text } }] };
105
+ });
106
+ return true;
107
+ }
108
+ //# sourceMappingURL=skill-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-prompt.js","sourceRoot":"","sources":["../src/skill-prompt.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. Verification tools (verify_redaction, verify_seal) remain free and uncapped.`,
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.3.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": {