`openclaw mcp serve` を SSH + `docker exec -i` 経由で呼び出しても、Claude Code から MCP として接続できなかった。
`initialize` リクエストを送っても無応答(ぶら下がったまま)。
## 原因
`openclaw mcp serve` はデフォルトで gateway の WebSocket URL を `config.json` の `gateway.remote.url` から読む。
Docker コンテナ内からローカル起動の gateway に接続するには `--url` を明示する必要がある。
## 解決策
`~/.claude.json` の MCP エントリに `-T` フラグと `--url` を追加する:
```json
"openclaw": {
"type": "stdio",
"command": "ssh",
"args": [
"-T",
"cure",
"sudo docker exec -i openclaw openclaw mcp serve --token
]
}
```
- `-T`: SSH の PTY 割り当てを無効化(stdio が正しくパイプされるように)
- `--url ws://localhost:18789`: OpenClaw gateway の WebSocket URL(cure コンテナ内 localhost)
## 検証方法
```bash
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' \
| ssh -T cure "sudo docker exec -i openclaw openclaw mcp serve --token
# → {"result":{"protocolVersion":"2024-11-05","capabilities":{...}}} が返れば成功
```
## 環境
- cure (100.86.220.63): Docker で openclaw コンテナ起動
- gateway は port 18789 でバインド
- shadow から SSH 経由で MCP serve を呼び出す構成