inclusio-mcp
Use inclusio-mcp to drive the Inclusio accessibility-first publishing engine from MCP clients for document discovery, rendering, and PDF accessibility auditing.
list_docs— enumerate registered documents and metadata fromdata/meta.yaml.doc_count— quickly count registered documents as a lightweight connectivity/health probe.render— materialize a registered document into LaTeX, Markdown, JSON, or text source underbuild/.cache/rendered/using draft, submission, or camera-ready mode.audit_pdf— run veraPDF accessibility audits over built PDFs for PDF/UA-2, WTPDF, and PDF/A-4f conformance, optionally surfacing blocking failures in strict mode.Read resources —
inclusio://meta,inclusio://audit/latest, andinclusio://version.Integrate with Claude Code, Cursor, Continue, or other MCP clients for agent-driven publishing workflows.
Enables LLM-augmented judges for ATS scoring and citation grounding using OpenAI's API.
Contents
Install —
pip, optional extras, sourceQuick Start — first tagged PDF in 60 seconds
Features — what the engine ships
Usage — common Python + CLI recipes
Tools — the MCP tool and resource surface
Architecture — the engine's package layout
Examples — six runnable scenarios
Documentation — quickstart, tutorials, reference
Development — local validation gate
Security — signed commits, provenance, audit
Related MCP server: FastMCP LaTeX Server (tex-mcp)
Install
pip install inclusio # engine + CLI
pip install 'inclusio[mcp]' # + FastMCP server
pip install 'inclusio[provenance]' # + pyhanko (PAdES)
pip install 'inclusio[dev]' # + pytest, ruff, sphinx, interrogateRequires Python ≥ 3.11 and a LuaLaTeX toolchain on PATH. Linux, macOS, and WSL are supported (native Windows works for the Python surface; the LaTeX gate needs WSL or a TeX Live install).
Optional tool | Adds | Install |
| The strict EAA / accessibility audit gate | |
| HTML5 / JATS XML / EPUB3 multi-format emission |
|
| C2PA Content Credentials | |
| PAdES B-T / B-LT / B-LTA signing | Pulled by the extra |
Build from source
git clone https://github.com/sebastienrousseau/inclusio.git
cd inclusio
./bin/setup # check toolchain + install dev extras
make test # smoke suite
make coverage # full suite (gate: 97 %)Quick Start
A complete worked example you can paste into a fresh directory:
pip install inclusio
# Grab the minimal example, build + audit + emit + judge:
git clone --depth=1 https://github.com/sebastienrousseau/inclusio
cd inclusio/examples/01-hello-world && makeThat single make produces build/hello.pdf (PDF/UA-2 + WTPDF +
PDF/A-4f triple-conformance), runs veraPDF over it, and exits
non-zero if any flavour fails.
Drive the same surface from Python:
# quickstart.py
import subprocess
from pathlib import Path
# 1. Render + build the bundled "hello" fixture — the CLI is the
# canonical entry point for the LaTeX step.
subprocess.run(
["python", "-m", "inclusio.cli.build", "build", "--doc", "hello"],
cwd="examples/01-hello-world",
check=True,
)
# 2. Audit the produced PDF in-process — pure-Python, no subprocess.
from inclusio.cli import audit
pdfs = audit.collect_pdfs(
target=Path("examples/01-hello-world/build"),
build_dir=Path("examples/01-hello-world/build"),
registry_stems={"hello"},
)
report = audit.audit(pdfs)
assert report["summary"]["fail"] == 0, "veraPDF reported a failure"
print(f' PASS {report["summary"]["pdfs"]} PDF(s), '
f'{report["summary"]["pass"]}/{report["summary"]["total"]} checks')
# → PASS 1 PDF(s), 3/3 checksFeatures
Tagged PDF, by default. Every build emits a PDF/UA-2 + WTPDF + PDF/A-4f triple-conforming artefact via the LaTeX kernel's
tagpdfintegration. The veraPDF audit gate is wired into CI and exits non-zero on any FAIL.Multi-format emission. The same LaTeX source produces HTML5 (WCAG-clean), JATS XML (1.3, JATS4R-ready), and EPUB3 via Pandoc.
LLM-augmented judges. ATS (Workday / Greenhouse / Lever heuristic), citation grounding, and JD-to-CV fit — local
llama.cppor BYO-key cloud (Anthropic / OpenAI), with heuristic-only fallback when the LLM is unreachable.Content provenance. C2PA Content Credentials (via
c2patool), PAdES B-T / B-LT / B-LTA signatures (viapyhanko), and SLSA L3 build attestation (viaactions/attest-build-provenance).MCP server.
inclusio-mcpexposeslist_docs,audit_pdf,render, anddoc_countso Claude Code, Cursor, Continue, or any other MCP client can drive the engine.JSON Resume importer.
inclusio import-resumeconverts a jsonresume.org v1 document into the engine's CV YAML schema.Brief-driven CV tailoring. ATS-clean variants tailored against a job description with British-English cleanup and consistency lint.
Usage
Build, audit, judge a registered document
inclusio build --doc cv --mode draft # → build/cv.pdf
inclusio audit --strict # → veraPDF, non-zero on FAIL
inclusio judge --doc cv --judge ats # → grade + findingsScore a CV against a job description
# score_cv.py — fully runnable: drop into a directory with brief.txt + cv.txt
from pathlib import Path
from inclusio.judge import jd_fit
jd_text = Path("brief.txt").read_text(encoding="utf-8")
cv_text = Path("cv.txt").read_text(encoding="utf-8")
report = jd_fit.score_jd_fit(jd_text, cv_text)
print(f"score: {report.score}/100 grade: {report.grade}")
print(f"missing: {sorted(report.metrics['missing_required'])[:5]}")
# → score: 78/100 grade: B
# → missing: ['opentelemetry', 'rust']Drive the engine over MCP
inclusio-mcp # stdio (Claude Code default)
inclusio-mcp --http --port 8765 # Streamable HTTPWire into Claude Code via ~/.claude/claude_desktop_config.json:
{
"mcpServers": {
"inclusio": {
"command": "inclusio-mcp",
"env": { "INCLUSIO_CONTENT_DIR": "/absolute/path/to/content" }
}
}
}Embed C2PA Content Credentials
inclusio provenance --doc cv \
--cert /path/to/cert.pem \
--key /path/to/key.pem \
--output build/cv.c2pa.pdfTools
The inclusio-mcp server exposes four MCP tools:
list_docs— Enumerate documents registered in the content treedoc_count— Quick count of available documentsrender— Build a tagged, conformant PDF (and other formats) for a documentaudit_pdf— Accessibility audit of a PDF (veraPDF)
Plus three read-only resources:
inclusio://meta— Project manifest (meta.yaml)inclusio://audit/latest— Latest audit reportinclusio://version— Engine version card
Architecture
inclusio/ # Python package
cli/ # build · audit · render · tailor · judge · emit · provenance · …
judge/ # ats · citations · jd_fit · local_llm · cloud_llm
emit/ # pandoc (HTML5 / JATS XML / EPUB3)
provenance/ # c2pa (c2patool) · pades (pyhanko)
mcp/ # FastMCP server
tools/ # fix_semantic · stamp_pdfs · overlay
core/ # LaTeX classes (.cls) and styles (.sty)
templates/ # Jinja2 templates for the template-driven docs
benches/ # pytest-benchmark micro-benchmarks
examples/ # Six self-contained runnable scenarios
docs/ # Sphinx documentationExternal consumers supply their own content tree (LaTeX sources,
YAML metadata, brand assets) and point the engine at it through
INCLUSIO_CONTENT_DIR or --content-dir. The repo's own src/
and data/ directories double as the public-engine self-test
fixtures.
Examples
# | Folder | What it teaches |
1 | Tagged-PDF build with the audit gate | |
2 | JSON Resume → CV → ATS + JD-fit scoring | |
3 | Paper → PDF + HTML + JATS + EPUB + citation judge | |
4 |
| |
5 | C2PA Content Credentials | |
6 | PAdES B-T eIDAS signature |
Each folder has its own Makefile (make help lists targets) and
a README.md with the why + the how.
Documentation
Quickstart — five-minute walkthrough.
Tutorials — four end-to-end walkthroughs paired 1 : 1 with the examples.
Architecture — public-engine vs content-repo boundary, sprint history, decision log.
Tagged PDF — the conformance stack.
Multi-format — HTML / JATS / EPUB.
Judges — ATS, citations, JD-fit, LLM rerank contract.
Provenance — C2PA, PAdES, SLSA.
MCP server — tool + resource surface.
Publishing against an external content tree
make publish CONTENT_DIR=/absolute/path/to/your-content-repoThe content repo supplies its own data/meta.yaml (document
registry) and src/**.tex (LaTeX sources). The engine reads no
state from outside INCLUSIO_CONTENT_DIR once it's set.
Development
make test # smoke (≤ 20 s)
make coverage # full suite + 97 % gate (~3 min)
make docstrings # 100 % interrogate gate
make benchmark # pytest-benchmark micro-budgets
make audit-strict # veraPDF, exits non-zero on any FAIL
make docs # SphinxAll commits to main are squash-merged via PR. Branch protection
requires Lint (ruff) + Public Engine Checks (py3.11 / 3.12 / 3.13) + the Signed-commit gate to pass. See
CONTRIBUTING.md.
Security
SSH-signed commits. Every commit on
mainis GitHub-verified.Signed tags. Release tags are ED25519-signed.
SLSA L3 build provenance (gated on the repo being public or on a paid GitHub plan).
PyPI Trusted Publishing wiring (
pypa/gh-action-pypi-publish) inrelease.yml; flipvars.PYPI_TRUSTED_PUBLISHING=trueonce the PyPI publisher is configured.Cloud LLM keys are env-var only —
inclusionever auto- discovers credentials from disk.
Report vulnerabilities per SECURITY.md.
Related MCP Servers
Sibling MCP servers by the same author — each targets a different agent workflow:
Server | Purpose |
Lossless YAML 1.2 parsing, formatting & validation (Rust) | |
RustLogs log streams for on-call / SRE agent workflows | |
Generate & validate ISO 20022 pain.001 payment initiation files | |
Parse bank statements (BAI2, MT940/MT942, CAMT.053, OFX, CSV) | |
Parse & reconcile ISO 20022 camt.053 bank-to-customer statements | |
Generate & validate ISO 20022 acmt.001 account management messages |
MCP Registry
mcp-name: io.github.sebastienrousseau/inclusio-mcp
Install the MCP server with pip install 'inclusio[mcp]' (the mcp extra pulls in mcp[cli]>=1.27.0). Run with inclusio-mcp — stdio transport, exposes accessibility-publishing tools to Claude Desktop, Cursor, and other MCP clients.
License
Licensed under either of:
at your option. © 2026 Sebastien Rousseau.
Available Tools
4 toolsaudit_pdfAudit PDF accessibility (veraPDF)ARead-onlyIdempotent
Audit built PDFs for accessibility conformance with veraPDF.
Purpose:
Verifies whether built PDFs satisfy PDF/UA-2, WTPDF, and PDF/A-4f triple-conformance
accessibility and preservation standards using veraPDF.
When to use:
- When validating accessibility compliance of compiled PDF documents prior to publication.
- When auditing batch PDFs under `build/` for regulatory standards (EAA, WCAG 2.2 AA).
When NOT to use:
- Do NOT use to generate or compile documents; use `render` and the build pipeline first.
- Do NOT use if veraPDF is not installed or available on PATH.
Behavioral transparency:
Read-only audit. Shells out to veraPDF without modifying any PDF or source files.
Returns:
Audit report dictionary detailing summary, per-PDF results, and per-flavour passes/fails.
Inputs: strict, target. Returns: object
doc_countCount registered documentsARead-onlyIdempotent
Count the documents registered in data/meta.yaml.
Purpose:
Fast, lightweight health and connectivity probe that counts registered documents in the manifest.
When to use:
- When verifying server availability and project manifest readability with minimal payload size.
- When performing initial connectivity checks before deeper inspection.
When NOT to use:
- Do NOT use when full metadata (doc_id, class, title) is needed; use `list_docs` instead.
Behavioral transparency:
Read-only, instantaneous manifest header check.
Inputs: no named parameters. Returns: result
list_docsList registered documentsARead-onlyIdempotent
List every document registered in data/meta.yaml with its metadata.
Purpose:
Enumerates all registered documents, returning their identifiers, classes, source paths,
titles, and PDF/A flags.
When to use:
- When discovering valid `doc_id` values before calling `render` or `audit_pdf`.
- When checking document classes (e.g. CV, paper, report, letter) registered in the workspace.
When NOT to use:
- Do NOT use if you only need a quick connectivity probe; use `doc_count` instead.
- Do NOT use for raw YAML content; use the `inclusio://meta` resource instead.
Behavioral transparency:
Pure, read-only filesystem inspection. Reads `data/meta.yaml` without mutating any state.
Returns:
List of document specification dictionaries. Empty list when no manifest exists.
Inputs: no named parameters. Returns: result
renderRender document to a fileAIdempotent
Render a registered template-driven document to a file on disk.
Purpose:
Materializes document templates into concrete source files (LaTeX, Markdown, JSON, text)
under `build/.cache/rendered/` applying the specified build mode.
When to use:
- When generating LaTeX source for PDF compilation and accessibility tagging.
- When generating Markdown or text representations for review or downstream processing.
When NOT to use:
- Do NOT use without discovering valid `doc_id` values first using `list_docs`.
- Do NOT use to compile PDFs directly; this tool produces rendered sources for compilation.
Behavioral transparency:
Non-destructive, idempotent cache writer. Regenerates files under `build/.cache/rendered/`
without modifying template sources or `data/meta.yaml`.
Returns:
Dictionary containing doc_id, format, build mode, output_path, and byte size.
Inputs: doc_id (required), fmt, mode. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: list_docs enumerates documents, audit_pdf validates PDFs, doc_count provides a lightweight count, and render generates document sources. The descriptions explicitly state when to use each and cross-reference alternatives, eliminating ambiguity.
Tool names follow a consistent snake_case verb_noun pattern: list_docs, audit_pdf, doc_count (verb_noun with doc as noun), and render (verb, though noun omitted but still clear). All are lowercase with underscores, maintaining a predictable style.
With only 4 tools, the set is compact but covers essential operations for document management and audit. While the count is slightly low, each tool serves a distinct role, and the addition of doc_count as a lightweight probe is justified.
The tool surface covers listing, rendering, and auditing, but lacks operations for modifying the document manifest (e.g., create, update, delete) and direct PDF compilation. This creates notable gaps for a complete document lifecycle, though the server's scope may intentionally focus on read-only and rendering tasks.
Maintenance
Related MCP Connectors
Design, publish and render PDF templates with Typst. Full template lifecycle over MCP.
Compliant PDFs (PDF/A-2A + PDF/UA-1) from markdown or a compact DSL - fast, no headless browser.
Render Markdown and LLM output into accessible PDF/UA-1 PDFs. No headless Chromium.
Generate PDF, Word (.docx) and PowerPoint (.pptx) documents from Markdown over MCP.
Related MCP Servers
- AlicenseBqualityDmaintenanceA universal MCP server for document processing, conversion, and automation. Handle PDF, DOCX, HTML, Markdown, and more through a unified API and toolset.1318 npm140MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that renders LaTeX to PDF via pdflatex, supporting raw LaTeX and Jinja2 templates with artifact generation.11MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server for programmatic creation, modification, and compilation of structured LaTeX documents.17 npm3Apache 2.0
- AlicenseAqualityDmaintenanceEasyAccessPDF is a production MCP server for PDF accessibility and document conversion. Five tools: convert documents (PDF/DOCX/PPT/XLS/HTML/EPUB/RTF/ODT/TXT) to clean Markdown; export PDFs to JSON/HTML/text/annotated-PDF; run veraPDF PDF/UA-1 (ISO 14289) accessibility audits with graded reports; auto-tag and remediate PDFs for WCAG 2.1/2.2, Section 508, ADA Title II and EAA/EN 301 549 compliance.5MIT