Four servers, one weekend, and an API that no longer existed
Halfway through standing up my fourth MCP server, Todoist answered me with HTTP 410. Not a 404, which could mean anything; a 410 means gone, on purpose, stop asking. The REST API my build was coded against had been retired upstream, and thankfully I learned it from a probe request with a deliberately fake token, before the server went live. I was a day into giving every corner of my homelab its own MCP access, and the to-do list was supposed to be the easy one.
When I first wired AI assistants up to my own services, the connectors demanded internet-facing endpoints, and that ruled out most of what I run. I self-host precisely so that our family documents, our media, and the monitoring never need to touch the open web. A Home Assistant blog post changed my mind: I could now reach the house this way without exposing anything to the internet, and I figured what was true for the house was probably true for the rest of the estate. My knowledge base had already proven the shape: a thin server around an existing service, reachable only inside my private network.
The unglamorous reason I spent a weekend on this is sprawl. Watching my first agents come online was exciting; a few months on, talking to the fleet means channel-hopping through Discord several times a session to reach the right specialist. What I want is a single front door: a chief of staff I can hand any request in plain language and let it route the work through whatever sub-agent or tool the job needs. These four servers are that door’s hardware.
Four servers and about 24 hours later: one for Radarr and Sonarr, the pair that manage our media library; one for Paperless, the vault of scanned family documents; one for Prometheus and Graylog, metrics and logs; one for Todoist, the to-do list. Every one wraps an API I had been driving by hand; a lengthy media-curation session I operated in July hand-rolled dozens of curl commands against the first two. The same questions are now tools an assistant can call.
Each server got its own address behind the reverse proxy and its own basic-auth account: four doors, four separate keys, and no key that opens more than one. A reasonable person wouldn’t self-host their family’s critical services at all, and part of being an unreasonable person is doing a thorough job of it: isolation rules meant to keep a vulnerability in one service from propagating to the next. You build for the worst case, hoping that day never comes, rather than hoping for the best and knowing you traded security away for convenience. My data is too precious to me and my family to make that deal.
The suite found its first bug by being used: each server has to answer one real question from a fresh session before it counts as done, and the media server’s question, “what are my top upgrade candidates?”, came back with every movie’s current quality reading null. The tool read a field Radarr’s wanted-list endpoint didn’t return, with no parameter to ask for it (Sonarr’s has one; Radarr’s doesn’t). The smoke tests had been green the whole time; nobody had read that field until a real operation needed it. The fix joins the quality name in from a bulk endpoint, and the tool now ranks the backlog by current quality, worst first.
Two of the four servers hold credentials scoped down to what their tools can do; the other two carry the full-scope keys their services handed me, so those servers hold more privilege than they expose. I don’t love that, and it’s still open. The Todoist server ran in parallel with the hosted connector it replaced until it survived two weeks of daily use. It did, and once it could also do the few things the hosted one still did better, I switched the hosted connector off. I keep circling a voice version too. That waits on an access-control answer, because a voice command works for anyone who can talk, and my toddler is likely going to grow into a very technical and (if he’s anything like me) mischievous young boy. Discord, where only my account can give orders, gets full capability; voice will likely get a read-only subset, at least until junior and I see eye to eye on remux versioning.
Meanwhile the four fresh-session questions were all answered the ordinary way: a media backlog ranked worst-first, a utility bill pulled from the vault by asking for it, a log anomaly hunted down, a task added from chat and read back a minute later.