MCP Spine
MCP Spine
컨텍스트 최소화 도구 & 상태 보호기 — 토큰 낭비를 줄이고, 도구 소모를 방지하며, 컨텍스트 부패를 제거하는 로컬 우선 MCP 미들웨어 프록시입니다.
MCP Spine은 LLM 클라이언트(Claude Desktop 등)와 MCP 서버 사이에 위치하여 보안 강화, 지능형 도구 라우팅, 스키마 압축 및 파일 상태 추적 기능을 단일 프록시를 통해 제공합니다.
이유
MCP 도구를 사용하는 LLM 에이전트는 세 가지 문제에 직면합니다:
토큰 낭비 — 도구 스키마는 요청당 수천 개의 토큰을 소비합니다. 40개 이상의 도구가 로드되면 대화가 시작되기도 전에 JSON 스키마로 인해 컨텍스트가 소진됩니다.
컨텍스트 부패 — 긴 세션에서 LLM은 이전에 기억했던 오래된 파일 버전을 편집하여 최신 변경 사항을 조용히 덮어쓰는 경우가 발생합니다.
보안 경계 부재 — MCP 서버는 전체 액세스 권한으로 실행됩니다. LLM과 도구 사이에 감사 추적, 속도 제한, 비밀 정보 스크러빙이 없습니다.
MCP Spine은 이 세 가지 문제를 모두 해결합니다.
설치
pip install mcp-spine
# With semantic routing (optional)
pip install mcp-spine[ml]빠른 시작
# 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.tomlClaude Desktop 통합
모든 개별 MCP 서버 항목을 단일 Spine 항목으로 교체하세요:
{
"mcpServers": {
"spine": {
"command": "python",
"args": ["-u", "-m", "spine.cli", "serve", "--config", "/path/to/spine.toml"],
"cwd": "/path/to/mcp-spine"
}
}
}-u 플래그는 버퍼링되지 않은 stdout을 보장하여 Windows에서 파이프가 멈추는 것을 방지합니다.
기능
1단계: 보안 프록시
JSON-RPC 메시지 검증 및 살균
비밀 정보 스크러빙 (AWS 키, GitHub 토큰, 베어러 토큰, 개인 키, 연결 문자열)
슬라이딩 윈도우를 사용한 도구별 및 전역 속도 제한
심볼릭 링크를 인식하는 감옥(jail)을 통한 경로 탐색 방지
서버 생성을 위한 명령 주입 방지
HMAC 지문이 포함된 SQLite 감사 추적
실패하는 서버에 대한 서킷 브레이커
설정에서 선언적 보안 정책 지원
2단계: 의미론적 라우터
all-MiniLM-L6-v2를 사용한 로컬 벡터 임베딩 (API 호출 없음, 데이터가 기기 밖으로 나가지 않음)ChromaDB 기반 도구 인덱싱
쿼리 시점 라우팅: 가장 관련성 높은 도구만 LLM에 전송
명시적 컨텍스트 전환을 위한
spine_set_context메타 도구키워드 중첩 + 최신성 가중치 재순위 지정
백그라운드 모델 로딩 — 도구는 즉시 작동하며, 라우팅은 준비되는 대로 활성화됨
3단계: 스키마 최소화
4단계 강도 조절 (0=끄기, 1=약함, 2=표준, 3=강함)
2단계 설정 시 도구 스키마에서 61% 토큰 절감 달성
$schema, 제목,additionalProperties, 매개변수 설명, 기본값 제거모든 필수 필드 및 유형 정보 보존
4단계: 상태 보호기
watchfiles를 통해 프로젝트 파일 감시단조 증가 버전 관리와 함께 SHA-256 매니페스트 유지
도구 응답에 압축된 상태 핀 삽입
LLM이 오래된 파일 버전을 편집하지 못하도록 방지
인간 개입 (Human-in-the-Loop)
파괴적인 도구에 대한
require_confirmation정책 플래그Spine이 호출을 가로채고, 인수를 표시하며, 사용자 승인을 대기
LLM이 결정을 전달할 수 있도록 하는
spine_confirm/spine_deny메타 도구glob 패턴을 통한 도구별 세밀한 제어
도구 출력 메모리
마지막 50개의 도구 결과를 저장하는 링 버퍼 캐싱
도구 이름 + 인수 해시를 통한 중복 제거
TTL 만료 (기본값 1시간)
캐시된 결과를 쿼리하기 위한
spine_recall메타 도구의미론적 라우터가 턴 사이에 도구를 교체할 때 발생하는 컨텍스트 손실 방지
SSE 전송
로컬 stdio 서버와 함께 HTTP/SSE를 통해 원격 MCP 서버에 연결
외부 의존성 없음 (표준 라이브러리 urllib 사용)
인증을 위한 사용자 정의 헤더 지원
진단
# 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예시 설정
[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"]보안 모델
심층 방어 — 각 계층은 다른 계층이 실패할 수 있다고 가정합니다.
위협 | 완화 조치 |
도구 인수를 통한 프롬프트 주입 | 입력 검증, 도구 이름 허용 목록 |
경로 탐색 |
|
비밀 정보 유출 | AWS 키, 토큰, 개인 키 자동 스크러빙 |
에이전트 루프 폭주 | 도구별 + 전역 속도 제한 |
명령 주입 | 명령 허용 목록, 셸 메타 문자 차단 |
서비스 거부 (DoS) | 메시지 크기 제한, 서킷 브레이커 |
민감한 파일 접근 |
|
도구 오용 | 정책 기반 차단, 감사 로깅, HITL 승인 |
로그 변조 | 모든 감사 항목에 HMAC 지문 |
파괴적 작업 |
|
아키텍처
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
└───────┘시작 순서
즉각적인 핸드셰이크 (~2ms) —
initialize에 즉시 응답동시 서버 시작 — 모든 서버가
asyncio.gather를 통해 병렬로 연결점진적 준비 — 서버가 연결되는 즉시 도구 사용 가능
지연 서버 알림 — 느린 서버가 완료되면
tools/listChanged전송백그라운드 ML 로딩 — 모델이 로드되면 의미론적 라우터가 조용히 활성화
Windows 지원
다음 사항에 대해 강화된 Windows 환경에서 검증됨:
Claude Desktop 설정 및 로그를 위한 MSIX 샌드박스 경로
shutil.which()를 통한npx.cmd확인공백(
C:\Users\John Doe\) 및 괄호(C:\Program Files (x86)\)가 포함된 경로플랫폼 간 베이스네임 추출을 위한
PureWindowsPath환경 변수 병합 (설정 환경 변수가 시스템 환경 변수를 확장하며 대체하지 않음)
BOM 없는 UTF-8 인코딩
파이프 멈춤 방지를 위한 버퍼링되지 않은 stdout (
-u플래그)
프로젝트 구조
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테스트
pytest tests/ -v보안, 설정 검증, 스키마 최소화, 상태 보호기, HITL 정책, 대시보드 쿼리, 분석, 도구 메모리 및 Windows 경로 엣지 케이스를 다루는 135개 이상의 테스트.
CI는 모든 푸시마다 실행: Windows + Linux, Python 3.11/3.12/3.13.
라이선스
MIT
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