MCP-server
Forbind Julekalender med Claude, Cursor eller en anden MCP-klient, og lad din assistent bygge kalenderen: planlæg lågerne sammen med den, udfyld dem i ét hug, og få senere at vide, hvilken låge der blev åbnet mest.
Sidst opdateret: 2026-09-29
Få en API-nøgle
Adgang til API og MCP er inkluderet i Premium (1.499 kr om året) og Enterprise (9.999 kr om året). Skriv til [email protected] med din kontos e-mailadresse, så sender vi dig en testnøgle og en live-nøgle.
Overblik
Model Context Protocol (MCP) er en åben standard, der lader AI-assistenter bruge eksterne værktøjer. Vores MCP-server tilbyder funktionerne fra REST API'et som værktøjer, assistenten selv kan kalde.
I praksis ser det sådan ud: du siger til din assistent "lav en julekalender til vores nyhedsbrev, en rabat bag hver låge, lågerne åbner kl. 8", svarer på to eller tre spørgsmål, og få minutter senere har du et offentligt link.
- Planlæg en kalender i samtale, og opret den med de rigtige datoer, tidszone og design.
- Udfyld alle låger ud fra en liste, et regneark eller et produktfeed, du indsætter.
- Ret enkelte låger senere ("udskift låge 12 med det nye gavekort").
- Bed om tal ("hvilke låger blev åbnet mindst?").
Adgang
MCP-serveren bruger de samme nøgler som API'et og er inkluderet i Premium (1.499 kr om året) og Enterprise (9.999 kr om året) uden ekstra omkostninger. Nøgler udstedes i hånden. Skriv til [email protected].
Assistenten har præcis de funktioner, din plan har. Den kan ikke opgradere planen, betale eller ændre fakturering. Hvis du beder om noget, din plan ikke omfatter, fortæller den dig, hvilken plan du skal bruge, og hvor du kan skifte.
Serveradresse
Serveren taler MCP over Streamable HTTP på https://mcp.julekalenderskaber.dk/mcp. Autentificering sker med API-nøglen som bearer-token.
curl https://mcp.julekalenderskaber.dk/health
# {"status":"ok","protocol":["2025-06-18","2025-03-26"]}
Sæt din klient op
Claude Code
claude mcp add --transport http advent-calendar \
https://mcp.julekalenderskaber.dk/mcp \
--header "Authorization: Bearer $ACM_API_KEY"
Claude Desktop
Claude Desktop forbinder eksterne servere via mcp-remote. Tilføj dette i claude_desktop_config.json, og genstart appen.
{
"mcpServers": {
"advent-calendar": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"https://mcp.julekalenderskaber.dk/mcp",
"--header", "Authorization: Bearer ${ACM_API_KEY}"
],
"env": { "ACM_API_KEY": "sk_live_..." }
}
}
}
Cursor og andre klienter
Klienter, der understøtter eksterne servere direkte, behøver kun URL'en og headeren.
{
"mcpServers": {
"advent-calendar": {
"url": "https://mcp.julekalenderskaber.dk/mcp",
"headers": { "Authorization": "Bearer ${env:ACM_API_KEY}" }
}
}
}
Brug en sk_test_-nøgle, mens du prøver dig frem. Testkalendere ser ægte ud, har et testbanner og forsvinder efter 30 dage.
Værktøjer
| Værktøj | Scope | Hvad det gør |
|---|---|---|
| create_calendar | calendars:write | Opretter en kalender med titel, datointerval, åbningstidspunkt, tidszone og design. |
| list_calendars | calendars:read | Lister dine kalendere, eventuelt kun dem, der kører på en given dag. |
| get_calendar | calendars:read | Indstillinger, offentligt link og alle låger i én kalender. |
| update_calendar | calendars:write | Ændrer indstillinger som datoer, åbningstidspunkt, design eller animation. |
| set_door | calendars:write | Skriver indholdet af én låge. |
| fill_doors | calendars:write | Skriver op til 50 låger i ét kald. Som standard overskriver den ikke låger, der allerede har indhold. |
| add_media_from_url | calendars:write | Henter et billede eller en video fra en offentlig URL og returnerer et media-id til en låge. |
| get_stats | stats:read | Visninger og åbninger pr. låge. |
| list_options | calendars:read | Skabelonstile, baggrundsdesigns, tags, indholdstyper og det, den aktuelle plan tillader. |
Der er med vilje intet værktøj til at slette en kalender. Sletning forbliver en beslutning, du træffer i editoren eller via API'et.
Værktøjsdefinitioner
Hvert værktøj kommer med et JSON Schema for sit input og en beskrivelse skrevet til modellen. Beskrivelserne indeholder de regler, assistenten skal følge, for eksempel at den ikke må opfinde rabatkoder.
{
"name": "fill_doors",
"description": "Writes content into several doors of a calendar at once. Only use content the user gave or approved. Never invent coupon codes, prices or links.",
"inputSchema": {
"type": "object",
"required": ["calendar_id", "doors"],
"properties": {
"calendar_id": { "type": "string" },
"doors": {
"type": "array",
"maxItems": 50,
"items": {
"type": "object",
"required": ["day", "content_type"],
"properties": {
"day": { "type": "integer", "minimum": 1, "maximum": 50 },
"content_type": { "type": "string", "enum": ["text", "embed", "link", "image", "video", "coupon", "quiz", "product", "event", "giveaway", "download", "survey", "music"] },
"title": { "type": "string", "maxLength": 255 },
"text": { "type": "string" },
"url": { "type": "string", "format": "uri" },
"coupon_code": { "type": "string", "maxLength": 64 },
"data": { "type": "object", "description": "Type specific fields: options, answer, price, date, time, location, prize, deadline, button, artist" },
"media_id": { "type": "string" }
}
}
},
"overwrite": { "type": "boolean", "default": false }
}
},
"annotations": { "readOnlyHint": false, "idempotentHint": true }
}
Værktøjsresultater
Resultater indeholder en kort tekst, assistenten kan give videre, et link til den berørte ressource og structuredContent med de præcise tal, så assistenten ikke skal gætte ud fra løbende tekst.
{
"content": [
{
"type": "text",
"text": "Saved 24 doors in \"Northwind Coffee Advent Calendar\". Door 1 opens on 1 December 2026 at 08:00 (Europe/Berlin). Public link: https://julekalenderskaber.dk/c/k7x2mq9t/"
},
{ "type": "resource_link", "uri": "calendar://cal_4Hq8nW2kLp", "name": "Calendar", "mimeType": "application/json" }
],
"structuredContent": {
"calendar_id": "cal_4Hq8nW2kLp",
"doors_written": 24,
"doors_skipped": 0,
"doors_filled": 24,
"door_count": 24
},
"isError": false
}
Ressourcer
Ud over værktøjer tilbyder serveren ressourcer, som en klient kan indlæse i samtalen som kontekst, for eksempel for at tale om en eksisterende kalender, før den ændres.
calendar://{id} calendar settings and public link
calendar://{id}/doors all doors with unlock times and content
calendar://{id}/doors/{day} a single door
stats://{id} views, door opens, clicks, entries
backgrounds://catalog background designs, styles and tags
Prompts
Serveren leverer færdige prompts, som klienter viser som kommandoer. De fører assistenten gennem de rigtige spørgsmål, før den opretter noget.
plan_marketing_calendar: kundekalender med ét tilbud pr. låge, til butikker og brands.plan_team_calendar: kalender til kolleger med hilsner, quizspørgsmål og små overraskelser.plan_family_calendar: personlig kalender med beskeder, fotos og videoer til en, du holder af.review_calendar: gennemgår en eksisterende kalender for tomme låger, ødelagte links og låger, der åbner i en weekend, hvor kontoret er lukket.
{
"name": "plan_marketing_calendar",
"description": "Plans a customer advent calendar with one offer per door and fills it after approval.",
"arguments": [
{ "name": "brand", "required": true },
{ "name": "door_count", "description": "usually 24", "required": false },
{ "name": "offers", "description": "list of offers or products to feature", "required": false }
]
}
Eksempel på en samtale
Et kafferisteri bygger en nyhedsbrevskalender sammen med Claude. Værktøjskald vises i kantede parenteser.
User: We are a small coffee roaster. I want an advent calendar for our
newsletter, 24 doors, a new discount every morning at 8.
Agent: [list_options] Sounds good. Which products should the doors feature,
and do you already have coupon codes in your shop system?
User: Filter coffee, espresso, the winter blend and our grinder. Codes are
ADVENT01 to ADVENT24, all 15 % off, door 24 is 30 %.
Agent: [create_calendar: 2026-12-01 to 2026-12-24, 08:00, Europe/Berlin,
template_style=cozy]
Here is my plan for the 24 doors: ... Shall I fill them like this?
User: Yes, but door 6 should be a video from our roastery instead.
Agent: [fill_doors: 23 coupon doors]
[set_door: day=6, content_type=embed, url=https://youtu.be/...]
Done. All 24 doors are filled, door 1 opens on 1 December at 08:00.
Link for the newsletter: https://julekalenderskaber.dk/c/k7x2mq9t/
Hvad assistenten ikke gør
- Den opfinder ikke rabatkoder, priser, links eller juridiske tekster. Mangler der indhold, spørger den dig.
- Den viser dig planen for alle låger, før den udfylder dem, og den overskriver ikke låger med indhold, medmindre du er enig.
- Den sletter ikke kalendere og ændrer ikke din plan eller dine betalingsoplysninger.
- Den sætter ikke en adgangskode eller sporingskode, medmindre du giver den en.
- Den ser aldrig data om dine besøgende, kun de samlede tal fra
get_stats.
Disse regler står i værktøjsbeskrivelserne og håndhæves også af serveren: fill_doors uden overwrite: true springer låger over, der allerede er udfyldt, og et sletteværktøj findes ikke.
Scopes
På forespørgsel udsteder vi en nøgle med færre rettigheder, for eksempel til en assistent, der kun skal rapportere tal.
| Scope | Tillader |
|---|---|
| calendars:read | list_calendars, get_calendar, list_options og ressourcerne. |
| calendars:write | Desuden create_calendar, update_calendar, set_door, fill_doors, add_media_from_url. |
| stats:read | get_stats og stats://. |
Værktøjer uden for nøglens scope vises slet ikke for klienten.
Fejl
Hvis et værktøjskald fejler, har resultatet isError: true og en tekst, der fortæller assistenten, hvad der gik galt, og hvad den kan gøre nu. På den måde kan den rette sig selv eller spørge dig i stedet for at give op.
{
"content": [
{
"type": "text",
"text": "Door 25 does not exist: this calendar runs from 2026-12-01 to 2026-12-24 and has 24 doors. Ask the user whether to extend end_date with update_calendar (up to 50 doors) or to drop door 25."
}
],
"isError": true
}
Plangrænser kommer tilbage på samme måde: teksten nævner den plan, der er nødvendig, og beder assistenten om at fortælle dig det.
Grænser
Værktøjskald tæller mod samme rate limit som API'et (120 forespørgsler pr. minut pr. nøgle). fill_doors tæller som ét kald. Medier fra add_media_from_url følger de samme størrelsesgrænser: billeder op til 2 MB, videoer op til 20 MB, lydfiler og downloads op til 10 MB.
Privatliv
MCP-serveren gemmer intet af din samtale. Den modtager kun værktøjskaldene og deres argumenter, ligesom en API-forespørgsel, og opbevarer forespørgselslogs i 30 dage til support.
Hvad din assistent gør med resultaterne, afhænger af dens udbyder. Er indholdet i lågerne fortroligt, så tjek dataindstillingerne i din AI-klient.
Support
Hvis din klient ikke kan forbinde, eller et værktøj opfører sig anderledes end beskrevet, så skriv til [email protected] med klientens navn, værktøjet og tidspunktet. Vi læser hver eneste henvendelse.
Få en API-nøgle
Adgang til API og MCP er inkluderet i Premium (1.499 kr om året) og Enterprise (9.999 kr om året). Skriv til [email protected] med din kontos e-mailadresse, så sender vi dig en testnøgle og en live-nøgle.