# Beveiligingsoverzicht van de MCP-server

Hoe de Cortena MCP-server gebruikers authenticeert, tools afbakent en schrijfacties logt.

Aanvulling op de Cortena-vertrouwensdocumentatie voor IT- en informatiebeveiligingsbeoordelaars van klanten die beoordelen of ze de Cortena MCP-connector in een AI-assistent willen inschakelen, zoals Claude, ChatGPT, Dust, Cursor, Perplexity en vergelijkbare toepassingen.

**Installatie-instructies:** [MCP-server](https://help.cortena.ai/guides/advanced/mcp-server). De MCP-server is in **bèta**.

## 1. Wat het is

| | |
| --- | --- |
| **Eindpunt** | `https://app.cortena.ai/api/mcp` |
| **Protocol** | Model Context Protocol via HTTPS (Streamable HTTP, JSON-RPC) |
| **Authenticatie** | OAuth 2.0 (authorization code + PKCE voor connectors met meerdere gebruikers, client credentials voor clients met één gebruiker), of een legacy bearer-token uit de instellingen |
| **Hosting** | Dezelfde Cortena-applicatie-infrastructuur als `app.cortena.ai` (gehost in de EU, zie [Hosting in de EU](https://help.cortena.ai/compliance/eu-hosting)) |
| **Gegevensbereik** | De eigen Cortena-tenants en machtigingen van de verbonden gebruiker. Gegevens van andere klanten zijn niet toegankelijk |

Het is geen afzonderlijk product of gegevensopslag. Het is een beperktere interface naar dezelfde Cortena-API's en gegevens die de gebruiker al in de webapplicatie ziet, met een aanvullende connectorbeperking voor tenants, toegangsmodus en een optionele lijst met toegestane tools.

Token-eindpunt: `https://app.cortena.ai/api/mcp/oauth/token`. Clients worden beheerd via **Instellingen → MCP-toegang (bèta)** (`https://app.cortena.ai/?settings=mcp-access`).

### Dynamic Client Registration (DCR)

Cortena ondersteunt **OAuth 2.0 Dynamic Client Registration**. Assistenten die DCR ondersteunen, bijvoorbeeld **Claude** en Dust Automatic OAuth, hebben alleen de MCP-URL nodig:

**`https://app.cortena.ai/api/mcp`**

De assistent registreert zichzelf, verkrijgt automatisch een Client ID en Secret en voltooit het inloggen bij Cortena en de configuratie van de connector in de browser. Je hoeft OAuth-sleutels niet handmatig te plakken. Automatisch geregistreerde clients worden nog steeds weergegeven onder **Instellingen → MCP-toegang (bèta)** en kunnen daar op elk moment worden ingetrokken.

Voor Claude raden we de vermelde connector aan: **[Cortena FinOps in de Claude-directory](https://claude.ai/directory/cortena-finops)** (Verbinden → inloggen bij Cortena).

Handmatige OAuth-clients, met Client ID + Secret uit de instellingen, blijven beschikbaar voor assistenten die geen DCR gebruiken.

## 2. Wie verbinding kan maken

Alleen personen die al een Cortena-gebruikersaccount hebben. Op deze interface is geen openbare zelfregistratie beschikbaar.

Toegang vereist:

1. Een Cortena-gebruikersidentiteit, dezelfde login als voor de webapp.
2. De tenantmachtiging **MCP-toegang** voor elke tenant die de connector mag gebruiken. Deze machtiging wordt door een tenantbeheerder verleend via **Instellingen → Gebruikersmachtigingen**.
3. Een actieve MCP-client, aangemaakt in de instellingen of automatisch geregistreerd via DCR, waarvan de **toegestane tenants** die tenant bevatten.

De effectieve runtime-toegang is altijd:

```
connectorlimiet ∩ lidmaatschap van gebruikerstenant ∩ machtiging voor MCP-toegang ∩ Cortena-machtigingen per tool
```

Een verbinding kan slagen zonder overlap tussen tenants. In dat geval ziet de assistent geen tenantgebonden gegevens. `cortena_user_list_tenants` legt uit of je de machtigingen, de lijst met toegestane connectors of de verbinding opnieuw moet instellen.

Voor organisatieconnectors, bijvoorbeeld Claude, stelt een beheerder eenmalig de **organisatiegrens** in, bestaande uit toegangsmodus en toegestane tenants. Elke aanvullende gebruiker logt nog steeds in met het eigen Cortena-account en moet, als die gebruiker niet de eigenaar van de connector is, **MCP-connectortoegang toestaan** goedkeuren. De toegang wordt bepaald door de persoon, niet door de applicatie.

## 3. Omgaan met tokens

| Beveiligingsmaatregel | Implementatie |
| --- | --- |
| **Access token** | Bearer `cortena_mcp_at_…`, standaardlevensduur **14 dagen** |
| **Refresh token** | Uitgegeven voor verbindingen met een authorization code, standaardlevensduur **30 dagen**, wordt bij gebruik geroteerd |
| **MCP HTTP-sessie** | In-memory sessie-id, standaard **24 uur**; automatisch hersteld zolang het access token geldig blijft |
| **Transport** | Alleen HTTPS |
| **Intrekking** | **Instellingen → MCP-toegang → Intrekken** markeert de client als inactief. Het volgende verzoek mislukt bij de authenticatie |

Machtigingen liggen niet voor altijd vast bij het inloggen. Bij elke aanroep controleert Cortena opnieuw de referentie, de verbonden gebruiker, de toegestane tenants, de toegangsmodus en de lijst met toegestane tools. Het verwijderen van **MCP-toegang**, het verwijderen van lidmaatschap van een tenant of het intrekken van de client wordt bij het volgende verzoek van kracht.

## 4. Toegangsmodi: alleen lezen versus lezen + schrijven

Elke MCP-client heeft een **toegangsmodus** die bij het aanmaken of instellen van een organisatieconnector wordt bepaald:

| Toegangsmodus | Wat de assistent kan doen |
| --- | --- |
| **Alleen lezen** | Alleen tools voor weergeven en lezen. Schrijftools worden niet geregistreerd en kunnen niet worden aangeroepen. |
| **Lezen + schrijven** | Leestools plus acties voor workflows voor voorbereiden en toepassen, uploaden van inkoopfacturen en schrijven van supporttickets, nog steeds afhankelijk van Cortena-machtigingen. |

Met **Geavanceerd: tools en resources** kun je verder beperken welke tools en documentatieresources een client beschikbaar maakt. Als je geen aangepaste lijst opgeeft, zijn "alle tools die voor die toegangsmodus zijn toegestaan" beschikbaar.

### Leestools, voor beide modi tenzij aangepast beperkt

| Gebied | Voorbeelden |
| --- | --- |
| **Identiteit en tenants** | Effectieve tenants weergeven, machtigingen ophalen, tenantmetadata |
| **Facturen** | Lijsten en zoekopdrachten, één factuur ophalen, overzicht exporteren, filters weergeven, deep links |
| **Workflows** | Catalogus, nodetypen, workflowstatus per factuur |
| **Pulse** | Dashboardstatistieken, met dezelfde functie- en machtigingscontroles als in de webapp |
| **DATEV-proefbalans** | Status en gepagineerde rijen met saldi en totalen die al met Cortena zijn gesynchroniseerd |
| **Boekingen** | Dimensies, status, lijst, totalen, transactiedetails voor gesynchroniseerde ERP-historie, vereist **Boekingen bekijken** |
| **Support** | Supporttickets van tenants weergeven en ophalen, vereist **Supporttickets bekijken** |

### Schrijftools, alleen voor lezen + schrijven

Mutaties van facturen en workflows worden nooit in één stille stap uitgevoerd:

1. **Voorbereiden** (`cortena_invoice_approve`, `cortena_invoice_review`, `cortena_invoice_update_service_accrual` of `cortena_change_prepare`) retourneert een samenvatting in gewone taal, `humanSummary`, en een `confirmationToken`.
2. **Je bevestigt** dit expliciet in de chat.
3. **Toepassen** (`cortena_change_commit` met `userConfirmed: true`) voert de wijziging uit via dezelfde Cortena-API's als de webinterface.

Voorbereide wijzigingen verlopen na **15 minuten**. De momenteel ondersteunde voorbereidingsbewerkingen zijn goedkeuren, controle voltooien, afwijzen met reden en de From/To-datums van de serviceperiode van een regel bijwerken, wanneer de functie voor boekingsvoorstellen voor overlopende kosten is ingeschakeld en de gebruiker **Factuurregeldetails bewerken** heeft.

**Uitzonderingen voor schrijven**, zonder stap voor voorbereiden en toepassen omdat de gebruikersactie al expliciet is:

- **Inkoopfacturen uploaden** (`cortena_invoices_upload`): dezelfde verwerkingspipeline als bij handmatig uploaden in de interface. Vereist **Facturen toevoegen**.
- **Supportticketbewerkingen** voor aanmaken, beantwoorden, sluiten, heropenen en koppelen: vereisen de bijbehorende supportmachtigingen.

Een token met toegang voor lezen + schrijven werkt nog steeds niet zonder de onderliggende Cortena-machtiging. Een upload zonder **Facturen toevoegen** mislukt bijvoorbeeld.

## 5. Verbonden boekhoudsystemen, wat MCP wel en niet kan wijzigen

MCP communiceert met **Cortena**. Het opent geen live schrijfkanaal naar je boekhoudsysteem.

| Verbinding | Richting in Cortena | Via MCP |
| --- | --- | --- |
| **DATEV Datenservice Export Rechnungswesen** | **Alleen-lezen inkomende** synchronisatie naar Cortena, met boekjaren, rekeningschema, boekingshistorie, saldi en totalen / proefbalans | Assistenten kunnen de al gesynchroniseerde proefbalans en boekingshistorie in Cortena **lezen**. MCP kan geen DATEV-synchronisatie starten en kan via Datenservice Export geen gegevens naar DATEV uploaden of pushen. |
| **DATEV Buchungsdatenservice** (EXTF / documenten) | **Uitgaande** export van boekingsklare batches vanuit Cortena naar DATEV | **Niet beschikbaar als MCP-tool.** "Verzenden naar DATEV" blijft uitsluitend beschikbaar in de Cortena-webapplicatie en het bijbehorende auditlog. |
| **Twinfield / Exact Online** boekingshistorie | Gesynchroniseerd met Cortena voor rapportage | MCP kan gesynchroniseerde boekingen lezen als de gebruiker **Boekingen bekijken** heeft. MCP boekt niet naar deze systemen en exporteert er ook niet naartoe. |
| **Upload van inkoopfacturen** | Bestanden komen in Cortena terecht, S3 → extractie → factuurwerkruimte | Alleen toegestaan met lezen + schrijven + **Facturen toevoegen**. Dit stuurt geen facturen naar DATEV of een ander grootboek. |

**Kort samengevat voor DATEV Datenservice Export Rechnungswesen:** dit is een alleen-lezen API-verbinding van DATEV naar Cortena. Door een assistent te verbinden krijgt die assistent, of Cortena via MCP, geen mogelijkheid om via deze interface boekingen naar DATEV te schrijven, uploaden of pushen.

## 6. Toegangsmodel

De toegang weerspiegelt de bestaande Cortena-machtigingen van de gebruiker. Door een assistent te verbinden ontstaan geen nieuwe rechten voor facturen, workflows of boekhouding.

| Laag | Controles |
| --- | --- |
| **MCP-clientlimiet** | Toegestane tenants, `read_only` / `read_write`, optionele lijst met toegestane tools |
| **MCP-toegang** | Of de gebruiker MCP überhaupt op een tenant mag gebruiken |
| **App-machtigingen** | Dezelfde controles als in de webapp, zoals `Facturen toevoegen`, `Boekingen bekijken`, workflowgeschiktheid, supportmachtigingen en dergelijke |
| **Workflowgeschiktheid** | Goedkeuren en controleren alleen wanneer de gebruiker de huidige stap in de interface kan voltooien |

Toegang tussen klanten is niet mogelijk. Elke tenantgebonden aanroep wordt aan de serverzijde beperkt tot de bovenstaande doorsnede.

De effectieve controlepunten voor beheerders zijn: wie een Cortena-account heeft, wie **MCP-toegang** heeft, welke tenants en toegangsmodus elke connector toestaat en wanneer een client moet worden **ingetrokken**.

## 7. Waar de gegevens naartoe gaan nadat een assistent is verbonden

Dit betreft de relatie van de klant met de eigen AI-leverancier, niet die van Cortena. We raden aan dit expliciet te beoordelen:

Gegevens die uit Cortena worden opgehaald, worden overgedragen aan de verbonden assistent. De provider ontvangt deze gegevens op basis van de eigen overeenkomst en voorwaarden voor gegevensverwerking van de klant met die provider. Cortena is voor dat deel geen verwerkingsverantwoordelijke of verwerker en kan geen voorwaarden opleggen voor bewaartermijnen, opslag of training.

De beheerder van de klant bepaalt de activering in de organisatie-instellingen van de assistent en beslist welke gebruikers verbinding mogen maken. De eigen subverwerkers van Cortena zijn gedocumenteerd onder [Subverwerkers](https://help.cortena.ai/compliance/sub-processors).

## 8. Logging en offboarding

### Levenscyclus van referenties

Cortena registreert belangrijke MCP-toegangsgebeurtenissen die aan een individuele gebruiker zijn toe te schrijven, niet aan een gedeeld serviceaccount, waaronder:

- Referentie / client **aangemaakt**
- Gebruiker **verbonden**, via inloggen met authorization code
- Client **ingetrokken**, verbinding verbroken

Payloads bevatten de gebruikersidentiteit, referentie-id, OAuth-client-id, label, toegangsmodus en toegestane tenants.

### Elke schrijfactie

Schrijfacties verlopen via dezelfde bedrijfs-API's als de webapplicatie en verschijnen in het **Activiteit**-overzicht van de factuur ([Auditlog](https://help.cortena.ai/guides/invoices/audit-log)):

| Actie | Auditgedrag |
| --- | --- |
| Goedkeuren / controleren / afwijzen / serviceperiode, na toepassen | Activiteitsvermelding bij de factuur voor de echte gebruiker, met initiatorkanaal **mcp** en een verwijzing naar de MCP-referentie |
| Upload van inkoopfacturen | Dezelfde import- en verwerkingshistorie als bij handmatig uploaden. De oorsprong van de upload is standaard **mcp** |
| Bewerkingen van supporttickets | Dezelfde supporttickethistorie als in de webinterface |

Voorbereide maar niet toegepaste wijzigingen worden alleen opgeslagen als records waarvoor nog bevestiging nodig is, met een vervaltijd van 15 minuten. Ze wijzigen geen facturen voordat ze zijn toegepast.

Gebruikstellers per client, zoals laatste gebruik en het aantal aanroepen per tool, worden op de MCP-client opgeslagen voor operationele zichtbaarheid. Ze vervangen niet het Activiteitsoverzicht van de factuur.

### Offboarding

| Actie | Effect |
| --- | --- |
| De MCP-client intrekken via Instellingen | De client wordt inactief, tokens mislukken bij het volgende verzoek en vernieuwen voor die client mislukt |
| **MCP-toegang** verwijderen | De tenant valt buiten de in aanmerking komende set. Tenantgebonden tools retourneren `forbidden` |
| De gebruiker uit de tenant verwijderen | De lidmaatschapscontrole mislukt bij de volgende aanroep |
| Client ID / Secret roteren na een lek | Behandel dit als intrekken en opnieuw aanmaken |

## 9. Expliciete beperkingen, bèta

Het volgende is momenteel niet beschikbaar via de MCP-server voor gebruikers:

- Bankkoppelingen en tools voor banktransacties
- Treasury- en betalingsbatchuitvoering
- Triggers voor boekhouduitvoer, zoals DATEV Buchungsdatenservice, Exact, Twinfield en vergelijkbare acties voor "verzenden naar grootboek"
- De meeste bewerkingen van factuurvelden buiten workflowstappen en serviceperiode-datums
- Bulk toepassen van meerdere facturen
- Gebruikers- of tenantbeheer en het verbinden of verbreken van integraties
- Het starten van DATEV Datenservice Export-synchronisaties
- Elke push of upload naar DATEV via Datenservice Export Rechnungswesen

## 10. Contact

- Product- en beveiligingsvragen: [compliance@cortena.ai](mailto:compliance@cortena.ai)
- Dagelijkse ondersteuning: [support@cortena.ai](mailto:support@cortena.ai)

Voor stappen voor het instellen van de connector, zie [MCP-server](https://help.cortena.ai/guides/advanced/mcp-server).
