Your project key
Doctor checks the key and whether email or WhatsApp is ready.

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.
Doctor checks the key and whether email or WhatsApp is ready.

Cursor: .cursor/mcp.json · Claude: claude_desktop_config.json

Workflow recommends exact slugs before any code is written.

Diagnose → scaffold → validate → send (you confirm) → watch log.

Start here
Same idea for Cursor and Claude — only the config file path changes.
Five steps. Same idea for Cursor and Claude — only the config 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
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.
Create the editor config below, put your API key in env, reload.
npm i @zindua/mcp inside your Python, .NET, PHP, or Node app. That does not connect the editor by itself.
Only if you want a pinned local binary for advanced setups. Day-to-day: use npx in the config.
Your editor
Same MCP server. Pick a tab. Slash commands (/zindua-ship) exist in Cursor with the plugin; Claude uses plain chat.
Four steps — then paste the config below.
Open Cursor Settings → Tools & MCP
macOS: Cmd+Shift+J · Windows/Linux: Ctrl+Shift+J. Or create the JSON file manually.
.cursor/mcp.json
{
"mcpServers": {
"zindua": {
"command": "npx",
"args": ["-y", "@zindua/mcp@latest"],
"env": {
"ZINDUA_API_KEY": "YOUR_ZINDUA_API_KEY"
}
}
}
}Safer for git (env)
{
"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.
API key in config
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.
After connect
Copy these into chat. The assistant should call the tools.
Copy into chat. The assistant calls 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.
Any language
The editor talks to Zindua. Your app SDK is a separate step after templates are known.
The editor talks to Zindua. Your app SDK is a separate step after templates are known.
Any stack in Cursor / Claude
Same npx @zindua/mcp config
Then in the backend: After workflow/scaffold, install the SDK for your language
Project layout
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 …Channels
Connect the channel in the dashboard first. Then use MCP tools from chat.
Connect the channel in the Zindua dashboard first. Then use MCP tools from chat.
Email OTP
A normal email address, e.g. you@example.com
Email service connected in the dashboard (Gmail / SMTP). Prompt: “Run zindua_workflow_otp with channel email. If ready, scaffold for my stack, then after I confirm send a test to me@example.com.”
Tools
Start with zindua_workflow_otp. Everything else supports that closed loop.
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.
Read the beginner blog walkthrough, or open API docs for send payloads.