CapyAgent Meet MCP
Allows the bot to join Google Meet meetings as a guest, record audio locally, and produce transcripts with timestamps.
Allows the bot to join Webex meetings as a guest, record audio locally, and produce transcripts with timestamps.
Allows the bot to join Zoom meetings as a guest, record audio locally, and produce transcripts with timestamps.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@CapyAgent Meet MCPJoin the meeting https://meet.google.com/abc-defg-hij and transcribe it"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
CapyAgent Meet MCP
MCP-сервер, который заходит в онлайн-встречу, молча её записывает и расшифровывает запись локально. Поддерживает Яндекс Телемост (telemost.yandex.ru и telemost.360.yandex.ru), Google Meet, Zoom и Webex.
Бот входит гостем с выключенными микрофоном и камерой. На случай, если интерфейс встречи их всё-таки включит, вместо настоящих устройств ему подсунуты тишина и чёрный кадр. Расшифровка делается на своей машине через faster-whisper, наружу ничего не уходит, ключи внешних сервисов не нужны.
Инструменты
Инструмент | Что делает |
| Заходит во встречу и начинает запись, возвращает id. Вход подтверждается только тогда, когда файл записи появился и растёт. |
| Показывает, в звонке ли бот, растёт ли файл, есть ли звук в последних 20 секундах, сколько минут записано и как идёт расшифровка. |
| Выходит из встречи и запускает расшифровку в фоне. |
| Отдаёт текст с таймкодами |
| Показывает последние записи. |
| Запускает расшифровку заново, если она упала или процесс записи оборвался. |
Ни один вызов не висит всю встречу. Каждая запись идёт отдельным фоновым процессом со своим звуковым устройством и своим виртуальным экраном, поэтому параллельные записи не смешиваются. Если по той же ссылке запись уже идёт, join_meeting вернёт её id, второго бота не будет.
Где есть systemd, каждая запись запускается в своём scope capymeet-<id>.scope. Поэтому перезапуск агента или MCP-сервера идущую запись не обрывает, а после перезапуска meeting_status видит её по-прежнему живой. Отключить такой запуск можно переменной CAPY_MEET_NO_SCOPE=1.
Related MCP server: ChatterBox MCP Server
Установка
Системные пакеты (Ubuntu или Debian):
apt-get install -y git pulseaudio xvfb ffmpegНужен uv. Дальше:
git clone https://github.com/smolnikov-k/capy-meet-mcp && cd capy-meet-mcp
uv sync --frozen --no-dev
.venv/bin/python -m playwright install --with-deps chromium
.venv/bin/capy-meet-doctorcapy-meet-doctor проверяет всё, что нужно для записи, и подсказывает, как исправить найденное. Нужна полная сборка Chromium: в headless-сборке нет звука, и запись выйдет тихой.
Модель расшифровки (small, около 500 МБ) скачивается при первой расшифровке.
Подключение к MCP-клиенту
Сервер работает по stdio:
/path/to/capy-meet-mcp/.venv/bin/capy-meet-mcpНастройки (переменные окружения)
Переменная | По умолчанию | Смысл |
|
| где лежат записи: |
|
| имя бота во встрече, если не задано при вызове |
|
| модель faster-whisper |
| не задан | язык расшифровки, без него определяется сам |
|
| где и как считать |
|
| потолок длины записи |
Что лежит в папке записи
meta.json и state.json описывают запрос и состояние записи, audio.wav это сама запись (16 кГц, моно), transcript.txt и segments.json содержат расшифровку, engine.log, worker.log и ffmpeg.log это журналы. Если войти не удалось, рядом появится снимок экрана debug_failed_join.png.
Лицензия
MIT, см. LICENSE.
Available Tools
6 toolsget_transcriptBRead-only
Расшифровка встречи с таймкодами [ЧЧ:ММ:СС] и путь к WAV. Длинный текст отдаётся частями: следующий кусок с offset=next_offset.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry readOnlyHint=true, which the description does not contradict — retrieving a transcript is consistent with a read operation. The description adds genuine behavioral value beyond the annotation: it discloses that long texts are paginated and that the next chunk is fetched via offset=next_offset, and it reveals the output contains timestamps and a WAV path. This is meaningful context the annotation does not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with the core purpose front-loaded and the pagination detail placed second. No wasted words; the timestamps format and pagination behavior each earn their place. Only a small efficiency gain would be possible by trimming redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only retrieval tool with readOnlyHint annotation and no output schema, the description covers the return content (transcript, timestamps, WAV path) and the pagination mechanism. It is incomplete on what 'id' should be and on prerequisites (e.g., requiring a prior transcribe_recording). The return format is described but the parameter contract is not fully specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden of explaining the two parameters. It partially compensates by explaining offset's role in pagination (next_offset), but it never defines what 'id' refers to (meeting ID? transcript ID?) or its required format. With no schema help, leaving a required parameter undocumented is a notable gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the resource (transcript of a meeting) and the content delivered (timestamps in HH:MM:SS format and WAV path). The verb is implied rather than explicit ('Расшифровка' = transcript), but the intent to retrieve is unambiguous. It partially distinguishes from the sibling transcribe_recording, which is about creating a transcript, while this one retrieves it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus its siblings. The natural counterpart transcribe_recording (creation vs. retrieval) is never named, nor is any precondition stated (e.g., that a transcript must already exist). The only usage hint is implicit in the pagination note about offset, which is behavioral rather than selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
join_meetingA
Зайти в онлайн-встречу молча (микрофон и камера выключены) и начать запись.
Платформы: Яндекс Телемост (telemost.yandex.ru и telemost.360.yandex.ru),
Google Meet, Zoom, Webex. platform="auto" определяет её по ссылке.
Возвращает id записи. Вход считается состоявшимся только когда файл записи
появился и растёт; ждём этого не дольше wait_seconds, дальше проверять
через meeting_status. Если по этой ссылке запись уже идёт, вернёт её id,
второго бота не запускает.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| platform | No | auto | |
| display_name | No | ||
| wait_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only openWorldHint and destructiveHint in annotations, the description carries the behavioral burden and does so thoroughly. It reveals that the tool starts a recording, returns the recording id, is idempotent for an already-running recording, and only considers entry successful when the recording file appears and grows, with a bounded wait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, front-loaded with the core action and then layered with necessary caveats. There is no filler; every sentence contributes operational knowledge.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explains the return value (recording id), the eventual consistency behavior, the timeout fallback to meeting_status, and the no-second-bot guarantee. This is sufficient for an agent to invoke the tool correctly in most scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains platform='auto' (detection by link) and wait_seconds (timeout cap), and url is contextual from 'по ссылке', but display_name is not mentioned and platform values are not enumerated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific action: silently join an online meeting and start recording. This clearly separates it from siblings like meeting_status and leave_meeting by naming the resource (meeting) and the exact operation (join + record).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear invocation context: supported platforms, how platform='auto' works, and the timeout behavior. It even points to meeting_status for follow-up checks, though it does not explicitly contrast against other siblings such as transcribe_recording or leave_meeting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leave_meetingA
Выйти из встречи, закончить запись и запустить локальную расшифровку. Расшифровка идёт в фоне; готовый текст отдаёт get_transcript.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide destructiveHint=false, so the description carries the behavioral burden. It discloses that transcription runs in the background and that the final text is retrieved via get_transcript. However, it does not mention side effects like whether the recording is saved or if leaving is irreversible, but the async behavior is a valuable addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two short, front-loaded sentences with no filler. The first sentence states the actions; the second explains the background transcription and where to retrieve results.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema, the description covers the primary effects and the follow-up tool, but omits the meaning of the required 'id' parameter and any prerequisites or errors. It is adequate but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description does not explain the 'id' parameter at all. The agent must infer that 'id' refers to the meeting ID, so the description adds no semantic value for the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool leaves the meeting, ends recording, and starts local transcription. It explicitly names get_transcript as the provider of the finished text, distinguishing this tool from transcribe_recording and get_transcript.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool (leaving a meeting and wanting a transcript) and points to get_transcript as the follow-up. It does not explicitly exclude alternatives, but the intended workflow is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_meetingsCRead-only
Последние записи: id, платформа, ссылка, когда, фаза, длительность.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=true annotation already communicates that this is a safe read operation, and the description does not contradict it. The description adds the returned field list but not behavioral details such as ordering, date filtering, or pagination behavior. With annotations covering the safety profile, this is a baseline-adequate score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short fragment with no filler, so it is concise in length. However, it is so terse that it reads more like a response label than a complete tool definition, making it under-specified rather than well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with one optional parameter and no output schema, the field list provides useful context about what is returned. Yet the agent is left without knowing how limit affects results or whether records are ordered, so the description has clear but not severe gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, limit, is not mentioned anywhere in the description, and the schema provides no description coverage either. The description neither explains what limit controls nor hints at pagination, so it adds no value beyond the raw schema field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Последние записи' (latest records) and enumerates the fields (id, platform, link, when, phase, duration), which together with the tool name make clear this tool lists recent meetings. It is distinguishable from the action-oriented siblings like join_meeting or transcribe_recording. However, it doesn't explicitly phrase the action as 'list meetings', so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus meeting_status or get_transcript, and no indication of when not to use it. The description only reports output contents, leaving the agent to infer selection criteria from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meeting_statusBRead-only
Состояние записи: в звонке ли бот, растёт ли файл, есть ли звук в последних 20 секундах, сколько минут записано, идёт ли расшифровка.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint=true, so the description need not restate safety. The description adds valuable behavioral context by listing the specific status indicators it reports (bot presence, file growth, audio, duration, transcription). However, it does not disclose error behavior, what happens for missing IDs, or whether the tool might block or wait. This is acceptable given the read-only annotation, so a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, densely informative sentence that front-loads the core concept ('Состояние записи') followed by a clear list of status aspects. Every word adds value; there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one parameter) and read-only, so the description lists the key status fields, which is useful. However, it does not describe the return format (e.g., JSON structure, field names, types) or how the status is presented. Since there is no output schema, this information must come from the description, and it is missing. Also, the parameter semantics gap further reduces completeness. A 3 reflects that the description covers the what but not the how.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has a single required parameter 'id' with no description, and schema description coverage is 0%. The tool description does not explain what 'id' refers to (likely a meeting/recording ID), nor the format or how to obtain it. With zero coverage in the schema and no clarification in the description, the parameter is effectively undocumented. This is a significant gap for an agent to invoke the tool correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: reporting the status of a recording (whether the bot is in the call, file growth, audio presence, minutes recorded, transcription progress). It uses a specific verb ('состояние' status) and resource (recording), and clearly distinguishes from siblings like transcribe_recording, join_meeting, and get_transcript, which are actions rather than status queries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. It implies a status-checking use case, but doesn't state when to prefer it over get_transcript or list_meetings, nor any prerequisites (e.g., that a meeting must be active or a recording ID must exist). No exclusions or alternatives named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcribe_recordingA
Заново расшифровать готовую запись: если расшифровка упала или процесс записи умер, а WAV остался. Идёт в фоне, результат в get_transcript.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavioral context beyond the sparse annotations: it runs in the background ('Идёт в фоне') and its result is exposed through get_transcript. Since annotations only provide destructiveHint=false and no readOnlyHint, this async framing is valuable. It does not contradict any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is two compact sentences with no wasted words. The purpose and trigger condition are front-loaded, and the second sentence provides the key behavioral detail (background execution and result destination). Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema and minimal annotations, the description covers purpose, trigger condition, async behavior, and where to get the result. It is slightly incomplete only in not spelling out the semantics of id and not describing failure/error behavior, but these are minor gaps given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has one required string parameter 'id' with 0% schema description coverage, and the description never explicitly explains what id refers to. The surrounding context implies it is the recording identifier, but the description does not compensate for the missing schema documentation, leaving the parameter semantics underspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and object: 'Заново расшифровать готовую запись' (re-transcribe a finished recording), and gives a concrete trigger condition (transcription crashed or recording process died while WAV remains). This clearly separates it from siblings like get_transcript (retrieval), list_meetings (listing), and join/leave_meeting (meeting actions).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states an explicit when-to-use condition: use it when the previous transcription failed but the WAV file still exists. It also points to get_transcript as the place to retrieve the result. It does not explicitly name alternatives or say when not to use it, but the intended context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v1.0.2- First observed
get_transcript - First observed
join_meeting - First observed
leave_meeting - First observed
list_meetings - First observed
meeting_status - First observed
transcribe_recording
TDQS
Scored across 6 tools
Each tool maps to a clear lifecycle action: joining, checking status, leaving, listing, and fetching transcripts. There is slight overlap between transcribe_recording and leave_meeting since both can trigger transcription, but the descriptions distinguish a normal finish from a retry after failure.
Most tools follow a clear verb_noun pattern: join_meeting, leave_meeting, get_transcript, list_meetings, transcribe_recording. meeting_status breaks the pattern by using a noun phrase instead of an imperative verb, creating a minor inconsistency.
Six tools is well-scoped for a meeting recording and transcription server. Each tool serves a necessary function without redundancy or bloat.
The toolset covers the full workflow: join a meeting, monitor recording status, leave and trigger transcription, retrieve transcripts, list past meetings, and re-transcribe failed recordings. There are no obvious dead ends for the stated purpose.
Maintenance
Related MCP Connectors
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Memoket — access your recording transcripts, summaries, and key takeaways over MCP.
Meeting bots for Zoom, Google Meet and Teams: record, transcribe, summarize, run voice agents.
YouTube transcripts, search, channel browsing, and playlists for AI agents via MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables recording audio from a microphone and transcribing it using OpenAI's Whisper model. Works as both a standalone MCP server and a Goose AI agent extension.6MIT
- AlicenseBqualityDmaintenanceA Model Context Protocol server that enables AI agents to join and interact with online meetings (Zoom and Google Meet), capturing transcripts and recordings to generate meeting summaries.310MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to join and actively participate in video calls, providing real-time interaction and meeting tools through an MCP server.566MIT
- AlicenseAqualityCmaintenanceEnables MCP clients to transcribe audio/video files locally, generate SRT subtitles, and burn captions into videos via tool calls, without a cloud API.3MIT