> ## Documentation Index
> Fetch the complete documentation index at: https://docs.askassembly.app/llms.txt
> Use this file to discover all available pages before exploring further.

# MCP Server

> Connect Wavelength to Claude, Cursor, ChatGPT, or any MCP-compatible client, and ask questions about your accounts in plain English.

<Note>
  **Read-only.** The Wavelength MCP server can look things up. It cannot send an email, change a field, or delete anything.
</Note>

## What you can do with it

Once connected, you can ask things like:

* *"What meetings do I have this week, and what do I need to know before each one?"*
* *"Give me a brief on Vanta — health, open deals, what's happened recently."*
* *"Which of my accounts are at risk and renewing in the next 60 days?"*
* *"What did we say to Acme about the SSO request? Pull the actual thread."*
* *"Who at Flosum have we talked to in the last month?"*
* *"What open requests are assigned to me?"*

The typical loop is: start with your week, pull a brief for an account, then dig into the underlying conversations when something needs a closer look.

### What it can't do (yet)

| Not supported                                                | Why                                                                                                    |
| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ |
| Sending or drafting email, updating fields, creating records | The server is read-only in this release.                                                               |
| Ranking your book ("what should I work on today?")           | You can *filter* your book by your own criteria; Wavelength does not rank it for you.                  |
| Searching meetings by participant across the org             | You can see your own booked meetings. Org-wide meeting search is not available yet.                    |
| Deal totals and pipeline sums                                | Only the named metrics listed below are available. Anything not on that list is not answerable here.   |
| Semantic search inside a long call recording                 | Recordings match as a whole, not passage by passage.                                                   |
| "Every email mentioning X"                                   | Email search finds threads owned by the people you scope to. Someone who was only cc'd may not appear. |
| Slack conversations outside tickets                          | Not indexed for search.                                                                                |
| Individual email message bodies                              | Wavelength stores the thread summary, not each message's text.                                         |

<Info>
  **One difference you may notice.** MCP can surface meeting notes that the Wavelength web app currently hides. Notes ingested from some notetakers are marked inactive in the app but are still real, still yours, and still useful context — so MCP reads them rather than pretending they don't exist. If a note shows up here that you can't find in the web app, that is why, not a bug.
</Info>

## Before you start

* A Wavelength account with an active login.
* An MCP-compatible client: Claude (desktop, web, or Code), Cursor, ChatGPT, or your own client built on the MCP SDK.
* MCP is enabled for all Wavelength organizations by default — there is nothing to switch on. If a connection fails with "mcp is not enabled for this organization", MCP has been paused for your org; contact support.

You sign in with your normal Wavelength login. You do not need an API key.

## Server details

| Field      | Value                             |
| ---------- | --------------------------------- |
| Server URL | `https://mcp.askassembly.app/mcp` |
| Transport  | Streamable HTTP                   |
| Auth       | OAuth 2.1 (browser sign-in)       |
| Access     | Read-only                         |

## Setup

<Tabs>
  <Tab title="Claude (desktop or web)">
    <Steps>
      <Step title="Open Settings → Connectors">
        Find the **Connectors** section in your Claude settings.
      </Step>

      <Step title="Add a custom connector">
        Click **Add custom connector**.
      </Step>

      <Step title="Enter the server details">
        Name: `Wavelength`. URL: `https://mcp.askassembly.app/mcp`.
      </Step>

      <Step title="Connect and approve">
        Click **Connect**. A browser window opens; sign in to Wavelength and approve.
      </Step>

      <Step title="Confirm">
        The connector shows as connected, with the Wavelength tools listed.
      </Step>
    </Steps>
  </Tab>

  <Tab title="Claude Code">
    ```bash theme={null}
    claude mcp add --transport http wavelength https://mcp.askassembly.app/mcp
    ```

    Then run `/mcp` inside Claude Code and choose **Authenticate** for `wavelength`.
  </Tab>

  <Tab title="Cursor">
    **Settings → MCP → Add new MCP server**, or add to `~/.cursor/mcp.json`:

    ```json theme={null}
    {
      "mcpServers": {
        "wavelength": {
          "url": "https://mcp.askassembly.app/mcp"
        }
      }
    }
    ```

    Restart Cursor, then click **Sign in** next to the Wavelength server.
  </Tab>

  <Tab title="ChatGPT">
    **Settings → Connectors → Create**, using the same URL. Sign in when prompted.
  </Tab>

  <Tab title="Any other MCP client">
    Point it at `https://mcp.askassembly.app/mcp` over Streamable HTTP. The server advertises its authorization server at:

    ```
    https://mcp.askassembly.app/.well-known/oauth-protected-resource
    ```

    An unauthenticated request returns `401` with a `WWW-Authenticate` header pointing at that document — that response starts the standard OAuth 2.1 flow. Dynamic client registration is supported.
  </Tab>
</Tabs>

## Tools

All tools are read-only, and all are scoped to your organization automatically. You never pass an organization or user id — the server takes both from your sign-in.

### `wavelength_v1_api_read_get_my_week`

Your booked meetings over a window, each with the account it belongs to and its pre-meeting brief.

* Default window: 7 days. Maximum: 30 days.
* Covers meetings you are the assignee on.

### `wavelength_v1_api_read_get_brief`

A fixed-size snapshot of one account or one person.

`entity: "company"` returns, in a single call:

| Section              | How much                         |
| -------------------- | -------------------------------- |
| Recent meeting notes | the 2 most recent, summarised    |
| Recent interactions  | the 5 most recent                |
| Account CTA          | the current one, if there is one |
| Deals                | up to 10                         |
| Contacts             | up to 10                         |

`entity: "contact"` returns their role, account, and details.

**Every section reports an exact total**, like `"deals": "10 of 47"`. A section showing fewer rows than its total has been capped, not emptied — use `list_deals` or `list_contacts` for the rest, and `get_content` for a note's full transcript.

The brief is deliberately bounded. It is designed to be cheap enough to call before every meeting, so it summarises rather than dumps.

Accepts a name or an id. If a name is ambiguous, you get the candidates back rather than a guess.

### `wavelength_v1_api_read_list_deals`

Deals across your organization, filterable by:

* `stages` — deal stage names, matched exactly. The tool description lists your organization's actual stages.
* `amount` — `{operator, value}`, or `{operator: "is_between", min_value, max_value}`.
* `close_date` — a date, or a relative window like the next 90 days.
* `company_ids` / `company_name` — narrow to one account.

Sorted by close date, newest first. Returns an exact total and pages via `offset`. A query matching too many deals returns that total plus a request to narrow, rather than a truncated list that looks complete.

**Not yet filterable: deal type.** It also does not appear in the results — the underlying query does not return it. Coming in a later release.

**No pipeline sums.** This tool lists deals; it does not total them. See the metrics note below.

### `wavelength_v1_api_read_list_contacts`

Every contact on one account, with role and email. Requires `company_id` or `company_name`. Returns an exact total and pages via `offset`.

### `wavelength_v1_api_read_list_accounts`

Filter your book by criteria you supply: health pulse, renewal date, last interaction, tier, stage, tags, custom attributes.

* Returns thin rows plus a total.
* Capped at 25 rows per call.
* **At least one filter is required.** "List all my accounts" is refused on purpose — the answer would be thousands of rows nobody reads.
* If the filter still matches too many accounts, the server returns a count and asks you to narrow it, rather than returning a truncated list that looks complete. That is deliberate — it is not an error and not an empty result.

### `wavelength_v1_api_read_search`

Meaning-based search over one corpus at a time — `interactions` (email and support threads) or `notes` (meeting notes and recordings).

* `corpus` is required — one per call. Ask for two things and your client will make two calls.
* **Scope search to an account for meaning-based results.** Ask about a named company and it will resolve automatically.
* **With no account, `interactions` searches your own inbox instead.** It matches on both meaning and literal words, and covers only the mailbox connected under your own email address — never a colleague's. If you have no mailbox connected, it says so rather than returning nothing.
* Returns summaries plus a total. Use `get_content` to read the full thing.

### `wavelength_v1_api_read_list_interactions`

Structured filtering over support tickets, email threads, and conversations. Use this when the question is about fields rather than wording: open requests, status, assignee, source, account, or time window.

* Defaults to the last 90 days unless you pass `start_time` / `end_time`.
* `assignee` accepts `"me"`, `"unassigned"`, or a teammate's name.
* Returns up to 25 rows, newest first, with `total_count`.
* `count_only` returns just the count when the number is the answer.
* If more than 1000 interactions match, it returns a refusal and asks you to narrow the query rather than paging through an unbounded result set.

Use `search` instead when the question is about what was said, meaning, phrasing, or keywords.

### `wavelength_v1_api_read_get_content`

The full text behind a search result, by the ids a search returned.

* **Notes and recordings** return the full note, summary, action items, and the transcript where one exists.
* **Interactions** (email and support threads) return the subject and the thread summary. Individual message bodies are not stored, so they cannot be returned — if you need the exact wording of one message, open the thread in Wavelength or your inbox.

#### What you can see in email

Everything that is not email — support tickets, Slack-sourced threads, and the rest — is visible to everyone in your organization, as it is in the app.

Email is narrower:

| Email                    | Who can read it                     |
| ------------------------ | ----------------------------------- |
| Linked to an account     | anyone in your organization         |
| Not linked to an account | only the person whose mailbox it is |

So a colleague's personal correspondence never appears in your results, and yours never appears in theirs. A shared mailbox such as `support@` belongs to no individual, so mail there that was never linked to an account is not reachable through these tools at all — open it in Wavelength instead.

One practical consequence: `get_content` can return fewer items than the ids you gave it. That is this rule at work, not an error.

### `wavelength_v1_api_read_resolve`

Turns free text into a specific company, contact, team, or teammate. Used automatically by the other tools; you rarely call it directly. When a name is ambiguous it returns every candidate, so the model can pick using context from your conversation rather than guessing.

### `wavelength_v1_api_read_search_semantics`

Looks up what Wavelength's own terms mean — what "at risk" counts as, what each health driver measures, what a routine is, what a given metric includes and excludes. The model uses this so it answers in your definitions rather than inventing its own.

### `wavelength_v1_api_read_get_metric`

Numbers come from a fixed list of defined metrics, not from a general "sum this column" tool. Each result carries its own definition inline, so you can see exactly what was counted.

Available today — five support metrics, all filterable by team, source, assignee, and date window:

| Metric                    | What it measures                                                                                                                  |
| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `avg_first_response_time` | Mean time from a customer's first message to the first human reply.                                                               |
| `avg_response_time`       | Mean time a ticket sat in needs-response before being picked up. Not the same as first response — don't use them interchangeably. |
| `avg_resolution_time`     | Mean time from a ticket's first message to close, over tickets **closed** in the window.                                          |
| `sla_breach_count`        | Number of SLA breaches in the window.                                                                                             |
| `avg_sla_breach_duration` | Mean overrun on breached SLAs.                                                                                                    |

Every result carries its own definition inline, including what it excludes. All are wall-clock, not business hours.

<Warning>
  **Not available**: deal totals, pipeline sums, ARR, account-level aggregates, and timer totals. If a number is not in the table above, the server says so rather than approximating it. That is on purpose: a plausible wrong number in a QBR is worse than no number.
</Warning>

## How your data is scoped

* **Everything is limited to one organization** — the one on your sign-in. There is no cross-organization read, search, or comparison, and no tool accepts an organization as a parameter.
* **Currently, access is organization-wide, not per-user.** Any connected user can read any account in their organization, including other reps' notes, meetings, and persisted email bodies. This matches what the Wavelength web app already allows. If your organization needs tighter limits, talk to us before rolling MCP out broadly.
* **Authorization is checked on every request**, not once per session. Token validation is cached briefly, so revocation can take up to about a minute to take effect.
* **Read-only.** No tool can change anything in Wavelength.

## Limits

### Rate limits

Limits are **per organization** — shared across everyone in your org who has connected — and are set per tier, because the tools do very different amounts of work.

| Tier            | Limit        | Tools                                                                                       |
| --------------- | ------------ | ------------------------------------------------------------------------------------------- |
| Read            | 100 / second | `resolve`, `get_my_week`, `get_content`, `list_interactions`, `list_deals`, `list_contacts` |
| Brief           | 10 / second  | `get_brief`                                                                                 |
| Search          | 300 / minute | `list_accounts`                                                                             |
| Semantic search | 2 / second   | `search`                                                                                    |
| Reporting       | 2 / second   | `get_metric`                                                                                |

`search_semantics` is not rate limited.

Tiers are counted separately, so heavy searching never uses up the budget for cheap lookups.

If you hit a limit you get a clear error naming the tier and how many seconds to wait — never a silent truncation and never an empty result.

### Other limits

| Limit                        | Value       |
| ---------------------------- | ----------- |
| Rows per list or search call | 25          |
| Meeting window               | 30 days max |
| Time per tool call           | 30 seconds  |

**Results are never silently cut short.** Every list response tells you both how many rows came back and how many matched in total. If a query is too broad, the server says so and tells you how to narrow it.

## Troubleshooting

<AccordionGroup>
  <Accordion title="&#x22;Not enabled for this organization&#x22;">
    Your admin has not turned MCP on. Contact them, or email support.
  </Accordion>

  <Accordion title="The sign-in window opens and closes but nothing connects">
    Check that you signed in with the same email you use for Wavelength, and that the account belongs to the organization you expect.
  </Accordion>

  <Accordion title="&#x22;No results&#x22; for something you know exists">
    Two common causes: the name did not resolve (try the exact account name, or ask the model to resolve it first), or the time window excluded it (search defaults to a recent window — say "in the last year" explicitly).
  </Accordion>

  <Accordion title="Answers stop working mid-session">
    Your token expired or was revoked. Reconnect from your client's connector settings.
  </Accordion>

  <Accordion title="Slow responses on very large books">
    Broad filters over tens of thousands of accounts take longer. Narrowing the filter is faster than paging.
  </Accordion>
</AccordionGroup>

## FAQ

<AccordionGroup>
  <Accordion title="Does this cost extra?">
    Talk to your Wavelength account team.
  </Accordion>

  <Accordion title="Can I use it with my own agent?">
    Yes — it is a standard MCP server over Streamable HTTP with OAuth 2.1. Nothing about it is Claude-specific.
  </Accordion>

  <Accordion title="Is my data sent to Anthropic / OpenAI?">
    Yes, in the sense that any tool result your client requests is passed to the model you are using, the same as anything you paste into a chat. The MCP server itself does not send your data anywhere else.
  </Accordion>

  <Accordion title="Why can't it write an email for me?">
    This release is deliberately read-only. Write support is the next thing we are scoping.
  </Accordion>

  <Accordion title="Will the tool names change?">
    The `wavelength_v1_` prefix is a version marker. Names within `v1` are stable; a breaking change ships as `v2` alongside it.
  </Accordion>
</AccordionGroup>

## Support

Email **[support@askassembly.app](mailto:support@askassembly.app)**. Include your organization name, the client you are using, and the question you asked.
