Featured project, Claude API + MCP, 2026
Agent Ops Lab
A live server I break on purpose so an AI agent can fix it, inside guardrails I wrote.
How an incident runs
- 01ComplaintClaude gets the users' complaint, never which fault was picked.
- 02DiagnosisRead-only commands from an allowlist, run through the MCP server.
- 03ApprovalEvery change waits for a person, with the reason it should work.
- 04FixThe smallest change the evidence supports.
- 05VerificationThe lab runs its own user check before it counts as fixed.
Tested with Haiku, Sonnet and Opus: 15 of 15 outages fixed, and none of them followed the fake instructions.
I set up a small company's CRM on an Ubuntu server at DigitalOcean, with a load balancer, two app servers, PostgreSQL and DNS running in Docker. You pick a fault, like a full disk, an expired certificate or a database out of connections, and it really happens. Claude only gets the user's complaint, and it can only reach the servers through an MCP server I wrote in Python. It can run read-only commands from an allowlist, and every change waits for someone to approve it. The lab checks the result on its own, and every fault hides fake instructions in the logs to see if the agent falls for them.
- Python
- MCP
- Claude API
- Docker
- PostgreSQL
- Caddy
- Next.js
- This pageA static Next.js app in the visitor's browser
- Incident servicePython. Injects the fault, streams the timeline, relays approvals
- ClaudeReads the evidence and asks for changes, through MCP only
- MCP serverPython. Command allowlist, approvals, budgets, audit log
- Docker labSix containers on one DigitalOcean droplet
lb-01crm-app-01crm-app-02db-01dns-01office-pc
A demo lab I run for this portfolio, not a production system.



