{"id":2423,"date":"2025-07-05T10:00:00","date_gmt":"2025-07-05T08:00:00","guid":{"rendered":"https:\/\/pletzenauer.com\/?p=2423"},"modified":"2026-08-05T17:25:30","modified_gmt":"2026-08-05T15:25:30","slug":"model-context-protocol-mcp-n8n","status":"publish","type":"post","link":"https:\/\/pletzenauer.com\/da\/2025\/07\/05\/model-context-protocol-mcp-n8n\/","title":{"rendered":"Model Context Protocol (MCP) forklaret forst\u00e5eligt \u2013 med n8n-eksempel"},"content":{"rendered":"<p>Bygger du AI-agenter, kender du problemet: for hver funktion i en tilkoblet tjeneste skal der defineres et eget v\u00e6rkt\u00f8j. S\u00f8ge, oprette, \u00e6ndre, slette en kalenderpost \u2013 det er hurtigt fire separate byggeklodser, og det bare for \u00e9n enkelt tjeneste. Med mange tilkoblinger vokser vedligeholdet tilsvarende. <strong>Model Context Protocol (MCP)<\/strong> forf\u00f8lger en anden tilgang: det standardiserer, hvordan en sprogmodel kommunikerer med en tjeneste \u2013 og reducerer antallet af n\u00f8dvendige byggeklodser drastisk. Dette indl\u00e6g sammenfatter konceptet og et konkret praksiseksempel med n8n.<\/p>\n<div style=\"background:#FFE6D6;border-left:4px solid #F26A21;padding:16px 20px;border-radius:6px;margin:24px 0;\">\n<strong>Det vigtigste kort fortalt<\/strong><\/p>\n<ul>\n<li>MCP standardiserer, hvordan en sprogmodel forst\u00e5r en tjenestes kontekst \u2013 alts\u00e5 hvad den kan, og hvordan man taler til den.<\/li>\n<li>I stedet for at koble hver enkelt funktion til separat r\u00e6kker en <em>MCP-server<\/em> (foran tjenesten) og en <em>MCP-klient<\/em> (i agenten).<\/li>\n<li>Agenten klarer sig med to trin: <em>liste<\/em> funktioner (List Tools) og <em>udf\u00f8re<\/em> funktioner (Execute Tool).<\/li>\n<li>I n8n kan det bygges efter med en milj\u00f8variabel, en community-node og to MCP-klientv\u00e6rkt\u00f8jer.<\/li>\n<li>MCP er en ung teknologi: der er kendte sikkerhedsbet\u00e6nkeligheder \u2013 i produktionsmilj\u00f8er er forsigtighed p\u00e5 sin plads.<\/li>\n<\/ul>\n<\/div>\n<figure style=\"margin:28px 0;\"><img decoding=\"async\" src=\"https:\/\/pletzenauer.com\/wp-content\/uploads\/2026\/06\/1488-1.png\" alt=\"Sammenligning i to spalter: til venstre den klassiske \u00e9t-v\u00e6rkt\u00f8j-pr-funktion-tilkobling med mange byggeklodser, til h\u00f8jre MCP med kun to trin, List Tools og Execute Tool.\" style=\"width:100%;height:auto;border-radius:8px;border:1px solid #E5E2DE;\"\/><figcaption style=\"font-size:0.9em;color:#6b6b6b;margin-top:8px;\">I stedet for at koble hver funktion til enkeltvis klarer agenten sig med to MCP-operationer.<\/figcaption><\/figure>\n<h2>Hvad MCP overhovedet l\u00f8ser<\/h2>\n<p>Grundid\u00e9en i Model Context Protocol ligger i navnet: en sprogmodel skal forst\u00e5 en applikations <strong>kontekst<\/strong>. Konkret betyder det: hvad kan denne applikation? Hvad er den til for? Og hvordan udf\u00f8rer jeg handlinger i den?<\/p>\n<p>Klassisk kobler man hvert v\u00e6rkt\u00f8j til enkeltvis, n\u00e5r man bygger agenter \u2013 hver funktion er en egen byggeklods. Ved Google Calendar f.eks.: et v\u00e6rkt\u00f8j til at s\u00f8ge poster, et til at opdatere, et til at slette, et til at oprette. Fire funktioner for \u00e9n tjeneste. Ved komplekse agenter med mange tilkoblede tjenester l\u00f8ber det hurtigt op i snesevis af byggeklodser.<\/p>\n<h2>Server, klient og det ensartede skema<\/h2>\n<p>MCP arbejder med to roller:<\/p>\n<ul>\n<li><strong>MCP-server:<\/strong> l\u00e6gger sig foran selve tjenesten (f.eks. Airbnb eller Google Calendar) og beskriver, hvordan man kan interagere med den.<\/li>\n<li><strong>MCP-klient:<\/strong> sidder i agenten og henter og kalder serverens funktioner.<\/li>\n<\/ul>\n<p>I den aktuelle implementering \u2013 f.eks. i n8n \u2013 r\u00e6kker to trin i stedet for mange enkeltv\u00e6rkt\u00f8jer:<\/p>\n<ol>\n<li><strong>List Tools (liste):<\/strong> agenten sp\u00f8rger serveren, hvilke funktioner der er tilg\u00e6ngelige.<\/li>\n<li><strong>Execute Tool (udf\u00f8re):<\/strong> agenten kalder en konkret funktion med de passende parametre.<\/li>\n<\/ol>\n<p>Afg\u00f8rende er det <strong>ensartede skema<\/strong>. Uanset hvilken tjeneste der ligger bag: svaret p\u00e5 en List Tools-foresp\u00f8rgsel er altid bygget op ens. Det indeholder pr. funktion navnet, en beskrivelse og et skema med de tilladte parametre. Indhold og parametre er forskellige fra tjeneste til tjeneste \u2013 strukturen forbliver konstant. Netop det er, hvad protokollen fastl\u00e6gger og standardiserer.<\/p>\n<h3>Et eksempel med Airbnb-v\u00e6rkt\u00f8jet<\/h3>\n<p>Sp\u00f8rger man agenten, hvilke muligheder Airbnb-v\u00e6rkt\u00f8jet giver, henter den selv funktionslisten via List Tools-v\u00e6rkt\u00f8jet. Tilbage kommer blandt andet:<\/p>\n<ul>\n<li><strong>Airbnb Search:<\/strong> s\u00f8gning efter udbud med filtre og paginering \u2013 f.eks. sted, check-in- og check-ud-dato, antal voksne, b\u00f8rn, sp\u00e6db\u00f8rn og k\u00e6ledyr samt prisinterval.<\/li>\n<li><strong>Airbnb Listing Details:<\/strong> detaljerede oplysninger om et bestemt udbud via dets listing-id.<\/li>\n<\/ul>\n<p>Agenten skulle ikke have noget foreskrevet her \u2013 den har selv skaffet sig de tilg\u00e6ngelige funktioner, deres beskrivelser og parameterskemaet. I skemaet ser man for eksempel et tekstfelt <code>location<\/code> (by, region osv.), datofelterne til check-in og check-ud, antallet af voksne samt minimums- og maksimumspris.<\/p>\n<p>Stiller man s\u00e5 en konkret foresp\u00f8rgsel \u2013 f.eks. en indkvartering i Bangkok til seks personer for maksimalt 50 euro pr. nat \u2013 k\u00f8rer agenten i to trin: den kalder f\u00f8rst List Tools (den har ikke husket noget, da der ikke er aktiv memory), afl\u00e6ser de n\u00f8dvendige parametre ud fra skemaet og udf\u00f8rer s\u00f8gningen via Execute Tool. Resultatet \u2013 f.eks. en indkvartering med tre senge til ca. 35 euro pr. nat \u2013 kommer tilbage, og det med kun to tilf\u00f8jede v\u00e6rkt\u00f8jer. Hvis Airbnb tilb\u00f8d flere funktioner, f.eks. til at administrere egne annoncer, kunne de afbildes via det samme skema uden at definere yderligere byggeklodser.<\/p>\n<h2>S\u00e5dan bygger du MCP efter i n8n<\/h2>\n<p>De f\u00f8lgende trin viser ops\u00e6tningen med Airbnb-eksemplet. Det egner sig godt til at pr\u00f8ve af, fordi der ikke kr\u00e6ves nogen API-n\u00f8gle.<\/p>\n<ol>\n<li><strong>S\u00e6t milj\u00f8variablen:<\/strong> s\u00e6t <code>N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE<\/code> til <code>true<\/code>. Det giver community-noder adgang til tools. Ved en Docker-installation (f.eks. p\u00e5 en Hetzner-server) skriver du det i afsnittet <code>environment<\/code> i <code>docker-compose<\/code>-filen og genstarter instansen.<\/li>\n<li><strong>Opret AI-agenten:<\/strong> opret en AI-agent og angiv en model (i videoen GPT-4.1 Mini).<\/li>\n<li><strong>Installer community-noden:<\/strong> under <em>Settings &rarr; Community Nodes<\/em> installerer du pakken <code>n8n-nodes-mcp<\/code> og bekr\u00e6fter advarslen om installation af ukontrolleret kode fra offentlige kilder.<\/li>\n<li><strong>Tilf\u00f8j MCP-klientv\u00e6rkt\u00f8jet:<\/strong> s\u00f8g efter \u201eMCP\u201c via plusset ved <em>Tools<\/em>. Bem\u00e6rk: m\u00e5 ikke forveksles med n8n&#8217;s eget <em>MCP Client Tool<\/em> \u2013 community-varianten kendes p\u00e5 kassesymbolet og er indtil videre mere omfattende.<\/li>\n<li><strong>Opret adgangsoplysninger:<\/strong> som forbindelsestype kan man v\u00e6lge Command Line, Server-Sent Events og HTTP Streamable. I eksemplet bliver det ved Command Line. De rigtige v\u00e6rdier st\u00e5r i den p\u00e5g\u00e6ldende MCP-servers repository i afsnittet om installation. For Airbnb: command <code>npx<\/code>, argumenter indtastet trin for trin \u2013 <code>-y<\/code>, pakken <code>@openbnb\/mcp-server-airbnb<\/code> og valgfrit <code>--ignore-robots-txt<\/code>.<\/li>\n<\/ol>\n<blockquote><p><strong>Bem\u00e6rkning om robots.txt:<\/strong> muligheden <code>--ignore-robots-txt<\/code> tilsides\u00e6tter et websites adgangsregler. Til en demo er det forsvarligt \u2013 i produktionsmilj\u00f8er b\u00f8r du respektere de p\u00e5g\u00e6ldende tjenesters robots.txt.<\/p><\/blockquote>\n<h3>S\u00e6t de to operationer op<\/h3>\n<p>Derefter skal du bruge to MCP-klientv\u00e6rkt\u00f8jer med forskellige operationer:<\/p>\n<ul>\n<li><strong>List Tools:<\/strong> kald v\u00e6rkt\u00f8jet f.eks. \u201eAirbnb List Tools\u201c og angiv som beskrivelse, at det bruges til at hente alle tilg\u00e6ngelige Airbnb-v\u00e6rkt\u00f8jer. Et testklik (Execute Step) b\u00f8r returnere den kendte funktionsliste med navn, beskrivelse og skema.<\/li>\n<li><strong>Execute Tool:<\/strong> et andet MCP-klientv\u00e6rkt\u00f8j med operationen Execute Tool. Beskrivelse: til at udf\u00f8re Airbnb-v\u00e6rkt\u00f8jer, som kan listes via List Tools-v\u00e6rkt\u00f8jet. V\u00e6rkt\u00f8jsnavnet giver du med som expression, s\u00e5 agenten selv bestemmer, hvilken funktion den kalder; v\u00e6rkt\u00f8jsparametrene lader du st\u00e5 frie, s\u00e5 den selv fastl\u00e6gger dem.<\/li>\n<\/ul>\n<p>Efter oprydning og gemning kan agenten testes \u2013 f.eks. igen med Bangkok-foresp\u00f8rgslen. Den henter funktionslisten, giver den tilbage til modellen, v\u00e6lger s\u00f8gningen og leverer passende indkvarteringer. Pr\u00e6cis den adf\u00e6rd fra konceptdelen, nu i dit eget workflow.<\/p>\n<h2>Ud over n8n \u2013 og et ord om sikkerhed<\/h2>\n<p>MCP begr\u00e6nser sig ikke til automatiseringsplatforme. Ogs\u00e5 desktop-programmer som Claude Desktop kan forbindes med MCP-servere. Dermed kan man i chatten uddelegere opgaver til lokalt installerede programmer \u2013 et meget citeret eksempel er styringen af 3D-softwaren Blender via MCP, hvor en person uden Blender-kendskab laver renderinger. MCP-serveren k\u00f8rer her lokalt, mens selve sprogmodellen fortsat k\u00f8rer via cloudtjenesten.<\/p>\n<p>Trods al begejstring g\u00e6lder: MCP er en ung udvikling. Der findes allerede <strong>sikkerhedsbet\u00e6nkeligheder<\/strong>, og der er fundet sikkerhedshuller. Netop i produktionsmilj\u00f8er skal teknologien nydes med forsigtighed \u2013 det betaler sig at f\u00f8lge den videre udvikling, f\u00f8r man bygger kritiske processer oven p\u00e5 den.<\/p>\n<h2>Konklusion<\/h2>\n<p>Model Context Protocol er en pragmatisk standardiseringstilgang: en sprogmodel l\u00e6rer selv via en MCP-server, hvad en tjeneste kan, og hvordan man taler til den \u2013 i stedet for at hver funktion skal defineres p\u00e5 forh\u00e5nd. For komplekse AI-agenter betyder det m\u00e6rkbart f\u00e6rre byggeklodser og mindre vedligehold; i n8n-eksemplet r\u00e6kker to trin: liste og udf\u00f8re. Tilgangen er overbevisende, men stadig ung. Pr\u00f8ver du den af, b\u00f8r du begynde med ukritiske tjenester og tage de \u00e5bne sikkerhedssp\u00f8rgsm\u00e5l alvorligt i produktionsmilj\u00f8er.<\/p>\n<p><strong>Kilde:<\/strong> <a href=\"https:\/\/www.youtube.com\/watch?v=ujHOD52ybyo\" target=\"_blank\" rel=\"noopener\">Model Context Protocol (MCP): Erkl\u00e4rung &amp; n8n Tutorial (Deutsch)<\/a> \u2013 YouTube-kanalen Philip Thomas, p\u00e5 tysk.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hvad er Model Context Protocol (MCP), og hvordan forenkler det AI-agenter? Koncept, praksiseksempel med n8n og Airbnb samt sikkerhedshensyn i overblik.<\/p>\n","protected":false},"author":0,"featured_media":1503,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2423","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-unkategorisiert"],"_links":{"self":[{"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/posts\/2423","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/comments?post=2423"}],"version-history":[{"count":1,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/posts\/2423\/revisions"}],"predecessor-version":[{"id":3091,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/posts\/2423\/revisions\/3091"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/media\/1503"}],"wp:attachment":[{"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/media?parent=2423"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/categories?post=2423"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/tags?post=2423"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}