Five MCP tools, one per stage. Extract, PII mask, validate, route to human review, report cost. Model-agnostic — runs on Claude, GPT, Gemini, or any tool-calling model.
A document-processing MCP server for regulated environments. Five composable tools, one per stage, with deterministic PII masking, schema + business-rule validation, an HITL queue for exceptions, and per-document token-cost reporting. Built on Claude; portable to any tool-calling model.
AI / Agent Engineer · Applied AI Engineer · AI Platform Engineer · Forward-Deployed Engineer (regulated)
Each stage is a separate custom Claude tool, swappable on its own. The conductor is Claude. Three of the five tools change something (extract, mask, route); one is a check (validate); one totals things up (cost).
doc_extract without touching the four downstream tools.
Four runs: three clean documents, plus one claim with deliberately broken amounts and a missing required field. The traces below are real outputs from the pipeline runner — same JSON the MCP tools produce when run end-to-end.
doc_extract doesn't call Claude — it's a tool that returns a structured work order for Claude to carry out. Production with direct API access plugs in here without touching any downstream stage.
request { "doc_text": "NORTHSTAR MUTUAL — AUTO CLAIM SUBMISSION\nClaim ID: NSM-2026-0451829\n...", "doc_type": "claim" } response { "task": "Extract structured data from this claim document. Conform exactly to the schema. Return JSON only.", "doc_type": "claim", "schema": { /* full JSON Schema for AutoClaim — types, requireds, patterns, formats */ }, "extraction_rules": [ "Output JSON only, conforming exactly to the provided schema. No commentary, no markdown fences.", "Use ISO 8601 for all dates (YYYY-MM-DD) and date-times (YYYY-MM-DDTHH:mm:ssZ or with offset).", "Currency values: strip $ and commas, return as numbers.", "Missing fields → null. Do not invent values.", "policyholder.address.state should be the two-letter USPS code.", "vehicle.year is an integer, not a string.", /* 7 more rules */ ], "output_format": "Plain JSON, valid against the schema. No prose, no fences, no comments.", "on_completion": "Pass the extracted JSON to pii_mask with doc_type='claim'.", "estimate": { "stage": "extract", "input_tokens": 1955 } }