MCP Tool Manager
MCP Tool Manager
Ein für den Produktionsbetrieb gehärtetes, KI-natives Tool-Registry- und Agentenverwaltungssystem, das auf dem Model Context Protocol (MCP) basiert.
📖 Inhaltsverzeichnis
Related MCP server: mcp-tool-gateway
Was ist das?
MCP Tool Manager ist eine Zwei-Server-Plattform, die die schwierigsten betrieblichen Probleme in KI-integrierten Tool-Systemen löst:
Problem | Lösung |
LLMs verbrauchen Kontextfenster durch riesige API-Antworten | Byte-Budget pro Tool mit geordneter Kürzungssignalisierung |
Upstream-API-Fehler, die bis zur LLM durchschlagen | Circuit Breaker pro Tool (CLOSED → OPEN → HALF-OPEN) |
Alle Daten gehen bei Serverneustart verloren | Automatische periodische Datenträger-Snapshots, beim Start wiederhergestellt |
Brute-Force-/Injektionsangriffe auf das API-Gateway | Bedrohungserkennung für 10 Familien + gestuftes Rate Limiting + automatische IP-Sperrung |
Keine Möglichkeit, eine Anfrage Ende-zu-Ende zu verfolgen | X-Trace-ID-Header, der über alle Ebenen und zu Upstream-APIs propagiert wird |
Tools/Agenten nur im flüchtigen Speicher registriert | Dateibasiertes Aufrufprotokoll + Agenten-JSON-Konfigurationen + Zustands-Snapshots |
Architekturüberblick
┌─────────────────────────────────────────────────────────────────────────┐
│ MCP Tool Manager Platform │
│ │
│ ┌──────────────────────┐ ┌────────────────────────────────────┐ │
│ │ Manager Server │ │ Hardened MCP Server │ │
│ │ src/server │ │ mcp-server-project │ │
│ │ │ │ │ │
│ │ • REST API (CRUD) │ │ • MCP Protocol endpoint │ │
│ │ • JWT + API key auth │ │ • Agent API key auth + expiry │ │
│ │ • Tool registry │ │ • Circuit breaker per tool │ │
│ │ • Agent management │ │ • Retry + exponential backoff │ │
│ │ • Credential vault │ │ • Response cache (TTL per tool) │ │
│ │ • Audit log │ │ • Context window limiting │ │
│ │ • State snapshots │ │ • File-persisted call log │ │
│ │ • WebSocket events │ │ • 10-family threat detection │ │
│ │ • Response cache │ │ • Admin /metrics endpoint │ │
│ └──────────┬───────────┘ └──────────────┬─────────────────────┘ │
│ │ │ │
│ ┌──────────▼───────────┐ ┌──────────────▼─────────────────────┐ │
│ │ React Dashboard │ │ Claude Desktop / LLM Agent │ │
│ │ src/dashboard │ │ (connects via MCP SDK) │ │
│ └──────────────────────┘ └────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ Cross-cutting: X-Trace-ID · Rate Limiting · Helmet CSP · │ │
│ │ Structured Logging · Connection Limit · Compression │ │
│ └──────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘Projektstruktur
mcp/
├── .env.example # Template — copy to .env and fill in values
├── .gitignore # Excludes .env, node_modules, logs, snapshots
├── package.json # Root scripts — start both servers, CLI, tests
├── README.md # This file
├── REPORT.md # Full technical capability report
├── CHANGELOG.md # Version history
│
├── src/
│ ├── server/ # Manager Server (REST API)
│ │ ├── index.js # Entry point — snapshot restore + server start
│ │ ├── app.js # Express app — all middleware wired
│ │ ├── routes/
│ │ │ ├── tools.js # CRUD + test execution for tools
│ │ │ ├── agents.js # Agent management + tool discovery
│ │ │ ├── auth.js # Login, register, API key management
│ │ │ ├── credentials.js # Encrypted credential vault
│ │ │ └── monitoring.js # Stats, audit log, cache, snapshot status
│ │ ├── middleware/
│ │ │ ├── auth.js # JWT + API key auth + RBAC
│ │ │ └── error-handler.js # Typed errors + global handler
│ │ ├── storage/
│ │ │ ├── in-memory-store.js # All in-memory Maps + operations
│ │ │ ├── seeder.js # Initial data (skipped if snapshot exists)
│ │ │ └── state-snapshot.js # Periodic disk snapshots (JSON files)
│ │ ├── utils/
│ │ │ ├── trace.js # X-Trace-ID middleware
│ │ │ ├── context-limit.js # Response byte budget + pagination guard
│ │ │ ├── response-cache.js # node-cache wrapper + TTL presets
│ │ │ ├── encryption.js # AES-256-CBC for credential vault
│ │ │ └── logger.js # Levelled logger (error/warn/info/debug)
│ │ └── websocket.js # Real-time events via WebSocket
│ │
│ ├── dashboard/ # React + Vite management UI
│ │ ├── src/
│ │ │ ├── pages/ # Dashboard, Tools, Agents, Monitoring, Settings
│ │ │ ├── components/ # Sidebar, Topbar, ToastContainer
│ │ │ ├── services/api.js # Axios client for Manager Server
│ │ │ └── styles/ # global.css, sidebar.css
│ │ └── vite.config.js
│ │
│ ├── sdk/
│ │ └── index.js # Developer SDK — npm-publishable client
│ │
│ └── cli/
│ └── index.js # Admin CLI (17 commands)
│
├── mcp-server-project/ # Hardened MCP Server
│ ├── package.json
│ ├── src/
│ │ ├── server.js # Boot sequence — all 7 security layers
│ │ ├── mcp-protocol.js # MCP spec endpoint (/mcp/tools, /mcp/invoke)
│ │ ├── routes/
│ │ │ ├── invoke.js # Tool invocation (retry + CB + cache + limit)
│ │ │ ├── info.js # Tool discovery per agent
│ │ │ └── metrics.js # Admin monitoring endpoint
│ │ ├── middleware/
│ │ │ ├── auth.js # Agent auth + expiry + scope + disabled check
│ │ │ ├── trace.js # X-Trace-ID attachment
│ │ │ └── context-limit.js # Response byte budget
│ │ ├── state/
│ │ │ ├── call-log.js # Disk-persisted call log (NDJSON)
│ │ │ ├── circuit-breaker.js # Per-tool CLOSED/OPEN/HALF state machine
│ │ │ └── response-cache.js # TTL cache with auto-eviction
│ │ ├── loaders/
│ │ │ ├── registry.js # Central tool+agent in-memory registry
│ │ │ ├── tool-loader.js # Loads *.json from /tools/
│ │ │ ├── agent-loader.js # Loads *.json from /agents/
│ │ │ └── credential-loader.js # Merges .env + JSON credentials
│ │ └── watcher.js # chokidar hot-reload on /tools/ and /agents/
│ ├── security/
│ │ ├── middleware/
│ │ │ ├── security-headers.js # Strict Helmet CSP + CORS
│ │ │ ├── rate-limiter.js # 3-tier rate limiting + IP auto-block
│ │ │ └── threat-detector.js # 10-family injection/attack detector
│ │ └── logger/
│ │ └── security-log.js # Structured security event log (5 levels)
│ ├── tools/ # Tool definition JSON files
│ ├── agents/ # Agent definition JSON files
│ ├── credentials/ # .env and JSON secrets (gitignored)
│ ├── logs/ # Security log + call log (gitignored)
│ └── security-tests/ # Attack simulation suite + benchmark
│
├── snapshots/ # Manager server state snapshots (gitignored)
└── examples/ # Example tool/agent JSON filesSchnellstart
Voraussetzungen
Anforderung | Version |
Node.js | ≥ 16.0.0 |
npm | ≥ 7.0.0 |
Git | beliebig |
1. Klonen
git clone https://github.com/YOUR_USERNAME/mcp-tool-manager.git
cd mcp-tool-manager2. Abhängigkeiten installieren
# Root (Manager Server + CLI + SDK)
npm install
# Dashboard
cd src/dashboard && npm install && cd ../..
# MCP Server
cd mcp-server-project && npm install && cd ..3. Konfigurieren
# Manager Server
cp .env.example .env
# Edit .env with your JWT_SECRET, ENCRYPTION_KEY, etc.
# MCP Server
cp mcp-server-project/credentials/.env.example mcp-server-project/credentials/.env
# Edit credentials/.env with your agent keys and tool API keys4. Ausführen
# Terminal 1 — Manager Server (port 5000)
npm run dev:server
# Terminal 2 — React Dashboard (port 3000)
npm run dev:dashboard
# Terminal 3 — MCP Server (port 5001 by default)
cd mcp-server-project && npm start5. Zugriff
Schnittstelle | URL |
Dashboard | |
Manager-API | |
Manager-Health | |
MCP-Server | |
MCP-Health | |
MCP-Metriken |
Standard-Login (Manager)
Email: admin@mcp-tool-manager.dev
Password: admin123⚠️ Ändern Sie dies in der Produktion sofort über die Umgebungsvariablen
ADMIN_USERNAME/ADMIN_PASSWORD.
Konfigurationsreferenz
Manager-Server (.env)
# Core
NODE_ENV=development
MCP_SERVER_PORT=5000
MCP_SERVER_HOST=localhost
LOG_LEVEL=info
# Auth
JWT_SECRET=your-super-secret-key-min-32-chars
JWT_EXPIRY=24h
ENCRYPTION_KEY=your-encryption-key-exactly-32-ch
# Context Window
MCP_MAX_RESPONSE_BYTES=65536 # 64 KB default response budget
MCP_MAX_PAGE_SIZE=100 # Max items per paginated endpoint
# Scalability
MCP_MAX_CONNECTIONS=500 # TCP connection limit
SNAPSHOT_DIR=./snapshots # State persistence directory
SNAPSHOT_INTERVAL_SECS=60 # Save state every 60 seconds
SNAPSHOT_RESTORE=true # Restore state on startup
# Cache TTLs (seconds)
CACHE_TTL_TOOL_LIST=30
CACHE_TTL_TOOL_ITEM=60
CACHE_TTL_AGENT_LIST=30
CACHE_TTL_STATS=10
CACHE_TTL_ACTIVITY=300
# Future (not yet wired — provide connection string to enable)
DATABASE_URL=postgresql://user:password@localhost:5432/mcp_tools
REDIS_URL=redis://localhost:6379MCP-Server (mcp-server-project/credentials/.env)
# Agent API Keys (convention: AGENT_<AGENTID_UPPERCASE>_KEY)
AGENT_MY_AGENT_KEY=your-agent-secret-key
# Tool credentials (referenced by credential_ref in tool JSON)
OPENAI_API_KEY=sk-...
WEATHER_API_KEY=...
SLACK_BOT_TOKEN=xoxb-...
# Admin
ADMIN_KEY=your-admin-key-for-metrics-endpoint
# Server
MCP_PORT=5001
MCP_MAX_CONNECTIONS=200
MCP_MAX_RESPONSE_BYTES=32768 # 32 KB default per tool responseTool-JSON-Felder (MCP-Server)
{
"name": "my_tool",
"description": "Human-readable description for the LLM",
"endpoint_url": "https://api.example.com/endpoint",
"method": "POST",
"credential_ref": "MY_API_KEY",
"parameters": {
"type": "object",
"properties": {
"query": { "type": "string", "description": "Search query" }
},
"required": ["query"]
},
"cache_ttl_seconds": 60,
"max_response_bytes": 8192,
"retry_max": 3,
"timeout_ms": 10000,
"circuit_failure_threshold": 5,
"circuit_open_window_ms": 30000
}Agent-JSON-Felder (MCP-Server)
{
"agent_id": "my-agent",
"allowed_tools": ["weather_lookup", "send_email"],
"expires_at": "2027-01-01T00:00:00Z",
"disabled": false
}API-Referenz
Manager-Server (http://localhost:5000)
Authentifizierung
Methode | Pfad | Auth | Beschreibung |
POST |
| — | JWT-Token abrufen |
POST |
| — | Konto erstellen |
GET |
| ✅ | Aktueller Benutzer + API-Schlüssel |
POST |
| ✅ | Neuen API-Schlüssel generieren |
DELETE |
| ✅ | API-Schlüssel widerrufen |
Tools
Methode | Pfad | Auth | Beschreibung |
GET |
| ✅ | Tools auflisten (paginiert) |
POST |
| ✅ | Neues Tool registrieren |
GET |
| ✅ | Tool-Details |
PUT |
| ✅ | Tool aktualisieren |
DELETE |
| ✅ | Tool entfernen |
POST |
| ✅ | Tool-Aufruf testen |
Agenten
Methode | Pfad | Auth | Beschreibung |
GET |
| ✅ | Agenten auflisten |
POST |
| ✅ | Agenten registrieren |
GET |
| ✅ | Agenten-Details |
PUT |
| ✅ | Agenten aktualisieren |
DELETE |
| ✅ | Agenten entfernen |
POST |
| ✅ | Tools für Agenten ermitteln |
Monitoring
Methode | Pfad | Auth | Beschreibung |
GET |
| — | Liveness-Probe |
GET |
| ✅ | Vollständige Systemstatistiken + Cache + Snapshot |
GET |
| ✅ | Echte stündliche Aufruf-Zeitachse (24h) |
GET |
| ✅ | Top N Tools nach Aufrufanzahl |
GET |
| ✅ | Audit-Einträge |
GET |
| ✅ | Cache-Trefferquote + Einträge |
GET |
| ✅ | Zeitstempel + Anzahl des letzten Snapshots |
MCP-Server (http://localhost:5001)
Methode | Pfad | Auth | Beschreibung |
GET |
| — | Liveness-Probe |
GET |
| AGENT_KEY | Tools für den aufrufenden Agenten auflisten |
GET |
| ADMIN_KEY | Alle Tools + alle Agenten |
GET |
| — | Mit Claude Desktop kompatible Tool-Liste |
POST |
| — | MCP-Protokollaufruf |
POST |
| AGENT_KEY | Direkter Tool-Aufruf |
GET |
| ADMIN_KEY | Vollständiges Monitoring-Dashboard |
GET |
| — | Leichtgewichtige Liveness-Probe |
GET |
| ADMIN_KEY | Kürzlicher Aufrufverlauf |
Umsetzungsplan
Dieser Abschnitt dokumentiert die vollständige Roadmap – was bereits umgesetzt ist, was in Arbeit ist und was Infrastrukturentscheidungen erfordert.
Phase 1 – Grundlage ✅ Abgeschlossen
Manager-Server-REST-API (Tools, Agenten, Authentifizierung, Zugangsdaten, Monitoring)
In-Memory-Speicher mit vollständigen CRUD-Operationen
JWT + API-Schlüssel-Dualauthentifizierung mit RBAC
AES-256-CBC-Zugangsdatentresor
React-Dashboard (Seiten für Tools, Agenten, Monitoring, Einstellungen)
WebSocket-Echtzeit-Event-Broadcasting
Entwickler-SDK (
src/sdk/index.js)Admin-CLI mit 17 Befehlen (
src/cli/index.js)MCP-Protokoll-Endpunkt (Claude Desktop-kompatibel)
Dateibasiertes Tool-/Agenten-Register mit Hot-Reload (
chokidar)Audit-Log mit rotierendem Ringpuffer
Phase 2 – Sicherheitshärtung ✅ Abgeschlossen
Bedrohungserkennung für 10 Familien (SQL/NoSQL/XSS/SSRF/Shell/Template/Path/CMDi/Null/Header-Injektion)
Sperrung von Scanner-User-Agents (sqlmap, nikto, nmap, Burp Suite, 20+ Scanner)
3-stufiges Rate Limiting (global + strikt + Geschwindigkeitsverlangsamung)
Automatische IP-Sperrung nach Brute-Force-Angriffen (20+ Treffer)
Strukturiertes Sicherheitsereignisprotokoll mit 5 Schweregradstufen
Helmet strikte CSP (
defaultSrc: 'none')Ablauf von Agent-Schlüsseln + Deaktivierungs-Flag
Scope-Durchsetzung (
requireScopeMiddleware)Sicherheitsprotokollierung bei Authentifizierungsfehlern + Scope-Verletzungen
Sicherheits-Testsuite + Benchmark (Vergleich gehärtet vs. ungeschützt)
Phase 3 – Betriebliche Fähigkeiten ✅ Abgeschlossen (Dieses Release)
X-Trace-ID – eindeutiger Anfrage-Korrelator, propagiert durch alle Ebenen und Upstream-APIs
Circuit Breaker – CLOSED/OPEN/HALF-OPEN pro Tool (konfigurierbare Schwellwerte)
Wiederholung mit exponentiellem Backoff – 200ms → 400ms → 800ms, überspringt 4xx-Fehler
Antwort-Cache – TTL pro Tool/Datentyp, Trefferquoten-Verfolgung, Präfix-Invalidierung
Kontextfenster-Begrenzung – Byte-Budget pro Tool, geordnete Kürzung mit Signalisierung
Paginierungs-Schutz – globaler
?limit-Begrenzer (Standard maximal 100 Einträge)Zustands-Snapshots – atomare periodische Schreibvorgänge, beim Start wiederhergestellt (Tools/Agenten/Benutzer überleben Neustart)
Verbindungslimit-Wächter – verwirft TCP-Sockets über dem konfigurierbaren Maximum
Rate Limiting aktiviert (Manager) – 300 global + 15 Authentifizierungsversuche pro Minute und IP
Echtes Monitoring – Aktivitätszeitachse aus tatsächlichen Aufrufdaten (Math.random()-Mock entfernt)
/metrics-Endpunkt (MCP) – vollständiges Admin-Dashboard (Aufrufe, Cache, Circuit Breaker, Speicher)
node-cache aktiviert (Manager) – TTL-Voreinstellungen pro Datentyp, Trefferquoten-Verfolgung
/api/monitoring/cacheund/api/monitoring/snapshotneue Endpunkte
Phase 4 – Persistenz & Verteilung 🔲 Wartet auf Ihre Eingabe
Diese erfordern Infrastruktur.
pgundioredissind bereits installiert – es werden nur Verbindungszeichenfolgen benötigt.
PostgreSQL –
in-memory-store.jsin eine persistente Datenbank migrierenTabellen
tools,agents,users,api_keys,credentials,audit_logVerbindungspool über
pg(DATABASE_URLbereits in.env.example)
Redis – gemeinsamer Speicher für Rate Limit + Sitzungen + Antwort-Cache
node-cache durch ioredis für Multi-Instanz-Sicherheit ersetzen
Gemeinsame IP-Sperrliste über alle Serverinstanzen hinweg
(
REDIS_URLbereits in.env.example)
Horizontale Skalierung – sobald Redis + Postgres angebunden sind, N Instanzen hinter nginx bereitstellen
Phase 5 – Entwicklererfahrung 🔲 Optional
Automatische Generierung der OpenAPI/Swagger-Spezifikation (
swagger-jsdoc)zod-Umgebungs-Schema-Validierung beim Start (Fail-Fast bei fehlender Konfiguration)JWT-Refresh-Tokens + Blacklist
Prometheus-Metrikenexport (
/metrics/prometheus-Endpunkt)OpenTelemetry-verteiltes Tracing
Tool-Kompatibilitätsmatrix
WebSocket-Dashboard für den Echtzeit-Circuit-Breaker-Zustand
Sicherheitsmodell
Manager-Server
Request
│
├── X-Trace-ID attachment (Layer 0)
├── Helmet strict CSP (Layer 1)
├── Global rate limit 300/min (Layer 2a)
├── Auth rate limit 15/min on /api/auth (Layer 2b)
├── Body size limit 2 MB (Layer 3)
├── Context window budget (Layer 4)
├── Pagination guard max 100 items (Layer 5)
├── JWT / API key verification (per-route)
└── RBAC role check (per-route)MCP-Server
Request
│
├── X-Trace-ID attachment (Layer 0)
├── Strict Helmet CSP (Layer 1)
├── IP block list check (Layer 2)
├── Body size guard (Layer 3)
├── Context window budget (Layer 4)
├── HTTP method whitelist (Layer 5)
├── Scanner user-agent block (Layer 6)
├── Global rate limit + speed slow-down (Layer 7)
├── 10-family threat detection (Layer 8)
├── Agent API key auth + expiry + disabled check (per-route)
├── Tool scope enforcement (per-route)
├── Circuit breaker check (per-tool)
├── Response cache lookup (per-tool)
└── Retry + context limit on upstream call (per-tool)Monitoring & Beobachtbarkeit
Verfügbare Daten
Quelle | Was es zeigt |
| Systemübersicht, Cache-Statistiken, Snapshot-Informationen, Kontextlimit-Konfiguration |
| Echte 24-Stunden-Stundenzeitleiste der Aufrufe (Erfolgs- + Fehlerzahlen) |
| Top-Tools nach Aufrufanzahl + Erfolgsrate |
| Alle Admin-Aktionen (Tool erstellen/löschen, Agent hinzufügen/entfernen) |
| Cache-Trefferquote, Eintragsanzahl, Verdrängungen |
| Zeitstempel des letzten Snapshots + Datensatzanzahl |
| Circuit-Breaker-Zustände, Aufrufprotokoll, Cache-Statistiken, Systemspeicher |
| Betriebszeit + Speicher (leichtgewichtige Prüfung) |
| Vollständige Aufrufhistorie: Trace-ID, Agent, Tool, Latenz, Erfolg, Wiederholungen |
| Alle Sicherheitsereignisse: AUTH-Fehler, Bedrohungen, Ratenbegrenzungen, Circuit-Auslösungen |
| Letzter Snapshot: Zeitstempel + Anzahl für alle Datentypen |
X-Trace-ID-Ablauf
Client → [generates or passes X-Trace-ID]
→ Manager/MCP Server [attaches to req.traceId, echoes in X-Trace-ID response header]
→ Security log entries [include traceId]
→ Call log entries [include traceId]
→ Upstream API call [X-Trace-ID forwarded in headers]
→ Response [traceId in JSON body]Roadmap
v2.1 (Als Nächstes)
PostgreSQL für persistenten Speicher anbinden
Redis für verteilte Ratenbegrenzung + Cache anbinden
zod-Umgebungsschema-Validierung beim Start
v2.2
JWT-Refresh-Token + Blacklist
Prometheus-Metriken-Export
Ratenbegrenzung pro API-Schlüssel (nicht IP-basiert)
v3.0
Vollständige OpenAPI-Spezifikation
OpenTelemetry-Verteiltes-Tracing
OAuth2/OIDC-föderierte Agentenidentität
Mitwirken
Siehe CONTRIBUTING.md für Branch-Strategie, PR-Prozess und Code-Stil-Leitfaden.
Lizenz
MIT © MCP Tool Manager Team
Siehe REPORT.md für die vollständige technische Fähigkeitsbewertung.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to discover and execute tools via a secure MCP server with JWT authentication, RBAC, rate limiting, and audit logging.1MIT
- AlicenseNot gradedqualityCmaintenanceA secure tool-execution plane for agentic AI that enforces JWT authentication, rate limiting, prompt-injection inspection, and audit logging, while ingesting downstream OpenAPI endpoints as MCP tools.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to access a unified catalog of tools from various APIs (OpenAPI, GraphQL, MCP, Google Discovery) through the MCP protocol.MIT

AgentsGateofficial
AlicenseNot gradedqualityAmaintenanceEnables AI agents to securely call MCP tools with risk scoring, checkpoints, rollback, and approval workflows.134MIT
Related MCP Connectors
Hosted MCP endpoint with realistic fake data for prototyping agents. 12 tools, no setup.
Free public MCP for AI agents — 193 tools, 44 workflows. No API key.
Hosted MCP with 91 agent tools: X, domains, SEO, Maps, Trends, Search, YouTube, TikTok, and more.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/Nagendda/MCP-Tool-Manager'
If you have feedback or need assistance with the MCP directory API, please join our Discord server