# MCP server

> Let a model read and act on meetings directly, over the Model Context Protocol.

Everything the REST API does is also available as an [MCP](https://modelcontextprotocol.io) server, so a model can call it without you writing a tool layer first.

```
https://api-notetaker.nabrah.ai/mcp
```

Transport is Streamable HTTP, stateless — one `POST` per JSON-RPC message, with no session to keep alive.

## Connecting

Authentication is the same key, in the same header:

```json
{
  "mcpServers": {
    "nabrah": {
      "type": "http",
      "url": "https://api-notetaker.nabrah.ai/mcp",
      "headers": { "Authorization": "Bearer nt_..." }
    }
  }
}
```

**Warning: Which clients work**

Any client that lets you set a header — Claude Code, Claude Desktop custom connectors, and most SDK clients — connects with the key above.

A client that insists on full OAuth 2.1 discovery will not, because this server authenticates with a key rather than an authorization server. That is a real limitation rather than an oversight, and worth knowing before you spend an afternoon on it.

## The tools

A **read-only** key is shown only the read tools, and a write tool called with one is refused as though it did not exist. That is deliberate: a model that can see a capability will try it, and a refusal it could not have predicted is worse than a capability that was never offered.

| Tool | Needs |
| --- | --- |
| `list_meetings` · `get_meeting` | read |
| `get_schedule` — what is coming, and what will be recorded | read |
| `list_recordings` · `get_recording` · `get_transcript` | read |
| `list_action_items` · `get_bot` | read |
| `list_calendar_connections` | read |
| `get_organization_usage` · `get_organization_analytics` | read, organization key |
| `send_bot_to_meeting` · `stop_bot` | full |
| `set_meeting_recording` | full |
| `complete_action_item` | full |
| `create_calendar_connect_link` | full |

## What the model is told up front

`initialize` returns instructions carrying the facts a model would otherwise guess wrong: one live bot per account, a monthly cap, that connecting a calendar needs a person, and how far the calendar reaches. Those cost five lines and prevent a whole class of confidently wrong answers.

**Note: One implementation, two ways of asking**

Every tool calls the same service function the matching REST route calls. An answer through MCP and an answer over HTTP are the same object — there is no second code path to drift.
