> ## Documentation Index
> Fetch the complete documentation index at: https://docs.brilo.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# MCP tools

> Every tool the Brilo MCP server offers to clients signed in with an API key, with its parameters and an example request.

The Brilo MCP server offers read only tools for agents and calls to any MCP client signed in
with a Brilo API key. Each tool below lists its parameters and an example request. Every tool
only ever returns data from the workspace your API key belongs to, and none of them can change
anything. To connect a client, see [Connect an MCP client](/api-reference/mcp/connect).

## Tools your MCP client can use

The Brilo MCP server offers these tools to clients signed in with an API key. Each row is one tool.

| Tool | What it returns |
| - | - |
| [`list_agents`](#list_agents) | Your agents, as short summaries |
| [`get_agent`](#get_agent) | One agent with its full configuration |
| [`list_calls`](#list_calls) | Your call history, as short summaries |
| [`get_call`](#get_call) | One call in full, with its transcript |

## list\_agents

The `list_agents` tool lists the agents in your workspace with their name, status, role, model, channel, language and time zone. Prompts and chat widget settings are not included: use `get_agent` for one agent in full.

Each item in `data` contains these fields when they have a value: `id`, `name`, `description`, `status`, `role`, `modality`, `model`, `language`, `languages`, `timezone`, `voice_id`, `company_name`, `enable_recording`, `created_at`.

The `list_agents` tool takes these parameters, all optional.

| Parameter | Type | Required | Details |
| - | - | - | - |
| `q` | string | No | Case-insensitive substring match on agent name. Up to 100 characters. |
| `status` | string | No | Exact (case-insensitive) status match, e.g. "active". Unknown values return an empty page. Up to 64 characters. |
| `modality` | string | No | Exact (case-insensitive) modality match, e.g. voice, chat, email. Up to 32 characters. |
| `language` | string | No | Exact (case-insensitive) language match, e.g. en. Up to 32 characters. |
| `offset` | integer | No | Rows to skip. Default 0. From 0 to 1000000. |
| `limit` | integer | No | Page size. Default 20, max 200. From 1 to 200. |
| `sort` | string | No | Result ordering. Default created\_at:desc. One of: `created_at:desc`, `created_at:asc`, `name:asc`, `name:desc`. |

An example `list_agents` request:

```json theme={null}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_agents",
    "arguments": {
      "status": "active",
      "limit": 10
    }
  }
}
```

## get\_agent

The `get_agent` tool returns one agent with its live configuration: prompts and every behaviour setting, such as recording, voicemail, consent, timing and tone. Use it to check whether a setting is switched on. An agent outside your workspace returns `not_found`.

The result contains these fields when they have a value: `id`, `name`, `description`, `status`, `role`, `modality`, `model`, `language`, `languages`, `timezone`, `voice_id`, `company_name`, `company_website`, `created_at`, `updated_at`, `prompt`, `custom_prompt`, `instruction`, `objective`, `welcome_msg`, `seed_phrase`, `post_call_notes`, `tone_of_voice`, `len_resp`, `creativity`, `speaking_rate`, `patience_level`, `reasoning_effort`, `ring_duration`, `outbound_ring_duration`, `silence_timeout`, `idle_reminder`, `idle_reminder_duration`, `idle_reminder_message`, `call_duration`, `call_limit`, `call_back`, `call_tag`, `greeting_interrupt`, `call_screening_message`, `voicemail_behavior`, `voicemail_message`, `add_background_noise`, `background_noise_level`, `background_noise_type`, `noise_cancellation`, `is_transcript_enabled`, `expressive_mode`, `is_hipaa_compliant`, `retention_period`, `contact_access`, `self_learning`, `enable_recording`, `recording_consent`, `consent_type`, `consent_prompt`, `widget_theme`, `widget_position`, `widget_mode`, `widget_primary_color`, `widget_hover_color`, `widget_text_color`, `widget_hover_text_color`, `widget_cta_text`, `widget_trigger_heading`, `widget_trigger_button_text`, `widget_welcome_message`, `widget_start_call_text`, `widget_end_call_text`, `widget_hover_text`, `widget_connecting_text`, `widget_active_text`, `widget_stop_text`, `widget_tc_enabled`, `widget_tc_text`, `widget_tc_privacy_url`.

The `get_agent` tool takes these parameters.

| Parameter | Type | Required | Details |
| - | - | - | - |
| `agent_id` | string (UUID) | Yes | Agent ID (UUID). |

An example `get_agent` request:

```json theme={null}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_agent",
    "arguments": {
      "agent_id": "3f2b8c1e-5d4a-4b6f-9e2a-7c1d0b8a9f33"
    }
  }
}
```

## list\_calls

The `list_calls` tool lists calls in your workspace, newest first, as short summaries: status, direction, duration, phone numbers and the AI summary. Transcripts are left out so a page stays small: use `get_call` for one call in full. Test calls are left out unless `include_test` is true.

Each item in `data` contains these fields when they have a value: `id`, `status`, `direction`, `to`, `from`, `duration`, `answered_by`, `summary`, `created_at`, `agent_id`, `contact_id`, `campaign_id`, `schedule_time`, `content_redacted`, `redaction_reason`.

The `list_calls` tool takes these parameters, all optional.

| Parameter | Type | Required | Details |
| - | - | - | - |
| `agent_id` | string (UUID) | No | Filter to one agent. |
| `contact_id` | string (UUID) | No | Filter to one contact. |
| `campaign_id` | string (UUID) | No | Filter to one campaign. |
| `status` | string | No | Call status filter. One of: `scheduled`, `not-scheduled`, `paused`, `queued`, `dialing`, `in-progress`, `completed`, `failed`, `blocked`, `skipped`, `no-answer`, `busy`, `canceled`. |
| `direction` | string | No | inbound or outbound. One of: `inbound`, `outbound`. |
| `from_date` | string | No | Inclusive lower bound on created\_at (ISO 8601). |
| `to_date` | string | No | Inclusive upper bound on created\_at (ISO 8601). |
| `to_number` | string | No | Exact match on the dialed number. Up to 32 characters. |
| `from_number` | string | No | Exact match on the caller number. Up to 32 characters. |
| `min_duration` | integer | No | Minimum call duration in seconds (inclusive). At least 0. |
| `max_duration` | integer | No | Maximum call duration in seconds (inclusive). At least 0. |
| `answered_by` | string | No | Who/what answered: human, voicemail, or ivr. One of: `human`, `voicemail`, `ivr`. |
| `include_test` | boolean | No | Include test-run conversations. Default false. |
| `offset` | integer | No | Rows to skip. Default 0. From 0 to 1000000. |
| `limit` | integer | No | Page size. Default 20, max 200. From 1 to 200. |
| `sort` | string | No | Result ordering. Default created\_at:desc. One of: `created_at:desc`, `created_at:asc`. |

An example `list_calls` request:

```json theme={null}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_calls",
    "arguments": {
      "direction": "inbound",
      "from_date": "2026-09-01",
      "answered_by": "human",
      "limit": 20
    }
  }
}
```

## get\_call

The `get_call` tool returns one call in full: the summary, the transcript, duration and how the call ended. Recordings are not included, and HIPAA workspaces never receive transcripts or summaries. See [What is withheld](/api-reference/mcp/overview#what-is-withheld).

The result contains these fields when they have a value: `id`, `status`, `direction`, `to`, `from`, `duration`, `answered_by`, `summary`, `created_at`, `agent_id`, `contact_id`, `campaign_id`, `schedule_time`, `content_redacted`, `redaction_reason`, `transcript`, `ended_reason`, `ended_message`, `retry_after`.

The `get_call` tool takes these parameters.

| Parameter | Type | Required | Details |
| - | - | - | - |
| `call_id` | string (UUID) | Yes | Call ID (UUID). |

An example `get_call` request:

```json theme={null}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_call",
    "arguments": {
      "call_id": "8a1c2e4f-6b3d-4f7a-9c0e-1d2b3a4c5e6f"
    }
  }
}
```

## What is not supported

The Brilo MCP server does not support these today:

* **Changing anything.** Every tool reads data. Creating agents, starting calls and editing
  contacts are done through the [REST API](/api-reference/introduction) instead.
* **Other workspaces.** An API key only ever reads the workspace it belongs to, and no tool
  takes a workspace as a parameter.
* **Recordings.** Call recordings are not available over MCP. Transcripts are, except for
  HIPAA workspaces. See [What is withheld](/api-reference/mcp/overview#what-is-withheld).
* **Sign in with OAuth.** Clients that only offer an OAuth sign in, such as some hosted chat
  apps, cannot connect yet. Clients that accept a request header work today.

## FAQ

<AccordionGroup>
  <Accordion title="Which tools can an MCP client use with a Brilo API key?">
    An MCP client signed in with a Brilo API key can use every tool listed on this page:
    listing and reading agents, and listing and reading calls. The list comes from the server
    itself, so this page always matches what your client sees when it asks the Brilo MCP server
    for its tools.
  </Accordion>

  <Accordion title="Can an MCP client change anything in my workspace?">
    No. Every Brilo MCP tool is read only, so a client connected with your API key can look at
    agents and calls but cannot edit, create or delete anything. To make changes from your own
    code, use the [Brilo REST API](/api-reference/introduction), which uses the same API key.
  </Accordion>

  <Accordion title="Why does get_call return no transcript?">
    Either the workspace is a HIPAA workspace, or the call has no transcript yet. HIPAA
    workspaces never receive transcripts over MCP, and those calls have `content_redacted` set
    to true. A call still ringing, or one nobody answered, has no transcript at all. The full
    rules are on [What is withheld](/api-reference/mcp/overview#what-is-withheld).
  </Accordion>

  <Accordion title="Why can't I get call recordings over MCP?">
    Call recordings are kept in private storage that only your Brilo dashboard can open, so a
    link would not work in an outside AI tool. The Brilo MCP server leaves recordings out of
    every tool for that reason. To listen to a call, open it in your Brilo dashboard.
    Transcripts and summaries are available over MCP instead, except for HIPAA workspaces.
  </Accordion>

  <Accordion title="Why does my client say a tool was not found?">
    The tool name is not one the Brilo MCP server offers to API key clients. Tool names are
    exact, such as `list_calls`, and only the tools on this page are available. Ask your client
    to list the Brilo tools again, because some clients cache the list from an earlier session.
  </Accordion>

  <Accordion title="How many calls can list_calls return at once?">
    The `list_calls` tool returns 20 calls by default and up to 200 in one page. To read further,
    pass `offset` with the number of calls already read. Each result includes a `pagination`
    object with the total and a `has_more` flag, so your client knows when to stop.
  </Accordion>

  <Accordion title="Does list_calls include test calls?">
    No. The `list_calls` tool leaves out test conversations from your dashboard unless you set
    `include_test` to true. This keeps the call history your client reads the same as the one
    your customers actually had, and means test runs never skew counts or summaries.
  </Accordion>
</AccordionGroup>

## Related

* [Brilo MCP server](/api-reference/mcp/overview) for what it is and what is withheld
* [Connect an MCP client](/api-reference/mcp/connect) to set up Claude Code, Cursor or VS Code
* [API introduction](/api-reference/introduction) for API keys and rate limits


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.