---
category: reference
tags: [tasks, mcp, bug, multi-tenant]
last_updated: 2026-03-15
confidence: high
---

# MCP Wiki Routing Bug

## Problem

The MCP sidecar calls the otterwiki REST API at `http://localhost:8000` without a Host header. The TenantResolver on port 8000 treats requests without a wiki subdomain as the default wiki (`_default`). All MCP reads and writes go to the wrong wiki.

This means:
- Pages written via MCP go to `/srv/wikis/_default/`, not the intended wiki
- Pages read via MCP return content from `_default`, not the wiki the user connected to
- Semantic search queries search the wrong index
- The three `Tasks/` pages created today via MCP are in the `_default` wiki, not the dev wiki

## Root cause

The MCP server (otterwiki-mcp) creates a `WikiClient` with `OTTERWIKI_API_URL=http://localhost:8000`. When it makes HTTP requests to the REST API, it doesn't set a Host header. The TenantResolver sees `localhost` and falls through to the default wiki.

On 3gw (single-tenant), this works because there's only one wiki. On robot.wtf (multi-tenant), the MCP sidecar needs to forward the wiki context.

## Fix

The MCP sidecar receives requests on wiki subdomains (e.g., `dev.robot.wtf/mcp`). It needs to:

1. Extract the wiki slug from the incoming request's Host header
2. Pass `Host: {slug}.robot.wtf` on its API calls to `http://localhost:8000`
3. This way TenantResolver resolves the correct wiki for each API call

The `WikiClient` in `otterwiki_mcp/api_client.py` needs to accept a `host_header` parameter and include it in all requests. The MCP tool handlers need to know the current wiki slug (from the incoming request context) and pass it to the client.

## Complication

FastMCP's tool handlers are async functions registered with `@mcp.tool()`. They don't have direct access to the HTTP request context (Host header). The wiki slug needs to be threaded through somehow — either via a context variable, or by creating a per-request WikiClient.

The V5 consent flow already extracts the wiki slug in the `/authorize/callback` handler. A similar pattern can be used for tool calls.
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9