drawing-anonymizer-mcp
Drawing Anonymizer MCP Server
Anonymize technical drawings before you share them — mask company names, logos, people, addresses and contact data on drawing PDFs from any MCP-enabled assistant.
This Model Context Protocol server exposes the engine behind drawing-anonymizer.imnoo.com, the free drawing anonymizer by Imnoo. Sending a drawing to a supplier, a subcontractor or a second source for a quote? Hand the PDF to your assistant and get an anonymized copy in about a minute: Imnoo's drawing analysis finds the sensitive data in the title block, the notes and anywhere else on the sheet — company names, logos, person names, addresses, phone numbers, emails, websites and other identifying text — and the server whites it out (or replaces it with your own company name and logo), masks any extra term or area you name, and writes a tamper-proof, single-layer PDF with the document metadata removed. Article numbers, drawing numbers, dates, dimensions and tolerances stay readable, so the drawing can still be quoted and manufactured. Need to send it right away? Ask for an expiring share link (1 minute to 24 hours) that only ever serves the masked copy. NDA-safe drawing sharing and GDPR-safe drawing exchange, on vector and scanned PDFs alike. Built by Imnoo, the planning, scheduling and quoting platform for CNC manufacturers — where the same automatic drawing masking protects every drawing that leaves a quote.
"Anonymize bracket.pdf for our subcontractor, put our name in, and give me a 1-hour link"
│
▼ (your assistant calls the tools)
analyze_drawing ──► review_masking ──► mask_drawing
│ │
▼ ▼
14 masked · 4 visible ART-88213_masked.pdf (flattened, metadata removed)
still visible: "BRACKET LEFT" https://drawing-anonymizer.imnoo.com/api/share/… (expires in 1 h)Tools
Tool | What it does |
| Uploads a drawing PDF (vector or scanned, up to 4 pages, ≤ 30 MB) to Imnoo's drawing analysis — the service behind the web app — and returns every detection: id, category, value, PDF page, box, confidence, whether it sits in the title block and whether it is masked by default. |
| Opens a saved analysis JSON. Fully offline — no upload, no daily credit. |
| Shows exactly what the output will hide and what stays visible: masked detections (with their replacement), detections left visible, custom-term matches, rectangles, the anonymity score (0–100) with its warnings, the output file name, and the text a reader will still see on each page. Deterministic and offline — iterate until nothing identifying is left. |
| Writes the anonymized PDF: blank (or replacement-text / own-logo) boxes over every masked item; by default every page is then rasterized at 288 dpi so the covered content is destroyed rather than painted over, and author, title, producer and XMP metadata are removed. Optional coverage-report page, page selection and expiring share link. Also accepts |
Plus an anonymize-drawing prompt that walks the assistant through analyze → review → mask.
Where the analysis runs. Uploading the drawing is the only step that leaves your machine: analyze_drawing (or mask_drawing with a new pdf_path) sends the PDF to Imnoo's drawing analysis exactly like the web app does — 1 free analysis per day per IP address (need more? signed-in Imnoo users get a higher daily limit in the web app); uploaded files are deleted automatically within 24 hours and nothing else is stored. Masking, flattening and metadata removal run locally and are unlimited: review and re-mask as often as you like. A share link uploads the masked copy only — never the original.
Related MCP server: Drawing Converter (Metric ⇄ Imperial)
Installation
Requires Node.js ≥ 22.13.
Claude Code
claude mcp add drawing-anonymizer -- npx -y drawing-anonymizer-mcpClaude Desktop
Add to claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"drawing-anonymizer": {
"command": "npx",
"args": ["-y", "drawing-anonymizer-mcp"]
}
}
}Cursor
Add to Cursor — or add to ~/.cursor/mcp.json:
{
"mcpServers": {
"drawing-anonymizer": {
"command": "npx",
"args": ["-y", "drawing-anonymizer-mcp"]
}
}
}VS Code (GitHub Copilot)
code --add-mcp '{"name":"drawing-anonymizer","command":"npx","args":["-y","drawing-anonymizer-mcp"]}'Windsurf / other stdio clients
Any client that launches stdio servers works with:
npx -y drawing-anonymizer-mcpConfiguration (optional)
Variable | Purpose |
| Point the analysis and share links at another deployment of the web app (default |
Example session
You: Anonymize
C:\drawings\bracket.pdfbefore it goes to our subcontractor. Put "Supplier AG" where the customer's name was and give me a link that works for an hour.Assistant: calls
analyze_drawing— 18 detections on 1 page (A3): 3 company names, 4 person names, a logo, an address, a phone number, an email, a website, 2 other identifying items (a purchase-order number and a project name), plus the article number ART-88213, the drawing number DRW-10457-B and 2 dates, which stay visible. callsreview_maskingwithmode: "replace"andcompany_name: "Supplier AG"— 14 items masked, anonymity score 100; still visible on the sheet: the part title "BRACKET LEFT". adds it withterms: ["BRACKET LEFT"], reviews again, then callsmask_drawingwith the same masking andshare_link: "1h"— wroteART-88213_masked.pdf(flattened, metadata removed) and created a link that expires at 15:42. Two "Other" detections were found with low confidence — their boxes are worth a glance.
Those numbers are the web app's bundled sample drawing the smoke test runs against; real drawings vary.
Masking options (the masking argument)
One object, accepted by review_masking and mask_drawing — pass the same one to both so the PDF matches the reviewed masks. Everything is optional; the defaults reproduce the web app.
Option | Values |
| categories masked automatically — default |
|
|
|
|
| your own logo (PNG or JPEG, < 1 MB), drawn into every detected logo instead of a blank box |
| detection ids to mask or keep visible regardless of their category |
| extra text to mask everywhere it appears — case- and spacing-insensitive, across words the CAD export split |
| extra areas to cover: |
| mask colour ( |
| 1-based PDF pages to write (default all) |
| flatten the pages (default on), remove document metadata (default on), append a coverage-report page (default off) |
| your own article number for the part: names the file |
When masking is omitted on a drawing that was masked before in the same session — including the identical PDF under another path — the previous masking is reused, and the identical PDF is not uploaded again.
How the masked PDF is made
Detections come with their box, value and confidence; the categories you choose (and the detection scope) decide which are masked, and your explicit
mask/unmaskchoices win.Boxes are drawn onto a copy of the original pages. With
secureon (the default), every page is then rasterized at 288 dpi and the PDF is rebuilt from those images — the covered text no longer exists in the file, so it cannot be copied, searched or recovered by removing the boxes. Withsecureoff, the result is a layered PDF whose original content stays recoverable under the masks; the tools warn about it.Document metadata (author, title, subject, keywords, creator, XMP) is removed by default.
The anonymity score combines the share of identifying detections masked, secure output, metadata removal and full opacity — the same score the web app shows.
Limitations
The drawing analysis is automated: it can miss text (unusual layouts, free-text notes, hand-written additions) — read
visible_text_after_maskinginreview_maskingand addtermsorrectanglesfor anything still identifying, and look at the masked PDF before sharing it.Custom terms need the PDF's text layer; on scans, cover areas with
rectangles. Inside a longer line the term's position is estimated from the character count, so leave a little margin with a rectangle when a term sits between other text.Free tier: 1 analysis per day per IP address; PDFs up to 30 MB and 4 pages. Saved analyses (
save_analysis_to→load_analysis) and re-masking are unlimited and offline.Dragging boxes, the before/after slider, batch processing of up to 15 drawings and the hand-off from the Imnoo calculator are features of the web app.
Development
The server lives in src/; engine/ holds the masking engine it shares with the web app (mask builder, title-block scope, text search, coverage report and the secure-PDF builder), synced from the Drawing Anonymizer monorepo at Imnoo on every release — so the web app and this server detect, mask and flatten a drawing the same way by construction. Every release is gated on end-to-end checks that drive all four tools over stdio against the sample drawing in test/fixtures and read the output's text layer and pixels:
npm ci
npm test # build + end-to-end stdio checks
SMOKE_LIVE=1 npm test # + a real upload and share link (one daily analysis of your IP)Issues and feature requests are welcome in this repository.
About Imnoo
Imnoo — The System for Manufacturers | AI Planning, Scheduling & Quoting · Complete Assemblies · DFM · Tool & Material Libraries · Quoted-Parts Database · Toolpath & G-Code · Machine Connection · Webshop · ERP · Shop Analytics & Optimization · Drawing Masking & IP Security
Plan It. Schedule It. Quote It. Win It. — trusted by over 3,000 manufacturers.
Imnoo is the AI-powered planning, scheduling, and quoting platform for CNC manufacturers — your automatic production platform. One system that covers it all: automatic manufacturing planning with raw-material, catalog and purchase-part, and subcontracting sourcing; scheduling with smart reminders and AI-driven customer workflows; and AI cost and cycle-time estimation for milling, turning, and EDM — even from a 2D PDF alone. Quote complete assemblies: drop in one file and Imnoo explodes it into single parts automatically — with DFM checks, quality protocols, tolerance extraction and 2D-to-3D matching, toolpath and G-code generation, tool and machine recommendations, and connected machines feeding real production data back into every quote. Built on your own tool and material libraries and a growing database of every part you've ever quoted — powering statistics, benchmarks, and shop optimization. Extends to deep hole drilling, sheet metal, casting, and profile parts — with a 24/7 webshop, built-in ERP, hourly-rate calculation, market-price benchmarking, and imperial ⇄ metric conversion. Your data lives in its own physically separated environment — automatic drawing masking, Swiss hosting, end-to-end encryption. From messy RFQ to production-ready order, on one platform.
Planning
Automatic manufacturing planning — production plans generated straight from the quote.
Machine recommendation — every job routed to the machine that runs it best.
Catalog & purchase part management — norm parts, screws, and bought-in components recognized straight from the BOM, managed and priced alongside your machined parts.
Raw material sourcing — price, source, and order material without leaving the workflow.
Purchase part & external step sourcing — bought-in components, coating, heat treatment, and subcontracting sourced and ordered in the same flow.
Beyond milling & turning — deep hole drilling, sheet metal, casting, and profile parts.
Scheduling & Workflow
Scheduling & smart reminders — via email, Telegram, or WhatsApp. Nothing slips.
Email-to-quote automation — a messy inbox in, structured quotes out.
AI customer agents — RFQ answers, clarifications, and follow-ups handled automatically.
Built-in lightweight ERP — orders, companies, payment terms, and margins without the bulky software.
Quoting & Estimation
Complete assemblies, exploded automatically — upload one assembly file and Imnoo blows it out into single parts: every component recognized, drawings matched to the right parts, sub-assemblies nested, purchase parts pulled from the BOM. Quote the whole machine as easily as one part.
CNC quoting in one place — milling, turning, and EDM jobs quoted from a single AI-powered platform.
AI cost & cycle-time estimation — know price, time, and effort before engineering ever looks at it.
Drawing-only estimation — quote from the PDF alone. No 3D model needed.
Feature-by-feature costing — see exactly which holes, pockets, and tolerances drive the price.
Instant quotes — respond in minutes while competitors are still opening the STEP file.
24/7 instant-quoting webshop — customers upload parts and buy while you sleep.
Instant market-price benchmarking — know where your bid stands before you send it.
Hourly-rate calculation — your true machine and labor rates, always current.
Imperial ⇄ metric conversion — international RFQs without manual cleanup.
Libraries & Insights
Tool library — your cutting tools, holders, and parameters in one managed catalog.
Material library — standard and custom materials with live supplier pricing.
Quoted-parts database — every part you've ever quoted, searchable by geometry: similar part found, price found.
Statistics & analytics — win rates, margins, throughput, and quoting performance at a glance.
Shop optimization — learn from already-quoted parts to sharpen prices, spot profitable niches, and load the right machines.
Drawing Intelligence
DFM — Design for Manufacturing — manufacturability checked before you quote: undercuts, thin walls, unreachable features, and impossible tolerances flagged with the part still on the screen.
Quality check protocols — inspection plans generated automatically: stamped and numbered drawing features, inspection classes and rates, ready-to-use measurement reports.
Axis & orientation detection — AI finds the best part orientation and machining axes.
Automatic tolerance extraction — critical tolerances pulled straight off the drawing.
2D-to-3D tolerance matching — drawing requirements linked to the right model features.
CAM & Shop Intelligence
AI tool recommendation — stop searching catalogs: Imnoo suggests the exact cutting tools for every feature.
Automatic toolpath generation — from quote to machining strategy in one step.
G-code generation & estimation — generate and evaluate programs before work hits the floor.
Machine connection — your machines feed real production data back into the AI. Every quote gets smarter.
IP Protection & Data Security — Engineered Like a Swiss Vault
Physically separated data — every manufacturer runs in its own isolated environment. Your drawings, prices — never pooled with anyone else's: not for storage, not for AI training.
Automatic drawing masking & redaction — customer names, logos, and confidential data hidden before a drawing ever leaves your workflow. Share with suppliers and subcontractors without exposing whose part it is.
Your customers' IP, treated like your own — end customers' designs stay within your tenant, full stop.
Swiss hosting & end-to-end encryption — data sovereignty and security engineered to Swiss standards.
Trusted at scale — over 3,000 manufacturers run their quoting on Imnoo.
Quote the complete job — not just the spindle time.
Privacy
Two things can leave your machine, both over HTTPS to drawing-anonymizer.imnoo.com: the drawing PDF you analyse (sent to Imnoo's drawing analysis to detect the sensitive data, deleted automatically within 24 hours, not used for anything else), and — only when you ask for a share link — the masked copy, stored privately until the link expires. There is no telemetry and no other network call; masking, flattening and metadata removal run locally on your machine. Imnoo's privacy policy: https://www.imnoo.com/en/privacy-policy · Imprint: https://www.imnoo.com/en/imprint · Questions: https://github.com/imnoo-team/drawing-anonymizer-mcp/issues
License
MIT © Imnoo AG
Available Tools
4 toolsanalyze_drawingAnalyse a drawing PDF for sensitive data (Imnoo drawing analysis)A
Upload a technical-drawing PDF to Imnoo's drawing analysis and return the sensitive data it finds — company names, logos, person names, addresses, phone numbers, emails, websites, article numbers, drawing numbers, dates and other identifying text — each with a detection id, category, value, PDF page, box (analysis image pixels), confidence, whether it sits in the title block and whether it is masked by default, plus the page sizes. Up to 4 pages are treated as one drawing. Analysis takes roughly 10–120 s; the call waits up to timeout_seconds and otherwise returns status "processing" with the drawing_id to resume with. An identical PDF analysed earlier in this session is returned from memory (no upload). analyze_drawing uploads the PDF to Imnoo's drawing analysis (the service behind the web app): 1 free analysis per day per IP address (signed-in users get more in the web app); uploaded files are deleted automatically within 24 hours and nothing else is stored. Masking itself runs locally and is unlimited.
| Name | Required | Description | Default |
|---|---|---|---|
| pdf_path | No | path to the drawing PDF (vector or scanned, ≤ 30 MB) | |
| drawing_id | No | instead of pdf_path: the drawing_id of an earlier upload that returned status "processing" — keeps waiting for it without a new upload | |
| timeout_seconds | No | how long to wait for the analysis before returning "processing" (default 180) | |
| save_analysis_to | No | write the analysis JSON to this path (re-open it later with load_analysis, no upload needed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: quota (1 free analysis/day/IP), retention (files deleted within 24h, nothing else stored), latency (10–120 s), timeout behaviour with status "processing" plus resumable drawing_id, and session-level caching. The idempotentHint=false annotation is not contradicted — caching an identical PDF in-session is distinct from idempotent mutation semantics.
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?
Front-loaded with purpose and return shape, then quotas and retention last. Dense but nearly every clause carries information; the only mild redundancy is restating the wait/timeout behaviour in both the timing sentence and the upload sentence.
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 no output schema, the description compensates by enumerating returned fields (detection id, category, value, page, box, confidence, title-block flag, masked flag, page sizes). Inputs, cost, and retention are covered; only error/failure handling is left unstated.
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 the baseline is 3, but the description adds relationships the schema states only locally: that drawing_id resumes an earlier call that returned "processing" without a new upload, that timeout_seconds caps the wait before returning "processing", and that up to 4 pages count as a single drawing.
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?
Opens with a specific verb and resource: 'Upload a technical-drawing PDF to Imnoo's drawing analysis and return the sensitive data it finds', then enumerates exactly what is detected. It separates itself from siblings by stating that memory-cached re-analysis avoids a new upload and that masking runs locally, making it distinguishable from load_analysis and mask_drawing.
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?
Gives real operating context: 1 free analysis per day per IP, identical PDFs served from session memory without re-upload, and the drawing_id resume path. It falls short of explicitly naming when to prefer `load_analysis` or `mask_drawing` over this call, leaving that routing to be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_analysisOpen a saved drawing analysis (offline)ARead-only
Open a drawing analysis JSON saved earlier (analyze_drawing with save_analysis_to, or the Imnoo FileStore analysis document) and register it as a drawing for review_masking and mask_drawing. Fully offline — no upload, no daily credit. Pass pdf_path as well: masking needs the original PDF, and custom terms search its text.
| Name | Required | Description | Default |
|---|---|---|---|
| pdf_path | No | path to the matching drawing PDF (needed to write the masked PDF) | |
| drawing_id | No | id to register the drawing under (default: the analysis id, else the file name) | |
| analysis_path | Yes | path to the analysis JSON |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint/openWorldHint=false; the description adds real value beyond them by disclosing that this performs no upload, consumes no daily credit, and has the side effect of registering the drawing so review_masking and mask_drawing can consume it. That registration side effect, not visible in annotations, is exactly the kind of context an agent needs before calling.
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?
Three tight sentences, front-loaded with the action and result, then constraints, then the parameter hint. The parenthetical about the Imnoo FileStore document and the pdf_path clause both earn their space as disambiguation.
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 no output schema and thin annotations, the description carries most of the burden and does so well: it covers the source of the JSON, offline behavior, the registration side effect, and the prerequisite for downstream tools. The return value/registered-id behavior is only lightly implied rather than stated.
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 the baseline is 3, but the description goes further by explaining why pdf_path matters across tools ('masking needs the original PDF, and custom terms search its text') rather than merely restating 'needed to write the masked PDF'. It adds little about drawing_id beyond the schema's stated default.
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?
States a specific verb+resource ('Open a drawing analysis JSON saved earlier') and immediately names the downstream siblings it feeds (review_masking, mask_drawing) plus the producer (analyze_drawing with save_analysis_to). An agent can distinguish this from analyze_drawing without opening either schema.
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?
Clear about context: use this when the analysis JSON already exists, and it is 'fully offline — no upload, no daily credit', implicitly routing the agent away from re-running analyze_drawing. It also gives a concrete calling rule ('Pass pdf_path as well: masking needs the original PDF'). It stops short of an explicit when-not-to-use statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mask_drawingWrite the masked (anonymized) drawing PDFAIdempotent
Mask the drawing and write the anonymized PDF: blank (or replacement-text / own-logo) boxes over every masked detection, custom term and rectangle; by default every page is then rasterized at 288 dpi so the covered content is destroyed rather than painted over (tamper-proof single-layer PDF) and the document metadata (author, title, producer, XMP) is removed. Optional coverage report page and page selection. share_link additionally uploads the MASKED copy (never the original) and returns an expiring public link (1m, 15m, 1h or 24h). Accepts drawing_id (from analyze_drawing/load_analysis) or pdf_path for a one-shot run (analyses first). When masking is omitted for a drawing masked before in this session — including an identical PDF under another path — the previous masking is reused. Default location: next to the drawing PDF as _masked.pdf (else _masked.pdf); the source PDF is never modified.
| Name | Required | Description | Default |
|---|---|---|---|
| masking | No | Masking settings — shared by review_masking and mask_drawing; pass the same object to both so the PDF matches the reviewed masks. Everything is optional; the defaults reproduce the web app. | |
| pdf_path | No | the drawing PDF — analysed first when it is not known yet (one daily credit), or the original PDF for a drawing_id loaded without one | |
| overwrite | No | allow replacing an existing output file | |
| drawing_id | No | from analyze_drawing or load_analysis | |
| share_link | No | also create an expiring public link to the masked copy, valid for 1 minute, 15 minutes, 1 hour or 24 hours | |
| output_path | No | target .pdf path, or a directory (default: next to the drawing PDF, else the working directory) | |
| timeout_seconds | No | with pdf_path: how long to wait for the analysis (default 180) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations: it discloses that pages are rasterized at 288 dpi so covered content is destroyed (tamper-proof single-layer PDF), that metadata (author, title, producer, XMP) is stripped, that share_link uploads only the MASKED copy with explicit expiries, and that the source is never modified. It also gives the default output location and naming. This is rich, non-obvious behavioral context the structured fields do not carry.
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?
Front-loads the primary action and every sentence carries distinct information, but it is a single dense block with several embedded clauses. It is appropriately sized for a complex masking tool, though light structuring (grouping the secure/rasterize, share, and output concerns) would improve scanability.
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 nested-schema tool with no output schema, the description covers the important externals: what the output is, where it lands, how naming works, what share_link returns (an expiring public link), and that the original is untouched. An agent has what it needs to invoke correctly without opening the schema.
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 already 100%, so the baseline is 3, but the description adds meaning beyond the field docs: 288 dpi rasterization, the masking-reuse rule, share_link link lifetimes, and default output naming/location. It ties drawing_id back to its producers (analyze_drawing/load_analysis), which helps the agent source the value correctly.
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?
States a specific verb and resource up front — 'Mask the drawing and write the anonymized PDF' — and immediately scopes it with what gets covered (detections, terms, rectangles) and how (blank/replacement/logo boxes). An agent can tell this is the write/output stage of the pipeline, distinct from analyze_drawing (analysis) and review_masking (review).
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?
Explains the two entry paths clearly: drawing_id from analyze_drawing/load_analysis, or pdf_path for a one-shot run that analyses first. It also covers the reuse case (omitting masking for a previously masked drawing, including an identical PDF under another path) and states the source PDF is never modified. It never explicitly routes against review_masking as an alternative, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_maskingReview what the masked drawing will hideARead-only
Compose the masks for an analysed drawing exactly as mask_drawing will, without writing anything: which detections are masked (with their replacement in mode "replace") and which stay visible, custom-term matches, rectangles, the article-number stamp, the pages written, the anonymity score (0–100) with its warnings, the output file name, and visible_text_after_masking — the text a reader will still see on each page (from the PDF text layer). Use it to find leftovers (a customer name in the notes, a person the analysis missed) and add them as terms or rectangles. Deterministic and offline — iterate freely.
| Name | Required | Description | Default |
|---|---|---|---|
| masking | No | Masking settings — shared by review_masking and mask_drawing; pass the same object to both so the PDF matches the reviewed masks. Everything is optional; the defaults reproduce the web app. | |
| drawing_id | Yes | from analyze_drawing or load_analysis |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint=false, but the description adds substantial context: nothing is written, the run is deterministic and offline, and it enumerates exactly what the preview surfaces (masked vs visible detections, term matches, rectangles, stamp, pages, anonymity score with warnings, output file name, visible_text_after_masking). This is far beyond what the annotations 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 purpose and the dry-run distinction are front-loaded, and the long enumerated sentence earns its length because there is no output schema. Slightly dense, with the output list packed into one very long sentence, but no 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?
With no output schema, the description must explain the return payload, and it does so thoroughly (detections masked/visible, term matches, anonymity score, visible_text_after_masking, etc.). Combined with a fully documented input schema and readOnly annotations, an agent has everything needed to call it 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 description coverage is 100%, so the schema already documents every parameter (mode, terms, rectangles, etc.), and the description largely restates 'mode "replace"' rather than adding syntax or format meaning. Baseline 3 applies when the schema does the heavy lifting.
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?
States a specific action (compose the masks for an analysed drawing exactly as mask_drawing will, without writing anything), which is a dry-run/preview of the sibling mask_drawing. An agent can distinguish it from analyze_drawing, load_analysis and mask_drawing without opening any schema.
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?
Gives a concrete use case (find leftovers like a customer name in notes or a person the analysis missed, then add them as terms or rectangles) and implicit contrast with mask_drawing via 'without writing anything' and 'iterate freely'. It stops short of an explicit 'use this before mask_drawing, not instead of it' routing statement, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.0- First observed
analyze_drawing - First observed
load_analysis - First observed
mask_drawing - First observed
review_masking
TDQS
Scored across 4 tools
Each tool occupies a distinct stage: analyze_drawing (upload+detect), load_analysis (reuse saved analysis offline), review_masking (dry-run preview), mask_drawing (write output). There is minor overlap since load_analysis and analyze_drawing both register a drawing, and mask_drawing's pdf_path one-shot path re-implements analysis, but descriptions clearly steer selection.
All four tools follow a clean verb_noun snake_case pattern: analyze_drawing, load_analysis, review_masking, mask_drawing. No mixed conventions or vague verbs, so the surface is highly predictable.
Four tools map exactly onto the anonymization lifecycle (analyze, load, review, mask), each substantial and non-redundant. This is well within the well-scoped 3-15 range with no filler.
The core detect → preview → mask pipeline plus offline reuse and share_link covers the domain well. Minor gaps like listing or deleting previously stored/registered analyses are missing, but agents can work around them within a session.
Related MCP Connectors
Remove GPS, device details, dates and AI labels from video, PDF, RAW and photo files.
Detect and redact PII and secrets (API keys, tokens) in text, HTML or PDF before it reaches an LLM.
Stateless PII redaction over MCP/REST. Free ≤1000 words or $0.01/call; file upload supported.
Detects and redacts PII (emails, phones, SSNs, names, addresses) from text. $0.02/call via x402.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceDetects whether sensitive data like emails, SSNs, and phone numbers survive in supposedly redacted PDFs, running entirely locally via WebAssembly.-
- AlicenseAqualityCmaintenanceConvert technical-drawing PDFs and engineering callouts between metric and imperial — values stamped in place, threads cross-referenced, shop-floor rounding.125MIT
- FlicenseNot gradedqualityCmaintenanceAutomatically detects and obfuscates sensitive data (PII, secrets, etc.) before Claude processes it, with lossless restoration for client deliverables.6-
- AlicenseAqualityAmaintenanceEnables AI agents to permanently remove personally identifiable information from PDF documents, returning redacted files with the sensitive text deleted rather than merely covered. Supports scanned documents, multiple languages, entity types, and optional human review.6217 npm1MIT