Gå til indhold

Forbind en AI-assistent (MCP)

MoneyLights har en indbygget MCP server, så en AI-assistent — Claude Desktop, Claude Code, en IDE-agent, alt der taler protokollen — kan arbejde med din organisations data på anmodning.

Det er den samme legitimationsoplysning som REST API: en MCP-forbindelse er en API-nøgle, med de samme scopes, de samme grænser og den samme tilbagekaldelsesknap. Der er ikke noget separat at administrere.

Endpointet er https://api.moneylights.app/mcp (Streamable HTTP). En typisk klientkonfiguration:

{
"mcpServers": {
"moneylights": {
"url": "https://api.moneylights.app/mcp",
"headers": { "X-API-Key": "ml_sk_..." }
}
}
}

Med Claude Code er det en kommando:

Terminal window
claude mcp add --transport http moneylights https://api.moneylights.app/mcp \
--header "X-API-Key: ml_sk_..."

Opret nøglen i Indstillinger → API-nøgler og giv den kun de scopes, som assistenten har brug for. Alt kræver nøglen, inklusive oplistning af værktøjerne.

Værktøjslisten beregnes ud fra dine nøgles scopes, ved hver anmodning. En nøgle uden en scope får aldrig engang at vide, at det tilsvarende værktøj eksisterer.

VærktøjScopeHvad det gør
get_cashflow_overviewcashflow:readMånedlig indkomst/udgift/netto, åbningsbalance, topkategorier
get_analytics_overviewanalytics:readAggregater efter kategori, klient, projekt og person
list_transactionstransactions:readTransaktioner, filtreret og pagineret, hver med de tilknyttede dokumenter
list_documentsdocuments:readDokumenter og deres udtrukne felter, hver med de tilknyttede bevægelser
get_document_filedocuments:readDen originale fil af ét dokument — den PDF eller billede, appen viser
get_pending_distributionprofitpulse:readVentende Sikkert at bruge distributioner
list_vendorsvendors:readLeverandører, med totalforbrug
list_clientsclients:readKlienter, med totalindtægter
list_projectsprojects:readProjekter, med totaler og mål
upload_documentdocuments:writeArkiverer en faktura eller kvittering i dine dokumenter

Begge oversigter beregnes på den samme base og siger det: hver respons bærer en basis — periode, valutaer, de dækkede konti (hver synlig, medmindre der anmodes om id), og hvordan overførsler mellem organisationens egne konti blev behandlet. Som standard er de ekskluderet fra indkomst og udgifter, bevægelse for bevægelse, præcis som appens Pengestrøm-visning viser dem; send includeInternalTransfers: true til et af de to værktøjer for den rå bankbevægelse, som basis så mærker som sådan og som ikke er sammenlignelig med standarden. Sammenlign tal på tværs af de to værktøjer kun når deres basis matcher. netCashResult er indkomst minus udgifter af bankbevægelser — et kontant resultat, ikke regnskabsoverskud.

Hvilket dokument hører til hvilken bevægelse

Sektion kaldt “Hvilket dokument hører til hvilken bevægelse”

Begge lister siger det, fra begge sider, på den måde appen viser det. Hver transaktion bærer linkedDocuments og hvert dokument bærer linkedTransactions; hver post navngiver den anden side og et link:

  • confirmed — dokumentet er matchet til bevægelsen, hvilket tæller som dokumenteret.
  • suggested — matcheren foreslår parringen; ingen har bekræftet den, og bevægelsen mangler stadig sit dokument. Posten bærer matcherens score.

En assistent kan derfor skelne mellem ingen faktura, en faktura, der venter på at blive bekræftet, og allerede arkiveret — men kan ikke ændre noget af det, fordi denne forbindelse ikke har noget værktøj til det.

En bevægelse kan bære flere bekræftede dokumenter. Et dokument linker til højst én bevægelse, så en faktura betalt i flere dele viser kun den bevægelse, det blev matchet til. Et dokument, der stadig er Processing, har ingen links endnu; None betyder ingen.

Scopes gælder stadig: den fjerne side af et link beskrives (leverandør og nummer, eller beskrivelse og beløb) kun til en nøgle, der også kan læse den ressource. Med én scope får du den anden sides id, typen af linket og scoren — nok til at vide, at en bevægelse er dokumenteret, ikke hvad fakturaen siger.

get_document_file tager et documentId fra list_documents og returnerer den gemte fil selv — den samme PDF eller billede, appen åbner — som en indlejret ressource med sin MIME-type (application/pdf, image/jpeg, …), ved siden af dokumentets id, filnavn og størrelse — filer op til 10MB, den samme grænse som en upload. Det er hvordan en assistent tjekker, om en forskel kommer fra fakturaen, fra hvad der blev udtrukket eller fra bevægelsen, det blev matchet til, uden at eksportere noget. Det er en læsning: intet på dokumentet, dets udtrukne felter eller dets links ændres. Et dokument, der ikke tilhører dig, findes simpelthen ikke.

upload_document er det eneste værktøj, der skriver, og det blev valgt til den rolle med vilje: det tilføjer kun. Assistenten sender filen (PDF eller billede, op til 10MB) på præcis én af to måder — dens bytes (contentBase64, med et fileName), eller en url, MoneyLights downloader den fra, såsom et forudsigneret link, en anden tjeneste har givet ud (fileName er så valgfrit: uden det, navngives filen fra selve downloadet, aldrig fra linket, som måske bærer sin hemmelighed) — og MoneyLights kører det gennem den samme pipeline som en upload i appen — gemt, dets felter udtrukket (leverandør, dato, nummer, beløb) og automatisk matchet mod dine banktransaktioner.

At sende den samme fil to gange duplikerer aldrig dine data: gen-uploaden bliver registreret som en markeret duplikat, der peger på den originale — uanset om den kom som bytes eller via URL. Alt, hvad assistenten arkiverer, er synligt — og kan slettes — i appen.

En url skal være https, bære ingen legitimationsoplysninger og pege på en offentligt tilgængelig vært; omdirigeringer følges kun et par gange og genkontrolleres ved hver hop, og downloadet skal være en PDF, PNG eller JPEG på højst 10MB, der ankommer inden for 30 sekunder. Afvisninger angiver, hvad der skal rettes uden at gentage linket, og den hemmelige del af et signeret link logges aldrig.

Hver anden skrivning (oprettelse af klienter, omklassificering af transaktioner, konfiguration af kuverter…) forbliver i appen med vilje: disse handlinger forudsætter en menneskelig bekræftelse.

Serveren tilbyder også færdiglavede startpunkter — en månedlig pengestrøms gennemgang, en leverandørudgiftsanalyse, en oprydning af manglende dokumenter — opført kun når din nøgle kan køre hvert værktøj, de har brug for. Brug dem som de er eller rediger frit.

  • Assistenten er begrænset af nøglen, genkontrolleret ved hver anmodning. Nedgrader eller fjern nøglens skaber, og assistenten indsnævrer eller stopper ved næste opkald.
  • Finansielle data indeholder tekst skrevet af fremmede — betalingsreferencer, e-mailede dokumenter. Værktøjsresultater leveres inden for en markeret grænse, der fortæller modellen at behandle dem som data, aldrig som instruktioner. Behandl det som en afbødning, ikke en garanti, og scope nøgler stramt.
  • For at frakoble en assistent, tilbagekald dens nøgle i Indstillinger → API-nøgler. Øjeblikkelig, altid tilgængelig.

Giv hver assistent sin egen nøgle — én pr. klient betyder, at du kan skære én uden at forstyrre resten.