# MCP Server

Connect AI tools like Claude and Cursor to your note1 meetings with the note1 MCP Server

Canonical: https://note1.ai/docs/mcp-server
Published: 2026-08-09
Last updated: 2026-10-13

*Updated on October 13, 2026 to reflect note1's current plans and features.*

# note1 MCP Server

Connect your AI tools to note1 and work with your meetings from anywhere: search past conversations, pull summaries and transcripts, check your calendar, and schedule recordings — directly from Claude, Cursor, Slackbot, or any MCP-compatible client.

## What is MCP?

[Model Context Protocol (MCP)](https://modelcontextprotocol.io/) is an open standard that lets AI applications securely connect to external tools and data. The note1 MCP Server exposes your meetings as tools your AI assistant can call — always with your own note1 permissions, so private meetings stay private.

## Server details

The note1 MCP Server is available at:

```
https://api.note1.ai/mcp
```

It supports two authentication methods:

- **OAuth** — the browser-consent flow used by claude.ai. No setup needed; you'll be asked to log in to note1 and approve access.
- **Personal Access Token (PAT)** — a long-lived API token for clients that send auth headers (Claude Desktop, Claude Code, Cursor).

Related resources:

- **GitHub**: [note1-ai/note1-mcp](https://github.com/note1-ai/note1-mcp) — connector source and setup examples
- **npm**: [`@note1ai/mcp`](https://www.npmjs.com/package/@note1ai/mcp) — `npx -y @note1ai/mcp` stdio bridge for command-based MCP clients
- **MCP Registry**: [`ai.note1/mcp`](https://registry.modelcontextprotocol.io/v0/servers?search=note1) — official registry listing

## Create a Personal Access Token

1. Sign in to your note1 account.
2. Go to **Account** → **API tokens**.
3. Enter a name (for example, "Claude Desktop") and select **Create token**.
4. Copy the token immediately — it is shown only once.

Tokens act as you, with your exact meeting permissions. You can revoke them anytime from the same page.

## Configuration by platform

### Claude (web)

Claude connects via OAuth — no token needed:

1. Open [Claude Settings → Connectors](https://claude.ai/settings/connectors).
2. Select **Add custom connector**.
3. Name it `note1` and enter the URL: `https://api.note1.ai/mcp`.
4. Leave the OAuth Client ID and Secret fields **empty** — registration is automatic.
5. Select **Add**. Your browser opens a note1 consent page — select **Allow**.

You can revoke Claude's access anytime under **Account** → **Connected apps**. OAuth access is limited to the scopes you select during consent: read meetings, read calendar, manage meetings, and manage team integrations (`integrations:write`).

### Claude Desktop

Add the following to your `claude_desktop_config.json` (Settings → Developer → Edit Config), replacing `n1_YOURTOKEN` with your Personal Access Token:

```json
{
  "mcpServers": {
    "note1": {
      "command": "npx",
      "args": ["-y", "@note1ai/mcp"],
      "env": { "NOTE1_API_TOKEN": "n1_YOURTOKEN" }
    }
  }
}
```

Restart Claude Desktop after saving. Node.js is required. The [`@note1ai/mcp`](https://www.npmjs.com/package/@note1ai/mcp) package ([source](https://github.com/note1-ai/note1-mcp)) is a thin bridge to the hosted server — clients with native remote support can use the URL directly instead.

### Claude Code

```bash
claude mcp add note1 --transport http https://api.note1.ai/mcp \
  --header "Authorization: Bearer n1_YOURTOKEN"
```

### Cursor

Add to `~/.cursor/mcp.json` (or a project's `.cursor/mcp.json`):

```json
{
  "mcpServers": {
    "note1": {
      "url": "https://api.note1.ai/mcp",
      "headers": { "Authorization": "Bearer n1_YOURTOKEN" }
    }
  }
}
```

### Slackbot

If your Slack workspace is connected to note1 (Team → Integrations), no token is needed — Slack identifies you automatically by your Slack email:

1. Open a DM with **Slackbot**.
2. Select the **Apps** button in the Slackbot toolbar.
3. Add **note1** from the list.
4. Ask Slackbot things like "what meetings did I have this week?"

Your Slack email must match your note1 account email in the connected workspace.

For automatic meeting recaps, `/n1` private search, `@note1` thread answers, and channel controls, see the [note1 Slack integration](https://note1.ai/integrations/slack).

## Available tools

| Tool | Description |
| --- | --- |
| `note1_search_meetings` | Search your meetings. Mode `search` returns ranked source snippets; mode `analysis` returns an AI answer with cited sources. |
| `note1_list_meetings` | Browse meetings without a query — filter by status and date range, paginated. |
| `note1_get_meeting` | Fetch one meeting: summary overview, sections, participants, status, its recurring series (previous and next occurrence), and the dashboard link. |
| `note1_get_meeting_insights` | A meeting's derived data: speakers with talk-time share, the questions asked and answered, the topics covered with time ranges, topic-tracker mentions, or the highlights. Use instead of the transcript for "who spoke most" or "what was asked". |
| `note1_export_meeting` | Export a meeting's summary and/or full speaker-attributed transcript as paste-ready markdown or structured JSON. |
| `note1_get_account` | Your note1 account: plan, seats, what's left of this period's meeting allowance, the recording upload size limit, and the teams you belong to (with the active one). Check it before uploading a recording. |
| `note1_list_action_items` | The tracked action items you can see: for one meeting or the whole team, open by default, optionally only yours. Each with status, owner, meeting, date and its page, the tickets it is linked to (tool, identifier, link and whether the ticket was closed), and a "possibly done" hint when note1 has a pending suggestion that it is finished. |
| `note1_create_action_item` | Create an action item under a meeting or with none, assigned to you, a named person, or nobody. |
| `note1_update_action_item` | Change an action item's text, description or owner, or mark it open, completed or dismissed. Marking an item completed also closes or asks about its linked tickets according to the team's settings; set `closeLinkedTickets` to close the linked tickets that are waiting for a decision, were declined or failed to close. |
| `note1_list_integrations` | Slack and the task tools (Linear, Jira, GitHub, Asana, Trello, Todoist, Motion, Notion) with their connection state (active or needs reconnecting), workspace, target and settings (for GitHub also the allowed repositories and what happens when note1 is unsure which one fits), and whether you can manage them. Any team member can read this. |
| `note1_list_integration_options` | The targets you can pick for one integration: projects, boards or databases, plus Trello's done lists and the suggested one, or Slack's channels. |
| `note1_update_integration` | Change an integration's target (by id or exact name; for GitHub the default repository), GitHub's allowed repositories (ids or exact names) and whether note1 leaves a suggestion or uses the default repository when it is unsure which one fits, match mode, auto-create, what happens when a ticket is closed or an item is marked done in note1, Trello's done list (id, name or `none`), or Slack's default channel and posting default. Admin only; needs `integrations:write`. |
| `note1_connect_integration` | Get the link that connects Slack or a task tool. It expires in 10 minutes and must be opened in a browser. Motion uses an API key, so it returns the dashboard link instead. Admin only; needs `integrations:write`. |
| `note1_disconnect_integration` | Disconnect an integration. Needs `confirmed: true`, so the assistant asks you first. Admin only; needs `integrations:write`. |
| `note1_sync_action_items` | Queue the ticket sync for one action item (retry) or for every item of a meeting. Needs `meetings:write` and edit access to the item. |
| `note1_decide_ticket_suggestion` | Act on an action item's pending ticket suggestion: `link` the existing ticket, `create` a new one (for GitHub, optionally in the repository you name), or `dismiss` it. Replies "Already handled" if it was decided meanwhile. Needs `meetings:write`. |
| `note1_list_topic_trackers` | The topic trackers you can see (team and your own) and where their phrases came up recently across meetings, newest first, with quotes. |
| `note1_create_topic_tracker` | Create a topic tracker: a named set of phrases note1 watches across meetings. Personal by default; a team tracker takes an admin. |
| `note1_update_topic_tracker` | Rename a tracker, or add or remove the phrases it watches. |
| `note1_delete_topic_tracker` | Delete a tracker; its phrases are no longer watched. |
| `note1_get_meeting_notes` | A meeting's notes in two layers: your personal notes (talking points, reminders; private to you) and the shared agenda. Every block carries a ref for updates. |
| `note1_update_meeting_notes` | Change a meeting's notes block by block (insert under a heading or after a block, update, delete), or replace the whole document with markdown. Personal notes by default; the shared agenda needs edit access. |
| `note1_get_calendar` | List your calendar events with recording status. |
| `note1_get_scheduling_link` | Get a prefilled calendar link (Google Meet or Teams) with note1 pre-invited — the human-in-the-loop way to set up a recorded meeting. |
| `note1_schedule_recording` | Send note1's recording bot to an existing calendar event or any meeting link at a given time. Does not create calendar events. |
| `note1_update_meeting` | Edit a note1 meeting: title, bot time or link, summary style, language, video — optionally for a whole recurring series. |
| `note1_cancel_recording` | Call off the recording bot for a meeting or its series. |
| `note1_get_recording_upload_options` | Check the upload policy and get a workspace-specific browser link without reserving a meeting. |
| `note1_upload_recording` | Reserve one recording upload and get limited HTTP transfer instructions. Recording bytes stay outside MCP. |
| `note1_get_recording_upload` | Read the original uploader's acknowledged chunks, byte progress, and actual meeting state. |
| `note1_complete_recording_upload` | Confirm a fully transferred recording and start the existing processing pipeline. Safe to retry. |
| `note1_cancel_recording_upload` | Cancel a pending recording upload. Reports a conflict if completion already won. |

Read tools run without confirmation prompts; tools that change something (action items, topic trackers, scheduling, updating, cancelling) ask for approval in clients that support it (like Slackbot). Search matches by keyword and by meaning on every plan.

Managing team integrations (`note1_update_integration`, `note1_connect_integration`, `note1_disconnect_integration`) is admin-only, and an OAuth connection needs the **integrations:write** scope, which you grant on the consent page. Personal access tokens carry every scope. Listing integrations only needs **meetings:read**.

## Example prompts

- "What did we decide about pricing in last week's meetings?"
- "Export the transcript of yesterday's standup as markdown"
- "Which of my meetings tomorrow are being recorded?"
- "Who spoke the most in yesterday's standup, and what questions went unanswered?"
- "What are my open action items? Mark the deck one as done."
- "Start tracking mentions of pricing across our meetings"
- "What changed since the previous occurrence of this meeting?"
- "Record my 3pm meeting — here's the link: [https://meet.google.com/](https://meet.google.com/)..."
- "Set up a meeting for Thursday at 2pm" (returns a scheduling link to click)
- "Cancel the recording for Friday's 1:1, this week only"

## Upload an existing recording

All five recording-upload tools require **meetings:write**, including policy and progress. Get the user's approval before reserving, transferring, or canceling a recording. Uploads are private by default, contain exactly one immutable original audio/video file, and do not launch a meeting bot. The effective size limit comes from the workspace policy (initially 2,000,000,000 bytes).

### Direct transfer from a file-capable client

Your assistant needs access to the local file **and** an HTTP client that can send its exact byte slices. The MCP connection alone does not provide either capability. Do not send file bytes, base64, or local filesystem paths as tool arguments.

1. Call `note1_get_recording_upload_options` to check policy before reserving.
2. Call `note1_upload_recording` with metadata only. Keep the UUID and file metadata unchanged for retries:

```json
{
  "requestId": "fe926ddd-03bf-4917-8f1b-b44d3f290049",
  "title": "Customer interview",
  "file": { "name": "interview.wav", "size": 123456, "mimeType": "audio/wav" },
  "language": "en",
  "style": "interview"
}
```

An optional `teamId` overrides the connected account's active workspace, subject to membership checks. The result contains `teamId`, `meetingId`, `uploadId`, `fileId`, the effective limit, and `transfer` instructions. Initialization **reserves** a meeting; it does not transfer a recording.

3. Outside MCP, send each server-planned slice from `offset` for exactly `size` bytes. Use the returned HTTP `method` (**POST**, not PUT), replace only `{index}` in `urlTemplate` with the chunk's integer index, and include the returned headers: `Content-Type: application/octet-stream` and `X-Note1-Upload-Token`. Do not use an account bearer or put the upload token in a URL. Identical chunk retries are safe; changed bytes are rejected.
4. After a lost response, call `note1_get_recording_upload` with `uploadId` and the same `teamId` to check acknowledged chunks. Retry initialization with the **same requestId and frozen file metadata** to renew an expired transfer permission or recover initialization; do not create a second request.
5. Once all chunks are acknowledged, call `note1_complete_recording_upload` with `uploadId`, `fileId`, and the same `teamId`. It returns the actual meeting state and link. An accepted recording may still be processing: use `note1_get_meeting` when the transcript, summary, and action items are ready. Repeated completion does not queue another job.

The private upload-only permission lasts **one hour**. Renewal rotates it and invalidates the previous permission without extending upload retention. It cannot read recordings, complete/cancel an upload, or edit meetings. **Revoking a PAT or OAuth connection alone does not immediately invalidate an already issued upload permission**; expiry, rotation, cancellation, completion, or removal from the workspace does. Treat the returned upload header as a secret and do not paste it into public logs or chats.

### Browser fallback

If your client cannot read the file or send HTTP byte slices, use the browser URL from `note1_get_recording_upload_options` **before initialization**. Sign in, verify the requested workspace, explicitly switch if needed, then choose one recording and submit the existing upload form. Merely opening the page or form creates no meeting.

This is a new browser upload, **not cross-tab resume** of a direct reservation. If a direct upload already exists, continue it or confirm cancellation before starting another upload; starting over can consume another meeting allowance. Completion opens the normal meeting page. There is no embedded MCP widget or automatic callback into your chat.

### Usage and cancellation

Initialization reserves one meeting allowance; normal storage, transfer, and processing accounting applies. `note1_cancel_recording_upload` cancels only a pending upload and **does not refund the meeting allowance or transfer usage**. If completion already won, cancellation returns a conflict: check `note1_get_recording_upload` and open the retained meeting instead of claiming cancellation.

The `@note1ai/mcp` npm connector is only a bridge to these hosted tools. No new connector release is needed; refresh your client's tool list after the server is updated.

## Permissions and privacy

- Every tool acts **as you**: search results, transcripts, and calendar data follow your note1 permissions. Meetings you can't see in the dashboard don't appear in tool results either.
- OAuth connections and tokens are managed under **Account** → **API tokens**; revoking cuts authenticated tool access immediately. An already issued upload-only permission follows the expiry/revocation rules above.
- note1 holds no calendar write permissions — scheduling tools control note1's recording bot only and never create or modify calendar events. For creating events, `note1_get_scheduling_link` returns a link you open in your own calendar.

## Troubleshooting

**401 / authentication errors**

- Check the token is passed as `Authorization: Bearer n1_...` and hasn't been revoked (Account → API tokens shows last-used times).
- For claude.ai, reconnect the connector — OAuth access may have been revoked.

**A recently added tool doesn't appear**

- AI clients cache tool lists per session. Start a new conversation, or disconnect and reconnect the server (Claude Desktop: restart the app).

**"This meeting has no transcript file"**

- The meeting may still be processing, or it never recorded. Check its status on the meeting page.

**Slackbot doesn't offer note1**

- The workspace connection may predate MCP support: a team admin should reconnect Slack from **Team** → **Integrations**, then re-add note1 in Slackbot's Apps tab.
