MCP Server

99Visibility runs a Model Context Protocol (MCP) server at /api/mcp. An MCP client connects over HTTP with a bearer key, lists the tools that key may use, and calls them. Keys are issued by our team on request. There is no self-serve key and no public tool list.

Status

  • The endpoint is live in production.
  • Keys are created only by our staff, scoped tool by tool. Ask through the contact form, saying which client you use and what you want it to do.
  • Tools that act on one customer's account cannot run over MCP yet. Until they can, customer-scoped access is not available.

Protocol

ItemValue
EndpointPOST https://www.99visibility.com/api/mcp
TransportJSON-RPC 2.0 over HTTP POST, one JSON response per request. No streaming, no sessions.
Methodsinitialize, ping, tools/list, tools/call, and the notifications notifications/initialized and notifications/cancelled (answered 202).
CapabilitiesTools only. No resources or prompts.
BatchesRefused.
DiscoveryGET /api/mcp returns a short description without authentication.

Authentication

Send Authorization: Bearer 99v_ak_…. Only a hash of the key is stored, so a lost key cannot be recovered, only replaced. An unknown, revoked or expired key gets the same answer. Revocation takes effect on the next call.

Scopes

  • A scope is one exact tool name. There are no wildcards and no namespace grants.
  • tools/list shows only the tools in the key's scopes. Calling any other tool answers Unknown tool, exactly as for a tool that does not exist.
  • A key with no scopes authenticates and can do nothing.

Approval gating

Some tools are marked as needing a person's approval. Inside the product, the agent pauses and waits for someone to press Approve. An MCP call never passes through that pause, so the approval moves to the moment the key is issued: such a tool runs over MCP only if its exact name is in the key's scopes. Granting that scope approves every future call of it. tools/list marks these tools as pre-approved for the key, and each such call is logged as one.

Errors

CaseHTTPJSON-RPC error
Missing bearer token401-32600 "Missing bearer token"
Unknown, revoked or expired key401-32600 "Invalid API key"
Rate limit exceeded (per key)429, with Retry-After-32603 "Rate limit exceeded. Retry in Ns."
Body is not JSON200-32700 "Invalid JSON"
Batch, malformed envelope, or tools/call without an id200-32600
Unknown method200-32601 "Method not found"
Tool not in scope or not found; gated tool without its scope; invalid arguments200-32602
Tool unavailable, or a customer-scoped key200-32603
Tool ran and failed200No error: a result with isError: true

Only authentication and rate limiting use non-200 statuses. Everything else returns 200 with a JSON-RPC error, so a client should not retry a deterministic error as if the network failed.

Audit trail

Every call is logged, including refused ones, with the key, the tool and whether a pre-approved gate was used.

Programmatic access beyond MCP is covered in API and programmatic access.