meetings-mcp
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., "@meetings-mcpdid we talk about the renewal in any recent meeting?"
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.
meetings-mcp
An MCP server over the output of my meeting-transcription-pipeline. It takes the finished transcripts (Whisper text, speaker labeled with pyannote) and exposes them as tools any MCP-capable AI client can call.
The pipeline turns a recording into a long text file. Thats useful, but nobody rereads two hours of meeting. With this server a model can list the meetings, page through one, or search all of them for a topic and come back with the exact timestamp.
Tools
Tool | What it does |
| Every transcript with its id, length, turn count and speaker count |
| One page of 25 speaker turns, with the start value for the next page |
| Case-insensitive search across all meetings, with meeting id, timestamp and turn number per hit |
Related MCP server: LogicNotes MCP Server
Setup
pipx install meetings-mcpuvx meetings-mcp works too if you prefer no install. Hacking on a clone instead:
python3 -m venv .venv
.venv/bin/pip install mcpWire it into Claude Code:
claude mcp add meetings -- meetings-mcpRunning from a clone, point it at the venv instead:
claude mcp add meetings -- /path/to/meetings-mcp/.venv/bin/python /path/to/meetings-mcp/meetings_mcp.pyDemo
What it looks like from Claude Code:
> did we talk about the renewal in any recent meeting?
⏺ meetings · list_meetings()
2 meeting(s):
- 2026-09-21-vendor-review: 00:41:09, 4 turns, 3 speaker(s)
- 2026-09-24-weekly-sync: 00:18:47, 3 turns, 2 speaker(s)
⏺ meetings · search_transcripts("renewal")
3 match(es) for 'renewal':
[2026-09-21-vendor-review @ 00:03:12, turn 1] Speaker 2: The renewal quote came in higher, about fifteen percent.
[2026-09-21-vendor-review @ 00:07:40, turn 2] Speaker 1: Then we push back on the renewal before Friday.
[2026-09-24-weekly-sync @ 00:12:30, turn 1] Speaker 2: The renewal is signed, same price as last year.
⏺ Yes, twice. In the vendor review the quote came in about 15% higher
and the plan was to push back. By the weekly sync it was signed at
last year's price.The meetings above are demo data. The format is exactly what the server returns.
Design notes
Read-only by construction. Every tool reads text files, nothing writes. The transcripts stay on my machine and the model only sees what a tool returns.
Pseudonyms at the boundary. Speaker labels become Speaker 1, Speaker 2 and so on by first appearance, even when the source file has real names. Emails, phone numbers, home paths and long tokens get replaced before anything crosses the protocol.
Paged, not dumped. A two hour meeting is hundreds of turns. The server hands it over 25 turns at a time so a model reads what it needs instead of flooding its context.
Honest notes
It reads the pipeline's
transcripts/folder, one.speakers.txtper meeting, falling back to the raw Whisper.txtwhen diarization hasnt run. You need to run the pipeline first. The default path is my local copy. PointMEETINGS_DATA_DIRat your own data folder.The redaction is pattern based. It catches speaker labels, emails, phone numbers and paths, but a name spoken inside a sentence still comes through as said.
Search is a plain substring match, so an Arabic query has to match the spelling Whisper produced.
The logic is tested against synthetic transcripts in
test_server.py. Runpython test_server.py.
About
Al Amin Bashir Afara, Dubai · github.com/aminafara123 · linkedin.com/in/aminafara
Available Tools
3 toolsget_transcriptARead-onlyIdempotent
One page of a meeting transcript, 25 turns from turn number start. Call again with the start value it suggests to read on.
| Name | Required | Description | Default |
|---|---|---|---|
| start | No | ||
| meeting | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds non-obvious behavior: the page size is fixed at 25 turns and the response itself suggests the next start value, which is genuinely useful pagination context.
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 short sentences with no filler, and the pagination instruction is front-loaded after the core description. Slightly clipped/awkward phrasing ('from turn number start') costs a point but the size is right.
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 paged read tool with an output schema present, the description need not explain return values, and it covers the key behavioral loop (page size plus how to continue). Missing only the meaning/format of the required 'meeting' identifier.
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 does clarify that 'start' is a turn number and that turns are counted from it, but 'meeting' (the required parameter) is never explained, nor is the default of 0 or the identifier format.
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 a specific verb-implied action (fetch) and resource (one page of a meeting transcript), plus the page size of 25 turns. It doesn't explicitly contrast itself with search_transcripts, so an agent must infer the difference, but the resource is unambiguous.
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 concrete continuation guidance ('Call again with the start value it suggests to read on'), which is real usage instruction. However, it never says when to prefer this over search_transcripts or list_meetings, so sibling routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_meetingsARead-onlyIdempotent
Every transcribed meeting with its id, length, turn count and number of distinct speakers. Use the id with get_transcript.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered by structured data. The description adds one behavioral fact beyond that: only transcribed meetings are included, which is a meaningful scope constraint. It is silent on pagination and ordering for what could be a large list, so it does not go far beyond the annotations.
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 short sentences, zero waste, front-loaded with the scope and return fields followed by the follow-up action. Every clause 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 zero-parameter listing tool with annotations covering safety and an output schema covering return structure, the description supplies the essential scope ('transcribed meetings') and the next-step pointer. Ordering/pagination behavior is the only notable omission.
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 tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a 0-param tool is 4. No parameter-related information is missing.
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 names the specific verb+resource ('Every transcribed meeting') and enumerates the returned fields (id, length, turn count, speaker count), so an agent knows exactly what this returns. It partially distinguishes itself from siblings by implying no filtering ('Every') and by naming get_transcript as the follow-up, but it never contrasts directly with search_transcripts.
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 only guidance is a chaining hint ('Use the id with get_transcript'), which tells the agent what to do next with the output but not when to choose this tool over search_transcripts. There is no explicit when-to-use or when-not-to-use statement, though listing-all vs searching is implied by 'Every'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_transcriptsARead-onlyIdempotent
Case-insensitive substring search across every transcript. Returns each matching turn with its meeting id and timestamp, text capped.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely useful behavioral detail: matching is case-insensitive substring (not regex/fuzzy), each matching turn is returned, and text is capped — the cap being a limitation the agent should know about.
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 tight sentences, front-loaded with the matching semantics and followed by the return shape. No filler.
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?
An output schema exists, so return values need not be enumerated in depth; annotations already cover the safety profile. Combined with the matching semantics and cap disclosure, the description gives an agent everything needed to call it correctly.
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 single query parameter has 0% schema description coverage, so the description must carry the semantic load — and it does, clarifying that the input is treated as a case-insensitive substring rather than a regex or exact-match. It stops short of stating any length limits or escaping rules.
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?
States a specific verb (case-insensitive substring search) and resource (every transcript), with scope 'across every transcript' that sets it apart from the single-transcript sibling get_transcript. It does not name siblings explicitly, so it falls just 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?
Usage is implied by the scope phrase ('across every transcript'), which suggests a broad search rather than fetching one transcript. However there is no explicit when-to-use, when-not-to-use, or reference to get_transcript/list_meetings as alternatives.
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.
3 tool updates
v1.0.1- First observed
get_transcript - First observed
list_meetings - First observed
search_transcripts
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose: list_meetings enumerates meetings, get_transcript fetches paginated transcript content for a known meeting id, and search_transcripts performs a global substring search. There is no overlap in resource or action, so selection errors are unlikely.
All three names follow a consistent snake_case verb_noun pattern (list_meetings, get_transcript, search_transcripts). The singular/plural difference reflects the object cardinality well and does not break the convention.
Three tools is on the low end but well-scoped for a read-only transcript server: listing, reading paginated content, and searching. No functionality feels redundant or missing enough to warrant extra tools.
The read-only surface covers the core workflows: discover meetings, read a transcript, and search across all transcripts. Minor gaps exist, such as filtering meetings by date or retrieving per-speaker data, but agents can work around these using the provided tools.
Maintenance
Related MCP Connectors
Meeting transcripts for AI agents: search calls, read who said what, transcribe files and links.
Search, read, analyze and create HappyScribe transcripts and meeting notes from any MCP client
MCP server for RiverScript, an AI transcription platform - fetches transcripts shared via a link.
Memoket — access your recording transcripts, summaries, and key takeaways over MCP.
Related MCP Servers
- AlicenseAqualityDmaintenanceRead-only access to your Gilbert meetings, transcripts and summaries over MCP — list, search, and fetch transcripts and summaries.519 npm1MIT
- AlicenseNot gradedqualityDmaintenanceRead-only MCP server for searching and retrieving LogicNotes meeting notes, including summaries, transcripts, and action items.MIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP-capable agents to browse, search, and retrieve Meetily meeting transcripts and summaries on demand through read-only tools.1MIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients to search and read recorded meeting data, including transcripts, notes, action items, and participants, from Walkie's local database.1MIT