Hoppa till innehåll
AI & MLMCPAnthropic

MCP-revolutionen: Hur Model Context Protocol förändrar allt

Från isolerade LLM-anrop till ett universellt protokoll som kopplar AI till hela din infrastruktur - en djupdykning i MCP

Simon Axelsson

Simon Axelsson

IT-konsult & teknisk rådgivare

2026-04-0320 min15 320203

Model Context Protocol (MCP) är den största förändringen i hur vi bygger AI-applikationer sedan function calling introducerades. Det är ett öppet protokoll som standardiserar hur AI-modeller kommunicerar med externa system - databaser, API:er, filsystem, och allt däremellan. Den här artikeln är en djupdykning i hur MCP fungerar, hur du implementerar din egen server, och varför det förändrar spelets regler för alla som bygger med AI.

Vad är MCP?

Model Context Protocol är ett öppet protokoll utvecklat av Anthropic som definierar hur AI-modeller kan kommunicera med externa system på ett standardiserat sätt. Tänk på det som USB-C för AI: en universell kontakt som låter samma modell prata med vilken datakälla eller tjänst som helst, utan att behöva bygga unika integrationer för varje fall.

Före MCP var varje AI-integration en custom-byggd lösning. Om du ville att din AI-assistent skulle kunna läsa från din databas behövde du bygga en specifik integration. Om du ville att den skulle kunna skicka Slack-meddelanden behövde du bygga en till. Varje integration hade sitt eget format, sin egen autentisering och sina egna buggar. MCP löser det här genom att definiera ett gemensamt protokoll som alla kan implementera.

Protokollet baseras på JSON-RPC 2.0 och definierar tre huvudkoncept: Tools (funktioner som AI:n kan anropa), Resources (data som AI:n kan läsa), och Prompts (fördefinierade instruktioner). En MCP-server exponerar dessa capabilities, och en MCP-klient (t.ex. Claude Desktop eller Claude Code) konsumerar dem.

Tools

Funktioner som AI:n kan anropa. T.ex. 'kör en SQL-fråga', 'skapa en Jira-task', 'skicka ett Slack-meddelande'. Varje tool har ett definierat input-schema.

Resources

Data som AI:n kan läsa. T.ex. filer, databasinnehåll, API-svar. Resources är read-only och identifieras med URIs som 'file:///path' eller 'db://table'.

Prompts

Fördefinierade instruktioner och templates. Låt servern definiera specifika arbetsflöden som AI:n kan använda, t.ex. 'analysera den här koden' eller 'sammanfatta det här dokumentet'.

Det vackra med MCP är att det är modell-agnostiskt. Även om Anthropic skapade det, kan vilken AI-modell som helst implementera klientsidan. Och serversidan är helt oberoende av vilken modell som använder den. En MCP-server för din databas fungerar lika bra med Claude som med GPT eller Gemini.

Arkitektur

MCP:s arkitektur är medvetet enkel. Det finns två roller: klienten (AI-modellen eller applikationen som använder AI) och servern (den tjänst som exponerar tools, resources och prompts). Kommunikationen sker över antingen stdio (för lokala processer) eller Server-Sent Events (SSE) för nätverk.

MCP Arkitektur

  ┌─────────────────────────────────────────────────────────┐
  │                    MCP Host                              │
  │  (Claude Desktop, Claude Code, egna appar)              │
  │                                                         │
  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐    │
  │  │ MCP Client  │  │ MCP Client  │  │ MCP Client  │    │
  │  │ (BigQuery)  │  │ (Slack)     │  │ (GitHub)    │    │
  │  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘    │
  └─────────┼────────────────┼────────────────┼────────────┘
            │ stdio/SSE      │ stdio/SSE      │ stdio/SSE
            │ JSON-RPC       │ JSON-RPC       │ JSON-RPC
  ┌─────────┴──────┐ ┌──────┴───────┐ ┌──────┴──────┐
  │  MCP Server    │ │  MCP Server  │ │  MCP Server │
  │  (BigQuery)    │ │  (Slack)     │ │  (GitHub)   │
  │                │ │              │ │             │
  │  Tools:        │ │  Tools:      │ │  Tools:     │
  │  - run_query   │ │  - send_msg  │ │  - get_pr   │
  │  - get_schema  │ │  - read_ch   │ │  - review   │
  │                │ │              │ │             │
  │  Resources:    │ │  Resources:  │ │  Resources: │
  │  - tables      │ │  - channels  │ │  - repos    │
  └────────────────┘ └──────────────┘ └─────────────┘

Varje MCP-klient hanterar en enda serveranslutning. Om du vill koppla till både BigQuery och Slack skapar hosten två separata klienter. Det isolerar felhantering - om Slack-servern kraschar påverkas inte BigQuery-anslutningen.

Kommunikationsflödet är enkelt: klienten skickar en JSON-RPC request (t.ex. "anropa tool X med dessa parametrar"), servern bearbetar requesten och returnerar ett JSON-RPC response. För tools innebär det ofta att servern kör någon operation mot en extern tjänst och returnerar resultatet. För resources returneras data direkt.

Det som gör MCP kraftfullt är discovery-mekanismen. När en klient ansluter till en server ber den servern att lista alla tillgängliga tools, resources och prompts. Servern returnerar fullständiga JSON Schema-definitioner för varje capability, inklusive parameterbeskrivningar. AI-modellen använder sedan dessa schemas för att förstå vad den kan göra och hur den ska formatera sina anrop.

Implementera en MCP-server

Låt oss bygga en MCP-server från grunden. Vi skapar en server som ger AI:n tillgång till vårt BigQuery-dataset - specifikt möjligheten att lista tabeller, visa schema och köra read-only frågor. Det är exakt den typ av server vi använder i kundprojekt.

Vi använder TypeScript och det officiella MCP SDK:t från Anthropic. Först installerar vi beroendena:

Terminal
npm init -y
npm install @modelcontextprotocol/sdk @google-cloud/bigquery zod
npm install -D typescript @types/node tsx

Sedan bygger vi själva servern. Den har tre tools: list_tables, get_schema och run_query. Notera hur varje tool har ett fullständigt Zod-schema som definierar dess input:

src/bigquery-server.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { BigQuery } from "@google-cloud/bigquery";
import { z } from "zod";

const PROJECT_ID = process.env.GCP_PROJECT ?? "enterprise-data";
const ALLOWED_DATASETS = ["core", "staging", "analytics"];
const bq = new BigQuery({ projectId: PROJECT_ID });

const server = new McpServer({
  name: "bigquery-mcp",
  version: "1.0.0",
});

// Tool 1: Lista tabeller i ett dataset
server.tool(
  "list_tables",
  "Lista alla tabeller i ett BigQuery-dataset",
  {
    dataset: z.enum(["core", "staging", "analytics"])
      .describe("Datasetet att lista tabeller från"),
  },
  async ({ dataset }) => {
    const [tables] = await bq.dataset(dataset).getTables();
    const tableInfo = tables.map((t) => ({
      name: t.id,
      type: t.metadata.type,
      rows: t.metadata.numRows,
      size: t.metadata.numBytes,
      modified: t.metadata.lastModifiedTime,
    }));
    return {
      content: [
        {
          type: "text" as const,
          text: JSON.stringify(tableInfo, null, 2),
        },
      ],
    };
  }
);

// Tool 2: Visa schema för en tabell
server.tool(
  "get_schema",
  "Hämta schema för en BigQuery-tabell",
  {
    dataset: z.enum(["core", "staging", "analytics"]),
    table: z.string().describe("Tabellnamn"),
  },
  async ({ dataset, table }) => {
    const [metadata] = await bq.dataset(dataset).table(table).getMetadata();
    return {
      content: [
        {
          type: "text" as const,
          text: JSON.stringify(metadata.schema.fields, null, 2),
        },
      ],
    };
  }
);

// Tool 3: Kör en read-only SQL-fråga
server.tool(
  "run_query",
  "Kör en read-only SQL-fråga mot BigQuery (max 1000 rader)",
  {
    sql: z.string().describe("SQL-frågan att köra (måste vara SELECT)"),
    max_rows: z.number().optional().default(100)
      .describe("Max antal rader att returnera"),
  },
  async ({ sql, max_rows }) => {
    // Säkerhetskontroll: bara SELECT
    const normalized = sql.trim().toUpperCase();
    if (!normalized.startsWith("SELECT")) {
      return {
        content: [{
          type: "text" as const,
          text: "Fel: Bara SELECT-frågor är tillåtna.",
        }],
        isError: true,
      };
    }

    const [rows] = await bq.query({
      query: sql,
      maximumBytesBilled: "1000000000", // 1 GB limit
      maxResults: Math.min(max_rows ?? 100, 1000),
    });

    return {
      content: [{
        type: "text" as const,
        text: JSON.stringify(rows, null, 2),
      }],
    };
  }
);

// Starta servern
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error("BigQuery MCP server running on stdio");
}

main().catch(console.error);

Servern är medvetet begränsad: den tillåter bara SELECT-frågor, har en 1 GB byte-limit för att förhindra dyra frågor, och begränsar resultaten till max 1000 rader. Det är kritiskt för en produktion - du vill inte att en AI-modell av misstag ska köra en full table scan på en petabyte-tabell.

För att koppla servern till Claude Code lägger vi till den i konfigurationsfilen:

~/.claude/settings.json
{
  "mcpServers": {
    "bigquery": {
      "command": "npx",
      "args": ["tsx", "/path/to/bigquery-server.ts"],
      "env": {
        "GCP_PROJECT": "enterprise-data",
        "GOOGLE_APPLICATION_CREDENTIALS": "/path/to/sa-key.json"
      }
    }
  }
}

När Claude Code startar ser den automatiskt alla tools från bigquery-servern. Du kan nu säga till Claude "lista alla tabeller i core-datasetet" eller "visa mig de 10 största företagen i core.companies" och den använder MCP-tools för att hämta svaren direkt från BigQuery.

Claude + MCP i praktiken

Vi kör för närvarande 8 MCP-servrar i vår Claude Code-setup i produktion. Varje server ger Claude tillgång till en specifik del av vår infrastruktur. Här är en översikt:

BigQuery MCP

Fråga data, lista tabeller, visa schemas

3 tools
active

Slack MCP

Läsa/skicka meddelanden, söka kanaler

5 tools
active

GitHub MCP

PR-reviews, issues, kodsökning

7 tools
active

Vercel MCP

Deployment-status, loggar, miljövariabler

4 tools
active

Perplexity MCP

Webbsökning, research, faktakontroll

4 tools
active

Supabase MCP

Databasoperationer, migrationer, edge functions

6 tools
active

ClickUp MCP

Projekthantering, tasks, tidsrapportering

8 tools
active

Notion MCP

Dokumentation, wikis, databaser

5 tools
active

Det som gör kombinationen Claude + MCP så kraftfull är att Claude kan kedja tools från olika servrar i samma konversation. En typisk fråga som "finns det några BigQuery-tabeller som inte har uppdaterats på mer än 24 timmar? Om ja, skapa en Slack-alert i #data-pipeline" använder både BigQuery MCP och Slack MCP i sekvens.

Vi har också sett enorma produktivitetsvinster från MCP i kodgranskningar. Claude Code kan nu läsa hela PR-kontexten från GitHub, kontrollera om ändringarna bryter några BigQuery-schemas, och läsa relevant dokumentation från Notion - allt i en enda konversation utan att utvecklaren behöver byta verktyg.

“MCP är inte bara ett tekniskt protokoll - det är ett paradigmskifte. Istället för att AI:n går på information du klistrar in, går den på information den kan hämta själv. Det är skillnaden mellan att ge någon en karta och att ge någon GPS.”

- Simon Axelsson

En oväntad fördel är att MCP tvingar dig att bygga bra API:er. När du vet att en AI-modell ska använda dina tools börjar du tänka mer på tydliga beskrivningar, bra felmeddelanden, och meningsfulla returvärden. Det höjer kvaliteten på hela systemet.

Praktiska exempel

Låt oss gå igenom tre konkreta scenarion där MCP har förändrat hur vi jobbar. Varje exempel visar ett verkligt arbetsflöde från vår dagliga utveckling.

Exempel 1: Data Pipeline Debugging

Kl 07:30 på morgonen får vi en Slack-alert: "BigQuery table core.companies har 0 rader från nattens körning". Istället för att manuellt logga in i GCP Console, öppna BigQuery, köra diagnostik-frågor, kontrollera Cloud Function-loggar och sedan rapportera i Slack, gör vi så här:

# Konversation med Claude Code

> core.companies har 0 rader från inatt. Kan du kolla vad som hände?

# Claude använder BigQuery MCP: run_query för att undersöka

# Claude använder BigQuery MCP: get_schema för att kontrollera

# Claude läser Cloud Function-loggar via GCP MCP

> Problemet var att en publik datakälla ändrade sin HTML-struktur i går. Scraper-selectorn för org_number matchar inte längre. Jag har fixat selectorn och kör en test-scrape nu.

# Claude använder Slack MCP: send_msg för att rapportera i #data-pipeline

Exempel 2: Ny MCP-server på 30 minuter

Vi behövde ge Claude tillgång till kundens telefonsystem för att kunna analysera samtalsdata. Istället för att skriva MCP-servern manuellt bad vi Claude Code att göra det:

# Prompt till Claude Code

> Bygg en MCP-server för Stripe REST API. Den ska ha tools för: lista betalningar, hämta betalningsdetaljer, sök kunder. Använd samma mönster som den officiella GitHub MCP-servern.

# Claude läser GitHub MCP-servern som referens

# Claude skapar stripe-server.ts med 3 tools

# Claude uppdaterar settings.json med den nya servern

Från idé till fungerande MCP-server: 30 minuter. Inklusive testning. Det är kraften i att ha ett standardiserat protokoll - du behöver inte uppfinna hjulet varje gång.

Exempel 3: Cross-system analys

Varje måndag genererar vi en rapport som kopplar ihop data från flera system: försäljningssiffror från BigQuery, tasks från ClickUp, och feedback från Slack. Före MCP tog rapporten 2 timmar att kompilera manuellt. Nu:

> Generera veckorapporten för vecka 14. Inkludera: försäljningssiffror från BQ, öppna tasks från ClickUp, och sammanfattning av #sales-feedback från Slack.

# Claude anropar BigQuery MCP, ClickUp MCP, Slack MCP

# Genererar formaterad rapport på 5 minuter istället för 2 timmar

Alla tre exemplen visar samma mönster: MCP eliminerar kontextbyte. Istället för att hoppa mellan 5 olika verktyg och manuellt klistra in data mellan dem, stannar du i en enda konversation där AI:n har tillgång till allt den behöver. Det är inte bara snabbare - det är fundamentalt annorlunda.

Framtiden för MCP

MCP är fortfarande ungt, men adoptionen accelererar snabbt. Tusentals MCP-servrar finns redan tillgängliga på registret mcp.run, från stora databaser som PostgreSQL och MongoDB till nischade tjänster som Jira och Figma. Ekosystemet växer exponentiellt.

Det finns några trender som vi tror kommer att forma MCP:s framtid. För det första kommer remote MCP-servrar (över SSE/HTTP) att bli standard istället för lokala stdio-servrar. Det öppnar för hosted MCP-tjänster där du kopplar upp din AI mot en molnbaserad server utan att behöva installera något lokalt.

För det andra kommer säkerhet att bli allt viktigare. I dag har MCP-servrar samma tillgång som användaren som kör dem. Vi förutser att det kommer att utvecklas mer granulära behörighetsmodeller, där AI:n får specifika tillstånd för varje tool-anrop, liknande hur mobilappar frågar om tillgång till kamera och mikrofon.

För det tredje tror vi att MCP kommer att bli det dominerande sättet att bygga AI-agenter. Istället för att bygga monolitiska agenter som har all logik inbyggd, kommer agenter att vara tunna klienter som orkestrerar MCP-tools från olika servrar. Det gör agenter enklare att bygga, testa och underhålla.

2026 Q2

Remote MCP-servrar (SSE) blir mainstream, hosted MCP-as-a-service lanseras

2026 Q3

OAuth 2.0-baserad autentisering för MCP standardiseras

2026 Q4

Alla stora AI-modeller (GPT, Gemini, Llama) stödjer MCP nativt

2027

MCP-ekosystemet överstiger 100 000 publika servrar

Om du inte har börjat använda MCP än är nu rätt tid att börja. Börja med att lägga till en eller två MCP-servrar till din Claude-setup - BigQuery och Slack är bra startpunkter. När du vant dig vid arbetsflödet kommer du att undra hur du klarade dig utan det.

MCPModel Context ProtocolAnthropicClaudeAITypeScriptJSON-RPCIntegration
Simon Axelsson

Simon Axelsson

IT-konsult & teknisk rådgivare

Simon Axelsson är senior IT-konsult och grundare av SIAX Technology AB i Stockholm. Han hjälper nordiska företag med molninfrastruktur, dataplattformar och AI-automation. Han kör 8+ MCP-servrar dagligen och bygger integrationer som kopplar ihop AI med allt från BigQuery till Slack.