Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the Wisprflow MCP server

Vendor MCP
Open markdown

The Wisprflow MCP connector routes your AI agent's tool calls to Wisprflow's own MCP server through Scalekit. Each user signs in to Wisprflow once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 14 tools.

Tools
14
What they doRead · write · destructive
14 · 0 · 014 read0 write0 destructive
Users sign in with
OAuth app
Your own Wisprflow MCP server app

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the Wisprflow MCP connection

    In AgentKit > Connections, create a Wisprflow MCP connection and copy its redirect URI. The name you give it is the connection_name your code passes. See Configure connections.

  4. Register an OAuth app

    Wisprflow MCP server connections use your own OAuth app. Register one with Wisprflow MCP server and add the redirect URI you copied.

    Then enter the app's Client ID and Client Secret on the Wisprflow MCP connection.

  5. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'wisprflowmcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Wisprflow MCP:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'wisprflowmcp_get_account_info',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • wisprflowmcp_get_account_infoGet the authenticated user's own identity — their name and any display-name aliases they appear under on their calendar.Read-only

    GetAccountInfo

    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.

    Inputs

    This tool takes no inputs.

  • wisprflowmcp_get_calendar_eventGet a single calendar event by its calendar_id (the id returned by search_calendar_events or resolve_calendar_link).Read-only

    GetCalendarEvent

    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.

    Inputs

    calendar_idstringrequired
    The calendar_id from another calendar tool.
  • wisprflowmcp_get_meetingGet 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.Read-only

    GetMeeting

    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. 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.

    Inputs

    meeting_idstringrequired
    The meeting id from search_meetings.
    view_contentobject
    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.
    view_transcriptobject
    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.
  • wisprflowmcp_get_meeting_by_calendar_idGet 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).Read-only

    GetMeetingByCalendarId

    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. Errors if no recording is linked to that event. 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.

    Inputs

    calendar_idstringrequired
    The calendar_id from a calendar tool.
    view_contentobject
    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.
    view_transcriptobject
    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.
  • wisprflowmcp_get_meeting_participants_enrichedWho was in a meeting and which one of them is the user.Read-only

    GetMeetingParticipantsEnriched

    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.

    Inputs

    meeting_idstringrequired
    The meeting id from search_meetings.
  • wisprflowmcp_get_scratchpad_noteGet a bounded range of a specific note's normalized text.Read-only

    GetScratchpadNote

    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.

    Inputs

    note_idstringrequired
    The note id from search_scratchpad_notes.
    view_contentobject
    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.
  • wisprflowmcp_get_upcoming_meetingGet a single upcoming calendar event by calendar_id, with its latest pre-read when one is available.Read-only

    GetUpcomingMeeting

    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.

    Inputs

    calendar_idstringrequired
    The calendar_id of the upcoming event.
    include_prereadboolean
    Include the pre-read briefing if one exists. Defaults to true.
  • wisprflowmcp_list_meeting_seriesGiven 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.Read-only

    ListMeetingSeries

    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. Errors if the meeting isn't linked to a recurring calendar series. Each occurrence has the same shape as a search_meetings result (call get_meeting for full notes/transcript). 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.

    Inputs

    meeting_idstringrequired
    A meeting id from search_meetings, in the series.
    cursorstring
    Pagination cursor: the next_cursor from a previous response. Omit for the first page.
    limitinteger
    Page size (default 25, max 200).