# MCP-server

> Forbind Claude, ChatGPT, Claude Code eller Cursor til din Affilyflow-konto – opsætning, login, de 23 værktøjer, prompts og grænser.

MCP-serveren lader din AI-assistent arbejde direkte med din Affilyflow-konto: finde programmer, læse butikkens regler, søge i varer, lave sporbare links og hente dine klik, salg, sider og saldo – i samtalen. Værktøjerne bruger de samme funktioner som dashboardet og [REST-API'et](https://www.affilyflow.com/docs/affiliate/rest-api), så tallene er de samme.

MCP-serveren er kun for affiliates.

## Adressen

```text title="MCP-adresse"
https://app.affilyflow.com/api/mcp
```

Adressen er til en MCP-klient, der sender POST-forespørgsler. Åbner du den i en browser, får du 405 Method Not Allowed – det er forventet. Indsæt adressen som connector i din assistent.

Før du starter: du skal have en affiliate-konto, og du skal være tilmeldt de programmer, du vil lave links til. Assistenten kan ikke tilmelde dig.

## Forbind Claude

1. Åbn **Customize → Connectors** i Claude, og vælg **Add custom connector**.
2. Giv forbindelsen navnet Affilyflow, og indsæt MCP-adressen.
3. Vælg **Connect**. Log ind på din Affilyflow-konto, og godkend forbindelsen.
4. Aktiver Affilyflow under Connectors i samtalen. Bed assistenten vise dine tilmeldte programmer.

På en teamkonto kan en ejer først skulle tilføje forbindelsen til organisationen. Se Anthropics vejledning: [Get started with custom connectors](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp).

## Forbind ChatGPT

1. Åbn ChatGPT på web. Find **Developer mode** under Settings → Apps → Advanced Settings, hvis funktionen er tilgængelig for din konto.
2. Opret en custom app med navnet Affilyflow. Indsæt MCP-adressen, og vælg OAuth som godkendelse.
3. Log ind på Affilyflow, og godkend forbindelsen. På en arbejdskonto kan din administrator skulle give adgang først.
4. Vælg Affilyflow i samtalen. Bed ChatGPT vise de programmer, du er tilmeldt.

> [!NOTE]
> ChatGPT forbinder via Developer mode. Adgang og mulighed for at oprette links afhænger af abonnement, arbejdsområde og OpenAIs aktuelle funktioner. Se OpenAIs vejledning: [Developer mode and MCP apps in ChatGPT](https://help.openai.com/en/articles/12584461-developer-mode-and-mcp-apps-in-chatgpt).

## Forbind Claude Code

Kør kommandoen i din terminal:

```bash title="Terminal"
claude mcp add --transport http affilyflow https://app.affilyflow.com/api/mcp
```

Åbn derefter Claude Code, skriv `/mcp`, vælg Affilyflow, og gennemfør login i browseren. Du behøver ikke en API-nøgle. Fordi Claude Code kører på din egen computer, viser godkendelsessiden en advarsel – tillad kun, hvis du selv lige har startet forbindelsen.

## Forbind Cursor og andre MCP-klienter

Klienter, der ikke kan logge ind med OAuth, bruger en API-nøgle. Opret den under **AI og API** i dashboardet (se [REST-API](https://www.affilyflow.com/docs/affiliate/rest-api#kom-i-gang)), og sæt den ind i klientens konfiguration:

```json title="mcp.json"
{
  "mcpServers": {
    "affilyflow": {
      "url": "https://app.affilyflow.com/api/mcp",
      "headers": { "Authorization": "Bearer afk_DIN_NØGLE" }
    }
  }
}
```

## Login og adgang

Claude, ChatGPT og Claude Code forbinder med login i stedet for en nøgle (OAuth 2.1 med PKCE). Assistenten sender dig til Affilyflows egen login- og godkendelsesside. Den viser appens navn og den adresse, du sendes tilbage til, så du kan se, at det er den rigtige app. Assistenten får en adgang til MCP-serveren – den får aldrig din adgangskode.

| Assistenten kan | Assistenten kan ikke |
|---|---|
| Læse programmer, regler, produkter, dine links, sites, klik, salg, saldo og udbetalinger | Tilmelde dig programmer |
| Oprette, omdøbe og arkivere links | Slette links eller sites |
| Tilføje og rette dine sites | Se eller ændre bank-, CPR-, skatte- eller adresseoplysninger eller din profil |
| | Bede om udbetaling |

- En adgang gælder en time og fornyes automatisk. Fornyelsen gælder 60 dage og skiftes ved hver brug.
- Adgangen fra et login virker kun på MCP-serveren – ikke på REST-API'et.
- Under **AI og API** ser du dine forbundne apps og kan afbryde dem. API-nøgler tilbagekaldes samme sted. En afbrudt forbindelse virker ikke fra næste kald.

De data, du henter gennem assistenten, indgår hos den AI-tjeneste, du bruger. Vælg den konto og det arbejdsområde, du vil bruge til dine affiliateresultater.

## Værktøjerne

Serveren har 23 værktøjer. De læsende ændrer intet. De skrivende laver, retter eller arkiverer kun dine egne links og sites – intet værktøj sletter.

### Programmer og regler

| Værktøj | Gør |
|---|---|
| `search_programs` | Søger i alle åbne programmer – også dem, du ikke er tilmeldt – med provision, cookie, godkendelsesperiode, kanaler, regler, netværkets EPC og tilmeldingslink. |
| `list_programs` | De programmer, du er tilmeldt, med de gemte regler og butikkens retningslinjer. |
| `get_program` | Et program i dybden: beskrivelse, retningslinjer ordret, regler i dag og kommende stramninger med dato, rabatkoder, materialer med færdig banner-HTML, topprodukter, netværkstal og dine egne tal. |
| `check_compliance` | Tjekker en planlagt promovering mod programmets målbare regler: kanal, rabatkode- og cashbacksider, betalt søgning, landingsside og reklamemarkering. Svarer ok, advarsel eller ikke tilladt pr. regel. |

### Produkter og links

| Værktøj | Gør |
|---|---|
| `search_products` | Søger i butikkernes varer med pris, lager, anslået provision og – for tilmeldte programmer – et færdigt link til varen. |
| `create_link` | Opretter eller genbruger et link med landingsside, sub-ID, kampagne, kanal, UTM, navn, HTML-kode og QR-kode. Skrivende. |
| `create_links_batch` | Op til 50 links i et kald med et resultat pr. link. Skrivende. |
| `list_links` | Dine links, nyeste først, eventuelt med tal pr. link. |
| `get_link` | Et link med tal, de sider det virker på, programmets status og reglerne i dag. |
| `update_link` | Omdøber et link, skifter landingsside eller site-etiket. Skrivende. |
| `archive_link` | Skjuler et link fra listen – det virker stadig. Skrivende. |
| `restore_link` | Viser et arkiveret link igen. Skrivende. |

### Sites

| Værktøj | Gør |
|---|---|
| `get_sites` | Sites målt på klikkene med indtjening, side-sporingens dækning og forslag til sites, du kan tilføje (`suggest_add`). |
| `get_pages` | Siderne på dine sites med klik, salg, provision og udvikling. |
| `list_websites` | Dine registrerede sites. |
| `add_site` | Tilføjer et site. Tallene fra de klik, der allerede er kommet, følger med. Skrivende. |
| `update_site` | Retter domæne, navn, niche eller trafik – fx et domæne uden .dk. Skrivende. |

### Resultater

| Værktøj | Gør |
|---|---|
| `get_stats` | Klik, salg og provision for en periode – samlet eller pr. sub-ID, program, link, dag, site, side, kilde, enhed eller land, eventuelt sammenlignet med perioden før. |
| `list_sales` | Enkelte salg med status, afvisningsårsag, godkendelsesdato, refusioner og klikket. |
| `list_clicks` | Enkelte klik med side, kilde, enhed, land og de salg, klikket førte til. |

### Konto og udbetaling

| Værktøj | Gør |
|---|---|
| `get_account` | Din konto, kvote for nye links og genveje til dashboardet. |
| `get_balance` | Saldo, næste udbetalingsdag og hvad der mangler. Kun læsning. |
| `list_payouts` | Dine udbetalinger med afregningsbilag. Kun læsning. |

Parametre og svar er de samme som i [REST-API'et](https://www.affilyflow.com/docs/affiliate/rest-api). Hvert værktøj svarer med struktureret data og den samme JSON som tekst. `create_link` og `get_link` med `include_qr` sender QR-koden som et billede.

## Prompts

I Claude og Claude Code (og andre klienter, der understøtter prompts) findes fire færdige arbejdsgange:

| Prompt | Gør | Argumenter |
|---|---|---|
| `monthly_report` | Månedsrapport med hovedtal, bedste programmer og sider, afviste salg og næste udbetaling. | `month` (ÅÅÅÅ-MM, standard: sidste måned) |
| `find_programs_for_my_niche` | Finder de bedste åbne programmer til din niche og forklarer reglerne. | `niche`, `channel` |
| `optimize_links` | Gennemgår links, sider og side-sporing og foreslår forbedringer. | – |
| `build_product_links` | Finder varer og laver links til dem i et kald. | `query` (påkrævet), `store`, `sub_id`, `count` (standard 10, højst 50) |

ChatGPT bruger ikke prompts – værktøjerne virker uden.

## Hvad assistenten får at vide

Serveren giver assistenten en kort vejledning med: hvordan Affilyflow virker, en typisk arbejdsgang, at butikkens regler og retningslinjer skal følges, at en rabatkode ikke giver provision alene, at reklame skal markeres efter markedsføringsloven, at beløb er i kroner uden moms, og at datoer er i dansk tid. Assistenten afgør selv, hvordan den bruger det – tjek vigtige tal i dashboardet.

## Prøv det

- "Find de 10 sofaer, jeg tjener mest på hos Nordlys Bolig, og lav links til dem med sub-ID artikel-sofaer-okt. Tjek programmets regler først, og giv mig HTML-koden til mit site."
- "Jeg vil lave en TikTok-video og køre Google Ads på generiske søgeord for et af mine programmer. Må jeg det? Vis butikkens retningslinjer, og sig hvis reglerne ændrer sig snart."
- "Lav en rapport for sidste måned sammenlignet med måneden før: bedste programmer, sider og kilder, afviste salg med årsag og hvornår jeg får min næste udbetaling."
- "Tilføj de sites, der sender mig klik."

## Grænser

| Grænse | Værdi |
|---|---|
| Kald pr. minut | 120 pr. API-nøgle eller forbindelse |
| Skrivende kald pr. minut | 60 pr. API-nøgle eller forbindelse |
| Nye links | 500 pr. døgn pr. konto. Et genbrugt identisk link tæller ikke. |
| Links pr. batch | 50 |

## Fejl

Et værktøj, der fejler, svarer med en fejl og en kode, som assistenten kan reagere på, fx:

| Kode | Betyder |
|---|---|
| `not_joined` | Du er ikke tilmeldt programmet. Tilmeld dig i dashboardet, og prøv igen. |
| `channel_not_allowed` | Kanalen er ikke tilladt i programmet. |
| `landing_page_other_host` | Landingssiden ligger ikke på butikkens domæne. |
| `immutable_field` | Sub-ID, kampagne og kanal kan ikke ændres på et eksisterende link. Lav et nyt, eller brug `?sid=`. |
| `daily_link_limit` | 500 nye links det seneste døgn. |
| `invalid_domain`, `duplicate_domain` | Domænet er ugyldigt eller findes allerede på et af dine sites. |
| `rate_limited` | For mange kald. Vent lidt. |

Den fulde liste står under [REST-API → Fejlkoder](https://www.affilyflow.com/docs/affiliate/rest-api#fejlkoder).

Får du 401, er adgangen udløbet eller afbrudt: forbind assistenten igen, eller tjek at API-nøglen ikke er tilbagekaldt.

## Til dig, der bygger en klient

- **Transport:** Streamable HTTP uden sessioner. Hver POST er selvstændig, og der er ingen SSE-strøm på GET.
- **Protokol:** serveren taler både `2025-11-25`, `2025-06-18`, `2025-03-26` og `2024-11-05` (med `initialize`) og den statsløse `2026-07-28` (med `server/discover`, version og klientkapabiliteter i `params._meta` og headerne `MCP-Protocol-Version`, `Mcp-Method` og `Mcp-Name`).
- **Adgang:** `Authorization: Bearer afk_…` (API-nøgle) eller et OAuth-adgangstoken. Uden gyldig adgang svarer serveren 401 med `WWW-Authenticate: Bearer resource_metadata="…"`, som starter login i klienten.

OAuth-adresser (Affilyflow er selv autorisationsserver):

| Adresse | Formål |
|---|---|
| `/.well-known/oauth-protected-resource/api/mcp` | Ressourcens metadata (RFC 9728). |
| `/.well-known/oauth-authorization-server` | Autorisationsserverens metadata (RFC 8414). |
| `/oauth/authorize` | Login og godkendelse. |
| `/oauth/token` | Udveksling af kode og fornyelse (`authorization_code`, `refresh_token`). |
| `/oauth/register` | Dynamisk klientregistrering. |
| `/oauth/revoke` | Tilbagekald et token. |

PKCE med `S256` er påkrævet, scope er `affiliate` (plus `offline_access` for fornyelse), og tokenet bindes til ressourcen `https://app.affilyflow.com/api/mcp`. Klienter kan identificere sig med et Client ID Metadata Document (en URL som `client_id`) eller med dynamisk registrering. Redirect-adresser skal være https eller loopback.

```bash title="Kald et værktøj med en API-nøgle"
curl -X POST https://app.affilyflow.com/api/mcp \
  -H "Authorization: Bearer $AFFILYFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_stats","arguments":{"group_by":"program","compare":true}}}'
```

Kilde: https://www.affilyflow.com/docs/affiliate/mcp
