Connect an MCP client
The gateway speaks MCP over Streamable HTTP at one endpoint, behind one bearer token. Any MCP host works: nothing in the surface assumes a specific client or model.
pipedrive__deal_list; a dot in the operation id becomes an underscoreClaude Code
Use a project .mcp.json instead of claude mcp add --header — the header there is a literal command-line argument, so the token would sit in this process's own argv and in shell history for as long as it runs. ${VAR} in .mcp.json is expanded by Claude Code at runtime, straight from the environment, and never placed on a command line. Export the token with a hidden prompt in the shell that launches claude, so it never reaches history either (zsh: read -rs "MCPU_CLIENT_TOKEN?paste the token: " instead of -rsp):
read -rsp 'paste the token: ' MCPU_CLIENT_TOKEN; echo
export MCPU_CLIENT_TOKENThen, in .mcp.json (project root, or your global Claude Code config):
{
"mcpServers": {
"mcp-universe": {
"type": "http",
"url": "https://<your-instance>/mcp",
"headers": { "Authorization": "Bearer ${MCPU_CLIENT_TOKEN}" }
}
}
}Generic MCP host configuration
Most hosts (Claude Desktop, Cursor, VS Code, an agent framework) take a JSON entry of this shape.
{
"mcpServers": {
"mcp-universe": {
"type": "http",
"url": "https://<your-instance>/mcp",
"headers": { "Authorization": "Bearer <principal token>" }
}
}
}Check it from a shell
Read the token in rather than typing it after Bearer — that keeps it out of shell history and off this process's own argv (ps, /proc/<pid>/cmdline); -H @- reads the header from stdin instead. In zsh, read -rsp 'prompt: ' VAR has no -p — use read -rs "VAR?prompt: " instead.
read -rsp 'paste the token: ' MCPU_CLIENT_TOKEN; echo
printf 'Authorization: Bearer %s' "$MCPU_CLIENT_TOKEN" | curl -sS https://<your-instance>/mcp \
-H @- \
-H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
unset MCPU_CLIENT_TOKENWhat a call returns
Every tool answers with the result envelope: outcome is success, failure or pending_approval, and nothing is ever dropped quietly — a truncated page, a redacted field or a failed audit write is a notice on the result. On this M0 surface, destructive, financial and external-effect operations, and any that require a confirmation, are refused at the tool layer with nothing sent to the target; approvals arrive with the policy engine (M1).