MCP HUB

The Ultimate Control Plane for MCP Unlock the full power of Model Context Protocol with zero friction. One-Click GPT Integration: Bridge the gap between MCP servers and ChatGPT/LLMs instantly. No more manual config hunting. Pro-Level Orchestration: Manage, monitor, and toggle multiple MCP tools from a single, intuitive dashboard. Secure by Design: Built-in support for complex auth flows and 2FA, making enterprise-grade tool integration seamless. Streamlined Debugging: Test queries and inspect tool responses in real-time without leaving the hub. Stop wrestling with JSON configs. Start building agentic workflows that actually work.

MCP Hub

License: MIT Docker Python 3.11+ FastAPI

MCP Hub is a self-hosted, multi-user gateway that connects your favorite tools — Teamwork, Slack, Telegram, Miro, Figma — to AI assistants like ChatGPT, Claude Desktop, and Cursor via the Model Context Protocol (MCP).

One server. Multiple integrations. Full control over your data.


Why MCP Hub?

ProblemMCP Hub Solution
ChatGPT can't access your Teamwork tasksConnect once, use everywhere
Claude Desktop needs separate configs per toolSingle MCP endpoint for all integrations
Worried about token securityTokens encrypted at rest, never exposed to AI
Need audit trail for complianceEvery AI action logged with user, tool, and result
Team needs shared accessMulti-user with admin approval workflow
Complex deploymentSingle Docker container, SQLite, zero external deps

Key Features

One Gateway, Many Integrations

  • Teamwork: Projects, tasks, task lists, subtasks, time tracking, tags, comments, workflows
  • Slack: Channels, messages, DMs, users, search, canvases
  • Telegram: Dialogs, messages, search, history (via MTProto/Telethon)
  • Miro: Boards, items, sticky notes, text, shapes, cards, connectors
  • Figma: Dev layout extraction, images, comments, components, styles
  • More integrations coming soon!

Native MCP Protocol

  • Works with ChatGPT (via OAuth 2.0 + PKCE)
  • Works with Claude Desktop (via Bearer token)
  • Works with Cursor and any MCP-compatible client
  • JSON-RPC 2.0 over HTTP with streamable responses

Enterprise-Ready Security

  • OAuth 2.0 + PKCE for ChatGPT integration (RFC 8414, RFC 7591, RFC 9728)
  • AES-256 encryption for stored tokens
  • JWT-based authentication with configurable expiration
  • Personal Access Tokens (PAT) for long-lived API access
  • Client Credentials for machine-to-machine auth

Full Audit Trail

  • Every tool call logged with timestamp, user, provider, action, and status
  • Request/response details for debugging
  • Filter by user, provider, date range
  • Export-ready for compliance

Multi-User Support

  • User registration with admin approval workflow
  • Per-user integration connections (each user connects their own accounts)
  • Role-based access (admin/user)
  • User management dashboard

Easy Deployment

  • Single Docker containerdocker-compose up -d
  • SQLite database — no external database required
  • Zero external dependencies — runs anywhere
  • Environment-based configuration — 12-factor app ready

Quick Start

Option 1: Docker (Recommended)

# Clone the repository
git clone https://github.com/Vangardo/mcp_hub.git
cd mcp_hub

# Configure environment
cp .env.example .env
nano .env  # Edit with your settings

# Start with Docker Compose
cd docker
docker-compose up -d

# Access the UI
open http://localhost:8000

Option 2: Local Development

# Create virtual environment
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# Install dependencies
pip install -r requirements.txt

# Configure environment
cp .env.example .env
nano .env

# Run the server
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload

Configuration

Required Environment Variables

# Admin credentials (first user, auto-created)
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=your-secure-password

# Security keys (generate unique values!)
JWT_SECRET=your-jwt-secret-min-32-chars
TOKENS_ENCRYPTION_KEY=your-32-char-encryption-key

# Base URL (internal, used if public URL not set)
BASE_URL=http://localhost:8000

Optional Environment Variables

# Database location
DATABASE_PATH=data/app.db

# Teamwork OAuth (get from https://developer.teamwork.com/)
TEAMWORK_CLIENT_ID=your-client-id
TEAMWORK_CLIENT_SECRET=your-client-secret

# Slack OAuth (get from https://api.slack.com/apps)
SLACK_CLIENT_ID=your-client-id
SLACK_CLIENT_SECRET=your-client-secret

# Miro OAuth (get from https://miro.com/app/settings/user-profile/apps)
MIRO_CLIENT_ID=your-client-id
MIRO_CLIENT_SECRET=your-client-secret

# Figma OAuth (get from https://www.figma.com/developers/apps)
FIGMA_CLIENT_ID=your-client-id
FIGMA_CLIENT_SECRET=your-client-secret

# Telegram MTProto (get from https://my.telegram.org/)
TELEGRAM_API_ID=your-api-id
TELEGRAM_API_HASH=your-api-hash

Admin Settings (Web UI)

Navigate to Admin → Settings to configure:

  • Public Base URL — Used for OAuth redirects and GPT config
  • Public Host — Domain name for URL generation
  • Integration credentials — Can also be set via environment

Usage Guide

For Users

  1. Sign Up — Request access at /signup
  2. Wait for Approval — Admin approves your request
  3. Connect Integrations — On the Integrations page, connect Teamwork/Slack/Telegram/Miro/Figma
  4. Get Config — Click "Get GPT Config" to get your MCP configuration
  5. Use with AI — Paste config into ChatGPT, Claude, or Cursor

For Admins

  1. Approve Users — Navigate to Admin → Users
  2. Monitor Usage — Check Admin → Audit for activity logs
  3. Configure Settings — Set public URL and credentials in Admin → Settings
  4. Manage Integrations — View all user connections

Connecting to AI Assistants

ChatGPT (Actions / GPT Builder)

  1. In MCP Hub, click Get GPT Config
  2. Switch to OAuth tab
  3. Copy the Server URL (e.g., https://your-domain.com/mcp)
  4. In ChatGPT, create a new Action with:
    • Server URL: Your MCP endpoint
    • Authentication: OAuth 2.0
    • ChatGPT will auto-discover OAuth endpoints via RFC 8414

Claude Desktop

  1. In MCP Hub, click Get GPT Config
  2. Stay on Bearer JSON tab
  3. Generate a Personal Access Token (PAT) for long-lived access
  4. Copy the JSON config to your Claude Desktop settings

Example claude_desktop_config.json:

{
  "mcpServers": {
    "mcp-hub": {
      "url": "https://your-domain.com/mcp",
      "headers": {
        "Authorization": "Bearer your-pat-token"
      }
    }
  }
}

Cursor / Other MCP Clients

Same as Claude Desktop — use Bearer token authentication with the MCP endpoint URL.


Available Tools

Hub Tools

ToolDescription
hub.integrations.listList all connected integrations and available tools
hub.tools.listList tools for a specific provider
hub.tools.callCall a provider tool via the hub

Teamwork Tools

ToolDescription
teamwork.projects.listList all projects
teamwork.people.listList team members
teamwork.people.meGet current user
teamwork.tasks.listList tasks with filters
teamwork.tasks.due_todayGet tasks due today
teamwork.tasks.overdueGet overdue tasks
teamwork.tasks.bulk_createCreate up to 10 tasks
teamwork.tasks.bulk_updateUpdate up to 10 tasks
teamwork.tasks.completeMark task as complete
teamwork.tasks.getGet a task by ID
teamwork.tasklists.listList task lists in a project
teamwork.subtasks.createCreate a subtask
teamwork.subtasks.listList subtasks
teamwork.time.logLog time entry
teamwork.time.listList time entries
teamwork.time.totalsGet time totals
teamwork.tags.listList tags
teamwork.tags.ensureEnsure tags exist
teamwork.tags.createCreate tag
teamwork.tags.updateUpdate tag
teamwork.tags.deleteDelete tag
teamwork.comments.addAdd comment to task
teamwork.comments.listList task comments
teamwork.workflows.listList workflow stages
teamwork.stages.listList board columns
teamwork.columns.listList board columns (alias)
teamwork.tasks.set_stageMove task to stage
teamwork.tasks.set_stage_by_nameMove task by stage name
teamwork.tasks.move_to_columnMove task to column
teamwork.tasks.move_to_column_by_nameMove task by column name

Slack Tools

ToolDescription
slack.channels.listList all channels
slack.users.listList workspace users
slack.users.meGet current user
slack.users.infoGet user details
slack.users.find_by_emailFind user by email
slack.messages.postPost message to channel
slack.messages.historyGet channel history
slack.dm.listList direct messages
slack.dm.group_listList group DMs
slack.dm.sendSend direct message
slack.dm.historyGet DM history
slack.dm.openOpen DM
slack.dm.open_groupOpen group DM
slack.canvas.createCreate a canvas
slack.canvas.editEdit canvas content
slack.canvas.deleteDelete canvas
slack.canvas.shareShare canvas
slack.canvas.sections_lookupLookup canvas sections
slack.canvas.access_listList canvas access

Telegram Tools

ToolDescription
telegram.users.meGet current user
telegram.dialogs.listList all chats
telegram.messages.sendSend message
telegram.messages.searchSearch messages
telegram.messages.historyGet chat history

Miro Tools

ToolDescription
miro.boards.listList boards
miro.boards.getGet board details
miro.boards.createCreate board
miro.boards.updateUpdate board
miro.boards.deleteDelete board
miro.boards.copyCopy board
miro.boards.membersList board members
miro.boards.shareShare board
miro.users.meGet current user
miro.items.listList board items
miro.items.getGet item details
miro.items.deleteDelete item
miro.sticky_notes.bulk_createCreate sticky notes
miro.text.bulk_createCreate text items
miro.shapes.bulk_createCreate shapes
miro.cards.bulk_createCreate cards
miro.connectors.bulk_createCreate connectors

Figma Tools

ToolDescription
figma.dev.get_pageExtract CSS-ready layout
figma.files.get_layoutGet compact layout tree
figma.users.meGet current user
figma.files.get_metaGet file metadata
figma.files.getRaw file JSON (use with care)
figma.files.get_nodesRaw node JSON
figma.images.exportExport nodes as images
figma.images.get_fillsGet image fill URLs
figma.files.versionsList file versions
figma.comments.listList comments
figma.comments.createCreate comment
figma.comments.deleteDelete comment
figma.projects.listList team projects
figma.projects.filesList files in a project
figma.components.list_teamList team components
figma.components.list_fileList file components
figma.components.getGet component
figma.styles.list_teamList team styles
figma.styles.list_fileList file styles
figma.styles.getGet style

Architecture

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│   ChatGPT       │     │  Claude Desktop │     │     Cursor      │
│   (OAuth 2.0)   │     │  (Bearer Token) │     │  (Bearer Token) │
└────────┬────────┘     └────────┬────────┘     └────────┬────────┘
         │                       │                       │
         └───────────────────────┼───────────────────────┘
                                 │
                                 ▼
                    ┌────────────────────────┐
                    │       MCP Hub          │
                    │  ┌──────────────────┐  │
                    │  │  OAuth Server    │  │
                    │  │  (RFC 8414)      │  │
                    │  └──────────────────┘  │
                    │  ┌──────────────────┐  │
                    │  │  MCP Gateway     │  │
                    │  │  (JSON-RPC 2.0)  │  │
                    │  └──────────────────┘  │
                    │  ┌──────────────────┐  │
                    │  │  Audit Logger    │  │
                    │  └──────────────────┘  │
                    └────────────────────────┘
                                 │
         ┌───────────────────────┼───────────────────────┐
         │                       │                       │
         ▼                       ▼                       ▼
┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│   Teamwork      │     │     Slack       │     │    Telegram     │
│   (OAuth 2.0)   │     │   (OAuth 2.0)   │     │   (MTProto)     │
└─────────────────┘     └─────────────────┘     └─────────────────┘

Database

MCP Hub uses SQLite for simplicity and portability. The database is automatically created and migrated on startup.

Location: DATABASE_PATH (default: data/app.db)

Tables:

  • users — User accounts and roles
  • connections — OAuth tokens (encrypted) and connection metadata
  • refresh_tokens — JWT refresh tokens
  • personal_access_tokens — Long-lived PAT tokens
  • api_clients — Client credentials for OAuth
  • audit_logs — Tool call audit trail
  • app_settings — Admin configuration (public URL, credentials)
  • oauth_states — Temporary OAuth state tokens

API Documentation

Interactive API docs available at /docs (Swagger UI) and /redoc (ReDoc).

Key endpoints:

  • POST /auth/login — User login
  • POST /auth/refresh — Refresh access token
  • POST /auth/personal_token — Create PAT
  • GET /integrations — List integration status
  • POST /mcp — MCP JSON-RPC endpoint
  • GET /config/mcp — Get MCP configuration
  • GET /.well-known/oauth-authorization-server — OAuth metadata (RFC 8414)

Development

Running Tests

pytest tests/ -v

Code Style

ruff check app/
ruff format app/

Adding New Integrations

  1. Create a new folder in app/integrations/your_integration/
  2. Implement the BaseIntegration interface
  3. Define tools in a tools.py file
  4. Register in app/integrations/registry.py

Troubleshooting

"Invalid or expired refresh token"

  • Session may have expired. Log out and log in again.
  • Check that your server time is synchronized (NTP).

OAuth callback fails

  • Verify PUBLIC_BASE_URL is set correctly in Admin → Settings
  • Ensure the callback URL is registered in your OAuth app settings

Telegram connection fails

  • Make sure TELEGRAM_API_ID and TELEGRAM_API_HASH are set
  • Check that your phone number format is correct (with country code)

ChatGPT can't connect

  • Verify your server is accessible from the internet
  • Check that /.well-known/oauth-authorization-server returns valid JSON
  • Ensure CORS headers allow ChatGPT's domain

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Submit a pull request

License

MIT License — see LICENSE for details.


Support


MCP Hub — Connect your tools. Supercharge your AI.

Related Servers