Skip to content

feat(x): import Wispr Flow meetings via MCP - #834

Open
Rahulk644 wants to merge 1 commit into
rowboatlabs:mainfrom
Rahulk644:codex/wispr-flow-mcp-sync
Open

feat(x): import Wispr Flow meetings via MCP#834
Rahulk644 wants to merge 1 commit into
rowboatlabs:mainfrom
Rahulk644:codex/wispr-flow-mcp-sync

Conversation

@Rahulk644

Copy link
Copy Markdown

What

Adds an OAuth-backed Wispr Flow connector to the Rowboat desktop app. After Wispr finalizes a Notetaker meeting, Rowboat imports the title, My thoughts, summary, action items, participants, and speaker-attributed transcript as a normal meeting note under knowledge/Meetings/wispr-flow/.

The note then participates in Rowboat's existing knowledge ingestion, tagging, graph, search, backlink, agent, and meeting-ready event flows.

Why

Wispr already provides the live meeting experience (detection, capture, transcript, speakers, and post-call processing). Re-recording the same call in Rowboat would duplicate capture and processing. This connector keeps the boundary simple:

  • Wispr owns the live and post-processing experience.
  • Rowboat owns the durable knowledge artifact after the call.

The existing DCR path also assumed that registration_endpoint was present in OpenID discovery metadata. Wispr exposes an explicit RFC 7591 registration endpoint, so this adds a reusable, tested explicit-DCR path and RFC 8707 protected-resource binding.

Behavior and safety

  • Uses Wispr's OAuth-protected MCP connector with PKCE, dynamic client registration, refresh tokens, and the MCP resource audience.
  • Never reads Wispr desktop sessions, Keychain entries, private APIs, or local application databases.
  • Does not start/stop either recorder and does not change Rowboat's meeting-detection prompt.
  • Records existing finalized meetings as a baseline; it does not silently backfill meeting history.
  • Imports only artifacts with a conservative post-call finalization signal.
  • Uses atomic, idempotent writes keyed by Wispr meeting ID.
  • Preserves the same file across title changes.
  • Preserves already imported sections if an eventually-consistent MCP response temporarily omits them.
  • Validates meeting-shaped objects before requesting details so nested action-item IDs cannot become notes.
  • Converts Wispr's Name: text turns to Rowboat's transcript-block contract and derives non-generic participant names.
  • Fails closed on unrecognized MCP tool/response shapes.

The full contract and contributor test path are documented in docs/WISPR_FLOW_MCP_SYNC.md.

Verification

  • pnpm lint
  • pnpm typecheck
  • pnpm test — 75 files / 848 tests passed
  • Focused Wispr/OAuth suites — 3 files / 19 tests passed
  • Shared, core, preload, main-process, and renderer production builds completed
  • Manual macOS end-to-end verification on the fork build:
    • completed OAuth authorization in the system browser
    • finalized a new Wispr Notetaker meeting
    • observed one Rowboat knowledge note with title, post-call notes/summary, transcript, and named participants
    • verified that the transcript block renders instead of showing “Invalid transcript block”
    • verified that subsequent Wispr updates replace the same note rather than duplicating it

The local main-process build skipped Rowboat's optional Swift mic-monitor helper because the installed Swift compiler and macOS SDK versions do not match; the Electron main bundle completed. That existing helper is unrelated to this connector and CI's package smoke test remains authoritative.

Scope

This PR is deliberately independent of #833. It excludes native capture, Accessibility, local desktop extraction, meeting overlays, and experimental meeting-only launchers.

@Rahulk644
Rahulk644 marked this pull request as ready for review August 6, 2026 08:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant