MCP server
The Model Context Protocol is an open standard for connecting LLM agents to
external tools and data sources. Capvo ships a hosted MCP server at
https://api.capvo.app/mcp that exposes your meetings as a small set of tools an
agent can call directly. No scripting, no glue code.
If you use Claude Desktop, Cursor, or any other MCP-aware client, this is the fastest way to bring your transcripts into the conversation.
Setup
Claude Desktop
Open the Claude Desktop config file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Add the capvo entry under mcpServers:
{
"mcpServers": {
"capvo": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.capvo.app/mcp",
"--header",
"Authorization:Bearer ${CAPVO_API_KEY}"
],
"env": {
"CAPVO_API_KEY": "cpv_your_key"
}
}
}
}Quit Claude Desktop completely and reopen it. The Capvo tools should now appear in the tools menu.
Other MCP clients
Any client that supports remote MCP servers via mcp-remote (or its equivalent)
can connect to the same URL. The server expects a standard
Authorization: Bearer cpv_your_key header on every JSON-RPC request — pass it
through whichever mechanism your client provides (--header, custom headers
config, etc.).
Available tools
| Tool | Description |
|---|---|
list_meetings | List recent meetings with metadata. Supports filtering. |
get_meeting | Fetch one meeting with its full transcript. |
search_meetings | Semantic search across all your transcripts. |
get_action_items | Pull just the action items extracted from a meeting. |
list_meetings
{
"name": "list_meetings",
"input": {
"platform": "meet",
"created_after": "2026-04-01T00:00:00Z",
"limit": 20
}
}interface ListMeetingsInput {
platform?: 'meet' | 'zoom' | 'teams' | 'phone' | 'microphone'
created_after?: string // ISO 8601
created_before?: string // ISO 8601
limit?: number // 1..100, default 20
}
interface ListMeetingsOutput {
meetings: Array<{
id: string
title: string
platform: string
duration_seconds: number
created_at: string
}>
has_more: boolean
}get_meeting
{
"name": "get_meeting",
"input": { "id": "fd1c2b0e-08a2-4ee0-ab26-9f3a7a14b2c1" }
}interface GetMeetingInput {
id: string // UUID v4
}
interface GetMeetingOutput {
id: string
title: string
platform: string
duration_seconds: number
created_at: string
transcript: Array<{
speaker: string
sequence: number
start_time: number
content: string
}>
summary: string | null
}search_meetings
{
"name": "search_meetings",
"input": { "query": "quarterly forecast", "limit": 5 }
}interface SearchMeetingsInput {
query: string
limit?: number // 1..50, default 10
}
interface SearchMeetingsOutput {
results: Array<{
note_id: string // UUID v4
title: string
snippet: string
score: number
start_time: number // seconds into the recording where the match was found
}>
}get_action_items
{
"name": "get_action_items",
"input": { "id": "fd1c2b0e-08a2-4ee0-ab26-9f3a7a14b2c1" }
}interface GetActionItemsInput {
id: string // UUID v4
}
interface GetActionItemsOutput {
action_items: Array<{
text: string
assignee: string | null
}>
}Configuration
The MCP server reads two configuration values from the environment forwarded by the client:
| Variable | Required | Description |
|---|---|---|
CAPVO_API_KEY | Yes | A valid API key. Same format as the REST API. |
CAPVO_DEFAULT_LIMIT | No | Default limit for list/search calls (1..100). |
The server enforces the same per-key rate limits as the REST API. Tool calls that hit the limit return a structured error the agent can read and back off from.
Example prompts
Once the server is wired up, you can ask Claude things like:
- "List my meetings from this week with the design team."
- "Find every meeting where we talked about the Q3 budget. Quote the relevant lines."
- "Summarize my last call with Maya and pull out the action items assigned to me."
The agent will call the appropriate tools, stitch the results together, and answer. You stay in control of which key it uses and which meetings it can see.