Zindua

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.

Start here

Simple guide for first-time users

Five steps. Same idea for Cursor and Claude — only the config file path changes.

01

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}}).

02

Install Node.js 18+ on your computer

Only needed so Cursor/Claude can run npx. Your app can still be Python, C#, or PHP.

03

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.

04

Reload and check that zindua is connected

Cursor: Settings → Tools & MCP. Claude Desktop: restart the app after editing the config.

05

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.

Your editor

Cursor or Claude?

Same MCP server. Pick a tab. Slash commands (/zindua-ship) exist in Cursor with the plugin; Claude uses plain chat.

01

Open Cursor Settings → Tools & MCP

macOS: Cmd+Shift+J · Windows/Linux: Ctrl+Shift+J. Or create the JSON file manually.

02

Create .cursor/mcp.json

In the project root: mkdir -p .cursor then paste the config. First run downloads @zindua/mcp via npx.

03

Reload and verify

Save, reload the Cursor window, confirm the zindua server is connected under Tools & MCP.

04

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.json

At 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.json

In your user home folder. Available in every workspace on your machine.

After connect

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.

Any language

Python, ASP.NET, PHP, Node… same MCP

The editor talks to Zindua. Your app SDK is a separate step after templates are known.

Your appEditor MCPThen install in the backend
Any stack in Cursor / ClaudeSame npx @zindua/mcp configAfter workflow/scaffold, install the SDK for your language
Node / Next.js / Fastifymcp.json only (no npm i @zindua/mcp)npm i @zindua/sdk in the backend
Python / FastAPImcp.json only (Node needed for editor npx)pip install zindua in the Python env
ASP.NET / .NETmcp.json onlydotnet add package Zindua.Sdk
PHP / Laravelmcp.json onlycomposer require zindua/sdk
WordPressmcp.json in a plugin/theme workspace if you use CursorOfficial plugin or PHP SDK on the server
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

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.

Tools

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.