Run the server over HTTP¶
By default the client starts the server as a child process. For a shared setup, or a client that only connects to remote servers, run it as an HTTP service instead.
Start it¶
$ INDICO_URL=https://indico.cern.ch uvx --from git+https://github.com/vuillaut/indico-mcp \
indico-mcp --transport http --host 127.0.0.1 --port 8000
The MCP endpoint is http://127.0.0.1:8000/mcp (streamable HTTP). Change the path with --path.
Send tokens per request¶
On a shared server, each user should send their own Indico token with each request, and the server should hold none.
With one instance, send either header:
X-Indico-Token: indp_...
Authorization: Bearer indp_...
With several instances, send one header per instance: X-Indico-Token-cern, X-Indico-Token-in2p3. A _ in an instance name becomes - in the header. The server ignores X-Indico-Token and Authorization when several instances are configured, so it never sends one Indico's token to another.
Requests without a token fall back to the token in the configuration, or to anonymous access.
In Claude Code:
$ claude mcp add --transport http indico http://127.0.0.1:8000/mcp \
--header "X-Indico-Token: indp_..."
Expose it safely¶
The server has no login of its own. Anyone who reaches the port can use it with whatever token the configuration holds. So:
- keep the default
--host 127.0.0.1unless a reverse proxy sits in front; - leave
INDICO_TOKENunset on a shared server, so each user brings their own; - put a reverse proxy with TLS and authentication in front before opening it to a network;
- consider
INDICO_READ_ONLY=truefor a service many people use.
Run it as a container or service¶
There is no official image. The server is one command, so any process manager works. A minimal systemd unit:
[Service]
Environment=INDICO_URL=https://indico.cern.ch
Environment=INDICO_READ_ONLY=true
ExecStart=/usr/local/bin/uvx --from git+https://github.com/vuillaut/indico-mcp@v0.1.0 indico-mcp --transport http --host 127.0.0.1 --port 8000
Restart=on-failure