> **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 OtterAI MCP server

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

**Authentication:** OAuth 2.1/DCR
**Categories:** Transcription, Productivity, Collaboration
**Tools:** 3: 3 read, 0 write, 0 destructive
**Users sign in with:** OAuth
**OAuth app:** Scalekit's or your own
**Built by:** Vendor MCP
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=OTTERAIMCP)

## 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 OtterAI MCP connection

   In **AgentKit > Connections**, create an OtterAI MCP connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

   Scalekit credentials are available for OtterAI MCP server, so you don't need to register an OAuth app.

4. ### 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 = 'otteraimcp'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize OtterAI 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: 'otteraimcp_otter_get_user_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 = "otteraimcp"
   identifier = "user_123"

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

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="otteraimcp_otter_get_user_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: 'otteraimcp_otter_fetch',
  toolInput: {
    id: '<id>',
  },
  connector: 'otteraimcp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="otteraimcp_otter_fetch",
    tool_input={
        "id": "<id>",
    },
    connection_name="otteraimcp",
    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.

### `otteraimcp_otter_fetch`

Fetch · Read-only

Retrieve the full transcript and metadata for a single OtterAI meeting by its ID, returned by otter_search.

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

Inputs:

- `id` (`string`, required): Meeting ID returned by otter_search. Used to retrieve the full transcript from the Otter.ai platform.

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

### `otteraimcp_otter_get_user_info`

Get User Info · Read-only

Return the name and email of the currently authenticated OtterAI user.

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

Inputs: none.

Example input: `{}`

### `otteraimcp_otter_search`

Search · Read-only

Search meetings across platforms by date, attendee, topic, keyword, or title. Returns meeting metadata, AI summaries, outlines, and action items ranked by relevance; supports pagination via cursor.

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

Inputs:

- `attended_by` (`string`, optional): Optional. Name(s) of the participant(s) who were in the meeting. Case insensitive. Comma-separate multiple names.
- `channel_name` (`string`, optional): Optional. Name of any channel mentioned. Only include the name without the word channel. Default: ``.
- `created_after` (`string`, optional): Optional. 'YYYY/MM/DD' format. Start of the date range: only meetings created on or after this date are returned. Default: ``.
- `created_before` (`string`, optional): Optional. 'YYYY/MM/DD' format. End of the date range: only meetings created on or before this date are returned. Default: ``.
- `cursor` (`string`, optional): Optional. The next_cursor value from a previous otter_search response, used to fetch the next page of the same search.
- `folder_name` (`string`, optional): Optional. Name of any folder mentioned. Only include the name without the word folder. Default: ``.
- `include_shared_meetings` (`string`, optional): Optional. Whether to include meetings shared with the user. Set to false only when the user explicitly asks for their own meetings. Default: `true`.
- `keywords_in_transcript` (`string`, optional): Optional. Comma separated keywords that could be in the transcript. Case insensitive. Default: ``.
- `page_size` (`string`, optional): Optional. At most how many meetings to return in this response, between 1 and 25.
- `query` (`string`, optional): Optional. Semantic search query for finding relevant meetings by topic or content. Default: ``.
- `rationale` (`string`, optional): Optional. Briefly explain why you are calling this tool and how you plan to use the results. Do not include PII or other sensitive information. Maximum 250 characters.
- `title_contains` (`string`, optional): Optional. Space-delimited list of words, all of which must appear (in any order) in the recording title. Case insensitive. Default: ``.
- `username` (`string`, optional): Optional. The current user's name from otter_get_user_info, used to mark results as personally attended vs. only shared with the user.

Example input: `{}`

## Related

Other Transcription connectors ([all 26](/agentkit/connectors/?category=transcription)):

- [Chorus](/agentkit/connectors/chorus/): Scalekit connector, Username and password, 9 tools
- [Diarize](/agentkit/connectors/diarize/): Scalekit connector, Access token, 3 tools
- [Gong](/agentkit/connectors/gong/): Scalekit connector, OAuth, 49 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 |
