---
title: "Bruk ThunderPhone som en MCP-server"
description: "Bygg, test, valider og drift ThunderPhone-stemmeagenter fra Claude, ChatGPT, Claude Code, Codex, Cursor, VS Code eller en annen Streamable HTTP MCP-klient."
---

ThunderPhone eksponerer en Streamable HTTP Model Context Protocol-server på:

```text
https://api.thunderphone.com/v1/mcp
```

Dette er motsatt retning av [å koble en ekstern MCP-server til en stemmeagent](/nb/guides/mcp-servers):

| Retning | Resultat |
| --- | --- |
| Ekstern MCP-server → ThunderPhone-agent | En stemmeagent kan kalle verktøyene på den eksterne serveren. |
| ThunderPhone → MCP-klienten din | Kodeagenten din kan bygge, teste og drifte ThunderPhone. |

## Autentiser

Bruk [OAuth](/nb/guides/oauth) som standard for katalogklienter: logg inn, velg en organisasjon og godkjenn de forespurte tillatelsene. Tilbakekall tilgang under **Organisasjon → API-nøkler → Autoriserte apper**.

For klienter som er konfigurert med en API-nøkkel, opprett en `sk_live_`-nøkkel under **Organisasjon → Nøkler** og eksponer den for MCP-klienten din som `THUNDERPHONE_API_KEY`. Nøkkelen er knyttet til én organisasjon; en ID som eies av en annen organisasjon, oppfører seg som om den ikke finnes.

<Warning>
  En `sk_live_`-nøkkel kan lese organisasjonsdata og utføre produksjonshandlinger som å rulle ut agenter, foreta samtaler, kjøpe numre, starte kampanjer og slette ressurser. Hold den unna nettleserkode, repositorier, skjermbilder og chatlogger. Bruk klientens hemmelighetslager eller miljøstøtte, og tilbakekall en eksponert nøkkel umiddelbart.
</Warning>

## CLI- og stdio-alternativer

[ThunderPhone CLI](/nb/guides/cli) kan skrive klientkonfigurasjon samtidig som
uavhengige servere bevares:

```bash
npx -y @thunderphone/mcp setup --client cursor --api-key-env THUNDERPHONE_API_KEY
npx thunderphone mcp setup --client claude-desktop --scope user
```

Etter en global installasjon av `@thunderphone/mcp` bruker du `thunderphone-mcp setup` med de
samme alternativene. Oppsett støtter Claude Code, Codex, Cursor, VS Code, Gemini, Claude
Desktop og Windsurf. Direkte HTTP foretrekkes; Desktop bruker stdio.

For enhver klient som støtter stdio, konfigurer `command: "npx"` med
`args: ["-y", "@thunderphone/mcp"]`. Wrapperen bruker først `THUNDERPHONE_API_KEY`,
deretter legitimasjon fra `thunderphone login`, og oppdaterer utløpte tokener, deretter
OAuth gjennom `mcp-remote`. Enhetsinnlogging og OAuth krever at den tilsvarende API-
OAuth-funksjonen er rullet ut. API-nøkkelbanen gjør ikke det. Direkte HTTP-konfigurasjoner leser ikke
CLI-legitimasjonslageret; bruk stdio-wrapperen for å gjenbruke enhetsinnlogging.

Dette er alternativer til de manuelle klientkonfigurasjonene nedenfor.

## Klientkonfigurasjon

Claude og ChatGPT logger inn med [OAuth](/nb/guides/oauth); ingen API-nøkkel er involvert. Hvis du ikke har en ThunderPhone-konto ennå, velger du **Opprett konto** på innloggingssiden og kommer tilbake til godkjenningsskjermen etter at du har bekreftet e-postadressen din.

### Claude (nett, skrivebord og mobil)

1. Åpne **Tilpass → Koblinger** (**Innstillinger → Koblinger** i eldre versjoner). Hvis ThunderPhone vises i koblingskatalogen, velger du det. Ellers velger du **Legg til egendefinert kobling**, gir den navnet `ThunderPhone` og angir `https://api.thunderphone.com/v1/mcp`.
2. Velg **Koble til**, logg inn på ThunderPhone, velg organisasjonen og godkjenn tillatelsene.
3. I en chat aktiverer du ThunderPhone fra verktøymenyen og ber om det du trenger, for eksempel «Vis agentene mine».

Claude spør før det bruker hvert verktøy for første gang. For å hoppe over de fleste av disse spørsmålene åpner du **Tilpass → Koblinger → ThunderPhone** og angir **Skrivebeskyttede verktøy** til alltid å tillate. Disse verktøyene slår bare opp informasjon: agenter, samtaler, transkripsjoner, saldoer og dokumentasjon. La **Verktøy for skriving/sletting** kreve godkjenning hvis du vil se hver endring før den skjer.

Egendefinerte koblinger krever et betalt Claude-abonnement. I Team- og Enterprise-abonnementer legger en eier først til koblingen under organisasjonens koblingsinnstillinger, og deretter kobler hvert medlem til sin egen ThunderPhone-konto.

### ChatGPT

1. Hvis ThunderPhone vises i ChatGPTs appkatalog, velger du det og kobler til.
2. Ellers åpner du **Innstillinger → Apper og koblinger → Avanserte innstillinger**, slår på **Utviklermodus** og oppretter en kobling med URL-en `https://api.thunderphone.com/v1/mcp` og OAuth-autentisering.
3. Logg inn på ThunderPhone, velg organisasjonen og godkjenn tillatelsene. Legg til ThunderPhone i en chat fra verktøymenyen.

Sletting av en agent eller et telefonnummer, forkasting av et utkast, lansering av en kampanje og sending av en testforespørsel som kan skrive til et eksternt system krever en ekstra bekreftelse i begge appene. Se [Bekrefte destruktive handlinger](#confirming-destructive-actions).

### Claude Code

```bash
claude mcp add --transport http thunderphone https://api.thunderphone.com/v1/mcp \
  --header "Authorization: Bearer $THUNDERPHONE_API_KEY"
```

### Codex

Legg dette til i `~/.codex/config.toml`:

```toml
[mcp_servers.thunderphone]
url = "https://api.thunderphone.com/v1/mcp"
bearer_token_env_var = "THUNDERPHONE_API_KEY"
```

### Cursor

Opprett `.cursor/mcp.json`:

```json
{
  "mcpServers": {
    "thunderphone": {
      "url": "https://api.thunderphone.com/v1/mcp",
      "headers": {
        "Authorization": "Bearer ${env:THUNDERPHONE_API_KEY}"
      }
    }
  }
}
```

### Claude Desktop

Legg til en `mcp-remote`-bro i Claude Desktop-konfigurasjonen:

```json
{
  "mcpServers": {
    "thunderphone": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://api.thunderphone.com/v1/mcp",
        "--header",
        "Authorization: Bearer ${THUNDERPHONE_API_KEY}"
      ],
      "env": {
        "THUNDERPHONE_API_KEY": "sk_live_YOUR_API_KEY"
      }
    }
  }
}
```

### VS Code

Opprett `.vscode/mcp.json` og angi nøkkelen via VS Codes inndatadialog:

```json
{
  "inputs": [
    {
      "type": "promptString",
      "id": "thunderphone-api-key",
      "description": "ThunderPhone organization API key",
      "password": true
    }
  ],
  "servers": {
    "thunderphone": {
      "type": "http",
      "url": "https://api.thunderphone.com/v1/mcp",
      "headers": {
        "Authorization": "Bearer ${input:thunderphone-api-key}"
      }
    }
  }
}
```

## Verktøy

Alle verktøy har MCP-merknader. I tabellene betyr **R** skrivebeskyttet, **D** destruktivt, **I** idempotent og **O** samhandling med åpen verden/nettverk. En bindestrek betyr at ingen merknad er angitt.

### Tilkobling

| Verktøy | Hovedargumenter | Merknader | Hva det gjør |
| --- | --- | --- | --- |
| `get_connection_identity` | — | R, I | Validerer legitimasjonen og returnerer organisasjonen og sikker metadata om legitimasjonen. |

### Agenter

| Verktøy | Hovedargumenter | Merknader | Hva det gjør |
| --- | --- | --- | --- |
| `list_agents` | — | R, I | Viser agenter. |
| `get_agent` | `agent_id` | R, I | Henter én agent. |
| `create_agent` | agentkonfigurasjon | — | Oppretter en agent. |
| `update_agent` | `agent_id`, endrede felt | D | Mellomlagrer felt i agentutkastet og erstatter det utkastet hadde. Kjører uten et bekreftelsestrinn: den distribuerte agenten forblir uendret til `deploy_agent`, og `discard_agent_draft` tilbakestiller utkastet. |
| `deploy_agent` | `agent_id`, valgfri `if_updated_at` | D, I | Forfremmer utkastet til produksjon. |
| `discard_agent_draft` | `agent_id`, valgfri `if_updated_at`, `confirmation_token` i den andre forespørselen | D, I | Forkaster mellomlagrede endringer. To trinn, se [Bekrefte destruktive handlinger](#confirming-destructive-actions). |
| `duplicate_agent` | `agent_id`, valgfri `name` | — | Kopierer en agent i organisasjonen. |
| `delete_agent` | `agent_id`, `confirmation_token` i den andre forespørselen | D, I | Sletter en agent permanent. To trinn. |
| `list_agent_versions` | `agent_id` | R, I | Viser distribuerte konfigurasjonsversjoner. |

### Telefonnummer og operatører

| Verktøy | Hovedargumenter | Merknader | Hva det gjør |
| --- | --- | --- | --- |
| `list_phone_numbers` | — | R, I | Viser organisasjonens numre og ruting. |
| `get_phone_number_limits` | — | R, I | Henter bruk og grenser for administrerte numre. |
| `provision_phone_number` | valgfri `area_code`, `city`, `state`, `idempotency_key` | D, O | Kjøper et innkommende nummer administrert av ThunderPhone. |
| `list_voip_connections` | — | R, I | Viser tilkoblede kundeteleoperatører. |
| `search_voip_numbers` | `connection_id`, `country`, `type`, valgfri `area_code` | R, I, O | Søker i teleoperatørens nummerbeholdning. |
| `import_voip_numbers` | `connection_id`, `numbers` | D, O | Importerer numre som allerede eies hos teleoperatøren. |
| `update_phone_number` | `phone_number_id`, felt for ruting/etikett/webhook | D | Oppdaterer nummerets ruting, inkludert tildeling av stemmeagent. |
| `delete_phone_number` | `phone_number_id`, `confirm`, valgfri `release_at_provider`, `confirmation_token` i den andre forespørselen | D, I, O | Frigir et nummer. To trinn. |

### SMS

| Verktøy | Hovedargumenter | Merknader | Hva det gjør |
| --- | --- | --- | --- |
| `send_sms` | `from_number`, `to`, `body`, `idempotency_key` | D, I, O | Sender én SMS i ren tekst via et tilkoblet Twilio- eller Telnyx-nummer. |

### Samtaler

| Verktøy | Hovedargumenter | Merknader | Hva det gjør |
| --- | --- | --- | --- |
| `list_calls` | valgfrie filtre, `limit`, `offset` | R, I | Viser samtaler med REST-filtrene for samtalehistorikk. |
| `get_call` | `call_id` | R, I | Henter samtalestatus og metadata. |
| `get_call_transcript` | `call_id`, valgfri `live` | R, I | Henter samtaletranskripsjonen. |
| `get_call_audio_url` | `call_id`, valgfri `download` | R, I, O | Returnerer en signert lyd-URL; strømmer aldri lyd via MCP. |
| `get_call_grade` | `call_id` | R, I | Henter den nyeste samtalevurderingen. |
| `place_call` | `agent_id`, `from_number`, `to_number` | D, O | Foretar én ikke-idempotent utgående samtale. |
| `export_calls` | samtalefiltre, `export_format` | R, I | Eksporterer opptil REST-endepunktets grense som JSON eller CSV. |

### Testing og validering

| Verktøy | Hovedargumenter | Merknader | Hva det gjør |
| --- | --- | --- | --- |
| `list_test_scenarios` | `agent_id` | R, I | Viser testscenarioer. |
| `create_test_scenario` | `agent_id`, `title`, `scenario_prompt`, valgfrie betingelser | — | Oppretter et scenario. |
| `generate_test_scenarios` | `agent_id`, valgfri `count`, `include_edge_cases`, `locale` | O | Genererer scenarioer fra agentprompten. |
| `run_agent_tests` | `agent_id`, `channel`, `consent_to_charge`, valgfritt utvalg/matrise | D, O | Kjører scenarioer via nett eller telefoni. |
| `get_test_run` | `agent_id`, `batch_id` | R, I | Henter batchstatus og resultater per scenario. |
| `list_validation_runs` | `agent_id` | R, I | Viser nylige valideringskjøringer for utkast. |
| `get_validation_status` | `agent_id` | R, I | Henter den nyeste valideringstilstanden og samsvaret for utkastet. |

### Kunnskap

| Verktøy | Hovedargumenter | Merknader | Hva det gjør |
| --- | --- | --- | --- |
| `list_knowledge_bases` | — | R, I | Viser kunnskapsbaser. |
| `create_knowledge_base` | `name`, valgfri `description` | — | Oppretter en kunnskapsbase. |
| `add_knowledge_document` | `knowledge_base_id`, `name`, `content` | — | Legger til tekst eller Markdown. |
| `import_knowledge_url` | `url`, valgfri `name` | O | Setter en offentlig side i kø for sikker innlasting. |
| `search_knowledge` | `knowledge_base_id`, `query` | R, I | Søker i produksjonshenting. |

### Integrasjoner, webhooks og eksterne MCP-servere

| Verktøy | Hovedargumenter | Merknader | Hva det gjør |
| --- | --- | --- | --- |
| `list_integrations` | — | R, I | Viser HTTP-funksjonsintegrasjoner. |
| `create_integration` | `display_name`, funksjons-`spec`, valgfrie endepunktfelter | — | Oppretter et HTTP-verktøy. Legg til autentiseringshoder i dashbordet. |
| `test_integration` | `url`, valgfri metode/brødtekst/tidsavbrudd, `integration_id` med `header_names`, `confirmation_token` i den andre forespørselen | D, O | Sender en avgrenset, SSRF-beskyttet testforespørsel. Lagrede headerverdier fylles inn fra integrasjonen og sendes bare til dens egen vert. `POST` (standard), `PUT`, `PATCH` og `DELETE` er totrinns; `GET` kjører umiddelbart. |
| `list_webhook_endpoints` | — | R, I | Viser signerte webhook-endepunkter. |
| `list_webhook_deliveries` | valgfri `agent_id`, valgfri `endpoint_id` | R, I | Viser nylige resultater for webhook-leveringer uten nyttelast. |
| `create_webhook_endpoint` | `label`, `url`, valgfrie hendelser/status | O | Oppretter et signert webhook-endepunkt. |
| `test_webhook_endpoint` | `endpoint_id` | O | Sender en syntetisk hendelse gjennom vanlig levering. |
| `list_mcp_servers` | — | R, I | Viser eksterne servere som kan kalles av stemmeagenter. |
| `create_mcp_server` | `display_name`, `url` | O | Registrerer og synkroniserer en ekstern server. Servere som trenger autentiseringshoder, legges til i dashbordet. |
| `sync_mcp_server_tools` | `server_id` | D, O | Oppdaterer en ekstern servers verktøykatalog. |

### Kampanjer

| Verktøy | Hovedargumenter | Merknader | Hva det gjør |
| --- | --- | --- | --- |
| `list_campaigns` | — | R, I | Viser utgående kampanjer. |
| `create_campaign` | kampanjefelt | — | Oppretter en utkastkampanje. |
| `add_campaign_contacts` | `campaign_id`, `contacts` | — | Legger til opptil 5 000 JSON-kontakter. |
| `campaign_action` | `campaign_id`, `action`, valgfri `consent_to_charge`, `confirmation_token` i den andre forespørselen | D, O | Kjører `start`, `pause`, `resume` eller `stop`. `start` og `resume` har to trinn; `pause` og `stop` kjøres umiddelbart. |
| `get_campaign_stats` | `campaign_id` | R, I | Henter tellere og nylige resultater. |

### Stemmer, fakturering og dokumentasjon

| Verktøy | Hovedargumenter | Merknader | Hva det gjør |
| --- | --- | --- | --- |
| `list_voices` | — | R, I | Viser stemmer og støttede språk. |
| `preview_voice` | `voice`, `language`, `text` | O | Genererer et eksempel og returnerer en signert URL. |
| `list_voice_clones` | — | R, I | Viser egendefinerte stemmekloner. |
| `get_billing_summary` | — | R, I | Henter saldo og autoritative priser for nivåer; ingen betalingsendringer er eksponert. |
| `search_docs` | `query`, valgfri `limit` | R, I, O | Søker i den offentlige dokumentasjonsindeksen. |
| `get_doc_page` | `path` | R, I, O | Henter én offentlig Markdown-dokumentasjonsside. |

Alle produktverktøy bruker de samme REST-kodebanene som det offentlige API-et. REST-validering, organisasjonsavgrensning, roller, faktureringsgodkjenning, kvoter, TCPA-bekreftelse, leverandørsikkerhet og revisjonsatferd gjelder derfor uendret.

## Bekreftelse av destruktive handlinger

Verktøy merket med D endrer eller fjerner noe, eller begynner å ringe ekte personer. De som ikke kan angres, krever to forespørsler. Den første forespørselen endrer ingenting og returnerer:

```json
{
  "status": "confirmation_required",
  "action": "Delete agent",
  "target": { "id": 195, "name": "Front Desk Receptionist" },
  "confirmation_token": "…",
  "expires_in_seconds": 600,
  "next_step": "…"
}
```

Assistenten viser brukeren hva som påvirkes, og ber om et ja. Deretter gjentar den forespørselen med de samme argumentene pluss `confirmation_token`. En token er gyldig i 10 minutter og gjelder for én organisasjon, ett verktøy og ett eksakt sett med argumenter, så sletting av tre stemmeagenter krever tre bekreftelser. `campaign_action` med `pause` eller `stop` hopper over dette trinnet, slik at en aktiv kampanje alltid kan stanses umiddelbart, og det samme gjør `test_integration` med `GET`. Enkelte D-verktøy kjøres med én forespørsel fordi D-en angir effekten deres, ikke en bekreftelse på serversiden: `update_agent` erstatter det utkastet hadde (`discard_agent_draft` tilbakestiller det), `deploy_agent` erstatter den aktive konfigurasjonen, `update_phone_number` ruter aktive samtaler på nytt, `sync_mcp_server_tools` erstatter verktøykatalogen til en ekstern server, `import_voip_numbers` peker numre på nytt til operatøren din, `run_agent_tests` kan bruke kreditt, `send_sms` og `place_call` når en ekte person (`place_call` beholder sin egen samtykkebekreftelse), og `provision_phone_number` kjøper et nummer. MCP-klienten din kan fortsatt be deg om å godkjenne dem.

## Startmeldinger

`prompts/list` viser fem gjenbrukbare arbeidsflyter:

- `create_inbound_receptionist`
- `run_agent_tests`
- `buy_and_attach_number`
- `review_low_grade_calls`
- `add_url_to_agent_knowledge`

Bruk `prompts/get` med det oppførte promptnavnet og de deklarerte argumentene for å motta en klar brukerforespørsel.

## Ressurser

`resources/list` eksponerer offentlige, hurtigbufrede referanser:

| URI | Innhold |
| --- | --- |
| `thunderphone://docs/llms.txt` | Offentlig dokumentasjonsindeks. |
| `thunderphone://docs/quickstart` | Hurtigstart-Markdown. |
| `thunderphone://pricing` | Gjeldende offentlig pris-Mardown. |

Les en ressurs med `resources/read`. Offentlige hentinger bruker en kort tidsavbruddsgrense, en grense på 2 MiB og en ti minutters hurtigbuffer i prosessen.

## Protokoll og feil

Serveren støtter protokollversjonene `2025-06-18` og `2025-03-26`; den gjentar en støttet klientversjon og velger ellers `2025-06-18`. Den implementerer `initialize`, `ping`, verktøy, prompter, ressurser og varsler. Varsler returnerer `202 Accepted`. Denne tilstandsløse serveren eksponerer ikke en SSE-lytter eller sletting av økter, så `GET` og `DELETE` returnerer `405 Method Not Allowed` med `Allow: POST`.

Verktøyfeil forblir vellykkede JSON-RPC-svar med `isError: true`. Teksten inneholder en kort setning etterfulgt av en JSON-blokk:

```json
{
  "code": "insufficient_balance",
  "detail": "There is not enough prepaid balance.",
  "next_step": "Call get_billing_summary, add funds in Organization > Billing, then retry."
}
```

Det distinkte prefikset `outbound_tcpa_confirmation_required:` beholdes for `place_call`. Ukjente JSON-RPC-metoder returnerer `-32601` i et HTTP-`200`-svar. JSON-RPC-batcher støttes ikke av MCP `2025-06-18` og returnerer en ren `-32600`-feil for ugyldig forespørsel.
