Skip to main content
Glama
aminafara123

meetings-mcp

by aminafara123

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

list_meetings()

Every transcript with its id, length, turn count and speaker count

get_transcript(meeting, start)

One page of 25 speaker turns, with the start value for the next page

search_transcripts(query)

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-mcp

uvx meetings-mcp works too if you prefer no install. Hacking on a clone instead:

python3 -m venv .venv
.venv/bin/pip install mcp

Wire it into Claude Code:

claude mcp add meetings -- meetings-mcp

Running 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.py

Demo

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.txt per meeting, falling back to the raw Whisper .txt when diarization hasnt run. You need to run the pipeline first. The default path is my local copy. Point MEETINGS_DATA_DIR at 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. Run python test_server.py.

About

Al Amin Bashir Afara, Dubai · github.com/aminafara123 · linkedin.com/in/aminafara

Available Tools

3 tools
get_transcriptA
Read-onlyIdempotent

One page of a meeting transcript, 25 turns from turn number start. Call again with the start value it suggests to read on.

ParametersJSON Schema
NameRequiredDescriptionDefault
startNo
meetingYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_meetingsA
Read-onlyIdempotent

Every transcribed meeting with its id, length, turn count and number of distinct speakers. Use the id with get_transcript.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_transcriptsA
Read-onlyIdempotent

Case-insensitive substring search across every transcript. Returns each matching turn with its meeting id and timestamp, text capped.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 3 tool updatesv1.0.1
    • First observedget_transcript
    • First observedlist_meetings
    • First observedsearch_transcripts

TDQS

A4/5.0

Scored across 3 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Read-only access to your Gilbert meetings, transcripts and summaries over MCP — list, search, and fetch transcripts and summaries.
    5
    19 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables MCP clients to search and read recorded meeting data, including transcripts, notes, action items, and participants, from Walkie's local database.
    1
    MIT