- CLAUDE.md: Main homelab assistant context and instructions - IP-ASSIGNMENTS.md: Complete IP address assignments - NETWORK.md: Network bridges, VLANs, and configuration - EMC-ENCLOSURE.md: EMC storage enclosure documentation - SYNCTHING.md: Syncthing setup and device list - SHELL-ALIASES.md: ZSH aliases for Claude Code sessions - HOMEASSISTANT.md: Home Assistant API and automations - INFRASTRUCTURE.md: Server hardware and power management - configs/: Shared shell configurations - scripts/: Utility scripts - mcp-central/: MCP server configuration 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Centralized MCP Servers for Homelab
Current State of MCP Remote Access
The Problem: Most MCP servers use stdio transport (local process communication).
Claude Code clients expect to spawn local processes.
The Solution: Use mcp-remote to bridge local clients to remote servers.
Architecture
┌─────────────────────────────────────────────────────────────────┐
│ docker-host (10.10.10.206) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ airtable-mcp│ │ exa-mcp │ │ ticktick-mcp│ ... │
│ │ :3001/sse │ │ :3002/sse │ │ :3003/sse │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
▲ ▲ ▲
│ │ │
┌──────┴───────────────┴───────────────┴──────┐
│ Tailscale / LAN │
└──────┬───────────────┬───────────────┬──────┘
│ │ │
┌─────────▼─────┐ ┌───────▼───────┐ ┌─────▼─────────┐
│ MacBook │ │ Mac Mini │ │ Windows PC │
│ Claude Code │ │ Claude Code │ │ Claude Code │
│ mcp-remote │ │ mcp-remote │ │ mcp-remote │
└───────────────┘ └───────────────┘ └───────────────┘
Setup
Step 1: Deploy MCP Servers on docker-host
ssh hutson@10.10.10.206
cd /opt/mcp-central
docker-compose up -d
Step 2: Configure Claude Code Clients
Each device needs mcp-remote installed and configured.
Install mcp-remote:
npm install -g mcp-remote
Update ~/.claude/settings.json:
{
"mcpServers": {
"airtable": {
"command": "npx",
"args": ["mcp-remote", "http://10.10.10.206:3001/sse"]
},
"exa": {
"command": "npx",
"args": ["mcp-remote", "http://10.10.10.206:3002/sse"]
},
"ticktick": {
"command": "npx",
"args": ["mcp-remote", "http://10.10.10.206:3003/sse"]
}
}
}
For remote access via Tailscale, use Tailscale IP:
{
"mcpServers": {
"airtable": {
"command": "npx",
"args": ["mcp-remote", "http://100.x.x.x:3001/sse"]
}
}
}
Which Servers Can Be Centralized?
| Server | Centralizable | Notes |
|---|---|---|
| Airtable | Yes | Just needs API key |
| Exa | Yes | Just needs API key |
| TickTick | Yes | OAuth token stored server-side |
| Slack | Yes | Bot token stored server-side |
| Ref | Yes | API key only |
| Beeper | No | Needs local Beeper Desktop |
| Google Sheets | Partial | OAuth flow needs user interaction |
| Monarch Money | Partial | Credentials stored server-side |
Alternative: Shared Config File
If full centralization is too complex, you can at least share the config:
- Store
settings.jsonin a synced folder (e.g., Syncthingconfigs/) - Symlink from each device:
ln -s ~/Sync/configs/claude-settings.json ~/.claude/settings.json
This doesn't centralize the servers, but ensures all devices have the same config.
Traefik Integration (Optional)
Add to Traefik for HTTPS access:
# /etc/traefik/conf.d/mcp.yaml
http:
routers:
mcp-airtable:
rule: "Host(`mcp-airtable.htsn.io`)"
service: mcp-airtable
tls:
certResolver: cloudflare
services:
mcp-airtable:
loadBalancer:
servers:
- url: "http://10.10.10.206:3001"
Then use: http://mcp-airtable.htsn.io/sse in your config.