Доступ по сети

Сервер не на localhost: LAN, Tailscale, reverse proxy

По умолчанию сервер принимает запросы только с Host, равным loopback (localhost, 127.0.0.1, [::1]). Остальные Host отклоняются с кодом 421, чужой Origin — с 403. Это защита от DNS-rebinding. Каждый запрос требует Authorization: Bearer <токен>.

Только эта машина

server:
  host: 127.0.0.1
  port: 8765
  allowed_hosts: ["127.0.0.1:8765", "localhost:8765"]

Домашняя сеть или VPN

Сервер слушает все интерфейсы, адреса клиентов указаны подсетью:

server:
  host: 0.0.0.0
  allowed_hosts:
    - 192.168.88            # префикс = 192.168.88.0/24
    - 10.8.0.0/16           # CIDR
    - localhost

Подсеть сравнивается с заголовком Host (по какому адресу клиент обратился к серверу), а не с адресом клиента. Поддерживаются IPv4-подсети и любые порты; запись без порта разрешает любой порт, host:port — один. Ограничить, кто может подключиться, надо на уровне файрвола или server.host.

Tailscale / имя хоста

server:
  allowed_hosts: ["notebooks.tailnet.ts.net"]

Клиенту нужен https:// (через tailscale serve или reverse proxy). Голый http:// допустим только в доверенной сети; mcp-remote в Claude Desktop тогда запускается с --allow-http.

Reverse proxy

Прокси должен передавать исходный Host (в nginx — proxy_set_header Host $host;) и входить в allowed_hosts по публичному имени. Если нужен CORS/браузерный клиент, добавьте источник в server.allowed_origins.

Проверка

curl -s -o /dev/null -w "%{http_code}\n" http://192.168.88.10:8765/healthz
curl -s -H "Host: evil.example.com" http://127.0.0.1:8765/mcp   # 421

Клиенты: Claude Code и Claude Desktop. Не пробрасывайте порт на роутере в интернет.