Ein **MCP-Server** ist ein technisches Kernbauteil im Umfeld moderner KI-Systeme und steht für **Model Context Protocol Server**. Er dient dazu, **große Sprachmodelle (LLMs)** wie GPT strukturiert, sicher und reproduzierbar mit **externem Kontext, Daten und Funktionen** zu verbinden.

Im Kern ist ein MCP-Server eine **standardisierte Vermittlungsschicht** zwischen einem KI-Modell und der „realen Welt“ eines Unternehmens oder einer Anwendung.

---

## 1. Grundidee des MCP (Model Context Protocol)

Große Sprachmodelle sind von sich aus:

* zustandslos

* ohne direkten Datenbank- oder API-Zugriff

* nicht sicher mit internen Systemen verbunden

Das **MCP** definiert einen **einheitlichen, maschinenlesbaren Standard**, über den ein Modell:

* Daten abfragen

* Aktionen auslösen

* Werkzeuge verwenden

* Kontext erhalten

Ein **MCP-Server** implementiert diesen Standard.

---

## 2. Was macht ein MCP-Server konkret?

Ein MCP-Server stellt dem Modell kontrolliert zur Verfügung:

### a) Ressourcen (Resources)

Lesender Zugriff auf strukturierte oder unstrukturierte Daten, z. B.:

* Dateien

* Datenbankabfragen

* interne Dokumentation

* Tickets, CRM-Einträge, Logs

### b) Werkzeuge (Tools)

Ausführbare Funktionen, z. B.:

* API-Calls

* Berechnungen

* Suchabfragen

* Geschäftslogik (z. B. „Bestellung anlegen“)

### c) Kontext-Management

* Versionierung von Kontext

* Zugriffsbeschränkungen

* Mandantenfähigkeit

* Auditierbarkeit

### d) Sicherheits- und Kontrollschicht

* Authentifizierung & Autorisierung

* Rate-Limiting

* Eingabe- und Ausgabefilter

* Trennung von Prompt und Daten

---

## 3. Warum braucht man einen MCP-Server?

Ohne MCP:

* direkte Prompt-Injection-Risiken

* harte Kopplung an APIs

* keine saubere Rechteverwaltung

* schwer wartbar und nicht skalierbar

Mit MCP:

* **standardisierte Integration**

* **austauschbare Modelle**

* **zentrale Governance**

* **produktionsreife KI-Architektur**

Kurz:

> MCP macht aus einem Chatbot ein **Enterprise-fähiges KI-System**.

---

## 4. Für welche Art von Anwendungen ist ein MCP-Server relevant?

### Typische Anwendungsfälle

**1. Unternehmensinterne KI-Assistenten**

* Wissensassistent für Mitarbeiter

* Zugriff auf interne Dokumente, Richtlinien, Tickets

**2. Entwickler-Tools**

* Code-Analyse mit Projektkontext

* Zugriff auf Repositories, CI-Daten, Logs

**3. Fachanwendungen mit KI-Logik**

* Vertragsprüfung

* Risiko- und Compliance-Checks

* Angebots- und Berichtserstellung

**4. Agenten-basierte Systeme**

* Mehrschrittige Workflows

* Automatisierte Entscheidungen

* Tool-Ketten und Orchestrierung

**5. Regulatorisch sensible Systeme**

* Finanzwesen

* Gesundheitswesen

* Öffentliche Verwaltung

---

## 5. Für wen ist ein MCP-Server relevant?

### Direkt relevant für:

**Software-Architekten**

* saubere Trennung von Modell und Systemlogik

* Governance und Skalierbarkeit

**Backend- & Plattform-Entwickler**

* standardisierte Tool- und Datenanbindung

* Wiederverwendbarkeit

**Unternehmen / IT-Abteilungen**

* Kontrolle über Datenzugriff

* Modell-Austausch ohne Neuentwicklung

**KI-Produktteams**

* schnellere Iteration

* geringeres Sicherheitsrisiko

---

### Weniger relevant für:

* Endanwender

* einfache Ein-Prompt-Chatbots

* Proof-of-Concepts ohne Produktionsanspruch

---

## 6. Abgrenzung zu ähnlichen Konzepten

| Konzept | Unterschied |

| -------------------- | --------------------------------------------------- |

| **Plugins** | meist an ein Modell gebunden |

| **RAG** | nur Datenabruf, keine Aktionen |

| **Function Calling** | modellabhängig, kein Standard |

| **MCP** | modellneutraler, vollständiger Integrationsstandard |

---

## 7. Zusammenfassung

Ein **MCP-Server** ist:

* eine **Integrations- und Kontrollschicht**

* für **produktive, sichere KI-Systeme**

* mit Fokus auf **Standardisierung, Governance und Skalierbarkeit**

Er ist besonders relevant für Organisationen, die KI **nicht experimentell**, sondern **dauerhaft und kontrolliert** einsetzen wollen.



## 1. Konkrete Architektur-Skizze (MCP in der Praxis)

### Ziel

Ein KI-System, das:

* austauschbare LLMs nutzt

* kontrollierten Zugriff auf interne Systeme erlaubt

* revisionssicher und skalierbar ist

### Architektur (logische Sicht)

```

┌──────────────────────────┐

│ Frontend │

│ (Web, App, Chat UI) │

└─────────────┬────────────┘

              │ User Request

              ▼

┌──────────────────────────┐

│ Application Backend │

│ (Auth, Session, Roles) │

└─────────────┬────────────┘

              │

              ▼

┌──────────────────────────┐

│ MCP Server │

│ ────────────────────── │

│ • Context Provider │

│ • Resource Registry │

│ • Tool Registry │

│ • Policy Engine │

│ • Audit / Logging │

└─────────────┬────────────┘

              │ MCP Protocol

              ▼

┌──────────────────────────┐

│ LLM (austauschbar) │

│ GPT / Claude / Llama │

└──────────────────────────┘

              │

              ▼

┌──────────────────────────┐

│ Interne Systeme / APIs │

│ DB • CRM • ERP • Files │

└──────────────────────────┘

```

### Kernaussage

**Das Modell spricht niemals direkt mit internen Systemen.**

Der MCP-Server ist die **einzige kontrollierte Schnittstelle**.

---

## 2. Beispiel: MCP-Server in einer realen Anwendung

### Szenario

**Interner Vertragsassistent für ein Unternehmen**

#### Anforderungen

* Zugriff auf Vertragsdatenbank

* Berechnung von Risiken

* Erstellung von Zusammenfassungen

* Protokollierung aller Aktionen

---

### MCP-Server: Ressourcen & Tools

#### Ressourcen (read-only)

```json

{

  "resources": [

    {

      "name": "contracts",

      "type": "database",

      "description": "Vertragsdaten (Lesen)",

      "access": "role:legal"

    }

  ]

}

```

#### Tools (aktionen)

```json

{

  "tools": [

    {

      "name": "calculate_risk_score",

      "input_schema": {

        "contract_id": "string"

      },

      "description": "Berechnet Risikokennzahl"

    }

  ]

}

```

---

### Ablauf eines Requests

1. User fragt:

   > „Bewerte den Risiko-Level von Vertrag X“

2. MCP-Server:

   * prüft Benutzerrolle

   * stellt Vertragsdaten als Kontext bereit

   * erlaubt Tool-Call

3. Modell:

   * analysiert Text

   * ruft `calculate_risk_score`

4. MCP-Server:

   * führt Business-Logik aus

   * loggt Aktion

   * gibt Ergebnis zurück

5. Modell:

   * formuliert Antwort für User

---

### Warum MCP hier entscheidend ist

* Keine direkten DB-Credentials im Prompt

* Tool-Zugriff ist explizit freigegeben

* Audit-Trail für Compliance

* Modell kann gewechselt werden

---

## 3. Einordnung: MCP vs. OpenAI-Tools vs. LangChain vs. LlamaIndex

### Vergleichstabelle

| Kriterium | MCP | OpenAI Tools | LangChain | LlamaIndex |

| ---------------- | ----------- | -------------- | -------------- | ------------ |

| Standardisiert | **Ja** | Nein | Nein | Nein |

| Modellneutral | **Ja** | Nein | Teilweise | Teilweise |

| Governance | **Ja** | Nein | Nein | Nein |

| Tool-Security | **Zentral** | Prompt-basiert | Code-basiert | Code-basiert |

| Enterprise-ready | **Ja** | Begrenzt | Begrenzt | Begrenzt |

| Fokus | Integration | Modellfeatures | Orchestrierung | Retrieval |

---

### Einordnung nach Rolle

#### MCP

**Plattform- und Architekturstandard**

* vergleichbar mit REST oder OAuth

* langfristige Infrastruktur

#### OpenAI Tools / Function Calling

**Modell-Feature**

* gut für einfache Workflows

* nicht governance-fähig

#### LangChain

**Entwickler-Framework**

* schnelle Prototypen

* komplexe Chains

* schwer kontrollierbar im Betrieb

#### LlamaIndex

**RAG-Spezialist**

* Dokumentenabfragen

* kein Aktions- oder Policy-Layer

---

### Best Practice in der Realität

> **MCP ersetzt LangChain oder LlamaIndex nicht – es kapselt sie.**

Typische Kombination:

* MCP als Kontrollschicht

* LangChain intern für Logik

* LlamaIndex für Retrieval

* LLM beliebig austauschbar

---

## 4. Kurzfazit

Ein MCP-Server ist:

* kein Framework

* kein SDK

* kein Chatbot

Sondern:

> **die fehlende Infrastruktur-Schicht für produktive KI-Systeme**

---


Unter Einsatz von:

* **Node.js** für den MCP-Server (klar, weit verbreitet)

* **JSON-basierte Policies** (RBAC + ABAC)

* **ein Agenten-Beispiel**, das MCP korrekt nutzt

---

# 1. Konkrete MCP-Server-Implementierung (Node.js)

## Ziel

Ein MCP-Server, der:

* Ressourcen bereitstellt

* Tools ausführt

* Policies erzwingt

* modellneutral bleibt

---

## 1.1 Projektstruktur

```

mcp-server/

├── server.js

├── registry/

│ ├── resources.js

│ └── tools.js

├── policy/

│ └── policy-engine.js

├── services/

│ └── contracts.service.js

└── package.json

```

---

## 1.2 Minimaler MCP-Server (`server.js`)

```js

import express from "express";

import bodyParser from "body-parser";

import { resources } from "./registry/resources.js";

import { tools } from "./registry/tools.js";

import { checkPolicy } from "./policy/policy-engine.js";

const app = express();

app.use(bodyParser.json());

/**

 * MCP: Context Endpoint

 */

app.post("/mcp/context", async (req, res) => {

  const { user, resource } = req.body;

  if (!checkPolicy(user, resource, "read")) {

    return res.status(403).json({ error: "Access denied" });

  }

  const data = await resources[resource].get();

  res.json({ context: data });

});

/**

 * MCP: Tool Execution Endpoint

 */

app.post("/mcp/tool", async (req, res) => {

  const { user, tool, input } = req.body;

  if (!checkPolicy(user, tool, "execute")) {

    return res.status(403).json({ error: "Access denied" });

  }

  const result = await tools[tool].execute(input);

  res.json({ result });

});

app.listen(3000, () => {

  console.log("MCP Server running on port 3000");

});

```

---

## 1.3 Resource-Registry (`registry/resources.js`)

```js

export const resources = {

  contracts: {

    description: "Vertragsdaten (read-only)",

    async get() {

      return [

        { id: "C-1001", value: 50000, country: "DE" },

        { id: "C-1002", value: 200000, country: "US" }

      ];

    }

  }

};

```

---

## 1.4 Tool-Registry (`registry/tools.js`)

```js

import { calculateRisk } from "../services/contracts.service.js";

export const tools = {

  calculate_risk_score: {

    description: "Berechnet Risiko-Score",

    async execute({ contract }) {

      return calculateRisk(contract);

    }

  }

};

```

---

## 1.5 Business-Logik (`services/contracts.service.js`)

```js

export function calculateRisk(contract) {

  let score = 0;

  if (contract.value > 100000) score += 50;

  if (contract.country !== "DE") score += 30;

  return {

    contractId: contract.id,

    riskScore: score

  };

}

```

---

# 2. Policy-Definition (RBAC + ABAC)

## 2.1 Rollen (RBAC)

```json

{

  "roles": {

    "legal": ["contracts:read", "calculate_risk_score:execute"],

    "sales": ["contracts:read"],

    "guest": []

  }

}

```

---

## 2.2 Attributbasierte Regeln (ABAC)

```json

{

  "rules": [

    {

      "if": {

        "resource": "contracts",

        "action": "read",

        "user.department": "legal"

      },

      "allow": true

    },

    {

      "if": {

        "tool": "calculate_risk_score",

        "action": "execute",

        "user.seniority": "senior"

      },

      "allow": true

    }

  ]

}

```

---

## 2.3 Policy Engine (`policy/policy-engine.js`)

```js

const roles = {

  legal: ["contracts:read", "calculate_risk_score:execute"],

  sales: ["contracts:read"]

};

export function checkPolicy(user, target, action) {

  const permissions = roles[user.role] || [];

  return permissions.includes(`${target}:${action}`);

}

```

> In der Praxis würde hier zusätzlich:

>

> * ABAC ausgewertet

> * Mandanten-IDs geprüft

> * Logging erfolgen

---

# 3. Beispiel: Agenten mit MCP

## 3.1 Agenten-Konzept

Der Agent:

* analysiert eine Aufgabe

* entscheidet, welche Ressourcen benötigt werden

* ruft Tools über MCP auf

* bleibt zustandsarm

---

## 3.2 Agenten-Ablauf (logisch)

```

User → Agent → MCP(Context) → LLM

                  ↓

               MCP(Tool)

                  ↓

               Ergebnis → LLM → User

```

---

## 3.3 Agent (Pseudo-Code)

```js

async function riskAgent(user, question) {

  // 1. Kontext laden

  const context = await fetch("http://mcp:3000/mcp/context", {

    method: "POST",

    body: JSON.stringify({

      user,

      resource: "contracts"

    })

  }).then(r => r.json());

  // 2. Modell entscheidet, welches Tool nötig ist

  const contract = context.context.find(c => c.id === "C-1002");

  // 3. Tool-Aufruf

  const result = await fetch("http://mcp:3000/mcp/tool", {

    method: "POST",

    body: JSON.stringify({

      user,

      tool: "calculate_risk_score",

      input: { contract }

    })

  }).then(r => r.json());

  return `Risiko-Score für Vertrag ${contract.id}: ${result.result.riskScore}`;

}

```

---

## 3.4 Warum das ein „echter“ MCP-Agent ist

* Kein direkter DB-Zugriff

* Keine Credentials im Prompt

* Jede Aktion policy-gesichert

* Modell austauschbar

* Agent bleibt leichtgewichtig

---

# Gesamtfazit

Mit dieser Struktur erhältst du:

* **MCP als Infrastruktur-Layer**

* **klare Trennung von Modell, Logik und Daten**

* **Enterprise-taugliche Kontrolle**

* **Agenten ohne Sicherheitsrisiken**

---


Der Fokus liegt auf **klarer Trennung von Verantwortlichkeiten**, **Governance** und **Realbetrieb**.

---

# 1. Python-Variante eines MCP-Servers

## Technologie-Stack

* Python 3.11

* FastAPI (klar, schnell, OpenAPI-native)

* Pydantic

* explizite Policy-Prüfung

---

## 1.1 Projektstruktur

```

mcp_server/

├── main.py

├── registry/

│ ├── resources.py

│ └── tools.py

├── policy/

│ └── engine.py

├── services/

│ └── contracts.py

├── models.py

└── requirements.txt

```

---

## 1.2 `main.py` – MCP API

```python

from fastapi import FastAPI, HTTPException

from models import ContextRequest, ToolRequest

from registry.resources import RESOURCES

from registry.tools import TOOLS

from policy.engine import check_policy

app = FastAPI(title="MCP Server")

@app.post("/mcp/context")

def get_context(req: ContextRequest):

    if not check_policy(req.user, req.resource, "read"):

        raise HTTPException(status_code=403)

    resource = RESOURCES.get(req.resource)

    if not resource:

        raise HTTPException(status_code=404)

    return {"context": resource()}

@app.post("/mcp/tool")

def execute_tool(req: ToolRequest):

    if not check_policy(req.user, req.tool, "execute"):

        raise HTTPException(status_code=403)

    tool = TOOLS.get(req.tool)

    if not tool:

        raise HTTPException(status_code=404)

    return {"result": tool(req.input)}

```

---

## 1.3 Datenmodelle (`models.py`)

```python

from pydantic import BaseModel

from typing import Dict, Any

class User(BaseModel):

    id: str

    role: str

    department: str

class ContextRequest(BaseModel):

    user: User

    resource: str

class ToolRequest(BaseModel):

    user: User

    tool: str

    input: Dict[str, Any]

```

---

## 1.4 Resource-Registry

```python

# registry/resources.py

def contracts():

    return [

        {"id": "C-1", "value": 150000, "country": "US"},

        {"id": "C-2", "value": 20000, "country": "DE"}

    ]

RESOURCES = {

    "contracts": contracts

}

```

---

## 1.5 Tool-Registry

```python

# registry/tools.py

from services.contracts import calculate_risk

TOOLS = {

    "calculate_risk_score": calculate_risk

}

```

---

## 1.6 Policy Engine (RBAC + ABAC)

```python

# policy/engine.py

ROLE_PERMISSIONS = {

    "legal": ["contracts:read", "calculate_risk_score:execute"],

    "sales": ["contracts:read"]

}

def check_policy(user, target, action):

    perms = ROLE_PERMISSIONS.get(user.role, [])

    return f"{target}:{action}" in perms

```

---

# 2. OpenAPI- / MCP-Schema-Definition

## 2.1 MCP als Protokoll (logisch)

**MCP ist kein REST-Ersatz**, sondern ein **LLM-Integrationsprotokoll**.

OpenAPI beschreibt die **Transportform**.

---

## 2.2 OpenAPI-Auszug (YAML)

```yaml

openapi: 3.1.0

info:

  title: MCP Server

  version: 1.0.0

paths:

  /mcp/context:

    post:

      summary: Retrieve context for model

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: "#/components/schemas/ContextRequest"

      responses:

        "200":

          description: Context payload

  /mcp/tool:

    post:

      summary: Execute MCP tool

      requestBody:

        required: true

        content:

          application/json:

            schema:

              $ref: "#/components/schemas/ToolRequest"

      responses:

        "200":

          description: Tool result

components:

  schemas:

    User:

      type: object

      properties:

        id:

          type: string

        role:

          type: string

        department:

          type: string

    ContextRequest:

      type: object

      properties:

        user:

          $ref: "#/components/schemas/User"

        resource:

          type: string

    ToolRequest:

      type: object

      properties:

        user:

          $ref: "#/components/schemas/User"

        tool:

          type: string

        input:

          type: object

```

---

## 2.3 MCP-spezifische Erweiterungen (konzeptionell)

```json

{

  "mcp": {

    "resources": ["contracts"],

    "tools": ["calculate_risk_score"],

    "policies": ["rbac", "abac"],

    "auditing": true

  }

}

```

---

# 3. Multi-Agent-Orchestrierung mit MCP

## 3.1 Agentenrollen

| Agent | Aufgabe |

| ------------- | ------------------- |

| **Planner** | Zerlegt Aufgabe |

| **Retriever** | Holt Kontext |

| **Executor** | Führt Tools aus |

| **Writer** | Antwort formulieren |

---

## 3.2 Orchestrierung

```

User

 ↓

Planner Agent

 ↓

Retriever → MCP(Context)

 ↓

Executor → MCP(Tool)

 ↓

Writer Agent

 ↓

User

```

---

## 3.3 Orchestrator (Pseudo-Code)

```python

def orchestrate(user, task):

    plan = planner_agent(task)

    context = retriever_agent(

        user=user,

        resource=plan["resource"]

    )

    result = executor_agent(

        user=user,

        tool=plan["tool"],

        input=context

    )

    return writer_agent(result)

```

**Wichtig:**

Kein Agent hat direkten Zugriff auf DB oder APIs – **nur MCP**.

---

# 4. Produktionsarchitektur (Docker, Auth, Secrets)

## 4.1 Zielbild

```

┌──────────┐ ┌──────────┐

│ Frontend │ → │ Backend │

└──────────┘ └────┬─────┘

                     │

               ┌─────▼─────┐

               │ MCP Server │

               └─────┬─────┘

                     │

              ┌──────▼──────┐

              │ LLM Provider │

              └─────────────┘

```

---

## 4.2 Dockerfile (MCP)

```dockerfile

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]

```

---

## 4.3 Docker Compose

```yaml

version: "3.9"

services:

  mcp:

    build: .

    ports:

      - "8080:8080"

    environment:

      - MCP_ENV=prod

      - POLICY_MODE=strict

    secrets:

      - jwt_public_key

secrets:

  jwt_public_key:

    file: ./secrets/jwt.pub

```

---

## 4.4 Auth & Secrets (Best Practice)

### Auth

* JWT (OIDC, z. B. Keycloak / Auth0)

* User-Claims → MCP Policy Engine

### Secrets

* **keine Secrets im Prompt**

* **keine Secrets im Container**

* Vault / Kubernetes Secrets / AWS Secrets Manager

---

## 4.5 Governance & Audit

* jeder MCP-Call:

  * user_id

  * resource / tool

  * timestamp

  * result_hash

* revisionssicher loggen (SIEM-fähig)

---

# Abschließendes Fazit

Du hast jetzt:

* einen **vollständigen MCP-Server (Python)**

* ein **formales OpenAPI/MCP-Schema**

* eine **echte Multi-Agent-Architektur**

* ein **produktives Deployment-Modell**

Das ist exakt die Architektur, die Unternehmen aktuell aufbauen, wenn KI **kein Experiment**, sondern **Kerninfrastruktur** ist.