Two paths depending on which client you're using.
In Claude.ai's settings → Connectors → Add custom connector:
https://your-host/mcpClaude.ai will:
https://your-host/.well-known/oauth-protected-resource/mcp/oauth/authorize/mcp callsIf anything errors during the OAuth dance, the consent page logs the failure under smallstack.mcp.oauth and Claude.ai shows a generic "couldn't connect". Check kamal app logs | grep smallstack.mcp first.
For Desktop's claude_desktop_config.json:
{
"mcpServers": {
"smallstack": {
"command": "npx",
"args": ["mcp-remote", "https://your-host/mcp"],
"env": {
"AUTHORIZATION": "Bearer <token>"
}
}
}
}
Mint the token with:
uv run python manage.py create_api_token me --name "claude-desktop" --access-level readonly
mcp-remote proxies stdio to HTTP and passes the AUTHORIZATION env through.
For Desktop's Connectors UI (newer versions) — same as Claude.ai's UI flow above; point it at https://your-host/mcp.
After connecting, ask Claude:
What tools do you have access to from this server?
Claude will list the tools from your tools/list. If you see only ping, the registry is empty — no enable_mcp = True anywhere, and no MCP_TOOL_MODULES.
Choose the color mode for your app.
The accent color for your app.
Choose the font family that fits your app.
Choose the gray shade for your app.
Choose the border radius factor for your app.
Choose the page layout for your app.