Skip to content
Agentmart
Submit a tool

whosaid

Local speaker-attributed transcription and meeting search for Apple Silicon.

Connector by sblattj · GitHub account verified by the MCP Registry

IndexedMITLocal (stdio)★ 6
Write a review

Install

Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.

npx agentmarket install connector/sblattj-whosaid

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Local speaker-attributed transcription and meeting search for Apple Silicon. Audio stays on the Mac.

Use cases: audio-video, note-taking

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this server can do and what it asks for, from its tool list, install config and code. Checked Oct 25, 2026.

Tools
11 read · 1 write · 0 delete · 5 not yet classified
Secrets
None asked for
Install scripts
None found
Runs as
Python package

Tools by what they do 17

Read from the source code; the running server may list different tools.

Read 11 · Look things up without changing anything.

  • whosaid_context
  • whosaid_doctor
  • whosaid_items
  • whosaid_list_speakers
  • whosaid_meetings
  • whosaid_prs
  • whosaid_samples
  • whosaid_search
  • whosaid_speakers
  • whosaid_worklist
  • whosaid_workspace_status

Write 1 · Create, change, send or run things.

  • whosaid_relabel

Not yet classified 5 · We could not tell from the name and description.

  • whosaid_enroll_from_file
  • whosaid_item
  • whosaid_person
  • whosaid_reprocess
  • whosaid_transcribe

Secrets and settings it asks for

Other settings (environment variables or headers).

  • WHOSAID_WORKSPACE

Network hosts it talks to 5

  • astral.sh · found in code
  • ffmpeg.org · found in code
  • github.com · found in code
  • schema.skype.com · found in code
  • swiftbar.com · found in code

Files it touches

  • ~/.claude/local/claude
  • /opt/homebrew/bin
  • /opt/homebrew/bin/claude
  • /opt/homebrew/sbin
  • /usr/local/sbin
  • /usr/sbin
  • Your home directory (~)
  • ~/.config/whosaid/speakers.json
  • ~/.local/bin
  • ~/.local/bin/claude
  • ~/meetings.

Tools (17)

Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].

  • whosaid_context

    Read the verbatim transcript turns around ONE moment of ONE meeting: `meeting` is the workspace folder name from a search hit, `at` its timestamp (HH:MM:SS or MM:SS), `before`/`after` the window in seconds (default 60 s before, 120 s after). Call this after whosaid_search instead of loading a whole transcript: it is the cheap way to confirm what was actually said and by whom. Read-only. Keywords: context, surrounding turns, what was said before, exact quote, verify a hit.

  • whosaid_doctor

    Read-only readiness check: Apple-Silicon/arch + macOS, ffmpeg and uv, Whisper and diarization model-cache state, enrolled voices, and the mic/audio device list. Run this FIRST when a transcribe fails — each missing prerequisite prints the exact fix (usually `whosaid setup`). Keywords: health check, prerequisites, diagnose, models cached, setup status, is it ready.

  • whosaid_enroll_from_file

    Enroll a named voice from an EXISTING audio clip (≥15 s of one person speaking, reasonably clean) so future transcripts auto-label them — converts and writes voices/<Name>.wav. This does NOT record from the mic: for mic enrollment use the interactive `whosaid enroll` CLI (it needs a terminal and Microphone permission). Fails clearly if the clip is too short or silent. Keywords: enroll voice, add speaker, register voice, voiceprint, teach a new voice from a file.

  • whosaid_item

    One action item by id (AI-NNN) with its full history: every meeting it came up in, the timestamped turns where it was discussed, commitments and status changes, related PRs. Use whosaid_context on those timestamps for the verbatim discussion. Read-only.

  • whosaid_items

    List action items from the workspace's entity graph, filtered by `owner`, `requester`, `status` or `type`. Each item carries its id (AI-NNN), text, owner, status, the meetings it was raised in and any commitments. Built by `whosaid index`; read-only. Keywords: action items, todos, commitments, who owes what, open items, follow-ups.

  • whosaid_list_speakers

    List the voices whosaid can already auto-name: enrolled clips in `voices/` plus voiceprints saved in the local speaker registry (~/.config/whosaid/speakers.json). Read-only. Call this before whosaid_relabel so you reuse an existing name instead of creating a duplicate. Each registry entry carries its role tag (self/boss/…) when set. Keywords: known speakers, enrolled voices, registry, recognized voices, who can it identify.

  • whosaid_meetings

    List the meetings in the workspace as the graph knows them: folder, date, duration, attendees (speaker labels), action-item count, and kind (source origin: "teams-chat" for a Microsoft Teams chat folder, "outlook-mail" for an Outlook mail thread, "audio" for a recorded meeting; pass kind to filter). The folder names are what whosaid_search hits carry, what whosaid_context takes, and what the whosaid://workspace/meeting/{folder}/... resources use. Newest first. Filter with kind, since/until (YYYY-MM-DD, inclusive, on the meeting date) and query (case-insensitive substring of folder or source na…

  • whosaid_person

    Per-person commitments view (GitHub issue #13): what `name` owns, what they asked others for, deadlines they gave, and the meetings they were in. Omit `name` to list every known person with counts. Names are speaker labels exactly as they appear in the transcripts (see whosaid_speakers). Read-only. Keywords: my action items, what does X owe, commitments by person, who promised what.

  • whosaid_prs

    List pull-request mentions found in the transcripts: PR numbers or links, who mentioned them, in which meeting and when. Read-only. Keywords: PR, pull request, code review, merged, deployed. Page with offset/limit; a call with neither returns the first 50 plus total/omitted and a paging hint.

  • whosaid_relabel

    Put real names on SPEAKER_NN clusters and REMEMBER them: each name is saved to your local speaker registry and auto-applied to EVERY future transcript. Reads the cached <base>.diarization.json sidecar and rewrites <base>.speakers.txt + <base>.speaker-cards.txt in place — no re-transcription, no re-diarization. Run whosaid_transcribe first, read its speaker cards to tell who is who, then map clusters to names. Pass auto=true (with an empty assignments map) to instead re-apply registry matching + the absorb pass over the cached sidecar, which folds phantom cluster splits into their real speaker.…

  • whosaid_reprocess

    Re-diarize meetings in a workspace whose speaker sidecars predate the v1.10 diarizer fixes (wraps `whosaid reprocess`). DEFAULT IS A DRY RUN (dry_run=true): it prints the scan report and the plan and changes nothing; pass dry_run=false to apply. When applied it rewrites each meeting's speaker-labeled transcript and diarization sidecar from the existing Whisper <base>.json, so ASR is NOT re-run, carries over transcript-only (no_save) labels, regenerates per-meeting action items and commitments (skip with no_items=true), then re-runs the workspace roll-up so corpus item ids and hand edits surviv…

  • whosaid_samples

    Export ONE short representative WAV clip per SPEAKER_NN cluster, cut from the ORIGINAL recording, so a human can quickly LISTEN and confirm an identity before trusting an auto-label or enrolling that voice — replaces cutting clips by hand with ffmpeg. Picks each cluster's longest diarized segment, clamped to `seconds` (default 8), and writes <base>.samples/<SPEAKER_NN>[-<Name>].wav (mono 16kHz). Needs the sidecar's 'source' metadata (present since GitHub issue #1 parts 2-3); an older sidecar without it must be re-transcribed, or use the `whosaid samples --audio FILE` CLI flag directly. Keyword…

  • whosaid_search

    Search every speaker-labeled transcript in a meeting workspace and get back the matching TURNS (meeting folder, timestamp, speaker, text, score), not whole files. mode: exact (SQLite FTS5 full text; quoted phrases and prefix* work), meaning (local Ollama embeddings; falls back to exact when the index has none), hybrid (both, the default). Filter by `speaker` label or `meeting` folder; `k` caps the hits (1-100). Then call whosaid_context on a hit to read the verbatim minute around it. Read-only: the index is built by `whosaid index <ws>` from the CLI, never here. Workspace = the `workspace` arg…

  • whosaid_speakers

    List every speaker label in the search index with turn counts and the meetings they appear in. Use the exact labels as the `speaker` filter of whosaid_search or the `name` of whosaid_person. Busiest first; page with offset/limit; a call with neither returns the top 50 plus total/omitted and a paging hint. Read-only.

  • whosaid_transcribe

    Transcribe an audio file and label each turn with WHO said it — 100% locally on the Apple-Silicon GPU (no cloud, no API keys). Writes <base>.txt, <base>.speakers.txt (speaker-labeled), <base>.speaker-cards.txt and a <base>.diarization.json sidecar next to the input (or `outdir`). The FIRST run downloads ~1.5 GB of models. Speakers you haven't named come back as SPEAKER_00/01…; the result includes the speaker cards — read them, then call whosaid_relabel to name them (names then auto-apply to future transcripts). If you already know who was in the room, pass `expected_speakers` (names of voices …

Show 2 more tools
  • whosaid_worklist

    Ranked personal worklist (GitHub issue #13): what `owner` signed up for across every meeting, from the roll-up corpora (dev-commitments CM-NNN plus the action items AI-NNN they own), each item tiered P1/P2/P3 with a numeric score and short why strings. P1 = boss-requested, a blocking/urgency cue, a deadline cue, or seen in 3+ meetings; P2 = seen in 2 meetings, requested by anyone, or a strong cue in the latest meeting; P3 = the rest; negated items are never P1. owner is a speaker label or 'me' (the self-roled speaker, else the whosaid.toml [workspace] owner). Filter and page with tier (P1/P2/P…

  • whosaid_workspace_status

    Read-only health check for a meeting workspace: whether the search index (_search.db) exists and what it holds (meetings, turns, embeddings), whether the rendered _WIKI.md, _ACTION-ITEMS.md and _INDEX.md exist, how many meeting folders there are, and the configured owner and group names from whosaid.toml. Run this first when a search returns nothing: it tells you whether `whosaid index <ws>` has been run. Keywords: workspace status, is it indexed, index health.

Compare and alternatives

    Featured in

    Signals

    Stars
    6
    Forks
    0
    Open issues
    2
    Weekly downloads
    283
    Last commit
    Oct 23, 2026 (5 days ago)
    Last release
    Oct 23, 2026 (5 days ago)
    Last package publish
    Oct 23, 2026 (5 days ago)

    From GitHub (fetched Oct 24, 2026) and the package registry.

    Details

    Registry name
    io.github.sblattj/whosaid
    Version
    1.15.1
    Auth
    No auth
    Packages
    pypi whosaid
    License
    MIT
    First seen
    Oct 24, 2026
    Last checked
    Oct 24, 2026

    More from sblattj

    Cite this page

    whosaid MCP server. Agent Mart. https://agentmart.dev/connectors/sblattj-whosaid (last updated 2026-10-24)