Reference MCP servers for supplier invoice intake: read/draft/commit split, typed errors, server-side approval gate, audit log
- ✓Open-source license (MIT)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
claude mcp add invoice-intake-mcp -- python -m -e{
"mcpServers": {
"invoice-intake-mcp": {
"command": "python",
"args": ["-m", "venv"]
}
}
}MCP Servers overview
# invoice-intake-mcp
<!-- mcp-name: com.justdukkan/invoice-intake-mcp -->
Reference implementation of the tool-design rules in
[Designing MCP servers and tools that agents can use safely](https://justdukkan.com/insights/mcp-server-and-tool-design/),
on a real back-office process: supplier invoice intake.
It is small on purpose. The fake ERP is a JSON file; everything else is the
shape we use in production systems.
## What it shows
| Rule | Where |
|---|---|
| Model the business operation, not the API | `erp_match_po`, `erp_stage_invoice`, not `PATCH /invoices` |
| Separate reads, drafts and commits | `--role read` server (reads + reversible staging) vs `--role commit` server (irreversible post) |
| Strict schemas | `Literal` enums for currency, ids not names, `found=false` as a valid empty result |
| Permissions on the server and credential | specialist agents get *read*; only the orchestrator connects to *commit* |
| Tool results are untrusted input | `invoices_extract` says so in its description; the eval set includes a prompt-injection case |
| Typed errors | `{"error": "approval_required" \| "validation_failed" \| "business_rule" \| "not_found", "retryable": bool, ...}` |
| Log for the auditor | `audit.jsonl`: actor, tool, ids, approval reference |
| Human checkpoint enforced server-side | `erp_post_invoice` refuses without a recorded approval, whatever the client believes |
## Run it
```bash
python -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"
python -m invoice_intake_mcp.orchestrator # process the inbox
python -m invoice_intake_mcp.approve list # see what is waiting
python -m invoice_intake_mcp.approve APR-xxxx approved --by cfo
python -m invoice_intake_mcp.orchestrator --resume # post the approved item
cat audit.jsonl
```
Expected first run:
```
plan: 4 new invoices -> extract, resolve vendor, match, stage, post-or-approve
invoice_2291.pdf: staged STG-… -> WAITING for APR-… (7,420 EUR > 5,000 limit)
invoice_2292.pdf: match=goods_not_received -> REVIEW
invoice_2293.pdf: match=variance {"variance_pct": 2.34} -> REVIEW
invoice_2294.pdf: no PO reference -> REVIEW (ask requester)
```
The orchestrator is deterministic so the flow replays without an API key.
An LLM belongs in the places marked in `orchestrator.py` (ambiguous vendor
candidates, free-text remarks, the note back to the requester), not in the
match rule, the tolerance or the approval limit.
## Use the servers from an MCP client
```json
{
"mcpServers": {
"invoice-intake-read": { "command": "uvx", "args": ["invoice-intake-mcp", "--role", "read"] },
"invoice-intake-commit": { "command": "uvx", "args": ["invoice-intake-mcp", "--role", "commit"] }
}
}
```
Give an agent only the *read* server unless it is the orchestrator.
## Tests and evals
```bash
pytest # unit tests on the core operations and the gate
python evals/run.py # replayable decision cases, run on every change
```
## Layout
```
invoice_intake_mcp/
core.py business operations + policy (tolerance, approval limit), pure functions
server.py the two MCP servers and their tool descriptions
orchestrator.py minimal hub over MCP stdio: read server for work, commit server for posting
approve.py the human decision, as a CLI
audit.py append-only JSONL audit log
erp.py fake ERP / inbox state (JSON file)
tests/ pytest
evals/ cases.jsonl + run.py
```
MIT. Built by [JustDukkan](https://justdukkan.com), AI solutions architecture.
What people ask about invoice-intake-mcp
What is justdukkan/invoice-intake-mcp?
+
justdukkan/invoice-intake-mcp is mcp servers for the Claude AI ecosystem. Reference MCP servers for supplier invoice intake: read/draft/commit split, typed errors, server-side approval gate, audit log It has 0 GitHub stars and its last recorded update is dated 2026-09-13.
How do I install invoice-intake-mcp?
+
You can install invoice-intake-mcp by cloning the repository (https://github.com/justdukkan/invoice-intake-mcp) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is justdukkan/invoice-intake-mcp safe to use?
+
Our security agent has analyzed justdukkan/invoice-intake-mcp and assigned a Trust Score of 95/100 (tier: Verified). See the full breakdown of passed checks and flags on this page.
Who maintains justdukkan/invoice-intake-mcp?
+
justdukkan/invoice-intake-mcp is maintained by justdukkan. The last recorded GitHub activity is dated 2026-09-13, with 0 open issues.
Are there alternatives to invoice-intake-mcp?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy invoice-intake-mcp to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/justdukkan-invoice-intake-mcp)<a href="https://claudewave.com/repo/justdukkan-invoice-intake-mcp"><img src="https://claudewave.com/api/badge/justdukkan-invoice-intake-mcp" alt="Featured on ClaudeWave: justdukkan/invoice-intake-mcp" width="320" height="64" /></a>More MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!
The fastest path to AI-powered full stack observability, even for lean teams.