Skip to main content
Glama

MCP Spine

mcp-spine MCP server

Context Minifier & State Guard — Ein Local-First-MCP-Middleware-Proxy, der Token-Verschwendung reduziert, Tool-Abnutzung verhindert und Kontext-Verfall eliminiert.

MCP Spine sitzt zwischen Ihrem LLM-Client (Claude Desktop usw.) und Ihren MCP-Servern und bietet Sicherheits-Härtung, intelligentes Tool-Routing, Schema-Kompression und Dateistatus-Verfolgung — alles über einen einzigen Proxy.

Warum

LLM-Agenten, die MCP-Tools verwenden, stehen vor drei Problemen:

  1. Token-Verschwendung — Tool-Schemas verbrauchen Tausende von Token pro Anfrage. Bei über 40 geladenen Tools verbrauchen Sie Kontext für JSON-Schemas, noch bevor das Gespräch überhaupt beginnt.

  2. Kontext-Verfall — In langen Sitzungen greifen LLMs auf alte Dateiversionen zurück, die sie sich zuvor gemerkt haben, und überschreiben stillschweigend Ihre neuesten Änderungen.

  3. Keine Sicherheitsgrenze — MCP-Server laufen mit vollem Zugriff. Es gibt keinen Audit-Trail, kein Rate-Limiting und keine Bereinigung von Geheimnissen zwischen dem LLM und Ihren Tools.

MCP Spine löst alle drei Probleme.

Installation

pip install mcp-spine

# With semantic routing (optional)
pip install mcp-spine[ml]

Schnellstart

# Generate config
mcp-spine init

# Diagnose your setup
mcp-spine doctor --config spine.toml

# Validate config
mcp-spine verify --config spine.toml

# Start the proxy
mcp-spine serve --config spine.toml

Claude Desktop Integration

Ersetzen Sie alle Ihre einzelnen MCP-Server-Einträge durch einen einzigen Spine-Eintrag:

{
  "mcpServers": {
    "spine": {
      "command": "python",
      "args": ["-u", "-m", "spine.cli", "serve", "--config", "/path/to/spine.toml"],
      "cwd": "/path/to/mcp-spine"
    }
  }
}

Das -u-Flag stellt sicher, dass stdout ungepuffert bleibt, was Pipe-Hänger unter Windows verhindert.

Funktionen

Stufe 1: Sicherheits-Proxy

  • JSON-RPC-Nachrichtenvalidierung und -bereinigung

  • Bereinigung von Geheimnissen (AWS-Schlüssel, GitHub-Token, Bearer-Token, private Schlüssel, Verbindungszeichenfolgen)

  • Tool-spezifisches und globales Rate-Limiting mit gleitenden Fenstern

  • Pfad-Traversal-Prävention mit Symlink-bewusstem Jail

  • Befehlsinjektionsschutz für das Starten von Servern

  • HMAC-fingerabdruckbasierter SQLite-Audit-Trail

  • Circuit-Breaker bei fehlerhaften Servern

  • Deklarative Sicherheitsrichtlinien über Konfiguration

Stufe 2: Semantischer Router

  • Lokale Vektor-Embeddings unter Verwendung von all-MiniLM-L6-v2 (keine API-Aufrufe, keine Daten verlassen Ihre Maschine)

  • ChromaDB-gestützte Tool-Indizierung

  • Routing zur Abfragezeit: Nur die relevantesten Tools werden an das LLM gesendet

  • spine_set_context Meta-Tool für expliziten Kontextwechsel

  • Keyword-Überlappung + Aktualitäts-Boost-Reranking

  • Hintergrund-Modellladen — Tools funktionieren sofort, Routing aktiviert sich bei Bereitschaft

Stufe 3: Schema-Minifizierung

  • 4 Aggressionsstufen (0=aus, 1=leicht, 2=standard, 3=aggressiv)

  • Stufe 2 erreicht 61% Token-Einsparungen bei Tool-Schemas

  • Entfernt $schema, Titel, additionalProperties, Parameterbeschreibungen, Standardwerte

  • Bewahrt alle erforderlichen Felder und Typinformationen

Stufe 4: State Guard

  • Überwacht Projektdateien über watchfiles

  • Pflegt ein SHA-256-Manifest mit monotoner Versionierung

  • Injiziert kompakte Status-Pins in Tool-Antworten

  • Verhindert, dass LLMs veraltete Dateiversionen bearbeiten

Human-in-the-Loop

  • require_confirmation Richtlinien-Flag für destruktive Tools

  • Spine fängt den Aufruf ab, zeigt die Argumente an und wartet auf die Benutzerfreigabe

  • spine_confirm / spine_deny Meta-Tools für das LLM, um die Entscheidung weiterzuleiten

  • Tool-spezifische Granularität über Glob-Muster

Tool-Ausgabe-Speicher

  • Ringpuffer-Caching der letzten 50 Tool-Ergebnisse

  • Deduplizierung nach Tool-Name + Argument-Hash

  • TTL-Ablauf (Standard 1 Stunde)

  • spine_recall Meta-Tool zum Abfragen zwischengespeicherter Ergebnisse

  • Verhindert Kontextverlust, wenn der semantische Router Tools zwischen den Turns austauscht

SSE-Transport

  • Verbindung zu entfernten MCP-Servern über HTTP/SSE zusätzlich zu lokalen stdio-Servern

  • Keine externen Abhängigkeiten (verwendet stdlib urllib)

  • Unterstützt benutzerdefinierte Header für die Authentifizierung

Diagnose

# Check your setup
mcp-spine doctor --config spine.toml

# Live monitoring dashboard
mcp-spine dashboard

# Usage analytics
mcp-spine analytics --hours 24

# Query audit log
mcp-spine audit --last 50
mcp-spine audit --security-only
mcp-spine audit --tool write_file

Beispielkonfiguration

[spine]
log_level = "info"
audit_db = "spine_audit.db"

# Add as many servers as you need — they start concurrently
[[servers]]
name = "filesystem"
command = "npx"
args = ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/project"]
timeout_seconds = 120

[[servers]]
name = "github"
command = "npx"
args = ["-y", "@modelcontextprotocol/server-github"]
env = { GITHUB_TOKEN = "ghp_..." }
timeout_seconds = 180

[[servers]]
name = "sqlite"
command = "uvx"
args = ["mcp-server-sqlite", "--db-path", "/path/to/database.db"]
timeout_seconds = 60

[[servers]]
name = "memory"
command = "npx"
args = ["-y", "@modelcontextprotocol/server-memory"]
timeout_seconds = 60

[[servers]]
name = "brave-search"
command = "node"
args = ["/path/to/node_modules/@modelcontextprotocol/server-brave-search/dist/index.js"]
env = { BRAVE_API_KEY = "your_key" }
timeout_seconds = 60

# Remote server via SSE
# [[servers]]
# name = "remote-tools"
# transport = "sse"
# url = "https://your-server.com/sse"
# headers = { Authorization = "Bearer token" }
# timeout_seconds = 30

# Semantic routing
[routing]
max_tools = 15
rerank = true

# Schema minification — 61% token savings at level 2
[minifier]
level = 2

# State guard — prevent context rot
[state_guard]
enabled = true
watch_paths = ["/path/to/project"]

# Human-in-the-loop for destructive tools
[[security.tools]]
pattern = "write_file"
action = "allow"
require_confirmation = true

[[security.tools]]
pattern = "write_query"
action = "allow"
require_confirmation = true

# Security
[security]
scrub_secrets_in_logs = true
audit_all_tool_calls = true
global_rate_limit = 120
per_tool_rate_limit = 60

[security.path]
allowed_roots = ["/path/to/project"]
denied_patterns = ["**/.env", "**/*.key", "**/*.pem"]

Sicherheitsmodell

Defense-in-Depth — jede Schicht geht davon aus, dass die anderen versagen könnten.

Bedrohung

Schadensbegrenzung

Prompt-Injektion über Tool-Args

Eingabevalidierung, Tool-Namens-Allowlists

Pfad-Traversal

Symlink-bewusstes Jail für allowed_roots

Geheimnis-Leckage

Automatische Bereinigung von AWS-Schlüsseln, Token, privaten Schlüsseln

Durchgehende Agenten-Schleifen

Tool-spezifisches + globales Rate-Limiting

Befehlsinjektion

Befehls-Allowlist, Blockierung von Shell-Metazeichen

Denial of Service

Nachrichtengrößenbeschränkungen, Circuit-Breaker

Zugriff auf sensible Dateien

Deny-List-Muster für .env, .key, .pem, .ssh/

Tool-Missbrauch

Richtlinienbasierte Blockierung, Audit-Logging, HITL-Bestätigung

Log-Manipulation

HMAC-Fingerabdrücke bei jedem Audit-Eintrag

Destruktive Operationen

require_confirmation pausiert für Benutzerfreigabe

Architektur

Client ◄──stdio──► MCP Spine ◄──stdio──► Filesystem Server
                       │      ◄──stdio──► GitHub Server
                       │      ◄──stdio──► SQLite Server
                       │      ◄──stdio──► Memory Server
                       │      ◄──stdio──► Brave Search
                       │      ◄──SSE────► Remote Server
                   ┌───┴───┐
                   │SecPol │  ← Rate limits, path jail, secret scrub
                   │Router │  ← Semantic routing (local embeddings)
                   │Minify │  ← Schema compression (61% savings)
                   │Guard  │  ← File state pinning (SHA-256)
                   │HITL   │  ← Human-in-the-loop confirmation
                   │Memory │  ← Tool output cache
                   └───────┘

Startsequenz

  1. Sofortiger Handshake (~2ms) — Reagiert sofort auf initialize

  2. Gleichzeitiger Serverstart — Alle Server verbinden sich parallel über asyncio.gather

  3. Progressive Bereitschaft — Tools verfügbar, sobald ein Server verbunden ist

  4. Späte Serverbenachrichtigungtools/listChanged wird gesendet, wenn langsame Server fertig sind

  5. Hintergrund-ML-Laden — Semantischer Router aktiviert sich im Hintergrund, wenn das Modell geladen ist

Windows-Unterstützung

Kampferprobt unter Windows mit spezifischer Härtung für:

  • MSIX-Sandbox-Pfade für Claude Desktop-Konfiguration und Logs

  • npx.cmd-Auflösung über shutil.which()

  • Pfade mit Leerzeichen (C:\Users\John Doe\) und Klammern (C:\Program Files (x86)\)

  • PureWindowsPath für plattformübergreifende Basename-Extraktion

  • Zusammenführung von Umgebungsvariablen (Konfigurations-Env erweitert, ersetzt nicht die System-Env)

  • UTF-8-Kodierung ohne BOM

  • Ungepufferter stdout (-u-Flag) zur Vermeidung von Pipe-Hängern

Projektstruktur

mcp-spine/
├── pyproject.toml
├── spine/
│   ├── cli.py              # Click CLI (init, serve, verify, audit, dashboard, analytics, doctor)
│   ├── config.py           # TOML config loader with validation
│   ├── proxy.py            # Core proxy event loop
│   ├── protocol.py         # JSON-RPC message handling
│   ├── transport.py        # Server pool, circuit breakers, concurrent startup
│   ├── audit.py            # Structured logging + SQLite audit trail
│   ├── router.py           # Semantic routing (ChromaDB + sentence-transformers)
│   ├── minifier.py         # Schema pruning (4 aggression levels)
│   ├── state_guard.py      # File watcher + SHA-256 manifest + pin injection
│   ├── memory.py           # Tool output cache (ring buffer + dedup + TTL)
│   ├── dashboard.py        # Live TUI dashboard (Rich)
│   ├── sse_client.py       # SSE transport client for remote servers
│   └── security/
│       ├── secrets.py      # Credential detection & scrubbing
│       ├── paths.py        # Path traversal jail
│       ├── validation.py   # JSON-RPC message validation
│       ├── commands.py     # Server spawn guards
│       ├── rate_limit.py   # Sliding window throttling
│       ├── integrity.py    # SHA-256 + HMAC fingerprints
│       ├── env.py          # Fail-closed env var resolution
│       └── policy.py       # Declarative security policies
├── tests/
│   ├── test_security.py    # Security tests
│   ├── test_config.py      # Config validation tests
│   ├── test_minifier.py    # Schema minification tests
│   ├── test_state_guard.py # State guard tests
│   ├── test_proxy_features.py  # HITL, dashboard, analytics tests
│   └── test_memory.py      # Tool output memory tests
├── configs/
│   └── example.spine.toml  # Complete reference config
└── .github/
    └── workflows/
        └── ci.yml          # GitHub Actions: test + lint + publish

Tests

pytest tests/ -v

135+ Tests decken Sicherheit, Konfigurationsvalidierung, Schema-Minifizierung, State Guard, HITL-Richtlinien, Dashboard-Abfragen, Analysen, Tool-Speicher und Windows-Pfad-Grenzfälle ab.

CI läuft bei jedem Push: Windows + Linux, Python 3.11/3.12/3.13.

Lizenz

MIT

Install Server
A
security – no known vulnerabilities
A
license - permissive license
A
quality - A tier

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Donnyb369/mcp-spine'

If you have feedback or need assistance with the MCP directory API, please join our Discord server