Skip to main content
VisIQ exposes an authenticated Model Context Protocol (MCP) server so an AI agent or MCP-capable client can operate the product with tool calls instead of raw REST. It is the same management surface as the web app and the automation API — every tool enforces the identical RBAC permission its web route requires.
There are two VisIQ MCP servers, both listed in /.well-known/mcp/server-cards.json:
  • Public MCP — https://visiqlabs.com/mcp — read-only discovery, no credentials. Public information about VisIQ only.
  • Platform MCP (this page) — https://app.visiqlabs.com/api/mcp — authenticated; operates your tenant.

Endpoint & transport

You need a management-audience API key. Get one from Connectors → API Keys in the dashboard, or have your agent self-register with "requested_key_type": "management". A harness key is confined to the SDK operational surface and is not accepted here.

What needs a key

Tool calls are fail-closed. A missing key is a JSON-RPC error; an unknown, revoked or expired key, or a harness key, is refused before any tool runs; and a tool whose permission the key does not hold returns an error naming the missing permission, never a partial result.

Connect a client

Every client needs the URL and an Authorization: Bearer header carrying a management key. Keep the key in an environment variable (VISIQ_API_KEY below), not in a file you commit. The Claude Code, Cursor and Claude Desktop shapes follow those clients’ own documentation at the time of writing; the curl call is tested against this server. Claude Code
Cursor (.cursor/mcp.json)
Claude Desktop has no field for a custom header on a remote server, so connect it through the community-maintained mcp-remote bridge (not a VisIQ project; check its current flags). The header value is passed through env because the bridge splits arguments on spaces:
Any HTTP client (check a key without an MCP client):
Then start with whoami to confirm which vendor, role and permissions your key resolves to. Every other tool is gated by those permissions.

Retries and audit

  • Retries. Read-only tools are always safe to repeat. create_rule, create_recall_rule and compile_rule take an optional idempotency_key: repeat the call with the same key and the same arguments (in any key order) and you get the first result back instead of a second write. Without a key, a repeated create_rule or create_recall_rule with the same name is refused with 409 A rule with this name already exists, but a repeated compile_rule can create a second rule under another name. update_rule, delete_rule, register_agent, update_agent, respond_hitl, update_allow_settings and revoke_self are safe to repeat: a second call changes nothing further or is refused. Key-order tolerance applies to calls made through this server; the REST API hashes the body exactly as sent.
  • Audit. Tool calls your key makes are recorded in Settings → Activity with the tool, the outcome and the key that made it. The record holds the size of the arguments, never their content. A write is recorded before it runs and is not attempted if that record cannot be written; a read is recorded after it answers, on a best-effort basis. Not recorded: describe_chat, which reads nothing about your key; calls refused before a key resolves (no key, or an unknown, revoked or expired one); calls naming an unknown tool or sending invalid arguments.

Tool catalog

Arguments are checked against each tool’s inputSchema before the tool runs: an argument the schema does not list, a missing required one, or a value of the wrong type is refused with -32602. The server advertises 26 tools through tools/list. Each one is gated by the same permission as its web API route; call whoami to see which your key holds.

Discovery

whoami

Return the vendor, role and effective permissions of the management key you authenticated with, exactly as every other tool resolves them. Takes no arguments.

describe_chat

Discover the in-product AI chat surface: which chat_* tools exist, how to read the NlChatResult widgets (previews/final/clarify/navigate), and the catalog of pages a navigation proposal can point at. Takes no arguments.

Governance rules (unified: action and retrieval)

list_rules

List the tenant’s unified governance rules (action and retrieval), paginated. Filter by facet with operations.

get_rule

Fetch a single governance rule (action or retrieval) by id, including its Rego and applies_to facets.

create_rule

Create a governance rule. Author the logic in Rego and declare which operation facets it governs. Pass idempotency_key to make a retry safe.

update_rule

Update an existing governance rule. Send any subset of its fields; omitted fields are unchanged.

delete_rule

Delete a governance rule by id.

compile_rule

Author a governance rule from a natural-language description via the in-product Rule Builder assistant. The assistant compiles the intent to Rego, simulates its impact, and PERSISTS the rule (write). An ACTION rule needs allow_rules:create, a RETRIEVAL rule needs recall_rules:create (whichever facet the assistant persists is enforced). Returns the compiled rule graph + related rules. Pass idempotency_key to make a retry safe: without it, a retried call can create a second rule.

Retrieval-only rule aliases

list_recall_rules

List the tenant’s retrieval-governance rules only, paginated. list_rules returns both facets.

create_recall_rule

Create a retrieval-governance rule, authored in Rego (the retrieval facet is set for you). Pass idempotency_key to make a retry safe.

Agents

list_agents

List the tenant’s registered AI agents (across all connected frameworks) with governance metadata.

get_agent

Fetch a single agent by id with its full governance profile.

register_agent

Register/connect an AI agent from a supported framework (LangChain, OpenAI Agents SDK, LlamaIndex, Vercel AI SDK, Mastra, VoltAgent, Semantic Kernel, Pydantic AI, OpenClaw, CrewAI, AutoGen, LangGraph, Google ADK, Strands Agents, …). agent_id is the natural key: registering the same agent_id again is refused (409), never duplicated.

update_agent

Update an agent’s governance settings (mode, trust tier, categories, business function, owner, HITL pathway, shutdown, …). Unknown fields are refused.

Decisions and action schemas

get_decision_outcomes

Read governance decision outcomes (the decision audit log): each agent action or retrieval and whether it was permitted, denied, sent to approval, or masked.

list_action_schemas

List the discovered action/tool schemas and their field mappings for the tenant’s agents.

Human-in-the-loop

list_hitl_queue

List human-in-the-loop approval requests (actions routed for human review). Defaults to open requests.

respond_hitl

Respond to a human-in-the-loop request. For an end-user approval send decision; for other items send action (dismiss or create_rule). The approver is recorded from the authenticated management key you call with. It cannot be supplied or spoofed.

Settings

get_allow_settings

Read the tenant’s governance settings (no-coverage defaults, autopilot, HITL timeout, default agent mode, fail mode, redaction floor, Context Firewall policy, auto-disable). Takes no arguments.

update_allow_settings

Update the tenant’s governance settings. Send any subset of the fields; omitted fields are unchanged.

Natural-language queries

chat_rules_table

Ask the in-product AI assistant about the governance RULES table in natural language (‘which enabled rules block writes to external APIs?’). Returns a machine-friendly NlChatResult (previews/final query/clarify/navigate). Does not mutate. It resolves a query the Rules table would apply.

chat_events_log

Ask the in-product AI assistant about the EVENT LOG (governance decision outcomes) in natural language (‘show denies on stripe in the last hour’). Returns a machine-friendly NlChatResult. Read-only query resolution.

chat_agents_inventory

Ask the in-product AI assistant about the AGENTS inventory in natural language (‘which discovered agents are ungoverned shadow AI?’). Returns a machine-friendly NlChatResult. Read-only query resolution.

chat_hitl_queue

Ask the in-product AI assistant about the HUMAN-IN-THE-LOOP approval queue in natural language (‘pending refunds over $500 from the fraud bot’). Returns a machine-friendly NlChatResult. Read-only query resolution (use respond_hitl to act on an entry).

chat_data_table

Ask the in-product AI assistant about ANY other data table by supplying that table’s field schema (the generic dock every StandardTablePage carries). Returns a machine-friendly NlChatResult with the resolved query or a navigation proposal.

Key lifecycle

revoke_self

Revoke THIS API key: the exact management key you are authenticated with (RFC 7009 self-revocation). No special permission is required, and no other key can be targeted: the credential is identified from the request’s own bearer token. After this succeeds the key immediately stops authenticating, so it MUST be your final call with it. Irreversible. Takes no arguments.

Errors and limits

Errors

A failure is reported in one of two places. A problem with the request itself is a JSON-RPC error. A tool that ran and was refused, or failed, is a normal result with isError: true, and its text carries the HTTP status and the route’s error body.

Limits and transport

The first two limits are per-deployment settings (MCP_RATE_LIMIT_IP_PER_MIN and MCP_RATE_LIMIT_KEY_PER_MIN) and are enforced on each server instance, as a guard against a single runaway client rather than as a billing quota. Every call also spends the key’s own request budget, which it shares with the REST API.