Wispr Flow brings your meetings into Claude.
Connect Wispr Flow to let Claude work directly with everything you capture — recorded meetings, transcripts, scratchpad notes, calendar events, and action items. No copy-pasting, no switching tabs. Just ask.
What you can do:
- Search and recall meetings — "What did we decide about pricing last week?" Claude finds the meeting, reads the transcript, and answers.
- Summarize and extract — Pull action items, decisions, and open questions from any recording or series of meetings.
- Stay on top of your calendar — Look up upcoming meetings, resolve calendar invites, and prep before you walk in.
- Capture and track tasks — Create, update, and search action items so follow-ups never slip.
- Work across your notes — Search and reference scratchpad notes alongside your meeting history.
How it works:
Once connected, Claude can query your Wispr Flow account in natural language — surfacing the right meeting, transcript, or note exactly when you need it. Everything stays tied to your account, accessed only when you ask.
Whether you're recapping a standup, prepping for a 1:1, or chasing down a decision from three weeks ago, Wispr Flow gives Claude the context to actually help.
Get started with Wispr Flow at wisprflow.ai.
Protocol
MCP 2025-11-25
Server version
1
Supports
Tools
Overall score
A
Overall quality score: 88 out of 10088/100
Server metadata
6 of 8 fields70/1007 / 10 pts
Identity, discovery, and usage metadata advertised during the MCP handshake.
Use this server when the user asks about meetings, notes, transcripts, or calendar information stored in Wispr Flow. For questions that may span multiple connected sources, use the relevant sources needed to answer the request. Read https://notes.wisprflow.ai/shared/ links with resolve_share_link rather than fetching the page. All timestamps returned by these tools are UTC (ISO 8601, ending in 'Z'). Before showing any time to the user, convert it to their local time zone — never present the raw UTC value.
Protocol
Pass100/10020 / 20 pts
Connection, authentication, and protocol compatibility.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Get the authenticated user's own identity — their name and any display-name aliases they appear under on their calendar. Call this first for first-person questions ('what did I commit to', 'my meetings', 'who did I meet with', 'did I owe him') so you know which person the user is among a meeting's attendees.
Describe the returned information so the agent knows whether it will answer the request.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No input fields.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_account_info",
"title": "Get account info",
"description": "Get the authenticated user's own identity — their name and any display-name aliases they appear under on their calendar. Call this first for first-person questions ('what did I commit to', 'my meetings', 'who did I meet with', 'did I owe him') so you know which person the user is among a meeting's attendees.",
"inputSchema": {
"type": "object",
"properties": {}
},
"annotations": {
"title": "Get account info",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Search or list the user's meetings captured by Wispr Flow Meeting Recorder. Use when the user asks about their meetings, calls, standups, 1:1s, syncs, or anything discussed in a recorded conversation. Returns the most recently modified meetings when no query is given. For meetings on a particular day, pass since/until (when the meeting happened, half-open). Filter by who was there with attendee_emails (matched against the meeting's linked calendar event) — the precise way to answer 'my meetings with [email protected]'. Each result lists up to 5 attendees (more are summarized — call get_meeting for the full list), start/end times, and a has_transcript flag; when true, follow up with get_meeting and view_transcript={} and answer from the transcript rather than the lossy notes summary. folders lists the Wispr Flow folders the meeting is filed in that the user can see (their own and ones shared with them), as {id, name} sorted by name; null when it is in none. share_link is the meeting's notes page in Wispr Flow. Give it to the user whenever they ask for a link. Who else can open it depends on that meeting's sharing setting, and this server cannot read or change that setting. If the user wants to change who a link works for, tell them to open the Wispr Flow app, go to the Notetaker tab, click the menu to the right of the meeting, and click Share — that opens the sharing settings for that meeting. A meeting with no share_link has no notes page yet — say so rather than guessing a URL. Results are paginated, newest first. If the response's has_more is true there are more matches: call again with cursor set to the returned next_cursor (copied verbatim) to continue. When more remain, a 'more' field spells out how many and how to continue. To answer 'all'/'every'/'ever' questions, keep paging until has_more is false. Paging is capped at 1000 results per query; truncated=true means more matches exist beyond the cap — narrow the query. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Keyword matching title, summary, and notes, not transcript. Omit to browse the date window or recent meetings.
Clear enough to supply this argument.
field
Which field to search: title, content, or both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
attendee_emails
Filter by attendee email(s), exact addresses (case-insensitive). One email is the common case; pass several with attendee_match to require all or any of them. Omit to not filter by attendee.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
attendee_match
How to combine multiple attendee_emails: 'any' (default) matches anyone in the list; 'all' matches only items where every listed attendee was present. Ignored for a single email.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
since
Only meetings starting at or after this ISO datetime with offset/Z (calendar start, else stored creation time).
Clear enough to supply this argument.
until
Only meetings starting strictly before this ISO datetime with offset/Z. Use the next local midnight for a day filter.
Clear enough to supply this argument.
limit
Page size (default 25, max 200).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Pagination cursor: the next_cursor from a previous response. Omit for the first page.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "search_meetings",
"title": "Search meetings",
"description": "Search or list the user's meetings captured by Wispr Flow Meeting Recorder. Use when the user asks about their meetings, calls, standups, 1:1s, syncs, or anything discussed in a recorded conversation. Returns the most recently modified meetings when no query is given. For meetings on a particular day, pass since/until (when the meeting happened, half-open). Filter by who was there with attendee_emails (matched against the meeting's linked calendar event) — the precise way to answer 'my meetings with [email protected]'. Each result lists up to 5 attendees (more are summarized — call get_meeting for the full list), start/end times, and a has_transcript flag; when true, follow up with get_meeting and view_transcript={} and answer from the transcript rather than the lossy notes summary. folders lists the Wispr Flow folders the meeting is filed in that the user can see (their own and ones shared with them), as {id, name} sorted by name; null when it is in none. share_link is the meeting's notes page in Wispr Flow. Give it to the user whenever they ask for a link. Who else can open it depends on that meeting's sharing setting, and this server cannot read or change that setting. If the user wants to change who a link works for, tell them to open the Wispr Flow app, go to the Notetaker tab, click the menu to the right of the meeting, and click Share — that opens the sharing settings for that meeting. A meeting with no share_link has no notes page yet — say so rather than guessing a URL. Results are paginated, newest first. If the response's has_more is true there are more matches: call again with cursor set to the returned next_cursor (copied verbatim) to continue. When more remain, a 'more' field spells out how many and how to continue. To answer 'all'/'every'/'ever' questions, keep paging until has_more is false. Paging is capped at 1000 results per query; truncated=true means more matches exist beyond the cap — narrow the query. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.",
"inputSchema": {
"type": "object",
"properties": {
"field": {
"enum": [
"title",
"content",
"both"
],
"type": "string",
"description": "Which field to search: title, content, or both."
},
"limit": {
"type": "integer",
"description": "Page size (default 25, max 200)."
},
"query": {
"type": "string",
"description": "Keyword matching title, summary, and notes, not transcript. Omit to browse the date window or recent meetings."
},
"since": {
"type": "string",
"description": "Only meetings starting at or after this ISO datetime with offset/Z (calendar start, else stored creation time)."
},
"until": {
"type": "string",
"description": "Only meetings starting strictly before this ISO datetime with offset/Z. Use the next local midnight for a day filter."
},
"cursor": {
"type": "string",
"description": "Pagination cursor: the next_cursor from a previous response. Omit for the first page."
},
"attendee_match": {
"enum": [
"any",
"all"
],
"type": "string",
"description": "How to combine multiple attendee_emails: 'any' (default) matches anyone in the list; 'all' matches only items where every listed attendee was present. Ignored for a single email."
},
"attendee_emails": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by attendee email(s), exact addresses (case-insensitive). One email is the common case; pass several with attendee_match to require all or any of them. Omit to not filter by attendee."
}
}
},
"annotations": {
"title": "Search meetings",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Get a bounded range of the markdown notes, the complete derived markdown summary, the complete attendee list without email addresses, and (when requested and available) a bounded range of the recorded transcript of a specific meeting. Use after search_meetings to answer anything about what was discussed, decided, the action items, or who-said-what. Returns start/end times for when the meeting happened. The raw Lexical notes JSON is intentionally omitted; use `content` for the paginated markdown note body and `summary` for the Flow Summary body, whose next-steps section holds the meeting's action items. Prefer view_transcript={} and synthesize your answer from the transcript itself: the notes are an auto-generated summary that can drop details, while the transcript is the verbatim source of truth. Omit view_transcript only when you've judged the notes alone are enough (e.g. a quick high-level recap). Transcript responses are character-bounded; when truncated, use the continuation offset in the marker to request the next range. Content is also character-bounded and returns its first range by default; use view_content with the continuation offset to read more. The summary is always returned in full. folders lists the Wispr Flow folders the meeting is filed in that the user can see (their own and ones shared with them), as {id, name} sorted by name; null when it is in none. share_link is the meeting's notes page in Wispr Flow. Give it to the user whenever they ask for a link. Who else can open it depends on that meeting's sharing setting, and this server cannot read or change that setting. If the user wants to change who a link works for, tell them to open the Wispr Flow app, go to the Notetaker tab, click the menu to the right of the meeting, and click Share — that opens the sharing settings for that meeting. A meeting with no share_link has no notes page yet — say so rather than guessing a URL. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.
The description explains the capability, when to use it, and what to expect.
Inputs80/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
meeting_id
The meeting id from search_meetings.
Clear enough to supply this argument.
view_content › start_char
Zero-based character offset into the normalized markdown content (default 0).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
view_content › char_limit
Maximum content characters to return (default 12000, server-enforced max 40000).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
view_transcript › start_char
Zero-based character offset into the normalized plaintext transcript (default 0).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
view_transcript › char_limit
Maximum transcript characters to return (default 12000, server-enforced max 40000).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_meeting",
"title": "Get meeting",
"description": "Get a bounded range of the markdown notes, the complete derived markdown summary, the complete attendee list without email addresses, and (when requested and available) a bounded range of the recorded transcript of a specific meeting. Use after search_meetings to answer anything about what was discussed, decided, the action items, or who-said-what. Returns start/end times for when the meeting happened. The raw Lexical notes JSON is intentionally omitted; use `content` for the paginated markdown note body and `summary` for the Flow Summary body, whose next-steps section holds the meeting's action items. Prefer view_transcript={} and synthesize your answer from the transcript itself: the notes are an auto-generated summary that can drop details, while the transcript is the verbatim source of truth. Omit view_transcript only when you've judged the notes alone are enough (e.g. a quick high-level recap). Transcript responses are character-bounded; when truncated, use the continuation offset in the marker to request the next range. Content is also character-bounded and returns its first range by default; use view_content with the continuation offset to read more. The summary is always returned in full. folders lists the Wispr Flow folders the meeting is filed in that the user can see (their own and ones shared with them), as {id, name} sorted by name; null when it is in none. share_link is the meeting's notes page in Wispr Flow. Give it to the user whenever they ask for a link. Who else can open it depends on that meeting's sharing setting, and this server cannot read or change that setting. If the user wants to change who a link works for, tell them to open the Wispr Flow app, go to the Notetaker tab, click the menu to the right of the meeting, and click Share — that opens the sharing settings for that meeting. A meeting with no share_link has no notes page yet — say so rather than guessing a URL. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.",
"inputSchema": {
"type": "object",
"required": [
"meeting_id"
],
"properties": {
"meeting_id": {
"type": "string",
"description": "The meeting id from search_meetings."
},
"view_content": {
"type": "object",
"properties": {
"char_limit": {
"type": "integer",
"default": 12000,
"maximum": 40000,
"minimum": 1,
"description": "Maximum content characters to return (default 12000, server-enforced max 40000)."
},
"start_char": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Zero-based character offset into the normalized markdown content (default 0)."
}
},
"description": "Select a bounded character range of the normalized markdown content. Omit this object to return the first range. If the response is truncated, call the tool again with start_char set to the exact continuation offset in the appended marker.",
"additionalProperties": false
},
"view_transcript": {
"type": "object",
"properties": {
"char_limit": {
"type": "integer",
"default": 12000,
"maximum": 40000,
"minimum": 1,
"description": "Maximum transcript characters to return (default 12000, server-enforced max 40000)."
},
"start_char": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Zero-based character offset into the normalized plaintext transcript (default 0)."
}
},
"description": "Request a bounded character range of the normalized plaintext transcript. Omit this object to omit the transcript. If the response is truncated, call the tool again with start_char set to the exact continuation offset in the appended marker.",
"additionalProperties": false
}
}
},
"annotations": {
"title": "Get meeting",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Who was in a meeting and which one of them is the user. Returns the user's own name/email/domain plus every participant (speaker-map people and calendar attendees) with name, contact_id, emails, whether they spoke, organizer, and relationship to the user (self | colleague | external | unknown, by email domain). Omits the caller, mention-origin people, and Google room/equipment attendees. Calendar RSVP is not included. When listed, get_participant_contacts takes contact_ids from this result for LinkedIn, job title, and company.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Input documentation gives an agent enough context to populate the arguments.
meeting_id
The meeting id from search_meetings.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_meeting_participants_enriched",
"title": "Get meeting participants",
"description": "Who was in a meeting and which one of them is the user. Returns the user's own name/email/domain plus every participant (speaker-map people and calendar attendees) with name, contact_id, emails, whether they spoke, organizer, and relationship to the user (self | colleague | external | unknown, by email domain). Omits the caller, mention-origin people, and Google room/equipment attendees. Calendar RSVP is not included. When listed, get_participant_contacts takes contact_ids from this result for LinkedIn, job title, and company.",
"inputSchema": {
"type": "object",
"required": [
"meeting_id"
],
"properties": {
"meeting_id": {
"type": "string",
"description": "The meeting id from search_meetings."
}
}
},
"annotations": {
"title": "Get meeting participants",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Get the transcript, notes, or summary of a Wispr Flow meeting from a share link (https://notes.wisprflow.ai/shared/… or its bare slug). Use this rather than fetching the page, which does not include the transcript. Returns the title, Flow Summary (whose next-steps section holds the meeting's action items), owner, and the caller's role. The owner also receives their user-authored My Notes. Pass view_transcript={} when the user wants the transcript: a bounded range is returned only when the caller owns the note or is an explicitly invited recipient AND the owner's organization shares transcripts. Domain/team access, anyone-with-link access, or a notes-only organization returns transcript=null plus a transcript_access explanation when requested. When truncated, use the continuation offset in the marker to request the next range. Errors if the link is not a share link or no shared note is accessible for it. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
url
The pasted share link (or its bare slug).
Clear enough to supply this argument.
view_transcript › start_char
Zero-based character offset into the normalized plaintext transcript (default 0).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
view_transcript › char_limit
Maximum transcript characters to return (default 12000, server-enforced max 40000).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "resolve_share_link",
"title": "Fetch shared meeting",
"description": "Get the transcript, notes, or summary of a Wispr Flow meeting from a share link (https://notes.wisprflow.ai/shared/… or its bare slug). Use this rather than fetching the page, which does not include the transcript. Returns the title, Flow Summary (whose next-steps section holds the meeting's action items), owner, and the caller's role. The owner also receives their user-authored My Notes. Pass view_transcript={} when the user wants the transcript: a bounded range is returned only when the caller owns the note or is an explicitly invited recipient AND the owner's organization shares transcripts. Domain/team access, anyone-with-link access, or a notes-only organization returns transcript=null plus a transcript_access explanation when requested. When truncated, use the continuation offset in the marker to request the next range. Errors if the link is not a share link or no shared note is accessible for it. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.",
"inputSchema": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The pasted share link (or its bare slug)."
},
"view_transcript": {
"type": "object",
"properties": {
"char_limit": {
"type": "integer",
"default": 12000,
"maximum": 40000,
"minimum": 1,
"description": "Maximum transcript characters to return (default 12000, server-enforced max 40000)."
},
"start_char": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Zero-based character offset into the normalized plaintext transcript (default 0)."
}
},
"description": "Request a bounded character range of the normalized plaintext transcript. Omit this object to omit the transcript. If the response is truncated, call the tool again with start_char set to the exact continuation offset in the appended marker.",
"additionalProperties": false
}
}
},
"annotations": {
"title": "Fetch shared meeting",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Search or list the user's notes (Wispr Flow scratchpad). Use whenever the user asks about their notes, scratchpad, jottings, or anything they've written down. Returns the most recently modified notes when no query is given; case-insensitive substring match otherwise. Results are paginated, newest first. If the response's has_more is true there are more matches: call again with cursor set to the returned next_cursor (copied verbatim) to continue. When more remain, a 'more' field spells out how many and how to continue. To answer 'all'/'every'/'ever' questions, keep paging until has_more is false. Paging is capped at 1000 results per query; truncated=true means more matches exist beyond the cap — narrow the query.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Search term to match against notes. Omit to list all notes.
Clear enough to supply this argument.
field
Which field to search: title, content, or both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
since
Only notes modified at or after this ISO datetime with offset/Z.
Clear enough to supply this argument.
until
Only notes modified strictly before this ISO datetime with offset/Z. Use the next local midnight for a day filter.
Clear enough to supply this argument.
limit
Page size (default 25, max 200).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Pagination cursor: the next_cursor from a previous response. Omit for the first page.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "search_scratchpad_notes",
"title": "Search notes",
"description": "Search or list the user's notes (Wispr Flow scratchpad). Use whenever the user asks about their notes, scratchpad, jottings, or anything they've written down. Returns the most recently modified notes when no query is given; case-insensitive substring match otherwise. Results are paginated, newest first. If the response's has_more is true there are more matches: call again with cursor set to the returned next_cursor (copied verbatim) to continue. When more remain, a 'more' field spells out how many and how to continue. To answer 'all'/'every'/'ever' questions, keep paging until has_more is false. Paging is capped at 1000 results per query; truncated=true means more matches exist beyond the cap — narrow the query.",
"inputSchema": {
"type": "object",
"properties": {
"field": {
"enum": [
"title",
"content",
"both"
],
"type": "string",
"description": "Which field to search: title, content, or both."
},
"limit": {
"type": "integer",
"description": "Page size (default 25, max 200)."
},
"query": {
"type": "string",
"description": "Search term to match against notes. Omit to list all notes."
},
"since": {
"type": "string",
"description": "Only notes modified at or after this ISO datetime with offset/Z."
},
"until": {
"type": "string",
"description": "Only notes modified strictly before this ISO datetime with offset/Z. Use the next local midnight for a day filter."
},
"cursor": {
"type": "string",
"description": "Pagination cursor: the next_cursor from a previous response. Omit for the first page."
}
}
},
"annotations": {
"title": "Search notes",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Get a bounded range of a specific note's normalized text. The first range is returned by default. Call after search_scratchpad_notes when the user wants the note's content; when truncated, repeat with view_content.start_char set to the exact continuation offset in the marker.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
note_id
The note id from search_scratchpad_notes.
Clear enough to supply this argument.
view_content › start_char
Zero-based character offset into the normalized markdown content (default 0).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
view_content › char_limit
Maximum content characters to return (default 12000, server-enforced max 40000).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_scratchpad_note",
"title": "Get note",
"description": "Get a bounded range of a specific note's normalized text. The first range is returned by default. Call after search_scratchpad_notes when the user wants the note's content; when truncated, repeat with view_content.start_char set to the exact continuation offset in the marker.",
"inputSchema": {
"type": "object",
"required": [
"note_id"
],
"properties": {
"note_id": {
"type": "string",
"description": "The note id from search_scratchpad_notes."
},
"view_content": {
"type": "object",
"properties": {
"char_limit": {
"type": "integer",
"default": 12000,
"maximum": 40000,
"minimum": 1,
"description": "Maximum content characters to return (default 12000, server-enforced max 40000)."
},
"start_char": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Zero-based character offset into the normalized markdown content (default 0)."
}
},
"description": "Select a bounded character range of the normalized markdown content. Omit this object to return the first range. If the response is truncated, call the tool again with start_char set to the exact continuation offset in the appended marker.",
"additionalProperties": false
}
}
},
"annotations": {
"title": "Get note",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Search or list the user's Google Calendar events. Use to find meetings by who's on them (attendee_emails — the precise way to answer 'meetings with [email protected]', or 'with both alex and bob' via attendee_match=all), by keyword in the title/description, or within a date window. For a whole local calendar day (including earlier events), use since and until. Returns each event's title, time, conference URL, and an attendee preview (up to 5 structured attendees plus attendee_count). Use get_calendar_event for the complete attendee list. Note: these are calendar events, not the recorded meeting notes. Results are paginated, newest first. If the response's has_more is true there are more matches: call again with cursor set to the returned next_cursor (copied verbatim) to continue. When more remain, a 'more' field spells out how many and how to continue. To answer 'all'/'every'/'ever' questions, keep paging until has_more is false. Paging is capped at 1000 results per query; truncated=true means more matches exist beyond the cap — narrow the query. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Keyword to match against event title/description.
Clear enough to supply this argument.
attendee_emails
Filter by attendee email(s), exact addresses (case-insensitive). One email is the common case; pass several with attendee_match to require all or any of them. Omit to not filter by attendee.
Clear enough to supply this argument.
attendee_match
How to combine multiple attendee_emails: 'any' (default) matches anyone in the list; 'all' matches only items where every listed attendee was present. Ignored for a single email.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
since
Only events starting at or after this ISO datetime with offset/Z.
Clear enough to supply this argument.
until
Only events starting strictly before this ISO datetime with offset/Z. Use the next local midnight for a day filter.
Clear enough to supply this argument.
limit
Page size (default 25, max 200).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Pagination cursor: the next_cursor from a previous response. Omit for the first page.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "search_calendar_events",
"title": "Search calendar events",
"description": "Search or list the user's Google Calendar events. Use to find meetings by who's on them (attendee_emails — the precise way to answer 'meetings with [email protected]', or 'with both alex and bob' via attendee_match=all), by keyword in the title/description, or within a date window. For a whole local calendar day (including earlier events), use since and until. Returns each event's title, time, conference URL, and an attendee preview (up to 5 structured attendees plus attendee_count). Use get_calendar_event for the complete attendee list. Note: these are calendar events, not the recorded meeting notes. Results are paginated, newest first. If the response's has_more is true there are more matches: call again with cursor set to the returned next_cursor (copied verbatim) to continue. When more remain, a 'more' field spells out how many and how to continue. To answer 'all'/'every'/'ever' questions, keep paging until has_more is false. Paging is capped at 1000 results per query; truncated=true means more matches exist beyond the cap — narrow the query. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.",
"inputSchema": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"description": "Page size (default 25, max 200)."
},
"query": {
"type": "string",
"description": "Keyword to match against event title/description."
},
"since": {
"type": "string",
"description": "Only events starting at or after this ISO datetime with offset/Z."
},
"until": {
"type": "string",
"description": "Only events starting strictly before this ISO datetime with offset/Z. Use the next local midnight for a day filter."
},
"cursor": {
"type": "string",
"description": "Pagination cursor: the next_cursor from a previous response. Omit for the first page."
},
"attendee_match": {
"enum": [
"any",
"all"
],
"type": "string",
"description": "How to combine multiple attendee_emails: 'any' (default) matches anyone in the list; 'all' matches only items where every listed attendee was present. Ignored for a single email."
},
"attendee_emails": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by attendee email(s), exact addresses (case-insensitive). One email is the common case; pass several with attendee_match to require all or any of them. Omit to not filter by attendee."
}
}
},
"annotations": {
"title": "Search calendar events",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Resolve a calendar/meeting URL the user pasted (a Google Calendar event link, or a Meet/Zoom conference link) to the matching calendar event — title, time, attendees, conference URL, and its calendar_id. Use this whenever the user pastes such a link instead of guessing at its contents. To then pull the event again later, use get_calendar_event with the returned calendar_id. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Input documentation gives an agent enough context to populate the arguments.
url
The pasted calendar or conference URL.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "resolve_calendar_link",
"title": "Resolve calendar link",
"description": "Resolve a calendar/meeting URL the user pasted (a Google Calendar event link, or a Meet/Zoom conference link) to the matching calendar event — title, time, attendees, conference URL, and its calendar_id. Use this whenever the user pastes such a link instead of guessing at its contents. To then pull the event again later, use get_calendar_event with the returned calendar_id. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.",
"inputSchema": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The pasted calendar or conference URL."
}
}
},
"annotations": {
"title": "Resolve calendar link",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Get a single calendar event by its calendar_id (the id returned by search_calendar_events or resolve_calendar_link). Returns title, time, attendees, description, and conference URL. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Explain the meaning of this value, not just its name.
calendar_id
The calendar_id from another calendar tool.
Explain the meaning of this value, not just its name.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_calendar_event",
"title": "Get calendar event",
"description": "Get a single calendar event by its calendar_id (the id returned by search_calendar_events or resolve_calendar_link). Returns title, time, attendees, description, and conference URL. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.",
"inputSchema": {
"type": "object",
"required": [
"calendar_id"
],
"properties": {
"calendar_id": {
"type": "string",
"description": "The calendar_id from another calendar tool."
}
}
},
"annotations": {
"title": "Get calendar event",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Get the recorded meeting — a bounded range of its markdown notes, the complete derived markdown summary, and (when requested and available) a bounded transcript range — captured for a calendar event, by its calendar_id (from search_calendar_events or resolve_calendar_link). Use this to answer 'what was discussed / decided / the action items' for a meeting on the user's calendar. Returns start/end times for when the meeting happened. The raw Lexical notes JSON is intentionally omitted; use paginated `content` and complete `summary`, whose next-steps section holds the meeting's action items. Prefer view_transcript={} and synthesize from the transcript itself: the notes are an auto-generated summary that can drop or distort details, while the transcript is the verbatim source of truth. Omit view_transcript only when you've judged the notes alone are enough. When truncated, use the continuation offset in the marker to request the next range. Content returns its first bounded range by default; use view_content with its continuation offset to read more. If the event exists but no recording is linked to it, returns {recorded: false, reason: 'not_recorded'} with the event's title and times instead of a recording; errors only if the calendar_id is unknown. folders lists the Wispr Flow folders the meeting is filed in that the user can see (their own and ones shared with them), as {id, name} sorted by name; null when it is in none. share_link is the meeting's notes page in Wispr Flow. Give it to the user whenever they ask for a link. Who else can open it depends on that meeting's sharing setting, and this server cannot read or change that setting. If the user wants to change who a link works for, tell them to open the Wispr Flow app, go to the Notetaker tab, click the menu to the right of the meeting, and click Share — that opens the sharing settings for that meeting. A meeting with no share_link has no notes page yet — say so rather than guessing a URL. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
calendar_id
The calendar_id from a calendar tool.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
view_content › start_char
Zero-based character offset into the normalized markdown content (default 0).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
view_content › char_limit
Maximum content characters to return (default 12000, server-enforced max 40000).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
view_transcript › start_char
Zero-based character offset into the normalized plaintext transcript (default 0).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
view_transcript › char_limit
Maximum transcript characters to return (default 12000, server-enforced max 40000).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_meeting_by_calendar_id",
"title": "Get meeting for calendar event",
"description": "Get the recorded meeting — a bounded range of its markdown notes, the complete derived markdown summary, and (when requested and available) a bounded transcript range — captured for a calendar event, by its calendar_id (from search_calendar_events or resolve_calendar_link). Use this to answer 'what was discussed / decided / the action items' for a meeting on the user's calendar. Returns start/end times for when the meeting happened. The raw Lexical notes JSON is intentionally omitted; use paginated `content` and complete `summary`, whose next-steps section holds the meeting's action items. Prefer view_transcript={} and synthesize from the transcript itself: the notes are an auto-generated summary that can drop or distort details, while the transcript is the verbatim source of truth. Omit view_transcript only when you've judged the notes alone are enough. When truncated, use the continuation offset in the marker to request the next range. Content returns its first bounded range by default; use view_content with its continuation offset to read more. If the event exists but no recording is linked to it, returns {recorded: false, reason: 'not_recorded'} with the event's title and times instead of a recording; errors only if the calendar_id is unknown. folders lists the Wispr Flow folders the meeting is filed in that the user can see (their own and ones shared with them), as {id, name} sorted by name; null when it is in none. share_link is the meeting's notes page in Wispr Flow. Give it to the user whenever they ask for a link. Who else can open it depends on that meeting's sharing setting, and this server cannot read or change that setting. If the user wants to change who a link works for, tell them to open the Wispr Flow app, go to the Notetaker tab, click the menu to the right of the meeting, and click Share — that opens the sharing settings for that meeting. A meeting with no share_link has no notes page yet — say so rather than guessing a URL. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.",
"inputSchema": {
"type": "object",
"required": [
"calendar_id"
],
"properties": {
"calendar_id": {
"type": "string",
"description": "The calendar_id from a calendar tool."
},
"view_content": {
"type": "object",
"properties": {
"char_limit": {
"type": "integer",
"default": 12000,
"maximum": 40000,
"minimum": 1,
"description": "Maximum content characters to return (default 12000, server-enforced max 40000)."
},
"start_char": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Zero-based character offset into the normalized markdown content (default 0)."
}
},
"description": "Select a bounded character range of the normalized markdown content. Omit this object to return the first range. If the response is truncated, call the tool again with start_char set to the exact continuation offset in the appended marker.",
"additionalProperties": false
},
"view_transcript": {
"type": "object",
"properties": {
"char_limit": {
"type": "integer",
"default": 12000,
"maximum": 40000,
"minimum": 1,
"description": "Maximum transcript characters to return (default 12000, server-enforced max 40000)."
},
"start_char": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Zero-based character offset into the normalized plaintext transcript (default 0)."
}
},
"description": "Request a bounded character range of the normalized plaintext transcript. Omit this object to omit the transcript. If the response is truncated, call the tool again with start_char set to the exact continuation offset in the appended marker.",
"additionalProperties": false
}
}
},
"annotations": {
"title": "Get meeting for calendar event",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Given a meeting_id (from search_meetings) for a recurring meeting, list every recorded occurrence of that recurring series — newest first, including the meeting you passed in. Use to answer 'what did we discuss last time this met', 'what's recurred across these syncs', or to catch up before today's instance. If the meeting isn't part of a recurring calendar series, returns {recurring: false, reason: 'not_recurring' | 'no_calendar_event'} with an empty meetings list; errors only if the meeting_id is unknown. Each occurrence has the same shape as a search_meetings result (call get_meeting for full notes/transcript). folders lists the Wispr Flow folders the meeting is filed in that the user can see (their own and ones shared with them), as {id, name} sorted by name; null when it is in none. Results are paginated, newest first. If the response's has_more is true there are more matches: call again with cursor set to the returned next_cursor (copied verbatim) to continue. When more remain, a 'more' field spells out how many and how to continue. To answer 'all'/'every'/'ever' questions, keep paging until has_more is false. Paging is capped at 1000 results per query; truncated=true means more matches exist beyond the cap — narrow the query. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
meeting_id
A meeting id from search_meetings, in the series.
Clear enough to supply this argument.
limit
Page size (default 25, max 200).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Pagination cursor: the next_cursor from a previous response. Omit for the first page.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_meeting_series",
"title": "List recurring meeting occurrences",
"description": "Given a meeting_id (from search_meetings) for a recurring meeting, list every recorded occurrence of that recurring series — newest first, including the meeting you passed in. Use to answer 'what did we discuss last time this met', 'what's recurred across these syncs', or to catch up before today's instance. If the meeting isn't part of a recurring calendar series, returns {recurring: false, reason: 'not_recurring' | 'no_calendar_event'} with an empty meetings list; errors only if the meeting_id is unknown. Each occurrence has the same shape as a search_meetings result (call get_meeting for full notes/transcript). folders lists the Wispr Flow folders the meeting is filed in that the user can see (their own and ones shared with them), as {id, name} sorted by name; null when it is in none. Results are paginated, newest first. If the response's has_more is true there are more matches: call again with cursor set to the returned next_cursor (copied verbatim) to continue. When more remain, a 'more' field spells out how many and how to continue. To answer 'all'/'every'/'ever' questions, keep paging until has_more is false. Paging is capped at 1000 results per query; truncated=true means more matches exist beyond the cap — narrow the query. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.",
"inputSchema": {
"type": "object",
"required": [
"meeting_id"
],
"properties": {
"limit": {
"type": "integer",
"description": "Page size (default 25, max 200)."
},
"cursor": {
"type": "string",
"description": "Pagination cursor: the next_cursor from a previous response. Omit for the first page."
},
"meeting_id": {
"type": "string",
"description": "A meeting id from search_meetings, in the series."
}
}
},
"annotations": {
"title": "List recurring meeting occurrences",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
List the user's upcoming calendar events in the next window_hours (default 24, max 168), soonest first, with an attendee preview (up to 5 structured attendees plus attendee_count) and each event's latest pre-read attached when one has been generated. Use to answer 'what meetings are coming up' or 'prep me for my next meeting'. For today or another whole local day, use search_calendar_events with since/until. Events without a generated pre-read return preread: null — pre-reads are produced on-demand by the desktop app, not by this tool. Results are paginated, newest first. If the response's has_more is true there are more matches: call again with cursor set to the returned next_cursor (copied verbatim) to continue. When more remain, a 'more' field spells out how many and how to continue. To answer 'all'/'every'/'ever' questions, keep paging until has_more is false. Paging is capped at 1000 results per query; truncated=true means more matches exist beyond the cap — narrow the query. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
window_hours
Hours ahead to include (default 24, max 168 = one week).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Page size (default 25, max 50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Pagination cursor: the next_cursor from a previous response. Omit for the first page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_upcoming_meetings",
"title": "List upcoming meetings",
"description": "List the user's upcoming calendar events in the next window_hours (default 24, max 168), soonest first, with an attendee preview (up to 5 structured attendees plus attendee_count) and each event's latest pre-read attached when one has been generated. Use to answer 'what meetings are coming up' or 'prep me for my next meeting'. For today or another whole local day, use search_calendar_events with since/until. Events without a generated pre-read return preread: null — pre-reads are produced on-demand by the desktop app, not by this tool. Results are paginated, newest first. If the response's has_more is true there are more matches: call again with cursor set to the returned next_cursor (copied verbatim) to continue. When more remain, a 'more' field spells out how many and how to continue. To answer 'all'/'every'/'ever' questions, keep paging until has_more is false. Paging is capped at 1000 results per query; truncated=true means more matches exist beyond the cap — narrow the query. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.",
"inputSchema": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"description": "Page size (default 25, max 50)."
},
"cursor": {
"type": "string",
"description": "Pagination cursor: the next_cursor from a previous response. Omit for the first page."
},
"window_hours": {
"type": "integer",
"description": "Hours ahead to include (default 24, max 168 = one week)."
}
}
},
"annotations": {
"title": "List upcoming meetings",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Get a single upcoming calendar event by calendar_id, with its latest pre-read when one is available. Refuses past events — use get_meeting_by_calendar_id for the recorded notes of a past event, or get_calendar_event for generic event metadata. Pass include_preread=false to skip the pre-read fetch. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
calendar_id
The calendar_id of the upcoming event.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
include_preread
Include the pre-read briefing if one exists. Defaults to true.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_upcoming_meeting",
"title": "Get upcoming meeting",
"description": "Get a single upcoming calendar event by calendar_id, with its latest pre-read when one is available. Refuses past events — use get_meeting_by_calendar_id for the recorded notes of a past event, or get_calendar_event for generic event metadata. Pass include_preread=false to skip the pre-read fetch. Every timestamp in the response is UTC (ISO 8601, ending in 'Z'). Convert times to the user's local time zone before presenting them — do not show the raw UTC time to the user.",
"inputSchema": {
"type": "object",
"required": [
"calendar_id"
],
"properties": {
"calendar_id": {
"type": "string",
"description": "The calendar_id of the upcoming event."
},
"include_preread": {
"type": "boolean",
"description": "Include the pre-read briefing if one exists. Defaults to true."
}
}
},
"annotations": {
"title": "Get upcoming meeting",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01Search calendar eventsSearch or list the user's Google Calendar events.
02Search meetingsSearch or list the user's meetings captured by Wispr Flow Meeting Recorder.
03List upcoming meetingsList the user's upcoming calendar events in the next window_hours (default 24, max 168), soonest first, with an attendee preview (up to 5 structured attendee…
04Resolve calendar linkResolve a calendar/meeting URL the user pasted (a Google Calendar event link, or a Meet/Zoom conference link) to the matching calendar event — title, time, a…
05Search scratchpad notesSearch or list the user's notes (Wispr Flow scratchpad).
Want to run these tasks against your MCP server with us?
add_taskget_account_infoget_calendar_eventget_meetingget_meeting_by_calendar_idget_scratchpad_noteget_taskget_upcoming_meetinglist_meeting_serieslist_upcoming_meetingsresolve_calendar_linksearch_calendar_events+4 more
Wispr Flow setup, tools, quality score, publishing readiness, and alternatives.
How do I add Wispr Flow to Claude, ChatGPT, or Cursor?
Add Wispr Flow to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://api.wisprflow.ai/connect/mcp. This server requires OAuth, so complete the login prompt after you connect.
Is Wispr Flow MCP ready for ChatGPT and Claude?
As of October 6, 2026, Wispr Flow scores 96/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is Wispr Flow's MCP tool documentation?
As of October 6, 2026, Wispr Flow scores 82/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 14 of 14 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What tools does the Wispr Flow MCP server provide?
Wispr Flow lists 16 MCP tools, including add_task, get_account_info, get_calendar_event, get_meeting, get_meeting_by_calendar_id, get_scratchpad_note, get_task, get_upcoming_meeting, list_meeting_series, list_upcoming_meetings, resolve_calendar_link, and search_calendar_events.
What are the best alternatives to Wispr Flow?
As of October 20, 2026, alternatives to Wispr Flow in communication on the Manufact MCP leaderboard include AgentLine: Phone Numbers for AI Agents, Fleet Connected Apps, JooVoice, OpenMail, and Granola.
Does Wispr Flow MCP require authentication?
Wispr Flow requires authentication. Connect it in Claude, ChatGPT, or Cursor and complete the OAuth login prompt.
How can Wispr Flow improve its MCP documentation?
get_calendar_event is the lowest-scoring reviewed tool at 73/100. No output schema is declared. Add one for structured results so clients can interpret returned fields. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Who develops Wispr Flow?
Wispr Flow is developed by Wispr Flow. It is listed as partner on the Claude connector directory.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.