Språkmodeller har tradisjonelt vært brukt til å gi en prompt og så få et svar i form av tekst, og etter hvert bilder og andre media. Men etter at språkmodellene har fått støtte for verktøykall, som jeg skrev om i mitt forrige blogginnlegg, så har det oppstått et vell av nye muligheter.
En viktig standard er MCP, Model Context Protocol. Den ble publisert av Anthropic i november 2024, og støttes etter hvert av de fleste KI-assistenter. Det finnes også andre lignende standarder, som A2A, Agent to Agent fra Google og ACP, Agent Communication Protocol fra IBM, men i øyeblikket ser det ut som om MCP har mest moment.
Fordelen med å bruke MCP, i stedet for å kode mot verktøykall-API-er direkte, er altså at man kan få gjenbruk av verktøykall på tvers av KI-assistenter. MCP-standarden har også støtte for flere nyttige funksjoner som vi skal komme inn på senere. Ved å pakke inn verktøykallet som en såkalt MCP-tjeneste (eng: MCP server), så kan man via konfigurasjon gjøre dette verktøyet tilgjengelig for alle dine KI-assistenter.
Jeg tenker å gå igjennom hvordan vi lager en enkel MCP-tjeneste fra scratch. Koden finner du på github.
¶Selve tjenesten
Si nå for eksempel at vi vil pakke inn styring av lyset hjemme som en MCP-tjeneste. Sånn at vi kan spørre Claude klienten eller Cursor om “hvilke lamper er på i stuen” og gi kommandoer som “kan du dimme opp lyset på kjøkkenet”. La oss anta at vi allerede har implementert to javascript-funksjoner, getLampStatus og dimUp ved hjelp av et hjemmeautomasjons-api:
import {getLamps, Lamp, setDimmer} from "../api/homeAutomationAPI"
// Call the home automation API to get the status of lamps in the specified room
function getLampStatus(room: string): Lamp[] {
return getLamps(room);
}
// Call the home automation API to dim up all dimmable lamps
function dimUp(room: string, increment: number): void {
getLamps(room)
.filter(lamp => lamp.type === "dimmer")
.forEach(lamp => {
setDimmer(room, lamp.name, Math.min(lamp.status + increment, 100));
});
}
Verktøyet vårt inneholder foreløpig disse to enkle funksjonene. Vi vil gjerne tilgjengeliggjøre de som en MCP-tjeneste, sånn at vi kan plugge disse inn i vår KI-assistent.
¶Klargjør MCP-tjeneste
For å forberede denne tjenesten til å kunne brukes fra en språkmodell, så må man gi en del meta-informasjon. Målet er jo at vi i språkmodellen skal kunne stille spørsmål om status til lampene, eller å dimme opp lyset i et rom, og så skal verktøykallet automatisk utføres.
- Initialiseringskode for å starte tjenesten som en MCP-tjeneste. Bl.a. list hvilke verktøy som er tilgjengelig og hvordan de kalles. Mange muligheter, vi kommer tilbake til dette senere.
- Innpakning som muliggjør at KI-assistenten din kan starte opp din MCP-server via kommandolinjen.
MCP initialiserings-kode
I enkleste form lister man her opp hvilke funksjoner verktøyet støtter, og hvordan disse kalles. Det finnes i dag MCP SDK-er for mange språk. Vi bruker MCP sin Typescript server sdk og lister opp våre to funksjoner getLamps og dimUp:
#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod"; // simplify JSON Schema generation and validation
import {dimUp, getLampStatus} from "./tool/homeAutomationTool"
const server = new McpServer({
name: "home-automation",
version: "1.0.0",
capabilities: {
tools: {listChanged: true}
}
});
server.registerTool("getLampStatus",
{
title: "Get Lamp Status",
description: "Get current status of all lamps in a room",
inputSchema: {
room: z.string().describe("Room name")
},
},
async ({ room }) => ({
content: [{type: "text", text: JSON.stringify(getLampStatus(room))}]
})
);
server.registerTool("dimUp",
{
title: "Dim up all lamps in a room",
description: "Dim up all dimmable lamps in a room by a specified increment",
inputSchema: {
room: z.string().describe("Room name"),
increment: z.number().int().min(1).max(100)
.describe("Increment value to dim up")
},
},
async ({ room, increment }) => {
dimUp(room, increment)
return {
content: [{type: "text", text: "ok"}]
}
}
);
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Home Automation MCP Server running on stdio");
Dette kan virke som mye kode bare for å definere limet mellom to enkle funksjoner og en språkmodell. Men om man finleser så ser man at det meste egentlig er nødvendig meta-informasjon for å gjøre språkmodellen i stand til å velge hvilke funksjoner den vil kalle og med hvilke parametre.
Innpakning for oppstart
Det er ingen krav til hvilke språk en MCP tjeneste skal lages i. Men det er en fordel om den kan startes fra kommandolinjen uten installasjon eller bygging. Mye brukt er npx (node), uvx (python) eller docker. Siden vi bruker typescript bruker vi npx for oppstart. Vi har også gjort et par enkle triks for å kunne kjøre den som en kommando uten å måtte installere noe. Vi kan da starte tjenesten med:
npx -y ~/prj/2025/mcp-home-automation
¶Oppstartskonfigurasjon
For å kunne aksessere tjenesten fra en KI-assistent, så må KI-assistenten sette den opp i sin konfigurasjon. Dette er en ganske standardisert konfigurasjon, som sier hvordan tjenesten starter. Merk at du ikke skal starte denne selv, det er KI-assistenten som gjør dette automatisk ved oppstart eller når du endrer konfigurasjon. Eks:
{
"mcpServers": {
"mcp-home-automation": {
"command": "npx",
"args": [
"-y",
"~/prj/2025/mcp-home-automation"
],
"env": {
"HOME_AUTOMATION_TOKEN":"<HOME_AUTOMATION_TOKEN HERE>"
}
}
}
}
Enkelte tjenester har også støtte for å startes remote. Her bør du se på dokumentasjonen for den enkelte tjeneste for hvordan den skal startes.
Merk også hvordan vi kan angi miljøvariabler. Dette kan være et fint sted å oppgi f.eks. API-nøkler.
¶Test av Home Automation MCP server
Etter å ha konfigurert Claude klienten som angitt over, så kan man for eksempel ha følgende dialog:

Eller, om du holder på å kode med Copilot Agent i VSCode:

… så kommer en oversikt over kodebasen, etterfulgt av:

Merk at både Claude og Copilot Agent spør deg om lov til å kjøre verktøyet. Claude popper opp en dialog:

Mens Copilot VS Code plugin spør inline:

¶Om implementasjoner av MCP i KI-assistenter
De fleste KI-assistenter har nå støtte for MCP.
Det er to unntak som må nevnes og det er ChatGPT og Google Gemini. Begge disse har annonsert en viss støtte til MCP standarden, men ser ut til å holde tilbake på implementasjonen i klient-verktøyene. ChatGPT klient-applikasjonen har en funksjon som heter Custom Connectors som bare er tilgjengelig for betalende Pro/Team/Enterprise/Edu-kunder, der man kan pakke inn MCP tjenester. Google Gemini CLI har full MCP-støtte, men web-klienten holder tilbake. De har en preview på noe som kalles Vertex AI Extensions, men det er ikke direkte MCP-kompatibelt.
¶Flere MCP funksjoner
MCP har støtte for mer enn verktøykall. I initialiseringsskoden kan man bl.a. spesifisere:
- Ressurser. Man kan definere tilgjengelige ressurser, dvs filer og innhold som KI-assistenten kan brukes til å utvide språkmodellens kontekst.
- Prompter. Man kan definere prompt-maler som som KI-assistent kan gi til språkmodellen.
- Eliciting input. En funksjon for å spørre brukeren direkte om mer input. Dette er en relativt ny funksjon som ennå ikke er implementert i mange KI-assistenter.
- Sampling. Et elendig navn, men ment for å kunne gjøre kall til språkmodellen inne fra et verktøykall. KI-assistenter har jo allerede autentisert seg mot en språkmodell, og har kanskje betalt for en viss mengde bruk. Da er det meningen at vi kan bruke denne i stedet for å koble seg til en ny språkmodell internt fra verktøykall. Eksempel på bruk er hvis man trenger et utdrag av noe tekst etc. etc. Dette er også en ganske ny funksjon som ikke har bred støtte enda.
- Dynamisk oppsett av verktøy. Om du vil starte med et sett med verktøy, men senere legge til eller fjerne noen basert på ekstern tilstand eller en brukers handlinger, så er det opplegg for dette.
- Streamable HTTP, en transportprotokoll for toveis kommunikasjon som bygger på den etablerte Server Sent Events (SSE) protokollen.
- Støtte for notifikasjoner, kansellering av pågående verktøykall, feilhåndtering, mm.
¶Testing og debugging
MCP har noe opplegg for testing og debugging gjennom MCP Inspector.
¶Eksisterende MCP tjenester
På mcpservers.org finnes en lang liste over tilgjengelige tjenester. Bare pass på å bruke tjenester som er laget av noen du stoler på! Husk at såkalt prompt injection representerer en stor sikkerhetsrisiko hvis uvedkommende får slippe til i din kjede av verktøykall.
¶Veien videre
MCP standarden bærer preg av å ha blitt tatt frem raskt. Men det den mangler av formalisme og stabilitet tar den igjen på vid utbredelse. Anthropic ser også ut til å satse mye på å videreutvikle standarden og pr. i dag er den det eneste alternativet for å lage verktøy som kan brukes på tvers av KI-assistenter.
Men ting går som kjent i høyt tempo i KI-verdenen om dagen, så hvem vet hva som annonseres neste uke.