omitly-mcp
OfficialClick on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@omitly-mcpFind and redact all emails and phone numbers in my PDF"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
omitly-mcp
A Model Context Protocol server that exposes Omitly's local, verifiable PDF redaction to AI agents (Claude Code, Claude Desktop, and any other MCP client).
Repository scope and licence — please read before opening a PR.
This repository is source-available, not open source. See
LICENSE: the code is published so you can read exactly what runs on your machine before you let it touch a confidential document. It is not licensed for reuse in other projects.It contains the MCP server and the compiled wasm detection bundle. The Omitly redaction engine, the tamper-evidence seal and the licensing implementation are not in this repository and are developed privately; this code calls the engine, it does not contain it.
Development happens in a private repository and is mirrored here on release, so pull requests cannot be merged. Issues and security reports are very welcome — see
SECURITY.md.
The point of difference: an agent can redact a document without uploading it anywhere. Redaction runs on-device through the Omitly engine and returns a signed audit log proving the data was removed — the opposite of pasting a confidential file into a chat model.
Five of the eleven tools (find_sensitive_regions, locate_text,
check_redaction, verify_redaction, extract_pdf_text) work out of the
box — npm install, no Rust toolchain, no native binary, no desktop app.
They run on a wasm-bindgen build of the same detector that powers the web
leak-checker at omitly.app, bundled directly in this package. create_pdf,
the two write tools (redact_pdf, redact_by_entity), and the two
seal-verification tools (verify_seal, verify_document) still need a
configured native engine — see "Build & run" below. Neither seal tool has a
wasm fallback yet: there is no wasm seal-verification path (tracked in
issue #113), so both always require the native engine, even though checking
a seal needs no licence.
Tools
Tool | What it does |
| Scans a PDF on-device and returns PII candidates — email/SSN/phone/card plus Australian identifiers (TFN, ABN, ACN, Medicare, Centrelink CRN, IHI, BSB; check-digit validated where a published algorithm exists) — with page + exact coordinates, so the agent selects by entity and never guesses geometry. Best-effort pattern matching, not a compliance assessment. Optional |
| Resolves literal strings the model supplies (names, addresses — anything regex can't catch) to their page + coordinates. The model does the recognition; the engine does the geometry. |
| Audits an ALREADY-redacted PDF and reports whether sensitive text still survives underneath the redaction marks, in prior incremental-update revisions, metadata, AcroForm fields, or attachments — the "did my black boxes actually remove the data?" check, with a coverage report scoping what was inspected. Free tier (wasm) is EVALUATION-marked and capped to a monthly number of free checks; a configured licensed engine is not capped. |
| Extracts a PDF's full text, page by page, PII-MASKED BY DEFAULT so raw sensitive values never flood the model's context window. Each page's |
| One-shot: find + filter by kind ( |
| Removes the underlying data from given regions of a PDF, verifies nothing survives, writes the redacted file, and returns the audit log. |
| Re-scans an already-redacted PDF and returns the verification verdict — the redaction-completeness check. |
| Cryptographically checks a PDF's embedded Omitly audit report and trailing Ed25519 tamper-evidence seal — the tamper-evidence check, distinct from |
| Recipient trust-verification (omitly#113): the same seal/report check as |
| Generates a clean PDF from Markdown/HTML on-device, rendered through a real browser engine so it looks printed — instead of writing a throwaway reportlab/LaTeX script. |
| Reports the current licence or trial state — tier, trial days left, the vendor-signed licensee name, which resolution step supplied the licence, and whether it is bound to this machine. Free, takes no arguments, reads no document, and is re-resolved on every call so buy → save licence → call again works without a restart. Never returns the device fingerprint or the licence file's contents — device binding is a yes/no. Requires a native engine: the wasm free tier has no licence concept. |
Related MCP server: PDF Redaction MCP Server
PDF generation (create_pdf)
create_pdf is served by a separate binary, omitly-pdf (in
crates/omitly-pdf), kept apart from the redaction engine because generation is
a different trust model from verifiable redaction. It renders Markdown (or raw
HTML) through a headless Chromium-family browser (Chrome/Chromium/Edge/Brave;
override with OMITLY_BROWSER_BIN) — the same engine family the Omitly app's
webview uses, so output looks printed rather than script-generated. omitly-pdf
ships with the Omitly desktop application; its source is not in this repository.
Point OMITLY_PDF_BIN at the binary to enable this tool.
// stdin
{ "command": "create", "outputPath": "/abs/out.pdf",
"source": "# Hello\n\nBody **markdown**", "format": "markdown", "title": "Hello" }
// stdout
{ "ok": true, "output": "/abs/out.pdf" }Typical agent flows:
Quick:
redact_by_entity(find + redact + verify in one call).Careful:
find_sensitive_regions/locate_text→ review →redact_pdf→verify_redaction. Coordinates fromfind/locatedrop straight intoredactas itsregionsargument.
See DEMO.md for a full Claude Code walkthrough.
Status
The MCP surface (eleven tools, schemas, transport), the native engine binary
(crates/omitly-cli, built as omitly-redact), and the bundled wasm engine
(crates/leakcheck-wasm, covering the four free tools without a native
binary) are all implemented and pass end-to-end tests. find_sensitive_regions
is a first-pass detector (ASCII patterns, per-show-operator matching): treat
its hits as candidates for review, not a completeness guarantee. An LLM can
always supply additional regions directly.
Privacy of findings. Detection results are returned with a masked
preview (e.g. •••-••-6789), never the raw value. The file isn't uploaded and
the secret detected inside it isn't sent back through the model — redaction is
driven entirely by page + coordinates, so the plaintext stays on the machine.
Engine contract (implemented in crates/omitly-cli)
The server spawns OMITLY_REDACT_BIN, writes a JSON request to stdin, and reads
a JSON response from stdout. Any failure returns { "ok": false, "error": "..." }
(the process still exits 0, so the caller reads ok rather than the exit code).
// stdin
{ "command": "find", "pdfPath": "..." }
// stdout
{ "ok": true, "count": 2, "regions": [
{ "page": 0, "x": 250.4, "y": 610.4, "width": 79.2, "height": 14.4, "kind": "ssn", "preview": "•••-••-6789" } ] }
// `preview` is masked — the raw value never leaves the process; redaction is driven by coordinates.// stdin — "masked" omitted ⇒ true (the default); pass "masked": false for the
// documented raw-text opt-in. "regions" narrows detected kinds (generic
// kinds like email/card always apply).
{ "command": "extract_text", "pdfPath": "..." }
// stdout — "spans" offsets are CHAR (not byte) offsets into "text", valid
// against either the masked or the raw text of the same page (masking never
// changes a page's character count). A page that could not be decoded
// reports "contentDecoded": false with empty text/spans rather than being
// silently skipped.
{ "ok": true, "masked": true, "pages": [
{ "page": 0, "contentDecoded": true,
"text": "Sensitive sample line: SSN •••-••-6789",
"spans": [ { "kind": "ssn", "start": 24, "end": 35 } ] } ] }// stdin
{ "command": "redact", "pdfPath": "...", "outputPath": "...",
"regions": [{ "page": 0, "x": 72, "y": 700, "width": 200, "height": 14, "reason": "PII.SSN" }] }
// stdout — also writes "<outputPath>.audit.json" beside the file
{ "ok": true, "output": "...", "audit": { "verdict": "pass", "regions": [ ... ], "warnings": [], "metadataScrubbed": true } }// stdin — recovers the redacted regions from "<pdfPath>.audit.json"
{ "command": "verify", "pdfPath": "..." }
// stdout — hiddenContent re-checks thumbnails / document actions / embedded
// files on the delivered bytes (omitly#171); any fail flips the verdict
{ "ok": true, "verdict": "pass", "regions": [ ... ], "metadataScrubbed": true,
"hiddenContent": [ { "class": "thumbnails", "verification": { "result": "pass" } }, ... ] }// stdin — checks the embedded audit report + trailing Ed25519 seal, not
// redaction completeness (that's "verify" above)
{ "command": "verify_seal", "pdfPath": "..." }
// stdout — verdict is one of: no_report | seal_invalid |
// seal_unsupported_version | incomplete | verified. seal_unsupported_version
// means this verifier is too old to check the seal at all — sealValid is
// `null` (checked nothing), never true or false; carriesAuditReport flags
// whether the file also carries an Omitly audit report (escalation signal).
{ "ok": true, "verdict": "verified", "sealValid": true, "sealFingerprint": "...",
"allPassed": true, "metadataScrubbed": true, "regionCount": 2, "pageCount": 4,
"warnings": [], "licenseProvenance": null,
"inputSha256": "...", "outputSha256": "...",
"sourceFilename": "...", "outputFilename": "..." }The MCP tool verify_document (omitly#113) shells out to the exact same
verify_seal engine command above — it is the recipient-facing name/wording
for the same seal/report integrity check, not a separate engine command.
Build & run
Free tools only (find_sensitive_regions, locate_text, check_redaction, verify_redaction, extract_pdf_text) — no native engine needed:
cd omitly-mcp
npm install # published releases ship the wasm build already bundled
npm run build # plain tsc; the wasm bundle ships prebuilt in wasm/
node dist/index.jsnpm install omitly-mcp from the registry gets a package with wasm/
already built — a published install never needs Rust.
This repository also ships the compiled wasm bundle in wasm/, alongside
wasm/leakcheck_wasm_bg.wasm.sha256 so you can verify the byte-for-byte
artifact you received. It is the same bundle published in the npm package.
That means npm install && npm run build && npm test works here with no Rust
toolchain: npm run build is plain tsc. The wasm is compiled from the
Omitly detection engine, whose Rust source is not part of this repository
(see "Repository scope" below).
Everything, including create_pdf, verify_seal, verify_document, and
the two write tools (redact_pdf, redact_by_entity): neither seal tool
has a wasm fallback — unlike the five free tools above, they always need the
native engine configured, even though checking a seal carries no licence
requirement (see "Licensing" below).
# Build and start the MCP server (no Rust toolchain needed)
npm install
npm run build
node dist/index.js
# To enable the native-engine tools as well, point at a directory containing
# the Omitly engine binaries (omitly-redact, omitly-pdf). These ship with the
# Omitly desktop application; their source is not in this repository.
OMITLY_ENGINE_DIR=/abs/path/to/engine node dist/index.jsOne env var covers both binaries: OMITLY_ENGINE_DIR is the directory holding
omitly-redact and omitly-pdf. Per-binary overrides (OMITLY_REDACT_BIN,
OMITLY_PDF_BIN) win over the directory when set. When OMITLY_ENGINE_DIR
(or OMITLY_REDACT_BIN) isn't set, find_sensitive_regions, locate_text,
check_redaction, and extract_pdf_text transparently use the bundled wasm
engine instead — same detector, no native binary (extract_pdf_text's
optional regions filter is native-only; wasm scans every pattern and notes
that the filter was ignored). verify_redaction does too, but with a
narrower check: without a native engine there's no <path>.audit.json
sidecar to verify specific regions against, so it falls back to a general
re-scan of the whole file (still useful — a non-empty result still means the
file isn't clean — just not the same rigor as the sidecar-based check).
find/redact need qpdf for the redaction pipeline (QPDF_BIN overrides the
PATH lookup). find alone (native or wasm) is read-only and works without it.
Access control
Every path in a tool call comes from the model, so the server confines all reads and writes to one allowed directory:
OMITLY_ALLOWED_DIR— set it in the MCP config (recommended). Without it, the directory the server was started in is used.Symlinks are resolved before the check, so a link inside the root pointing outside it is refused.
Outputs never overwrite an existing file (or its
.audit.jsonsidecar); the agent is asked to pick a fresh name instead.OMITLY_ENGINE_TIMEOUT_MS(default 120000) — a wedged engine process is killed at the deadline instead of hanging the agent's tool call.
These are guardrails against confused-deputy mistakes, not a sandbox against a
hostile local user — see docs/THREAT-MODEL.md.
Licensing
redact_pdf/redact_by_entity are the write surface, enforced inside the
engine binary (not in this server, and not bypassable by the bundled wasm
fallback — wasm never touches these two tools): a Pro or Personal licence
(OMITLY_LICENSE_FILE, or the Omitly desktop app's activated licence on the
same machine) runs unmarked; otherwise the shared 14-day trial applies and
the audit output is permanently marked as evaluation output. The redaction
itself is never degraded, and licence checks never touch the network.
find_sensitive_regions, locate_text, check_redaction, verify_redaction,
verify_seal, verify_document, and extract_pdf_text are free — and
verify_redaction/verify_seal/verify_document/extract_pdf_text are free
forever with no cap and no marking (recipient-side verification and
on-device extraction are the point, not a metered funnel). The two free
detection tools (find_sensitive_regions, check_redaction) on the wasm
tier — i.e. with no native engine configured — are metered (omitly#226):
results carry an evaluation: true flag plus an EVALUATION banner, and after
a monthly number of free checks (default 10, OMITLY_FREE_CAP to tune) the
tool returns a structured { blocked: true, reason: "free-cap" } refusal
until the month rolls over. The count lives in ~/.omitly/usage.json
(override the directory with OMITLY_STATE_DIR; written 0600) and is
local-only — nothing ever phones home; deleting the file resets the free
count, which is accepted (the no-network doctrine makes it unavoidable), and
the counter is deliberately never consulted by any paid write path. Calls
served by a configured native engine are not metered here — that user is in
the engine funnel, where the licence rules above apply. verify_seal and
verify_document (both native-only) stay free by the same design in
crates/omitly-cli (no Pro/Personal licence check on that command path
either — both tools shell out to the identical verify_seal engine command).
Register with Claude Code
claude mcp add omitly -- env \
OMITLY_ENGINE_DIR=/path/to/engine-dir \
OMITLY_ALLOWED_DIR=/path/agents/may/touch \
node /abs/path/to/omitly-mcp/dist/index.jsOr in Claude Desktop's claude_desktop_config.json:
{
"mcpServers": {
"omitly": {
"command": "node",
"args": ["/abs/path/to/omitly-mcp/dist/index.js"],
"env": {
"OMITLY_ENGINE_DIR": "/path/to/engine-dir",
"OMITLY_ALLOWED_DIR": "/path/agents/may/touch"
}
}
}
}One-click install for Claude Desktop (MCPB, free tier only)
mcpb/ packages the four free/diagnosis tools (check_redaction,
find_sensitive_regions, locate_text, verify_redaction) — never the write
tools — as a self-contained MCPB .mcpb
extension: no Node/npm/Rust toolchain on the end user's machine, just
"Install Extension…" in Claude Desktop. This is a deliberately smaller,
separate server (mcpb/server/index.js) from dist/index.js above, so the
bundle can never expose redact_pdf/redact_by_entity/create_pdf even by
accident.
Download: releases.omitly.app/mcp/omitly-leak-check.mcpb
— always the current version (published by publish-npm.yml on every real
omitly-mcp release; a versioned copy + checksum also live at
mcp/latest.json). Drag the
downloaded file into Claude Desktop, or use "Install Extension…".
Or build it yourself from source:
npm run mcpb:pack # copy wasm/ into mcpb/wasm + npm install + mcpb pack
# → dist-mcpb/omitly-leak-check.mcpbmcpb:pack needs no Rust toolchain — it reuses the prebuilt wasm/ in this repository
(builds the shared wasm detector once, then copies it into mcpb/ — see
mcpb/scripts/copy-wasm.mjs). The packed .mcpb itself needs nothing but
Node, already bundled inside Claude Desktop.
Not signed (mcpb sign needs a code-signing cert we don't have yet — same
gate as desktop app signing). mcpb info on the packed file confirms
WARNING: Not signed. Whether Claude Desktop's "Install Extension…" flow
blocks or just warns on an unsigned .mcpb has NOT been confirmed against the
real Desktop app in this change (no Desktop GUI in this environment) — that
check is still open, tracked in omitly#225.
Available Tools
8 toolscheck_redactionA
Audit an ALREADY-redacted PDF and report whether sensitive text still survives underneath the redaction — the 'did my black boxes actually remove the data?' check. Most tools redact by drawing a rectangle over text while leaving the characters in the file, where they stay selectable and extractable. This re-extracts the text on-device and flags any emails, SSNs, phone or card numbers that are still present, each with a MASKED preview — the raw value never leaves the machine. It checks the page text layer, text surviving UNDER redaction marks, incremental-update prior revisions (the classic 'redacted then saved, original still in the file' failure), document metadata, AcroForm field values and embedded attachments, and returns a coverage report so a clean result is scoped to what was inspected. A non-empty result means the redaction leaked. Nothing is uploaded. (Pattern-based: names/addresses, image-only text, and the surfaces listed as not-inspected aren't covered; absence of hits isn't proof of completeness.) Free tier (no native engine): reports are EVALUATION-marked — for evaluation, not production reliance — and limited to a monthly number of free checks, counted locally; past the cap this tool returns a structured 'free-cap' refusal. A configured licensed engine is not capped.
| Name | Required | Description | Default |
|---|---|---|---|
| pdfPath | Yes | absolute path to the supposedly-redacted PDF to audit |
Output Schema
| Name | Required | Description |
|---|---|---|
| clean | Yes | |
| byKind | Yes | |
| offPage | Yes | |
| regions | Yes | |
| coverage | Yes | |
| survivors | Yes | |
| evaluation | No | |
| totalFindings | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it excels. It discloses that most redaction tools leave characters in the file, explains what surfaces are checked (text layer, under redaction marks, incremental revisions, metadata, AcroForm fields, attachments), states that processing is on-device ('the raw value never leaves the machine'), and details the free-tier cap and evaluation-marked reports. This is exemplary transparency beyond what any annotation could provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a clear one-sentence summary, then expands into rationale, checks performed, output type, limitations, and free-tier behavior. Every sentence adds value—no filler. Despite being long, it is well-organized and earns its length through density of useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple scan surfaces, output report, free-tier cap, limitations) and the lack of annotations, the description is exceptionally complete. It covers the input, process, output ('coverage report'), failure interpretation ('non-empty result means the redaction leaked'), and usage constraints. The presence of an output schema reduces the need to detail return fields, and the description sufficiently complements it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the single parameter pdfPath is described as 'absolute path to the supposedly-redacted PDF to audit.' The description reinforces that the PDF must be 'ALREADY-redacted' but adds no new syntax or format constraints beyond the schema. Baseline 3 applies because the schema already covers the parameter adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence clearly states the tool's purpose: 'Audit an ALREADY-redacted PDF and report whether sensitive text still survives underneath the redaction.' It uses a specific verb ('Audit') and resource ('ALREADY-redacted PDF'), and differentiates from siblings by focusing on the post-redaction verification step, even calling it 'the did my black boxes actually remove the data?' check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: after redaction, to verify data removal. It also provides explicit limitations ('Pattern-based: names/addresses, image-only text, and the surfaces listed as not-inspected aren't covered; absence of hits isn't proof of completeness'), which helps an agent decide if this tool is appropriate. However, it does not explicitly name alternative sibling tools or state when NOT to use this tool in favor of another, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_pdfA
Generate a clean PDF from Markdown (or raw HTML) on-device, rendered through a real browser engine so it looks printed — not like a script's best guess. Give it Markdown inline via source (or a file via sourcePath) and an outputPath; it writes the PDF and returns the path. Use this instead of writing a one-off reportlab/LaTeX/pandoc script. Nothing is uploaded.
| Name | Required | Description | Default |
|---|---|---|---|
| css | No | extra CSS appended after the default print styles | |
| title | No | document <title> / metadata | |
| format | No | input format (default: markdown) | |
| source | No | inline Markdown/HTML (omit if using sourcePath) | |
| outputPath | Yes | absolute path to write the PDF | |
| sourcePath | No | absolute path to a Markdown/HTML file |
Output Schema
| Name | Required | Description |
|---|---|---|
| output | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it discloses on-device rendering, that it writes the PDF, returns the path, and that nothing is uploaded. It could be even more explicit about overwrite behavior or error handling, but core side effects and privacy are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences and front-loaded with purpose. The phrase 'not like a script's best guess' is charming but non-essential; still, the description is compact and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a PDF-generation tool with a rich schema and output schema, the description covers input modes, privacy, output destination, and alternative tooling. It does not describe failure scenarios or path validation, but that is acceptable at this complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers all 6 parameters with descriptions (100% coverage), so the baseline is 3. The description lightly reinforces roles of source, sourcePath, and outputPath, but adds no new meaning beyond schema for css, title, or format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Generate'), names the resource ('PDF'), and specifies input formats (Markdown or raw HTML). It also distinguishes from sibling redaction/verification tools by clearly positioning this as a PDF creation tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this instead of writing a one-off reportlab/LaTeX/pandoc script,' giving clear guidance on when to prefer it. It also tells the user exactly how to invoke it: provide source/sourcePath and outputPath.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_sensitive_regionsA
Scan a PDF on-device and return candidate regions that look like PII — emails, US SSNs, phone numbers, card numbers, and Australian identifiers (TFN, ABN, ACN, Medicare, Centrelink CRN, IHI, BSB; kinds 'tfn'/'abn'/'acn'/'medicare'/'crn'/'ihi'/'bsb') — each with the page and exact coordinates (in PDF points) the redaction engine needs. Use this FIRST so you select regions by entity ('redact every TFN') and pass the returned coordinates straight to redact_pdf, instead of guessing geometry from a rendered page. Numeric kinds are check-digit validated where a published algorithm exists (CRN has none — its matches are format-only). Candidates are best-effort pattern matches for review — not a completeness guarantee and not a compliance assessment; the file is never uploaded — detection runs locally. Each candidate carries a MASKED preview (e.g. '•••-••-6789'), never the raw value: the secret stays on the machine. You don't need the plaintext to redact — drive it by page + coordinates. (A human reviewer has the file open locally for full context.) Free tier (no native engine): results are EVALUATION-marked and limited to a monthly number of free checks, counted locally — past the cap this tool returns a structured 'free-cap' refusal. A configured licensed engine is not capped.
| Name | Required | Description | Default |
|---|---|---|---|
| pdfPath | Yes | absolute path to the PDF to scan | |
| regions | No | narrow LISTED pattern kinds to these regional packs (generic kinds always listed; confirmed under-mark survivors always report); omit to scan everything — the safe default |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | Yes | |
| regions | Yes | |
| evaluation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and fully delivers: it discloses local/on-device processing, no upload, masked previews, best-effort/no-guarantee nature, check-digit validation, CRN format-only, and free-tier cap behavior with EVALUATION-marked results. This is a comprehensive transparency disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and is well-structured, but it is long and contains slight redundancy (e.g., 'never uploaded' and 'secret stays on the machine'). Still, every sentence contributes meaningful information for a complex tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (free-tier cap, security, coordinates, PII types) and the existence of an output schema, the description is complete: it covers behavior, limitations, security, and workflow. It does not need to explain return values because the output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers both parameters with descriptions (100% coverage), so baseline is 3. The description adds value by explaining how to use regions ('select regions by entity') and that coordinates are directly usable by redact_pdf, providing semantic context beyond the schema, though it does not add new parameter-level details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool scans a PDF and returns candidate PII regions with page and coordinates, and explicitly contrasts it with redact_pdf ('Use this FIRST... instead of guessing geometry from a rendered page'). This identifies the verb, resource, and output, and distinguishes it from siblings like locate_text and redact_pdf.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit workflow guidance: use this tool first to select regions by entity, then pass coordinates to redact_pdf. It also clarifies the free-tier cap and structured refusal, and notes that plaintext is not needed. This clearly communicates when and how to use the tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
locate_textA
Locate exact text strings in a PDF and return each occurrence's page and coordinates (in PDF points). Use this for what pattern-matching can't catch — names, addresses, account references — by doing the entity recognition YOURSELF and passing the literal strings here; the engine resolves where they sit so you never guess geometry from a rendered page. Feed the returned regions straight to redact_pdf. Case-insensitive; a string the PDF splits across text operators may not match as one run. Each hit returns a masked preview, not the raw text. Nothing is uploaded.
| Name | Required | Description | Default |
|---|---|---|---|
| texts | Yes | literal strings to locate | |
| pdfPath | Yes | absolute path to the PDF to search |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| regions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral disclosure burden. It discloses case-insensitivity, the split-text-operator limitation, the masked-preview output ('not the raw text'), and the privacy guarantee ('Nothing is uploaded'). This is exemplary transparency beyond what any schema could convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and each sentence adds distinct value: purpose, usage guidance, behavioral caveats, output format, and privacy. It is appropriately sized for the tool's complexity without redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is fully self-contained for a two-parameter tool. It explains what the tool returns, how to use it effectively, important edge-case caveats, and privacy behavior. An output schema exists to describe the return structure, so the description does not need to list return fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes both parameters completely (pdfPath and texts with descriptions), so the baseline is 3. The description reinforces that texts are 'literal strings' and that matching is exact, but it does not add substantial new parameter-level detail. The schema does the heavy lifting here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Locate exact text strings in a PDF and return each occurrence's page and coordinates (in PDF points).' It clearly distinguishes from siblings by framing it as the exact-match counterpart to pattern-matching tools. This makes the tool's purpose immediately unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is given: 'Use this for what pattern-matching can't catch' and the user is told to do entity recognition themselves and pass literal strings. It also names the downstream workflow: 'Feed the returned regions straight to redact_pdf.' This provides clear when-to-use context and an implicit alternative (pattern-matching).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redact_by_entityA
Find and redact PII in a PDF in ONE on-device step: scan, keep only the requested entity kinds (email/ssn/phone/card plus the Australian tfn/abn/acn/medicare/crn/ihi/bsb — omit kinds to redact every kind detected), remove them, verify, and return what was redacted plus the audit log. This is the 'just scrub the obvious PII' shortcut; when you need to review before removing, call find_sensitive_regions first. Same caveat as the detector: matches are best-effort pattern matching, not a completeness guarantee and not a compliance assessment. Nothing is uploaded.
| Name | Required | Description | Default |
|---|---|---|---|
| kinds | No | entity kinds to redact; omit to redact all detected | |
| drawBox | No | also paint a black bar (default: opaque fill only) | |
| pdfPath | Yes | absolute path to the source PDF | |
| regions | No | narrow to these regional packs (intersects with `kinds`); omit for all | |
| outputPath | Yes | absolute path to write the redacted PDF |
Output Schema
| Name | Required | Description |
|---|---|---|
| audit | Yes | |
| output | Yes | |
| verdict | Yes | |
| redacted | Yes | |
| redactedCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that processing is on-device, matches are best-effort pattern matching (not a completeness guarantee or compliance assessment), returns what was redacted plus an audit log, and that nothing is uploaded. This is rich, non-obvious behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences deliver all essential information: purpose, usage flow, alternatives, caveats, and privacy/upload behavior. The opening is front-loaded with the core action, and every clause earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description still explains what is returned ('what was redacted plus the audit log') and handles the tool's complexity: entity kinds, omit-all behavior, regional packs, review flow, and limitations. This is fully complete for a 5-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaningful semantics beyond the schema: 'omit `kinds` to redact every kind detected' clarifies default behavior, and 'regions narrow to these regional packs (intersects with `kinds`)' explains the relationship between params. This rises above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource: 'Find and redact PII in a PDF in ONE on-device step' and clearly distinguishes this from sibling tools by framing it as the 'just scrub the obvious PII' shortcut. It explicitly contrasts with find_sensitive_regions, which is a strong differentiator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states when to use this tool ('shortcut' for scrubbing obvious PII) and explicitly names an alternative: 'when you need to review before removing, call find_sensitive_regions first.' It also mentions the same caveat as the detector, giving clear context for suitability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redact_pdfA
Permanently redact regions of a PDF on-device using Omitly. Removes the underlying text and image data (not a black box over it), verifies nothing survives in each region, and returns a signed audit log. The file is never uploaded — redaction happens locally.
| Name | Required | Description | Default |
|---|---|---|---|
| pdfPath | Yes | absolute path to the source PDF | |
| regions | Yes | regions to remove | |
| outputPath | Yes | absolute path to write the redacted PDF |
Output Schema
| Name | Required | Description |
|---|---|---|
| audit | Yes | |
| output | Yes | |
| verdict | Yes | |
| regionCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses key behavioral traits: permanent destruction of underlying data, self-verification, signed audit log, and local processing. It clearly conveys that this is a destructive, privacy-preserving operation, going beyond what annotations would typically provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences, front-loaded with the core action. Each sentence adds value: what it does, how it works, and the privacy benefit. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is largely complete for a tool with a rich output schema (signed audit log) and no annotations. It covers major behavioral aspects and privacy. However, it doesn't address potential ambiguity with sibling tools like verify_redaction or check_redaction, leaving a small gap in understanding when to use this tool versus those verification tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all parameters (100% coverage), so the description does not need to add much. It mentions 'regions' and 'on-device' but does not provide additional detail beyond schema descriptions. The schema already explains coordinate system, page indexing, and required fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('redact'), resource ('PDF'), and scope ('regions'). It also distinguishes from siblings like redact_by_entity by emphasizing region-based redaction versus entity-based.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool (on-device, region-specific redaction) but does not explicitly mention alternatives or exclusions. It implies usage through the focus on 'regions' and 'on-device,' which differentiates it from sibling tools like redact_by_entity or verify_redaction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_redactionA
Re-scan an already-redacted PDF on-device and confirm nothing recoverable remains. With a configured native engine and this file's own <path>.audit.json sidecar (written by redact_pdf/redact_by_entity), this re-checks exactly the regions that were redacted — the strongest form of this check. Without a native engine (or without that sidecar — e.g. the file wasn't redacted by this tool), it falls back to a general on-device re-scan of the whole file and reports whether anything is still detectable — a good-faith re-check, not a claim of the same rigor as the sidecar-based path.
| Name | Required | Description | Default |
|---|---|---|---|
| pdfPath | Yes | absolute path to the redacted PDF to verify |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| clean | Yes | |
| verdict | No | |
| findings | Yes | |
| totalFindings | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and excels: it discloses the two distinct execution paths, prerequisites (native engine + sidecar), fallback behavior, and the explicit caveat that the fallback is 'a good-faith re-check, not a claim of the same rigor.' It also notes 'on-device' operation, adding meaningful privacy context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two well-structured sentences that pack substantial information without waste. The em-dash and parenthetical structure breaks the sidecar and fallback modes cleanly, and every clause adds value. No redundancy with schema or sibling names.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (two modes, prerequisites, caveats), the description covers all essential context: what it verifies, the strongest path, fallback behavior, and the rigor limitation. An output schema exists, so return values don't need explaining. This is complete for an AI agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description for pdfPath ('absolute path to the redacted PDF to verify'). The tool description adds context about sidecars and modes but doesn't elaborate on the parameter itself beyond the schema. Baseline 3 is appropriate since the schema already handles parameter semantics fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Re-scan an already-redacted PDF on-device and confirm nothing recoverable remains.' It clearly distinguishes the tool from siblings by introducing the sidecar-based rigorous path vs. the fallback general re-scan, making its scope and intent unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: use with a configured native engine and the file's sidecar for the strongest check, and falls back to a general re-scan otherwise. It explains when each mode applies, but doesn't explicitly name alternative tools like check_redaction or state exclusions, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_sealA
Verify a PDF's embedded Omitly audit report and trailing Ed25519 tamper-evidence seal — on-device, nothing uploaded. Distinct from verify_redaction: that tool re-checks whether redacted regions are still empty; this tool cryptographically checks whether the delivered bytes have changed since they were sealed. The seal proves INTEGRITY, NOT IDENTITY: the signing key is per-install and travels with the file, so a valid seal means 'unchanged since sealed by the holder of this key', never 'produced by Omitly'. Compare sealFingerprint out-of-band against the fingerprint the sender published if origin matters. Requires a configured native engine — there is no wasm seal-verification path, so this always needs OMITLY_ENGINE_DIR/OMITLY_REDACT_BIN. A seal_unsupported_version verdict means this verifier is too old to check the seal at all — that is neither a pass nor a fail; update the verifier rather than trusting or rejecting the file on that basis.
| Name | Required | Description | Default |
|---|---|---|---|
| pdfPath | Yes | absolute path to the PDF to check for an Omitly audit report and seal |
Output Schema
| Name | Required | Description |
|---|---|---|
| verdict | Yes | |
| warnings | Yes | |
| allPassed | Yes | |
| pageCount | Yes | |
| sealValid | Yes | |
| inputSha256 | Yes | |
| regionCount | Yes | |
| sealVersion | Yes | |
| outputSha256 | Yes | |
| outputFilename | Yes | |
| sourceFilename | Yes | |
| decisionChannel | Yes | |
| sealFingerprint | Yes | |
| metadataScrubbed | Yes | |
| licenseProvenance | Yes | |
| carriesAuditReport | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure. It reveals key traits: on-device processing (nothing uploaded), the integrity-not-identity caveat, the requirement for a configured native engine, and the meaning of an unsupported version verdict. These go beyond basic expectations and significantly inform the agent of operational constraints and limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph but every sentence contributes value. It front-loads the main purpose, then adds distinguishing, caveats, requirements, and verdict handling. While it could be broken into shorter paragraphs for readability, it is not wasteful and maintains focus.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a cryptographic verification tool with important nuances, the description is remarkably complete. It covers the exact object of verification, the distinction from a sibling, the integrity vs. identity trap, the need for a native engine, and the interpretation of a special verdict. Since an output schema exists, return values are presumably defined there, so the description covers all necessary contextual ground.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes the sole parameter (`pdfPath` as absolute path), achieving 100% coverage. The description does not add further semantic detail about the parameter itself, only contextual background about the file's contents. Thus, the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's specific purpose: verifying a PDF's embedded Omitly audit report and trailing Ed25519 tamper-evidence seal. It distinguishes itself from the sibling `verify_redaction` by explicitly contrasting their functions, making the tool's role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit guidance on when to use this tool vs. verify_redaction, explaining the difference in what each checks. It also gives critical direction on how to handle identity verification (comparing sealFingerprint out-of-band) and what to do upon receiving a `seal_unsupported_version` verdict (update verifier, not trust/reject). This fully addresses usage context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a distinct role, though verify_redaction and check_redaction both audit redacted PDFs from different angles, which could cause minor selection confusion. The descriptions clearly differentiate them, and other overlapping pairs (find_sensitive_regions vs redact_by_entity) are separated by scan-only vs scan-and-redact.
All tool names follow a consistent verb_noun snake_case pattern (find_sensitive_regions, redact_pdf, verify_redaction, etc.). This uniform convention makes the toolset predictable and easy to navigate.
With 8 tools, the server is well-scoped for a PDF redaction workflow. Each tool covers a specific stage—detection, location, redaction, verification, sealing, and creation—without unnecessary redundancy.
The toolset covers the full PDF redaction lifecycle: create_pdf generates input, find_sensitive_regions/locate_text detect targets, redact_by_entity/redact_pdf perform redaction, and verify_redaction/check_redaction/verify_seal provide comprehensive verification. No obvious dead ends or missing operations.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for detecting and redacting PII (Personally Identifiable Information) in PDF documents.
Hosted MCP server: convert PDFs to clean, LLM-ready Markdown with tables, formulas and OCR.
Document-to-Markdown MCP server — convert PDF, Office and HTML into LLM-ready Markdown.
Privacy-first PDF tools over MCP: merge, split, rotate, delete, compress, protect, inspect.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA local MCP server that extracts text-layer content from PDF files, enabling AI agents to inspect, extract text, outlines, and page content.
- AlicenseAqualityDmaintenanceA Model Context Protocol (MCP) server that provides comprehensive PDF redaction capabilities, including text and image redaction, search, and session-based in-memory operations using FastMCP and pymupdf.11MIT
- AlicenseAqualityBmaintenanceA local-first MCP server that ingests PDFs, extracts structure, and provides semantic search and sequential navigation tools for AI clients to query and learn from documents.10MIT
- AlicenseAqualityCmaintenanceFast, local PDF parsing as an MCP server with text extraction, bounding boxes, OCR, and visual citations. No cloud or API key required.5MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/omitly/omitly-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server