> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to the Wisprflow MCP server

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.

**Authentication:** OAuth 2.1/DCR
**Categories:** Calendar, Productivity, Transcription
**Tools:** 14: 14 read, 0 write, 0 destructive
**Users sign in with:** OAuth
**OAuth app:** Your own Wisprflow MCP server app
**Built by:** Vendor MCP
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=WISPRFLOWMCP)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".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](/agentkit/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

   **Node.js** (`quickstart.mts`)

   ```typescript
   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)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "wisprflowmcp"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Wisprflow MCP:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="wisprflowmcp_get_account_info",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user signs in once. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'wisprflowmcp_get_account_info',
  toolInput: {},
  connector: 'wisprflowmcp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="wisprflowmcp_get_account_info",
    tool_input={},
    connection_name="wisprflowmcp",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `wisprflowmcp_get_account_info`

GetAccountInfo · Read-only

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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `wisprflowmcp_get_calendar_event`

GetCalendarEvent · Read-only

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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `calendar_id` (`string`, required): The calendar_id from another calendar tool.

Example input: `{"calendar_id":"<calendar_id>"}`

### `wisprflowmcp_get_meeting`

GetMeeting · Read-only

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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `meeting_id` (`string`, required): The meeting id from search_meetings.
- `view_content` (`object`, optional): 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_transcript` (`object`, optional): 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.

Example input: `{"meeting_id":"<meeting_id>"}`

### `wisprflowmcp_get_meeting_by_calendar_id`

GetMeetingByCalendarId · Read-only

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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `calendar_id` (`string`, required): The calendar_id from a calendar tool.
- `view_content` (`object`, optional): 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_transcript` (`object`, optional): 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.

Example input: `{"calendar_id":"<calendar_id>"}`

### `wisprflowmcp_get_meeting_participants_enriched`

GetMeetingParticipantsEnriched · Read-only

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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `meeting_id` (`string`, required): The meeting id from search_meetings.

Example input: `{"meeting_id":"<meeting_id>"}`

### `wisprflowmcp_get_scratchpad_note`

GetScratchpadNote · Read-only

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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `note_id` (`string`, required): The note id from search_scratchpad_notes.
- `view_content` (`object`, optional): 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.

Example input: `{"note_id":"<note_id>"}`

### `wisprflowmcp_get_upcoming_meeting`

GetUpcomingMeeting · Read-only

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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `calendar_id` (`string`, required): The calendar_id of the upcoming event.
- `include_preread` (`boolean`, optional): Include the pre-read briefing if one exists. Defaults to true.

Example input: `{"calendar_id":"<calendar_id>"}`

### `wisprflowmcp_list_meeting_series`

ListMeetingSeries · Read-only

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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `meeting_id` (`string`, required): A meeting id from search_meetings, in the series.
- `cursor` (`string`, optional): Pagination cursor: the next_cursor from a previous response. Omit for the first page.
- `limit` (`integer`, optional): Page size (default 25, max 200).

Example input: `{"meeting_id":"<meeting_id>"}`

### `wisprflowmcp_list_upcoming_meetings`

ListUpcomingMeetings · Read-only

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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `cursor` (`string`, optional): Pagination cursor: the next_cursor from a previous response. Omit for the first page.
- `limit` (`integer`, optional): Page size (default 25, max 50).
- `window_hours` (`integer`, optional): Hours ahead to include (default 24, max 168 = one week).

Example input: `{}`

### `wisprflowmcp_resolve_calendar_link`

ResolveCalendarLink · Read-only

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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `url` (`string`, required): The pasted calendar or conference URL.

Example input: `{"url":"<url>"}`

### `wisprflowmcp_resolve_share_link`

ResolveShareLink · Read-only

Resolve a Wispr Flow shared-notes link the user pasted (https://notes.wisprflow.ai/shared/…) to the shared meeting note: its title, Flow Summary (whose next-steps section holds the meeting's action items), owner, and the caller's role. Use this whenever the user pastes such a link instead of guessing at its contents — shared notes are usually other people's meetings, which search_meetings/get_meeting (the user's own meetings) will never find. The owner also receives their user-authored My Notes. Set view_transcript={} when the user needs source-level detail: a bounded transcript 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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `url` (`string`, required): The pasted share link (or its bare slug).
- `view_transcript` (`object`, optional): 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.

Example input: `{"url":"<url>"}`

### `wisprflowmcp_search_calendar_events`

SearchCalendarEvents · Read-only

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 alex@acme.com', 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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `attendee_emails` (`array`, optional): 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.
- `attendee_match` (`string`, optional): 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. One of: `any`, `all`.
- `cursor` (`string`, optional): Pagination cursor: the next_cursor from a previous response. Omit for the first page.
- `limit` (`integer`, optional): Page size (default 25, max 200).
- `query` (`string`, optional): Keyword to match against event title/description.
- `since` (`string`, optional): Only events starting at or after this ISO datetime with offset/Z.
- `until` (`string`, optional): Only events starting strictly before this ISO datetime with offset/Z.

Example input: `{}`

### `wisprflowmcp_search_meetings`

SearchMeetings · Read-only

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 alex@acme.com'. 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. 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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `attendee_emails` (`array`, optional): 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.
- `attendee_match` (`string`, optional): 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. One of: `any`, `all`.
- `cursor` (`string`, optional): Pagination cursor: the next_cursor from a previous response. Omit for the first page.
- `field` (`string`, optional): Which field to search: title, content, or both. One of: `title`, `content`, `both`.
- `limit` (`integer`, optional): Page size (default 25, max 200).
- `query` (`string`, optional): Keyword matching title, summary, and notes, not transcript. Omit to browse the date window or recent meetings.
- `since` (`string`, optional): Only meetings starting at or after this ISO datetime with offset/Z (calendar start, else stored creation time).
- `until` (`string`, optional): Only meetings starting strictly before this ISO datetime with offset/Z. Use the next local midnight for a day filter.

Example input: `{}`

### `wisprflowmcp_search_scratchpad_notes`

SearchScratchpadNotes · Read-only

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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `cursor` (`string`, optional): Pagination cursor: the next_cursor from a previous response. Omit for the first page.
- `field` (`string`, optional): Which field to search: title, content, or both. One of: `title`, `content`, `both`.
- `limit` (`integer`, optional): Page size (default 25, max 200).
- `query` (`string`, optional): Search term to match against notes. Omit to list all notes.
- `since` (`string`, optional): Only notes modified at or after this ISO datetime with offset/Z.
- `until` (`string`, optional): Only notes modified strictly before this ISO datetime with offset/Z. Use the next local midnight for a day filter.

Example input: `{}`

## Related

Other Calendar connectors ([all 13](/agentkit/connectors/?category=calendar)):

- [Google Calendar](/agentkit/connectors/googlecalendar/): Scalekit connector, OAuth, 30 tools
- [Microsoft 365](/agentkit/connectors/microsoft365/): Scalekit connector, OAuth, 317 tools
- [Outlook](/agentkit/connectors/outlook/): Scalekit connector, OAuth, 126 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
