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.