Skip to main content
Glama

SERVER-MCP

On-Server Model Context Protocol Agent for PostgreSQL, Redis, Keycloak, and NGINX management on Ubuntu infrastructure.

Overview

SERVER-MCP is a specialized MCP server that runs directly on Ubuntu infrastructure servers (unlike IT-MCP which runs on desktop/laptop and SSH's to remote servers). It provides real-time database monitoring, service health management, and automated maintenance for production environments.

Architecture

┌─────────────────────────────────────────────────────────────┐
│                    IT-MCP (Desktop/Laptop)                   │
│  - Cross-platform diagnostics                                │
│  - Remote administration via SSH/WinRM                        │
│  - Central command dispatch                                   │
└───────────────────┬──────────────────────────────────────────┘
                    │
                    │ HTTPS + JWT Auth
                    │ (Keycloak)
                    ▼
┌─────────────────────────────────────────────────────────────┐
│          Agent Registry (server.acdev.host)                  │
│  - PostgreSQL: Command queue, agent registry                 │
│  - Redis: Pub/sub, real-time heartbeat                       │
│  - Keycloak: JWT authentication, RBAC                        │
└───────────────────┬──────────────────────────────────────────┘
                    │
                    │ Local execution
                    ▼
┌─────────────────────────────────────────────────────────────┐
│              SERVER-MCP (Ubuntu Server)                      │
│  ✓ PostgreSQL management (direct pg client)                 │
│  ✓ Redis operations (direct ioredis client)                 │
│  ✓ Keycloak admin (Admin API)                               │
│  ✓ NGINX monitoring (log analysis, config testing)          │
│  ✓ System metrics (disk, memory, CPU, network)              │
│  ✓ Automated backups (nightly PostgreSQL + Redis)           │
│  ✓ Service health checks & auto-restart                     │
└─────────────────────────────────────────────────────────────┘

Key Differences from IT-MCP

Aspect

IT-MCP

SERVER-MCP

Deployment

Desktop/laptop (macOS/Windows/Linux)

Ubuntu server (server.acdev.host)

Execution

SSH/WinRM to remote servers

Local commands via sudo

Database

SQLite primary + PostgreSQL sync (optional)

PostgreSQL primary + SQLite cache

Focus

Cross-platform diagnostics, remote admin

Database management, service health, backups

MCP Client

Claude Desktop, CLI tools

Headless (API-driven by IT-MCP or cron)

Capabilities

local-shell, ssh-linux, ssh-macos, winrm

postgres-admin, redis-admin, keycloak-admin, ubuntu-server

Features

Database Management

  • PostgreSQL: Real-time connection stats, replication monitoring, table bloat detection, slow query analysis, automated VACUUM, reindexing, backup/restore

  • Redis: Memory stats, keyspace analysis, slow log, client list, BGSAVE automation

Service Management

  • Keycloak: Realm stats, session monitoring, user management, event logs, client secret rotation

  • NGINX: Access log analysis, error log parsing, config testing, upstream health checks

  • System: Service restarts, package updates, Docker container management, PM2 process monitoring

Automated Maintenance

  • Nightly database backups (PostgreSQL + Redis)

  • Weekly Docker image pruning

  • Monthly Keycloak secret rotation

  • Security updates (with approval workflow)

  • Auto-restart failed services

Integration

  • Agent Registration: Auto-registers with IT-MCP central registry on startup

  • Command Queue: Polls PostgreSQL command queue for remote jobs

  • Heartbeat: Sends heartbeat to Redis every 30 seconds

  • JWT Authentication: Keycloak client credentials flow

Installation

Prerequisites

  • Ubuntu Server 24.04 LTS (or compatible)

  • Node.js 18.18+ installed

  • PostgreSQL 16+ running locally

  • Redis 7+ running locally

  • Keycloak running (Docker or standalone)

  • NGINX installed

  • Sudo access for the service user

Setup

  1. Clone and install dependencies:

    cd /opt
    sudo git clone <repository-url> server-mcp
    cd server-mcp
    sudo npm install
  2. Configure environment:

    sudo cp .env.example .env
    sudo nano .env
    # Fill in PostgreSQL, Redis, Keycloak credentials
  3. Build TypeScript:

    sudo npm run build
  4. Create service user:

    sudo useradd -r -s /bin/false mcp-agent
    sudo chown -R mcp-agent:mcp-agent /opt/server-mcp
  5. Configure sudo access (edit /etc/sudoers.d/server-mcp):

    mcp-agent ALL=(ALL) NOPASSWD: /usr/bin/systemctl
    mcp-agent ALL=(ALL) NOPASSWD: /usr/bin/docker
    mcp-agent ALL=(ALL) NOPASSWD: /usr/bin/pg_dump
    mcp-agent ALL=(ALL) NOPASSWD: /usr/bin/pg_dumpall
    mcp-agent ALL=(ALL) NOPASSWD: /usr/sbin/nginx -t
  6. Install systemd service:

    sudo cp systemd/server-mcp.service /etc/systemd/system/
    sudo systemctl daemon-reload
    sudo systemctl enable server-mcp
    sudo systemctl start server-mcp
  7. Verify installation:

    sudo systemctl status server-mcp
    sudo journalctl -u server-mcp -f

Configuration

Environment Variables

See .env.example for full configuration options. Key variables:

  • PostgreSQL: POSTGRES_HOST, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DATABASE

  • PostgreSQL Sync: POSTGRES_CONNECTION_STRING (optional - for structured thought sync)

  • Redis: REDIS_HOST, REDIS_PORT, REDIS_PASSWORD

  • Keycloak Admin: KEYCLOAK_BASE_URL, KEYCLOAK_CLIENT_ID, KEYCLOAK_CLIENT_SECRET, KEYCLOAK_REALM

  • Local Storage: SERVER_MCP_SQLITE_PATH, SERVER_MCP_QUEUE_PATH

  • Structured Thinking: SERVER_MCP_STAGE_CONFIG (optional path to JSON stage framework definition), SERVER_MCP_SQLITE_PATH

  • Agent Integration: IT_MCP_REGISTRY_URL (optional), IT_MCP_SERVER_ID (optional)

  • Security: SERVER_MCP_ALLOW_SUDO (default: true)

  • Logging: SERVER_MCP_LOG_LEVEL (default: debug)

Backup Configuration

Automated backups are enabled by default:

ENABLE_AUTO_BACKUP=true
BACKUP_SCHEDULE=0 2 * * *          # Daily at 2 AM
BACKUP_RETENTION_DAYS=30           # Keep 30 days
SERVER_MCP_BACKUP_DIR=/var/backups/server-mcp

MCP Tools

SERVER-MCP exposes 7 MCP tools (all execute locally, no SSH):

Tool

Description

Operations

database-diagnostics

Database health checks

PostgreSQL/Redis/Keycloak/NGINX/firewall/system diagnostics (6 suites)

postgres-manage

PostgreSQL operations

Connections, replication, bloat, slow queries, vacuum, reindex, backup

redis-manage

Redis operations

Memory stats, keyspace, slow log, client list, BGSAVE

keycloak-manage

Keycloak admin

Realm stats, sessions, users, events, secret rotation

nginx-monitor

NGINX monitoring

Access log analysis, error log parsing, config testing, reload

system-metrics

System health

Overview, processes, disk I/O, network, journal errors, service status

structured-thinking

Structured reasoning management

Capture/revise/retrieve thoughts, generate summaries, inspect framework, trigger sync

Usage

As Distributed Agent

SERVER-MCP automatically registers with the IT-MCP agent registry on startup. IT-MCP can then dispatch commands:

// From IT-MCP desktop client
const result = await dispatchCommand({
  tool: "postgres-manage",
  operation: "vacuum",
  database: "production",
  targetAgent: "server.acdev.host"
});

Direct Invocation (Development)

For testing, you can invoke tools directly via stdio:

echo '{"tool":"database-diagnostics","params":{"suites":["postgres","redis"]}}' | npm run dev

Monitoring

View logs in real-time:

# Journald logs (structured JSON)
sudo journalctl -u server-mcp -f

# Filter errors only
sudo journalctl -u server-mcp -p err -f

Structured Thinking Interface

The structured-thinking tool turns SERVER-MCP into the source of truth for guided reasoning:

  • Capture or revise thoughts with rich metadata (stage, quality score, tags, branches).

  • Retrieve filtered timelines (by stage, branch, importance, tags, or full-text fragment) and generate branch-aware summaries.

  • Inspect or override the reasoning framework by supplying a JSON config via SERVER_MCP_STAGE_CONFIG.

  • Run diagnostics to detect stale or missing stages, and trigger PostgreSQL syncs when POSTGRES_CONNECTION_STRING is configured.

  • Feedback heuristics surface stage dwell time, rolling quality drops, repetitive content, and unhealthy branches to nudge the agent when progress stalls.

Development

Build Commands

# Install dependencies
npm install

# Development mode (ts-node)
npm run dev

# Compile TypeScript
npm run build

# Watch mode
npm run build:watch

# Run compiled server
npm start

# Lint code
npm run lint

Service Architecture

SERVER-MCP follows IT-MCP's service layer pattern:

// Service with dependency injection
export class PostgresManagerService {
  public constructor(
    private readonly runner: CommandRunner,
    private readonly pool: pg.Pool
  ) {}

  public async getActiveConnections(): Promise<ConnectionStats> {
    // Direct PostgreSQL client query (not shell command)
    const result = await this.pool.query(
      "SELECT state, count(*) FROM pg_stat_activity GROUP BY state"
    );
    return this.parseConnections(result.rows);
  }
}

// Tool registration
server.registerTool(
  "postgres-manage",
  schema,
  async (params) => {
    try {
      const result = await deps.postgresManager.execute(params);
      return {
        content: [{ type: "text", text: formatResult(result) }],
        structuredContent: result
      };
    } catch (error) {
      return handleError(error);
    }
  }
);

Error Handling

All services use CommandRunner for safe command execution:

const result = await this.runner.run("systemctl status postgresql", {
  requiresSudo: false,
  timeoutMs: 10000
});

// Throws CommandExecutionError with full context on failure

Security

Sudo Configuration

SERVER-MCP requires sudo access for specific operations:

  • Service management: systemctl

  • Container operations: docker

  • Database backups: pg_dump, pg_dumpall

  • NGINX config testing: nginx -t

NEVER grant NOPASSWD: ALL - only specific commands listed in /etc/sudoers.d/server-mcp.

Secret Management

Production: Use systemd credentials (not .env):

# Store secrets in systemd credentials directory
echo -n "mypassword" | sudo systemd-creds encrypt - /etc/credstore/postgres_password

# Reference in systemd service
LoadCredential=postgres_password:/etc/credstore/postgres_password

# Access in code
const password = process.env.CREDENTIALS_DIRECTORY
  ? fs.readFileSync(`${process.env.CREDENTIALS_DIRECTORY}/postgres_password`, 'utf8')
  : process.env.POSTGRES_PASSWORD;

JWT Authentication

SERVER-MCP authenticates to the agent registry using Keycloak client credentials:

  1. Service starts → authenticates to Keycloak

  2. Receives JWT access token

  3. Includes Authorization: Bearer <token> in all registry API calls

  4. Auto-refreshes token before expiration

Monitoring & Operations

Health Checks

SERVER-MCP exposes a health check (future enhancement):

curl http://localhost:9090/health
# {"status":"healthy","uptime":86400,"lastHeartbeat":"2025-11-01T10:30:00Z"}

Backup Verification

Check backup status:

sudo ls -lh /var/backups/server-mcp/
# postgres_20251101_020000.sql.gz
# redis_20251101_020000.rdb

Service Restart

If SERVER-MCP crashes, systemd automatically restarts it:

[Service]
Restart=always
RestartSec=10

Troubleshooting

Common Issues

Issue: "Permission denied" when running commands

Solution: Check sudo configuration in /etc/sudoers.d/server-mcp


Issue: "Cannot connect to PostgreSQL"

Solution: Verify PostgreSQL is running and credentials in .env are correct:

sudo systemctl status postgresql
psql -h localhost -U postgres -c "SELECT version();"

Issue: "Keycloak authentication failed"

Solution: Verify Keycloak client exists and credentials are correct:

curl -k -X POST https://acdev.host:8080/realms/mcp-agents/protocol/openid-connect/token \
  -d "client_id=server-mcp-agent" \
  -d "client_secret=<secret>" \
  -d "grant_type=client_credentials"

Issue: "Backup directory not writable"

Solution: Check ownership and permissions:

sudo mkdir -p /var/backups/server-mcp
sudo chown mcp-agent:mcp-agent /var/backups/server-mcp
sudo chmod 750 /var/backups/server-mcp

Roadmap

Phase 1: Foundation ✅

  • Project structure

  • Core utilities (CommandRunner, logger)

  • Package dependencies

  • SQLite cache service (SQLitePlannerService)

  • Structured thinking service

Phase 2: Core Services ✅

  • ServerAdminService (from UbuntuAdminService)

  • DatabaseDiagnosticsService (simplified, no SSH)

  • PostgresManagerService (pg client)

  • RedisManagerService (ioredis client)

  • KeycloakManagerService (Admin API)

  • NginxMonitoringService

  • SystemMetricsService

Phase 3: MCP Tools ✅

  • Tool registration with Zod schemas (6 tools)

  • Error handling middleware

  • Dual content format (text + structuredContent)

Phase 4: Integration ✅

  • AutoDiscoveryService integration (agent registration)

  • KeycloakAuthService (JWT authentication)

  • CommandQueueService (SQLite job queue)

  • DatabaseSyncService (PostgreSQL ↔ SQLite sync)

  • Graceful startup/shutdown with cleanup

Phase 5: Deployment ✅

  • Systemd service file with security hardening

  • PM2 ecosystem configuration

  • Security hardening guide (docs/SECURITY.md)

  • Deployment guide (docs/DEPLOYMENT.md)

  • Automated setup script (scripts/setup.sh)

  • Automated deployment script (scripts/deploy.sh)

  • Environment configuration (.env.example)

  • Production deployment on server.acdev.host (ready to deploy)

Phase 6: Advanced Features

  • Automated maintenance scheduler

  • Backup automation

  • Health check endpoint

  • Metrics export (Prometheus)

Contributing

SERVER-MCP follows IT-MCP's coding standards:

  • TypeScript Strict Mode: All code must pass tsc --strict

  • Service Layer: All operations in service classes, not tool handlers

  • Error Handling: Use CommandExecutionError with full context

  • No Floating Promises: Resolve or explicitly void all promises

  • Readonly by Default: All interface properties readonly unless mutation required

License

MIT

  • IT-MCP: Parent project - cross-platform diagnostic tool with distributed coordination

  • Agent Registry: Central coordination service (private repository)


Questions? Open an issue or contact the maintainers.

-
security - not tested
F
license - not found
-
quality - not tested

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/acampkin95/MCPCentralManager'

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