# RiLiGar Storage — MCP Server Documents, collections and files per instance, with raw SQL guarded by EXPLAIN. Endpoint: `https://storage.manager.myinfrastructure.click/mcp/` Protocol: MCP revision 2026-07-28, Streamable HTTP, stateless. `POST` only — `GET` and `DELETE` answer 405. ## Authentication — OAuth 2.1, and nothing else ``` Authorization: Bearer ``` The token is issued by RiLiGar Auth and identifies a PERSON. Your client discovers the authorization server on its own: call the endpoint without a credential, read the 401, follow the challenge. ``` WWW-Authenticate: Bearer resource_metadata="https://storage.manager.myinfrastructure.click/.well-known/oauth-protected-resource", scope="auth:read auth:write" ``` **API keys do not authenticate here.** RiLiGar Storage's key is the credential of the REST API; sending it to this endpoint returns 401. MCP is for people, the REST API is for machines — and the token, unlike a key, says which person and with which consent. ### The audience is what isolates one server from another The token's `aud` must be this tenant's resource — `https://storage.manager.myinfrastructure.click/mcp/`. A token issued for another RiLiGar MCP is refused here even carrying the same scope names (RFC 8707). It is the audience, not the scope name, that separates one service from the next. ### Connecting ```bash claude mcp add --transport http storage https://storage.manager.myinfrastructure.click/mcp/ ``` No key in the command, and no secret in a config file: you approve in the browser and the client stores the token. ## Tools — 13 in total The catalogue is filtered by the token's scopes: a tool outside them is not registered, so it does not appear in `tools/list` and calling it by name fails. The tenant always comes from the address, never from a tool argument — that is the defence against prompt injection. ### Read — scope `auth:read` - `list_collections` - `describe_collection` - `query_collection` - `vector_search` - `run_sql` - `get_stats` - `list_blobs` ### Write — scope `auth:write` - `insert_document` - `insert_documents` - `delete_document` - `upload_blob` - `write_blob` - `delete_blob` The tools here carry no product prefix, unlike the other six. ## Errors A business error is a RESULT, not a transport failure: HTTP 200 with `isError: true` and a readable reason. The agent needs the refusal as an answer it can act on. Transport and authentication failures do use HTTP status: | Status | Meaning | |---|---| | 401 | No credential, an invalid token, or an API key sent instead of a token | | 403 | Identity known, scope missing | | 404 | No `tenantId` in the address | | 405 | `GET` or `DELETE` — this revision has no session | ## Also see - `https://myinfrastructure.click/products/storage/llms.txt` — the REST API, where the API key belongs - `https://myinfrastructure.click/products/auth/llms-mcp.txt` — Auth as the authorization server