Skip to main content
Glama

MCP OpsBridge

Production MCP (Model Context Protocol) server exposing 30 DevOps tools for AI agents with a user approval system that prevents unauthorized write/destructive operations.

What It Does

Exposes 29 tools + 1 approve_action tool across 4 services, guarded by a risk-based permission gate:

Service

Tools

Read (Auto)

Write (Gated)

Destructive (Double Approval)

GitHub

7

All 7

—

—

Calendar

8

4 (list_calendars, query_events, get_event_details, find_free_slots)

3 (create_event, update_event, add_attendee)

1 (delete_event)

Database

9

3 (execute_query, list_tables, describe_table)

2 auto + 1 gated (insert_row, update_rows auto; delete_rows gated)

3 (truncate_table, drop_table, migrate_schema)

Slack

5

3 (list_channels, get_thread, get_channel_history)

2 (send_message, send_thread_reply)

—

Related MCP server: mcp-github-server

User Approval System

The permission gate intercepts medium+ risk tool calls and returns pending_approval instead of executing. The agent presents a structured request to the user, who confirms via the approve_action tool.

  • Low risk → Auto-execute (reads)

  • Medium/High → Single approval required

  • Critical → Double approval required (two separate confirms)

  • Timeout → Stale approvals auto-expire after 5 minutes

Architecture

┌──────────────────────────────────────────────────┐
│  CLIENTS                                         │
│  Claude Desktop (stdio) │ Custom Client (HTTP)   │
└────────────┬─────────────────────┬───────────────┘
             │                     │
             ▼                     ▼
┌──────────────────────────────────────────────────┐
│  MCP SERVER                                      │
│  ┌────────────────────────────────────────────┐  │
│  │ Transport: stdio | Streamable HTTP         │  │
│  │ Rate Limiter: 100 req/min user, 1000/hr IP│  │
│  │ Permission Gate: Risk → Pending/Execute   │  │
│  │ Validation: Zod schemas on all inputs      │  │
│  └────────────────────────────────────────────┘  │
└────────────┬─────────────────────┬───────────────┘
             │                     │
             ▼                     ▼
┌──────────────────────────────────────────────────┐
│  EXTERNAL APIs                                   │
│  GitHub │ Google Calendar │ PostgreSQL │ Slack    │
└──────────────────────────────────────────────────┘

Quick Start

Local Development

npm install
npm run dev        # stdio mode (default)
TRANSPORT=http PORT=3099 npm run dev   # HTTP mode

With Claude Desktop

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "opsbridge": {
      "command": "npx",
      "args": ["tsx", "src/cli.ts"],
      "env": {
        "GITHUB_TOKEN": "ghp_...",
        "DATABASE_URL": "postgresql://...",
        "SLACK_TOKEN": "xoxb-...",
        "CALENDAR_TOKEN": "ya29..."
      }
    }
  }
}

With Docker

cp .env.example .env
# Edit .env with your tokens
docker compose up -d

Environment Variables

Variable

Required

Description

GITHUB_TOKEN

No*

GitHub token (*required for private repos; public repos work without)

DATABASE_URL

No*

PostgreSQL connection string (*required for DB tools)

SLACK_TOKEN

No*

Slack bot token (xoxb-...) (*required for Slack tools)

CALENDAR_TOKEN

No*

Google Calendar OAuth token (*required for Calendar tools)

TRANSPORT

No

stdio (default) or http

PORT

No

HTTP port (default: 3002)

Security

  • Permission gate: Risk-based approval for write/destructive operations; critical ops require double approval

  • Read-only database: PostgreSQL session set to READ ONLY + write keyword blocklist

  • Rate limiting: LRU cache, 100 requests/minute per user, 1000/hour per IP

  • Scoped tokens: Each service requires its own token

  • Input validation: All tool inputs validated with Zod schemas

  • No secrets in code: All tokens loaded from environment variables

  • 5-minute approval timeout: Stale pending approvals auto-expire

Development

npm run build    # Compile TypeScript
npm run dev      # Start dev server (stdio)
npm test         # Run Vitest (71 tests)
npm run lint     # Type check
npm run format   # Prettier format

Tech Stack

  • TypeScript 5.5+

  • @modelcontextprotocol/sdk v1.29 (MCP protocol)

  • Zod (input validation)

  • @octokit/rest (GitHub API)

  • pg (PostgreSQL)

  • lru-cache (rate limiting + approval store)

  • Vitest (testing)

License

MIT

Available Tools

30 tools
approve_actionA

Confirm or deny a pending action that requires user approval. Use this to respond to pending_approval or pending_approval_2 responses.

Inputs: decision (required), approval_id (required), reason.

calendar_add_attendeeC

Add an attendee to an existing event (requires approval)

Inputs: email (required), event_id (required), calendar_id.

calendar_create_eventB

Create a calendar event with optional attendees (requires approval)

Inputs: summary (required), end_time (required), start_time (required), attendees, +2 more.

calendar_delete_eventA

Delete a calendar event (double approval required — irreversible)

Inputs: event_id (required), calendar_id.

calendar_find_free_slotsB

Find mutually available time slots across calendars

Inputs: time_max (required), time_min (required), calendar_ids, duration_minutes.

calendar_get_event_detailsA

Get detailed information about a single event including attendees and description

Inputs: event_id (required), calendar_id.

calendar_list_calendarsA

List all calendars accessible by the authenticated user

Inputs: no named parameters.

calendar_query_eventsA

List events in a date range from Google Calendar

Inputs: time_max (required), time_min (required), calendar_id, max_results.

calendar_update_eventA

Update an existing calendar event (requires approval)

Inputs: event_id (required), summary, end_time, start_time, +2 more.

db_delete_rowsA

Delete rows from a table matching a WHERE clause (requires approval)

Inputs: table (required), where (required), params (required).

db_describe_tableB

Show columns and types for a table

Inputs: table (required), schema.

db_drop_tableA

Drop a table — permanently removes table and data (double approval required)

Inputs: table (required), if_exists.

db_execute_queryA

Execute a read-only SQL query against PostgreSQL

Inputs: query (required), params.

db_insert_rowA

Insert a new row into a table (auto-approved, logged)

Inputs: data (required), table (required).

db_list_tablesB

List all tables in a database schema

Inputs: schema.

db_migrate_schemaA

Execute a schema migration (ALTER/CREATE/DROP) — structural change (double approval required)

Inputs: query (required).

db_truncate_tableA

Truncate a table — removes all rows (double approval required)

Inputs: table (required), cascade.

db_update_rowsA

Update rows in a table matching a WHERE clause (auto-approved, logged)

Inputs: data (required), table (required), where (required), params (required).

github_get_commitsB

Get commit history for a branch

Inputs: repo (required), limit, branch.

github_get_file_contentsB

Get contents of a file or directory from a repository

Inputs: path (required), repo (required), branch.

github_get_pull_requestsB

Get pull requests in a repository with diff statistics

Inputs: repo (required), limit, state.

github_get_repo_statsB

Get repository statistics: stars, forks, open issues, recent commits

Inputs: repo (required).

github_list_branchesB

List all branches in a repository

Inputs: repo (required), limit.

github_list_reposA

List repositories for the authenticated user with metadata

Inputs: sort, type, limit.

github_search_issuesC

Search issues in a GitHub repository by query, state, and label

Inputs: repo (required), query (required), limit, state.

slack_get_channel_historyC

Get recent messages from a Slack channel

Inputs: channel (required), limit, cursor.

slack_get_threadB

Retrieve messages in a thread

Inputs: ts (required), channel (required), limit.

slack_list_channelsC

List accessible Slack channels

Inputs: limit, cursor.

slack_send_messageB

Send a message to a Slack channel (requires approval)

Inputs: text (required), channel (required), thread_ts.

slack_send_thread_replyA

Send a reply in a Slack thread (requires approval)

Inputs: text (required), channel (required), thread_ts (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.3/5.0

    Scored across 30 tools

    Disambiguation5/5

    Every tool is clearly namespaced by service (github_, calendar_, db_, slack_) and performs a distinct action. No two tools have overlapping purposes; even similar actions like calendar_query_events and calendar_get_event_details are clearly differentiated.

    Naming Consistency5/5

    All tool names follow a consistent snake_case pattern of domain_verb_noun (e.g., github_search_issues, db_execute_query, slack_send_message). The standalone approve_action still fits the verb_noun convention. No naming style mixing.

    Tool Count2/5

    At 30 tools, the server exceeds the 25+ threshold for 'too many'. While the tools are grouped by service, the overall count is heavy for a single MCP server and could overwhelm agents. Splitting into separate domain servers would be more appropriate.

    Completeness3/5

    Calendar, database, and Slack domains have full lifecycle coverage (CRUD and actions). However, the GitHub domain is read-only—no create/update/merge operations—which is a notable gap for an ops bridge. Also missing some actions like Slack message deletion or calendar availability beyond free slots.

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      Not graded
      maintenance
      A high-performance Go-based MCP server that provides a microservice architecture for orchestrating diverse tools through gRPC and HTTP/REST APIs. Enables seamless integration of language-agnostic tools including ML capabilities, web search, calculations, and human interaction for intelligent agent workflows.
      2
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      A production-grade MCP server providing 18 tools for comprehensive GitHub interaction, including repository management, issues, pull requests, code search, and CI/CD status, with Redis caching and rate limit handling.
      16 npm
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      A modular MCP server exposing tools for integrating with services like GitHub, Redash, Jenkins, Figma, Jira, Confluence, Teams, Datadog, PagerDuty, Slack, and Presto, enabling users to manage these platforms through natural language via an MCP client.
      -