Wave AI MCP Server

Give Claude, ChatGPT, Claude Code, and other AI assistants secure access to your Wave meeting transcripts, summaries, and semantic search — with one URL and OAuth.

Documentation

Bring every meeting into the conversation.

Connect Wave to Claude, ChatGPT, Claude Code, and any MCP-compatible client. Search sessions, pull exact transcripts, organize folders, and keep action items in sync.

OAuth 2.0 + PKCE

User-scoped access

No JSON config files

Endpoint

https://mcp.wave.co

$ claude mcp add --transport http wave https://mcp.wave.co

24 purpose-built tools

Search, read, organize, and act

OAuth by default

PKCE with bearer-token fallback

Three protocol versions

Latest plus broad compatibility

One-user boundary

Every call stays account-scoped

On this page

Your data, your scope

Wave exposes your own data and sessions shared with you. Shared sessions are read-only.

Overview

Your meeting memory, ready when you need it.

Wave MCP turns recordings, summaries, transcripts, folders, and action items into tools your AI assistant can call—without exporting a library or maintaining a second knowledge base.

Search by meaning

Ask in natural language and find the right discussion across meetings, calls, lectures, and recordings.

Retrieve exact context

Pull summaries for speed or speaker-attributed transcripts when exact wording matters.

Close the loop

Organize sessions into folders and safely round-trip structured action items back to Wave.

Focused writes, not open-ended access

Write tools manage action items, folders, and session sharing. MCP cannot edit recordings or transcripts, and it cannot delete sessions.

Connect

One endpoint. Use it from the client you already have.

Every setup finishes at https://mcp.wave.co and the same Wave sign-in.

Follow the Wave integration guides for Claude, ChatGPT, Claude Code, Codex, Cursor, and other clients. Setup instructions live there; the protocol and tool reference are below.

Capabilities

24 focused tools, with clear boundaries.

Read tools retrieve your own and shared meeting knowledge. Write tools manage action items, folders, session sharing, and session titles and summaries. Read tools require mcp:read; write tools require mcp:write.

For shared content, pass both session_id and owner_id to get_session, get_transcript, get_media, and get_action_items. Deep-research fetch accepts shared:owner_id:session_id (the fetch_id from list_shared_sessions). Search covers only your own sessions. Shared sessions cannot be edited or put in folders: update_action_items rejects owner_id and folder tools reject it too. share_session grants other people read access; confirm with the user unless they clearly asked. unshare_session accepts exactly one of recipient_id, email, or everyone: true; everyone also invalidates the old link. Share events, Teams sources, and per-invite scopes are deferred. update_session edits a session's title or summary and is refused while the recording is still processing. import_recording_from_url and create_recording_upload add new recordings and need the separate mcp:import permission, which Wave asks you to approve on its own consent screen; a call without it gets a 401 that names the missing scope.

Read tools

Search, browse, retrieve, and inspect

Read

search_sessions

Search across your Wave sessions using semantic search. Start here for cross-session questions, then fetch only the relevant session details. Returns sessions that match the query based on meaning, not just keywords. Pass `person` to keep only sessions a given person speaks in (e.g. "what did Sarah say about pricing"). Sessions of type "phone" include a `phone` object (direction inbound/outbound, to_number, from_number, status, ongoing).

query, limit?, folder?, tag?, tag_mode?, person?

Read

list_sessions

List your recent Wave sessions. Returns session summaries with metadata. For synthesis, start with 10–20 and paginate; use 100 only for an explicitly exhaustive request. Pass `person` (plus `since`) to list the sessions a given person speaks in, e.g. "what meetings was Sarah in this month". Sessions of type "phone" include a `phone` object (direction inbound/outbound, to_number, from_number, status, ongoing — for inbound bridge calls the other party is unknown so from_number is null).

limit?, type?, since?, cursor?, folder?, tag?, tag_mode?, person?

Read

list_folders

List the user's folders. Users organize sessions into folders in the Wave app. Use this to discover folder ids/names, then pass `folder` to list_sessions or search_sessions to scope results (useful for work/personal separation on a single account). Each folder also carries `pinned`, `sort_order` (sort for the sessions inside it), `order` (manual position) and `last_opened_at` when set; absence means not pinned / newest first / no manual position / never opened. Folders are returned in display order: pinned first, then by `order` ascending (folders with an order before those without), then by name.

No inputs

Read

get_session

Get full details for a specific Wave session, including the summary and optionally the transcript. Sessions of type "phone" include a `phone` object (direction inbound/outbound, to_number, from_number, status, ongoing). For a session shared with the user, pass its owner_id too; the result adds owner_id, owner_name, access "shared" and the share scope, and omits anything the owner did not share.

session_id, include_transcript?, owner_id?

Read

get_transcript

Get the transcript for a Wave session with speaker attribution. For a session shared with the user, pass its owner_id too.

session_id, format?, owner_id?

Read

get_media

Get download links for a Wave session's recording: a signed audio_url (the original audio file, usually M4A, WAV for phone calls) and, for meeting-bot recordings, a video_url (MP4). Links work for one hour (expires_at) and need no login, so give the link to the user to open or download; Claude Code, Codex and scripts can fetch the file directly (for example curl -L -o recording.m4a "<audio_url>"). Chat apps cannot download files themselves. Both URLs are null with a note when no media is stored (text-only imports), when the recording was deleted (audio_deleted_at), or when the owner of a shared session did not share its audio. For a session shared with the user, pass its owner_id too.

session_id, owner_id?

Read

get_action_items

Read the structured action items attached to a Wave session, plus the current version. Returned items have provenance: source="agent" means the item was written by an AI, source="user" means the user wrote or edited it. Pair with update_action_items using `expected_version` for safe round-trip edits. For a session shared with the user, pass its owner_id too; shared action items are read-only (read_only: true) and carry no provenance or version.

session_id, owner_id?

Read

search

Search the user's Wave sessions (meetings, calls, recordings) by meaning. Returns matching sessions as citable results with id, title, and url. This is the deep-research search interface; in interactive chats prefer search_sessions, which returns richer structured data.

query

Read

fetch

Fetch the full content of a Wave session by id: summary plus speaker-labeled transcript, with metadata. Use ids returned by `search`, or a `fetch_id` ("shared:{owner_id}:{session_id}") from list_shared_sessions for a session someone shared with the user. This is the deep-research fetch interface; in interactive chats prefer get_session / get_transcript.

id

Read

list_shared_sessions

List sessions other Wave users have shared with the user, newest share first. Each row has session_id, owner_id, owner_name, title, shared_at, the share scope (which of summary / transcript / audio / action_items the owner shared) and a fetch_id. To read one, pass BOTH session_id and owner_id to get_session, get_transcript or get_action_items (or fetch_id to fetch). Shared sessions are read-only and are not covered by search_sessions or search.

limit?, cursor?

Read

list_session_access

For one of the user's own sessions, list the people who have access (recipient_id, name, email, shared_at, how they got it) and the emailed invites nobody has accepted yet. An existing share link cannot be read back; share_session without emails creates one.

session_id

Read

list_people

List the people Wave recognises by voice (the user's Voice IDs): id, name, is_me (the user's own voice), recording_count and last_heard_at. Me first, then most recently heard. Use it to find who the user records with, or to get the exact name/id for get_person_sessions or the `person` filter on list_sessions / search_sessions. Only people the user has named and saved in Wave appear; other speakers in a recording are not listed. counts_partial true means the counts only cover the newest 1,000 recordings.

No inputs

Read

get_person_sessions

List the recordings one person (Voice ID) speaks in, newest first: session_id, title, timestamp, type, duration_seconds, talk_seconds (how long they spoke), name_in_session (the speaker label they appear under) and matched_by — how Wave identified them: "voice_match" (automatic voice recognition, with similarity 0–1), "user_confirmed" (the user named or corrected the speaker), "user_added" (the user saved this recording to their voice), "suggested", or "legacy" (linked before this was tracked). Use for "what meetings was Sarah in this month" or "how much did Sam talk last week". No transcripts: use get_transcript or get_session for content. `person` is a name (case-insensitive exact, then unique prefix) or an id from list_people; an ambiguous name returns an error listing the candidates. If no saved Voice ID matches the name, the result has person null, voice_id_matched false, candidates (saved Voice IDs with similar names) and a `fallback` block: label_matches (recordings whose speaker labels or title use the name) and search_results (transcript and summary search for the name). Fallback results are name matches, not voice matches; say so to the user. Paginate with next_cursor.

person, from?, to?, type?, limit?, cursor?

Write tools

Limited, user-scoped, and non-destructive

Write

update_action_items

Write back the structured action items for a Wave session. The array fully replaces the current list — preserve items by keeping their `id`. Items you add without an `id` get one assigned. Pass `expected_version` (from a prior get_action_items call) to reject the write if the user edited in between. Defaults `source` to "agent" for new items you add.

session_id, action_items, expected_version?

Write

create_folder

Create a folder for organizing sessions. Folders are non-exclusive (a session can be in many folders). If a folder with the same case-insensitive name already exists, returns it instead of erroring — safe to retry.

name, color?

Write

add_session_to_folder

Add a session to a folder. Non-exclusive: a session can belong to many folders simultaneously. Idempotent — calling this for a session already in the folder is a no-op.

session_id, folder_id

Write

remove_session_from_folder

Remove a session from a folder. The session itself is not deleted; only the folder link is removed.

session_id, folder_id

Write

update_folder

Rename, recolour, pin, reorder, or change the session sort of a folder. Pass any of `name` (trimmed, 1–100 chars), `color` (hex "#RRGGBB", or null to clear it), `pinned` (boolean; pinned folders sort first everywhere), `sort_order` ("newest" | "oldest" | "title" — the remembered sort for the sessions inside the folder), or `order` (integer from 0 to 2^53 - 1; manual position, folders with an order sort ascending before those without) — at least one is required; anything omitted is left unchanged. Membership is not touched: use add_session_to_folder / remove_session_from_folder for that. Use list_folders to find the folder_id.

folder_id, name?, color?, pinned?, sort_order?, order?

Write

delete_folder

Delete a folder. Only the folder itself is removed — the sessions in it are never deleted and stay in any other folders they belong to. This cannot be undone, so confirm with the user before deleting a folder they did not explicitly ask to remove. Use list_folders to find the folder_id.

folder_id

Write

share_session

Share one of the user's own sessions with other people. This grants them read access to the session, so confirm with the user before calling unless they clearly asked to share it. With `emails` (1–10 addresses, optional `message` up to 500 characters), Wave emails each person an invite and returns which addresses were sent and which were skipped (with a reason). Without `emails`, returns a share link (app.wave.co/i/…, valid 30 days) that anyone signed in to Wave can use to get access.

session_id, emails?, message?

Write

unshare_session

Remove access to one of the user's own sessions. Pass exactly one of: `recipient_id` (from list_session_access) to remove that person; `email` to cancel a pending emailed invite; or `everyone: true` to remove every person and reset the share link, so the old link stops working (a new, unsent link is returned). Confirm with the user before removing access they did not explicitly ask to remove.

session_id, recipient_id?, email?, everyone?

Write

import_recording_from_url

Import an audio or video file into Wave from a public https:// link (for example a podcast episode, a Dropbox or Google Drive direct-download link, or a file on the web). Wave downloads it, transcribes it and writes a summary, like an import in the Wave app. This uses the user's import allowance (imports are limited per hour and day, and free accounts have limited minutes), so confirm with the user before calling unless they clearly asked to import this file. Returns the new session id with status "fetching"; poll get_session until processing_status is "completed" (or "failed"). Supported: MP3, M4A, WAV, AAC, FLAC, OGG, OPUS, WebM, MP4, MOV, up to 2 GiB. Links that need a login or open a web page instead of the file will fail with source_unreachable.

source_url, title?, notes?, tags?, language?, recorded_at?, idempotency_key?

Write

create_recording_upload

Start an import of a local audio or video file: returns a signed upload URL that the client must PUT the file bytes to. Only for clients that can run an HTTP PUT with a local file, such as Claude Code, Codex or a script (for example curl -X PUT with the returned headers and --upload-file). Chat apps that cannot upload files should not use this. Wave transcribes and summarizes the file once the upload finishes; nothing else needs to be called. Uses the user's import allowance, so confirm with the user first unless they asked. The URL lasts 15 minutes and is signed with the returned headers; send all of them exactly. Each call without idempotency_key starts a new import; to retry the same file (including after a timeout or error, which also returns an idempotency_key), pass back that idempotency_key. Files up to 5 GiB. Poll get_session for processing_status.

content_type, filename?, size_bytes?, title?, notes?, tags?, language?, recorded_at?, idempotency_key?

Write

update_session

Edit one of the user's own sessions: title, notes, summary (markdown), tags or favorite. Only the fields you pass change. tags replaces the whole tag list and summary replaces the whole summary, so read the session first with get_session and send the full new value. A new title is kept even if Wave reprocesses the recording. Cannot edit transcripts, audio or sessions shared with the user. Confirm with the user before replacing a summary they did not ask to change.

session_id, title?, notes?, summary?, tags?, favorite?

Try it

Start with a real question, not a demo query.

Once Wave is connected, ask naturally. Your assistant chooses the right tools and sees your own sessions and sessions shared with you.

Meeting prep

01

“Prep me for my next call with Acme. Use our last three meetings and surface unresolved decisions.”

Exact recall

02

“Find the exact part where we discussed launch timing and quote it with the speaker’s name.”

Weekly synthesis

03

“Summarize all of my meetings this week, grouped by project, with decisions and open questions.”

Action-item write-back

04

“Turn yesterday’s product-review decisions into action items, assign owners when named, and save them to the session.”

Automatic organization

05

“Create a “Customer research” folder and add every customer interview from this month.”

Scoped research

06

“Only use sessions in my “work” folder. Find every discussion about retail media strategy.”

Download a recording

07

“Give me the download link for the audio of my call with Anna on Tuesday.”

Protocol

Standards-based from transport to sign-in.

Wave uses Streamable HTTP, standard MCP version negotiation, and OAuth discovery so modern clients can connect without custom setup logic.

Endpoint

https://mcp.wave.co

Protocol

MCP 2025-11-25, compatible with 2025-06-18 and 2025-03-26

Transport

Streamable HTTP · JSON-RPC

Authentication

OAuth 2.0 + PKCE (preferred) or wave_mcp_… bearer token

Discovery

https://mcp.wave.co/.well-known/oauth-authorization-server

https://mcp.wave.co/.well-known/oauth-protected-resource

Prompts

weekly-recap, prep-for-meeting, follow-up-email, action-items-to-tasks, what-did-person-say, decisions-log (prompts/list; clients show them as slash commands)

Registry

co.wave/mcp in the official MCP Registry

Data boundary

Reads and focused writes are scoped to the authenticated user’s own sessions, folders, and action items, plus read-only shared sessions.

Write boundary

No session deletion. No recording or transcript edits. Action-item updates support optimistic version checks.

Troubleshooting

The usual fixes, in one place.

Most connection issues come down to the endpoint, an unfinished OAuth window, or client-level action permissions.

My client cannot find or connect to Wave

Confirm the URL is exactly https://mcp.wave.co with no additional path. Choose Streamable HTTP when your client asks for a transport. Some desktop clients need a full restart after adding a remote server.

Authentication keeps looping or fails

Finish the Wave sign-in in the same browser window your client opened. If you use a manual token, verify it starts with wave_mcp_ and has not been revoked in Wave settings.

The connector returns no sessions

Use list_sessions for your own sessions and list_shared_sessions for sessions shared with you. Confirm you authorized the account that holds the recordings. Newly completed sessions may need a few minutes to finish processing and indexing.

Write tools are missing or disabled

Your client or workspace admin may allow read tools while disabling actions. In ChatGPT managed workspaces, admins can review Action control and refresh the app’s tool list. On Pro, custom apps currently use read/fetch permissions only.

Search results feel too broad

Use natural-language context and add a folder or exact tag filter. For example: “Only search the work folder for sessions tagged roadmap, and require all tags.”

Ready in a few minutes

Put your meeting memory to work.

Connect with OAuth, choose the tools your client may use, and start asking questions across your Wave library.

Open MCP settings