Setup
The Kirimdev MCP server is a standard remote MCP server at
https://api.kirimdev.com/mcp, speaking the
Streamable HTTP transport
defined by the MCP spec. That means any MCP-compatible client can
connect to it — Claude, OpenCode, Cursor, VSCode, Cline, Zed, Continue,
MCP Inspector, etc.
There are two ways to authenticate:
- OAuth sign-in — paste the URL, sign in to Kirimdev in your browser, pick an organization and approve the permissions. No key to copy. See Sign in with OAuth.
- API key — send the same Bearer API key you use for the REST API in
an
Authorizationheader. Works with every client, including scripts and clients without OAuth support. The client tabs below use this.
Prerequisites
Section titled “Prerequisites”- An owner or admin role in the organization (OAuth), or a Kirimdev
API key (
kdv_live_...) from Settings → API Keys. - At least one connected WhatsApp Business number.
- The client of your choice installed (links in each tab below).
Sign in with OAuth
Section titled “Sign in with OAuth”Kirimdev implements the MCP authorization spec (revision 2026-07-28): the
server publishes
protected resource metadata,
clients identify themselves with an OAuth Client ID Metadata Document,
and access tokens are bound to https://api.kirimdev.com/mcp.
-
Add
https://api.kirimdev.com/mcpto your client without anyAuthorizationheader. The client receives a401pointing at the metadata above and opens your browser. -
Sign in to Kirimdev (email or Google). Already signed in to the dashboard? This step is skipped.
-
Pick an organization if you own or administer more than one. Each connection reaches exactly one organization; connect again to use another.
-
Choose the permissions. Each one is a checkbox on the consent page:
Scope Lets the client Default mcp:readRead conversations, messages, contacts, labels and templates Always on mcp:writeCreate and update contacts, labels, templates and customers; mark messages as read On, can be unticked mcp:sendSend WhatsApp messages ( send_message)Off, tick to allow A tool outside the approved scopes returns
403 insufficient_scope; clients that support step-up authorization ask you again for the missing scope.
Configure your client
Section titled “Configure your client”-
Open the Claude Desktop config file.
Terminal window open ~/Library/Application\ Support/Claude/claude_desktop_config.jsonIf the file doesn’t exist, create it with
{}as its content.Terminal window notepad $env:APPDATA\Claude\claude_desktop_config.jsonIf the file doesn’t exist, create it with
{}as its content.Terminal window ${EDITOR:-nano} ~/.config/Claude/claude_desktop_config.json -
Add the Kirimdev MCP server entry.
Paste the following into the JSON (merge with any existing
mcpServersblock):claude_desktop_config.json {"mcpServers": {"kirimdev": {"command": "npx","args": ["-y","mcp-remote","https://api.kirimdev.com/mcp","--header","Authorization:Bearer ${KIRIM_API_KEY}"],"env": {"KIRIM_API_KEY": "kdv_live_REPLACE_ME"}}}}Replace
kdv_live_REPLACE_MEwith your actual API key. -
Restart Claude Desktop.
Fully quit Claude (not just close the window) and reopen it. The config is read only at startup.
-
Verify the connection.
In the Claude chat input, look for the 🔌 MCP icon at the bottom-left. Click it — you should see kirimdev listed with 11 tools available.
OpenCode supports remote MCP servers natively — no bridge needed.
-
Open your OpenCode config.
Edit either the global config (
~/.config/opencode/opencode.json) or a project-local one (opencode.jsonat the repo root). The project config wins when both exist. -
Add the Kirimdev MCP server entry.
opencode.json {"$schema": "https://opencode.ai/config.json","mcp": {"kirimdev": {"type": "remote","url": "https://api.kirimdev.com/mcp","enabled": true,"oauth": false,"headers": {"Authorization": "Bearer ${env:KIRIM_API_KEY}"}}}}Then export the API key in the shell that launches OpenCode:
Terminal window export KIRIM_API_KEY="kdv_live_REPLACE_ME"Add it to
~/.zshrc/~/.bashrcto make it persistent.Terminal window [Environment]::SetEnvironmentVariable("KIRIM_API_KEY", "kdv_live_REPLACE_ME", "User")Restart your terminal after running this.
-
Restart OpenCode so it picks up the new config.
-
Verify the connection.
Run
opencode mcp list— you should seekirimdevlisted as connected with 11 tools. Or just open the TUI and type a prompt that uses the tools (see Try it below).
Cursor supports remote MCP servers via mcp.json — no bridge needed.
-
Create or open the Cursor MCP config.
- Global (every project):
~/.cursor/mcp.json - Project (this repo only):
.cursor/mcp.jsonat the project root
If the file doesn’t exist, create it with
{}as its content. - Global (every project):
-
Add the Kirimdev MCP server entry.
.cursor/mcp.json {"mcpServers": {"kirimdev": {"url": "https://api.kirimdev.com/mcp","headers": {"Authorization": "Bearer ${env:KIRIM_API_KEY}"}}}}Then set the
KIRIM_API_KEYenvironment variable in your shell profile (~/.zshrc,~/.bashrc, or Windows User env vars). Cursor interpolates${env:KIRIM_API_KEY}from the environment of the process that launched it — make sure Cursor is opened from a terminal where the variable is set, or set it system-wide. -
Reload Cursor.
Open the Command Palette (
Cmd+Shift+P/Ctrl+Shift+P) → Developer: Reload Window, or restart the app. -
Verify the connection.
Open Settings → Tools & MCP (or Features → Model Context Protocol on older builds). The
kirimdevserver should appear as connected, with 11 tools listed. Toggle them on if any default to off.
Try it
Section titled “Try it”In any of the clients above, send a chat message like:
“List the WhatsApp phone numbers connected to my Kirimdev account.”
The model will call list_phone_numbers and read back the numbers and
their phone_number_ids. From there you can ask it to send messages,
browse conversations, look up contacts, and so on — all in natural
language.
Head over to Prompting the AI for a cookbook of phrases that work well (in Indonesian and English) for each kind of task.
Security tips
Section titled “Security tips”Troubleshooting
Section titled “Troubleshooting”The client doesn’t show the kirimdev server
Section titled “The client doesn’t show the kirimdev server”- Confirm the JSON file parses — paste it into jsonlint.com. A misplaced comma silently disables every server.
- For Claude Desktop: check
npxis on PATH (npx -y mcp-remote --help). Install Node.js from nodejs.org if missing. - For OpenCode / Cursor: confirm
KIRIM_API_KEYis actually set in the shell that launched the client —echo $KIRIM_API_KEY(or$env:KIRIM_API_KEYon PowerShell) should print the key. - Fully quit the client (not just close the window) before reopening — menu-bar / tray processes hold the old config.
”Invalid API key” or 401 errors
Section titled “”Invalid API key” or 401 errors”- Verify the key in the dashboard is
Active(not revoked or expired). - Check there are no quotes or whitespace inside
kdv_live_.... The format isBearer kdv_live_<26-base32-chars>. - For Claude Desktop: the
--headervalue must be exactlyAuthorization:Bearer ${KIRIM_API_KEY}with no space afterAuthorization:.mcp-remoteparses on the first colon. - For OpenCode with an API key: make sure
"oauth": falseis set. Without it, OpenCode sees the 401 and starts the OAuth flow instead of trusting your bearer header.
OAuth sign-in fails
Section titled “OAuth sign-in fails”- “No organization you can connect” — your role is agent in every organization. Ask an owner to connect the client or to make you an admin.
- The client reports a registration error — it only supports Dynamic Client Registration. Use an API key for that client.
- The connection stopped working — your role changed, you were removed from the organization, or the connection was revoked. Connect again.
send_messagereturns403 insufficient_scope—mcp:sendwas not ticked on the consent page. Reconnect and tick Send WhatsApp messages.
Tools call but every one returns an error
Section titled “Tools call but every one returns an error”The MCP tool error response carries the same code / message /
request_id envelope as the REST API. Common
ones:
whatsapp_number_not_verified— thephone_number_idyou passed exists but isn’tconnected. Reconnect from the dashboard.resource_not_found— wrongphone_number_id, or theconversation_id/contact_idbelongs to a different organization.rate_limit_exceeded— you’re past the per-minute budget. The response includes aRetry-After-equivalent timestamp.
Claude.ai (web) and other OAuth-only clients
Section titled “Claude.ai (web) and other OAuth-only clients”Web clients such as the Claude.ai Custom connector dialog accept only
OAuth. Add https://api.kirimdev.com/mcp as the connector URL and follow
Sign in with OAuth. If the dialog reports a client
registration error, that client relies on Dynamic Client Registration,
which Kirimdev does not offer — use Claude Desktop with an API key
instead. Both share the same model and tool semantics.
Other MCP clients
Section titled “Other MCP clients”The Kirimdev MCP endpoint is a standard Streamable HTTP server — any client that speaks the spec works. Quick pointers for clients we haven’t tested end-to-end but that follow the same pattern:
- VSCode (with the GitHub Copilot MCP extension) — workspace
.vscode/mcp.json, samemcpServersshape as Cursor, but theurlfield is"http"typed; consult the official VSCode MCP docs. - Cline / Continue / Zed — each ships its own settings file with a
mcpServers(or equivalent) object acceptingurl+headers. - MCP Inspector (for debugging) — run
npx @modelcontextprotocol/inspectorand configure a custom server pointing athttps://api.kirimdev.com/mcpwith the bearer header. This is the fastest way to confirm the server is healthy if a client misbehaves.
For ChatGPT, the “Custom GPT” Actions feature consumes our OpenAPI spec directly — MCP isn’t required for that flow.
Where to next
Section titled “Where to next”- Prompting the AI — what to actually say to the assistant once it’s connected. Cookbook of phrases for sending, browsing, searching, and multi-step workflows.
- Available Tools — full schema for each of the 6 tools.
- MCP Overview — what the server does, what it doesn’t expose.
- Errors — error codes shared with the REST API.