Skip to main content
Glama

Adi MCP

A remote Model Context Protocol server that exposes tools from many services through one endpoint, deployed on Cloudflare Workers.

Every integration lives in its own package and knows nothing about any other. Adding a provider means creating a folder and adding one line to a registration array — no existing code changes.

MCP client (Claude, etc.)
        │  Streamable HTTP + bearer/OAuth
        ▼
   ┌─────────────┐
   │  /mcp       │  Hono on Cloudflare Workers
   │  CORS · security headers · auth · rate limit
   └──────┬──────┘
          │  ProviderRegistry
   ┌──────┴───────────────────────────────────┐
   │  x   linkedin   github   gmail   notion  │  …13 providers + system
   └──────┬───────────────────────────────────┘
          │  per-provider credentials (KV, encrypted)
          ▼
   third-party APIs

Status

Provider

Auth

State

X

OAuth 2.0 + PKCE

Implemented — post, read profile, search, delete

LinkedIn

OAuth 2.0

Implemented — read profile, share post

GitHub

OAuth 2.0

Scaffold

Gmail

Google OAuth 2.0

Scaffold

Google Calendar

Google OAuth 2.0

Scaffold

Notion

OAuth 2.0

Scaffold

Obsidian

Bearer (Local REST API plugin)

Scaffold

Postgres

Connection string

Scaffold

Supabase

Service-role key

Scaffold

Stripe

API key

Scaffold

Resend

API key

Scaffold

Filesystem

Sandboxed local root

Scaffold

Browser

Browser Rendering / CDP

Scaffold

system

none

Implemented — server introspection

Scaffold means the package is structurally complete — real Zod schemas, real validation, real credential wiring, registered and discoverable over MCP — but execute() throws a NotImplementedError that MCP clients receive as a normal tool error. Filling one in means writing its API client; nothing else has to change. See docs/ADDING_PROVIDERS.md.

Related MCP server: Remote MCP Server (Authless)

Quickstart

pnpm install

Create apps/server/.dev.vars (wrangler's local secrets file — it does not read .env):

MCP_BEARER_TOKEN=some-long-random-string
LOG_LEVEL=debug

Start the server:

pnpm dev

Then check it is alive:

curl http://127.0.0.1:8787/health
{ "status": "ok", "server": "adi-mcp", "version": "0.1.0", "providers": 14, "tools": 29 }

List the tools over MCP:

curl -s -X POST http://127.0.0.1:8787/mcp -H "Authorization: Bearer some-long-random-string" -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'

Connecting a client

Point any MCP client at https://<your-worker>.workers.dev/mcp with an Authorization: Bearer <MCP_BEARER_TOKEN> header. The server advertises its auth scheme at /.well-known/oauth-protected-resource so compliant clients can discover it after a 401.

For clients that sign in rather than take a pasted token — Claude Desktop, Claude on the web — set AUTH_STRATEGY=oauth2. That turns on the built-in OAuth 2.1 authorization server (/.well-known/oauth-authorization-server, dynamic client registration, PKCE), so the client can register and complete a sign-in flow on its own. See docs/OAUTH.md.

Provider credentials are separate from that token — connect each service once via /providers/<id>/connect. See docs/OAUTH.md.

Commands

pnpm dev              # wrangler dev on :8787
pnpm test             # all 294 tests
pnpm test:coverage    # with coverage report
pnpm typecheck        # tsc across every package
pnpm lint             # eslint, type-aware
pnpm format           # prettier
pnpm build            # wrangler dry-run bundle
pnpm scaffold:provider <id> "<Name>" <credential-kind>

Local Postgres for the postgres provider:

docker compose up -d postgres

Documentation

Doc

What's in it

Architecture

Layers, request lifecycle, why it's built this way

Deployment

KV setup, secrets, deploying to Cloudflare

Adding providers

Step-by-step new integration

OAuth

Both auth layers explained end to end

Tools

Writing tools: schemas, validation, errors, docs

Resources & prompts

The other two MCP primitives

Layout

apps/server/        Cloudflare Worker: Hono app, MCP endpoint, OAuth routes
packages/core/      Provider/Tool/Resource/Prompt types, registry, logger, errors, KV, rate limit
packages/auth/      Auth strategies + credential providers (OAuth2, API key, bearer)
packages/<id>/      One isolated package per integration
shared/             Env bindings and constants shared across packages
scripts/            Provider scaffolding script
docs/               The docs above

License

MIT

Related MCP Connectors

  • Remote streamable-HTTP MCP server running on a single Cloudflare Worker. Your assistant gets live Airbnb, Amazon, Booking.com, Google Flights, Maps and Reddit data, social search on X, Instagram and TikTok, the Meta Ad Library, and image/video generation without any keys. Connect your own accounts to let it send WhatsApp or Telegram messages, work an IMAP inbox, manage Meta Ads campaigns and publish to X and LinkedIn. OAuth 2.1 with PKCE; stored credentials are AES-256-GCM encrypted.

  • MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.

  • The Remote MCP server acts as a standardized bridge between LLM applications (like Claude, ChatGPT, and Cursor) and external services, enabling AI agents to access external tools and resources. Its primary capability is providing a centralized search tool to discover other MCP servers and their respective tools. Unlike local implementations, it runs remotely with OAuth authentication and permission controls for security.

  • Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows

Related MCP Servers