WhatsApp MCP Platform
Provides tools for interacting with WhatsApp, enabling messaging, session control, and webhook normalization for WhatsApp messages.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@WhatsApp MCP PlatformSend a WhatsApp message to +15551234567 saying 'Hello'."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Normal
Normal is a personal platform that lets approved AI clients work with a connected WhatsApp account through the Model Context Protocol.
Each User owns one Personal Account. A Personal Account can hold up to three WhatsApp Connections and can grant each MCP Client access to an explicit set of Connections and capabilities. Read access and send access are separate permissions. Every outbound message requires confirmation in the MCP Client.
The platform is currently built for a private beta. Privacy, deletion, auditability, and safe recovery are part of the core design, not optional layers added later.
What is in this repo
This is a Bun and Turbo monorepo with seven deployable apps:
Path | Purpose | Runtime |
| Product UI, connection management, and OAuth consent | Next.js on Vercel |
| Static API reference generated from the shared OpenAPI contracts | Astro and Scalar on Vercel |
| Public HTTP API, OAuth server, MCP endpoint, webhook ingestion, and scheduled reconciliation | Cloudflare Workers |
| Private boundary for provider provisioning and control | Cloudflare Workers |
| Continues deletion after access and key use have stopped | Cloudflare Workers |
| Reconciles restored data with deletion markers and recovery rules | Cloudflare Workers |
| Runs authenticated, serialized, non-serving production recovery drills | Cloudflare Workers and Workflows |
| Independently verifies guarded recovery branches and aggregate objectives | Cloudflare Workers |
| Exercises disposable quarterly KV, Queue, R2, KMS, and pager capabilities | Cloudflare Workers |
Shared code is split by responsibility:
Path | Purpose |
| Pure domain rules and state transitions |
| MCP, API, health, handle, and service binding schemas |
| Drizzle schema, migrations, RLS-aware repositories, and database tools |
| Thin provider adapter for connection lifecycle, media, and webhook normalization |
| OpenTofu configuration for Cloudflare, Vercel, Neon, and AWS KMS |
| Deployment, validation, recovery, observability, and launch gate tooling |
The API Worker is the public data plane. Provider credentials stay behind the private provider-control service binding. Neon is the authoritative data store, while Cloudflare bindings handle edge protocol state, queues, and encrypted webhook payloads.
Related MCP server: WhatsApp MCP Server
Requirements
You need:
Bun 1.3.14
Node.js 20 or newer for supporting tools
Wrangler through the pinned workspace dependency
OpenTofu 1.12.5 for infrastructure validation
Chromium and its host dependencies for browser tests
For local provider or deployment work, you will also need access to the relevant Clerk, Cloudflare, Neon, AWS, Vercel, and Wasender environments.
Local setup
Install the pinned dependencies:
bun install --frozen-lockfileCreate local secret files only for the apps you plan to run:
cp apps/api/.dev.vars.example apps/api/.dev.vars
cp apps/provider-control/.dev.vars.example apps/provider-control/.dev.vars
cp apps/deletion-coordinator/.dev.vars.example apps/deletion-coordinator/.dev.vars
cp apps/restore-coordinator/.dev.vars.example apps/restore-coordinator/.dev.vars
cp apps/recovery-control/.dev.vars.example apps/recovery-control/.dev.vars
cp apps/web/.env.example apps/web/.env.localThe example files document the required values. Never commit .dev.vars, .env.local, credentials, tokens, phone numbers, provider payloads, or decrypted message content.
Start the web app and API Worker together:
bun run devYou can also run one workspace directly:
bun run --cwd apps/web dev
bun run --cwd apps/api dev
bun run --cwd apps/provider-control devIf a real external webhook needs to reach your local Worker, run the configured Cloudflare tunnel in another terminal:
bun run dev:tunnelVerification
CI runs these checks in order:
bun run format:check
bun run lint
bun run typecheck
bun run validate:infra
bun run test
bun run build
bun run manifests:validate
bun run observability:validate
bun run infra:validateThe release and deployed-environment gates are separate from ordinary pull request verification:
bun run launch:gate
bun run release:public-api
bun run deploy:smokeInstall the pinned browser once before the first full test run:
bun x playwright install --with-deps chromiumTests intentionally exercise production-shaped boundaries. API, provider-control, and recovery-control tests use the pinned Cloudflare Vitest runtime; the deletion and restore coordinator suites use ordinary Vitest. Browser tests use a production Next.js build and a test-only Wrangler API, while database tests apply production migrations in PGlite and switch to restricted runtime roles with RLS. Test composition roots must never become selectable from a production build.
bun run build also dry-runs production Worker bundles and scans Worker, source-map, Next.js, and docs output for test fixtures, controlled credentials, and fault-injection markers.
For focused work, use Turbo filters or workspace commands:
bun x turbo run test --filter=@whatsapp-mcp/api
bun x turbo run typecheck --filter=@whatsapp-mcp/web
bun run --cwd packages/db testThe root test script always runs scripts/*.test.ts before Turbo. Run the API public-boundary composition or one browser journey directly with:
(cd apps/api && bun x vitest run --config vitest.public-boundary.config.ts)
(cd apps/web && bun x playwright test test/browser/api-keys.spec.ts)Database changes
Database code and versioned production migrations live in packages/db. These commands require the direct TLS Neon owner URL in MIGRATION_DATABASE_URL; never configure it on a deployable app.
bun run --cwd packages/db db:generate
bun run db:migrate
bun run db:checkDo not edit a migration that has shipped. Preserve tenant foreign keys, runtime role grants, fixed search paths, RLS policies, deletion behavior, and restore behavior. Tests must exercise the production migration path.
Generate the public OpenAPI artifact with bun run --cwd packages/contracts generate:openapi. Building apps/docs also regenerates apps/docs/public/openapi.json and copies the pinned Scalar browser asset; do not hand-edit either generated file.
Architecture and operations
Start with these documents:
CONTEXT.mddefines the product language and invariants.docs/architecture.mdmaps the production boundaries and primary data flows.docs/mcp-contract.mddefines MCP tools, resources, authorization, errors, and pagination.docs/configuration.mdlists runtime configuration and secret ownership.docs/testing.mdexplains the public boundary test strategy.docs/wasender-seam.mddefines the provider boundary.docs/stored-media-container.mddescribes encrypted Stored Media.docs/adrrecords architectural decisions.docs/runbookscontains deployment, incident, recovery, security, and teardown procedures.
The most important rules are simple:
Use the terms in
CONTEXT.mdin code, tests, and docs.Keep provider details behind
packages/wasenderandapps/provider-control.Fail closed when identity, authorization, audit, quota, encryption, or configuration is unavailable.
Never retry an outbound send when provider acceptance is ambiguous.
Keep logs and telemetry free of message content, credentials, full phone numbers, provider identifiers, and tenant identifiers unless an approved contract explicitly allows them.
Make deletion and restore behavior explicit for every new persisted record.
Deployment
Development, preview, and production have separate configuration and infrastructure authority. Do not deploy by improvising commands from local manifests.
Follow docs/runbooks/deployment.md, but use the production workflow as the executable deployment order: migrate and check the database, then deploy provider-control, deletion coordinator, restore coordinator, recovery control, the rendered API, web, docs, and finally smoke the release. Production recovery, key rotation, replay, break-glass access, and environment teardown each have dedicated runbooks under docs/runbooks.
Sandcastle
Sandcastle can run issue agents in isolated Docker worktrees. After authenticating Docker, GitHub CLI, and Codex:
bun run sandcastle:build-image
bun run sandcastleAgent specific issue and triage guidance lives in docs/agents.
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
- AlicenseCqualityDmaintenanceA Model Context Protocol server that enables Claude to interact with WhatsApp through the Evolution API, allowing for message sending, contact management, group operations, and WhatsApp instance administration.15632MIT
- AlicenseCqualityFmaintenanceA Model Context Protocol server that connects your personal WhatsApp account to AI agents like Claude, enabling them to search messages, view contacts, retrieve chat history, and send messages via WhatsApp.71170ISC
- AlicenseNot gradedqualityNot gradedmaintenanceA Model Context Protocol server that integrates with WaPulse WhatsApp Web API, enabling users to send messages, manage groups, handle files, and perform various WhatsApp operations programmatically.31
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables interaction with WhatsApp through local stdio or remote HTTP/SSE connections. It allows users to send messages, manage groups, and access chat history using natural language.513MIT
Related MCP Connectors
A Model Context Protocol server for Wix AI tools
Hosted MCP server for the Wavix telecom platform: SMS, voice, 2FA, SIP, numbers, 10DLC, CDRs.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
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/cuevaio/normal'
If you have feedback or need assistance with the MCP directory API, please join our Discord server