MCP Server
Zindua for Cursor & Claude
Local MCP server for Cursor and Claude Desktop. Closed-loop OTP: diagnose your live project, scaffold a certified snippet, then send a test only after you confirm a recipient. Same config for Node, Python, ASP.NET, PHP, or WordPress.
New to MCP? You do not need to understand the protocol. You add one JSON file, put your Zindua API key in the environment, reload the editor, then type one sentence in chat. The assistant calls Zindua tools for you.
Simple guide for first-time users
Five steps. Same idea for Cursor and Claude — only the config file path changes.
Get a Zindua test key
Dashboard → create a project → copy a znd_test_ key. Connect Gmail/SMTP (email) and/or WhatsApp if you need that channel. Create one OTP template (slug + {{code}}).
Install Node.js 18+ on your computer
Only needed so Cursor/Claude can run npx. Your app can still be Python, C#, or PHP.
Add the JSON config (pick Cursor or Claude tab below)
This is the only install step. Do not npm i @zindua/mcp into your app.
Reload and check that zindua is connected
Cursor: Settings → Tools & MCP. Claude Desktop: restart the app after editing the config.
Type one sentence in chat
Start with: “Run zindua_workflow_otp for my project.” Fix anything the tool says is missing, then ask it to scaffold and (after you confirm a recipient) send a test.
Do not confuse npm install with editor setup
The npm page shows npm i @zindua/mcp by default. That command is optional and usually unnecessary. For Cursor or Claude you add an mcp.json-style config with npx. The editor downloads and runs the MCP server. You are not adding @zindua/mcp to your app dependencies.
- Do this: Create the editor config below, put your API key in env, reload.
- Skip this: npm i @zindua/mcp inside your Python, .NET, PHP, or Node app. That does not connect the editor by itself.
- When npm i is useful: Only if you want a pinned local binary for advanced setups. Day-to-day: use npx in the config.
Your project key
Doctor checks the key and whether email or WhatsApp is ready.
One JSON file
Cursor: .cursor/mcp.json · Claude: claude_desktop_config.json
Real templates
Workflow recommends exact slugs before any code is written.
Closed loop
Diagnose → scaffold → validate → send (you confirm) → watch log.
Cursor or Claude?
Same MCP server. Pick a tab. Slash commands (/zindua-ship) exist in Cursor with the plugin; Claude uses plain chat.
Open Cursor Settings → Tools & MCP
macOS: Cmd+Shift+J · Windows/Linux: Ctrl+Shift+J. Or create the JSON file manually.
Create .cursor/mcp.json
In the project root: mkdir -p .cursor then paste the config. First run downloads @zindua/mcp via npx.
Reload and verify
Save, reload the Cursor window, confirm the zindua server is connected under Tools & MCP.
Chat: start the closed loop
Type: “Run zindua_workflow_otp for my app.” Or use /zindua-ship / /zindua-doctor if you installed the Cursor plugin. Slash commands are Cursor-only; Claude uses natural language.
Replace YOUR_ZINDUA_API_KEY, or use ${env:ZINDUA_API_KEY} and export the key in your shell so you can commit mcp.json without secrets.
.cursor/mcp.json
{
"mcpServers": {
"zindua": {
"command": "npx",
"args": ["-y", "@zindua/mcp@latest"],
"env": {
"ZINDUA_API_KEY": "YOUR_ZINDUA_API_KEY"
}
}
}
}Safer for git (env reference)
{
"mcpServers": {
"zindua": {
"command": "npx",
"args": ["-y", "@zindua/mcp@latest"],
"env": {
"ZINDUA_API_KEY": "${env:ZINDUA_API_KEY}"
}
}
}
}This project (recommended)
.cursor/mcp.jsonAt the root of your app repo (FastAPI, ASP.NET, Laravel, Next.js, …). Teammates who open the folder in Cursor get the same tools.
All Cursor projects
~/.cursor/mcp.jsonIn your user home folder. Available in every workspace on your machine.
What do I type next?
Copy these into chat. The assistant should call the tools — you do not run npm scripts for this.
Diagnose
“Run zindua_workflow_otp for my project (stack nextjs, channel email).”
Checks key, email/WhatsApp readiness, and suggests real OTP templates. If stopCodegen is true, connect the channel in the dashboard first.
Scaffold
“Call zindua_scaffold with stack fastapi and my recommended template slug.”
Returns a short certified snippet. Never invents slugs.
Validate + send (you confirm)
“I confirm: validate then send a test to me@example.com with template otp-verification channel email.”
Live keys are blocked unless you explicitly allow forceLive. Prefer znd_test_.
Watch delivery
“Run zindua_watch_log with that logId.”
Polls until delivered or failed and suggests the next fix.
Python, ASP.NET, PHP, Node… same MCP
The editor talks to Zindua. Your app SDK is a separate step after templates are known.
| Your app | Editor MCP | Then install in the backend |
|---|---|---|
| Any stack in Cursor / Claude | Same npx @zindua/mcp config | After workflow/scaffold, install the SDK for your language |
| Node / Next.js / Fastify | mcp.json only (no npm i @zindua/mcp) | npm i @zindua/sdk in the backend |
| Python / FastAPI | mcp.json only (Node needed for editor npx) | pip install zindua in the Python env |
| ASP.NET / .NET | mcp.json only | dotnet add package Zindua.Sdk |
| PHP / Laravel | mcp.json only | composer require zindua/sdk |
| WordPress | mcp.json in a plugin/theme workspace if you use Cursor | Official plugin or PHP SDK on the server |
my-otp-app/ ← any stack (Python, .NET, PHP, Node…)
├── .cursor/
│ └── mcp.json ← ONLY file required for Cursor MCP
├── .env ← ZINDUA_API_KEY for YOUR app SDK (server-side)
├── .gitignore
└── … your app code …Test email and WhatsApp
Connect the channel in the Zindua dashboard first. Then use MCP tools from chat.
Email OTP
- Dashboard
- Email service connected in the dashboard (Gmail / SMTP).
- to
- A normal email address, e.g. you@example.com
“Run zindua_workflow_otp with channel email. If ready, scaffold for my stack, then after I confirm send a test to me@example.com.”
WhatsApp OTP
- Dashboard
- WhatsApp connected in the dashboard (QR session).
- to
- E.164 phone, e.g. +243812345678 (not an email).
“Run zindua_workflow_otp with channel whatsapp. If ready, scaffold, then after I confirm send a test to +243812345678.”
“Run zindua_workflow_otp for my FastAPI WhatsApp OTP.”
“Call zindua_doctor and tell me if email and WhatsApp are ready.”
“Recommend an OTP template, then zindua_scaffold for nextjs.”
“I confirm: validate then send a test OTP email to me@example.com using template otp-verification.”
MCP tools reference (v1.1)
Start with zindua_workflow_otp. Everything else supports that closed loop.
zindua_workflow_otp
Start here. Doctor + templates + nextSteps. Sets stopCodegen if channels are not ready.
zindua_doctor
API key, project reachability, email ready, WhatsApp ready.
zindua_scaffold
Certified snippets for nextjs, fastapi, aspnet, php, nodejs from a real template slug.
zindua_validate_payload
Dry-run to/channel/slug/variables. Does not send.
zindua_send_test
Send a test only after you confirm to + template. Blocks znd_live_ unless forceLive.
zindua_watch_log
Poll delivery until terminal status + fix hints.
zindua_list_templates
Exact template slugs, languages, and variables.
zindua_recommend_template
Score OTP-like templates for an intent (login_otp, …).
zindua_list_recent_logs
Recent deliveries for this project API key.
zindua_email_path / zindua_whatsapp_status
Channel readiness + dashboard setupUrl (no QR in chat).
zindua_wordpress_connect
Bind a site URL to this API key (WordPress).
/zindua-ship (Cursor plugin)
Slash command that runs the closed loop. Cursor only — Claude: ask in natural language.
Want the story version?
Read the beginner blog walkthrough, or open API docs for send payloads.