Investigate fraud by asking
A fraud score tells you what to do and not why. The Kaidn MCP server connects Claude, Cursor or any Model Context Protocol client straight to your tenant, so you can ask the question in English and get the evidence back, not a number to trust.
Why this exists
Most fraud tooling assumes a fraud analyst. It gives you a console, a queue and a score, and it assumes somebody whose full-time job is fraud will sit in front of it and interpret what they see.
Most of the operators we work with do not have that person. There is an engineer who also handles payments, support and the deploy pipeline, and who checks the fraud queue when something goes wrong. For them a console is not leverage, it is another interface to learn.
Asking a question in the editor you are already in is a much shorter path. The model chains the calls, reads the evidence and gives you an answer you can act on, without anybody first learning what our seventh column means.
Worth being straight about the limits: this is an investigation and triage surface, not the enforcement path. Your application should call the scoring API inline for decisions. The MCP server is for the human afterwards, asking why.
Connect it in a minute
No build step and no infrastructure. You need an API key, which the free tier gives you at 10,000 events a month. Every MCP client takes the same three things — a command, its arguments, and an environment block — so this config works in most of them as written.
{
"mcpServers": {
"kaidn": {
"command": "npx",
"args": ["@kaidn/mcp@latest"],
"env": { "KAIDN_API_KEY": "your_key" }
}
}
}The standard config · only the place you put it changes
Claude Code
One command, no config file.
claude mcp add kaidn --env KAIDN_API_KEY=your_key -- npx @kaidn/mcp@latest
Claude Desktop
Add the standard config to claude_desktop_config.json, then restart Claude. Settings → Developer → Edit Config opens the file.
Cursor
Settings → MCP → Add new MCP Server, or drop the standard config into .cursor/mcp.json for one project, or ~/.cursor/mcp.json for all of them.
VS Code
One command from the terminal.
code --add-mcp '{"name":"kaidn","command":"npx","args":["@kaidn/mcp@latest"],"env":{"KAIDN_API_KEY":"your_key"}}'Windsurf
Add the standard config to ~/.codeium/windsurf/mcp_config.json.
Cline
MCP Servers icon → Configure MCP Servers, which opens cline_mcp_settings.json. Standard config goes there.
Zed
Add it to settings.json under context_servers, using the same command, args and env as the standard config.
Anything else that speaks MCP
The protocol is open, so any compliant client works. Give it the command, args and env from the standard config. If your client can only reach a server over the network rather than spawning a process, use the Streamable HTTP transport instead.
The server runs over stdio locally by default. A Streamable HTTP transport and a Docker image are both documented in the repository for hosted and containerised setups. It is also listed in the official Model Context Protocol registry as io.kaidn/kaidn-mcp, so clients that browse the registry can find it without any config at all.
Four things to ask it
The tools are built to chain, so a single question usually becomes several calls. These are the flows they were designed around.
“What happened overnight, and what needs me?”
get_stats → triage_queue → explain_event
The model reads the shape of the last 24 hours, pulls everything sitting on review, then explains the worst one. You get a ranked list with the reasoning attached instead of a dashboard you still have to interpret.
“Event evt_8f21c — a customer says they were wrongly blocked.”
explain_event
Returns every check that fired with its raw evidence: the datacenter ASN it matched, how many accounts shared that device, the velocity count in the window. Enough to answer the customer, or to conclude your rule was wrong and needs tuning.
“Is 194.x.x.x a one-off or part of a ring?”
investigate_entity
Enrichment and network reputation for the address, plus every recent event it appears in. If the same device ids keep recurring across supposedly unrelated accounts, that is a ring rather than a coincidence.
“If I dropped the velocity weight, what would stop being blocked?”
get_config → list_events
Reads your current weights, then the events currently caught on block, and tells you which of those depend on the check you are about to weaken. A rule change you can reason about before you ship it.
Twelve tools
Ten are read-only and ship by default. Five of those cost nothing against your quota, so triage and explanation are free however often you ask.
| Tool | Cost | What it returns |
|---|---|---|
| explain_event | free | Every check that fired on one event, with the raw evidence behind each |
| triage_queue | free | Everything sitting on review, highest score first |
| list_events | free | Scored events for your tenant, newest first |
| get_stats | free | Totals by verdict, average score and shape over a rolling window |
| get_config | free | The effective weights and thresholds for your tenant |
| investigate_entity | 1 row¹ | Enrichment, network reputation and related events for one entity |
| check_email | 1 row | Disposable domain, deliverability, fraud score, abuse history |
| check_ip | 1 row | Proxy, VPN, Tor, datacenter ASN, geo, abuse history |
| check_phone | 1 row | Validity, line type, carrier, fraud score |
| score_event | 1 row | Score a new event, and record it |
¹ Free when the entity is a device id. Enrichment only costs on an email or an IP.
The two that change things need saying so
claude mcp add kaidn \ --env KAIDN_API_KEY=your_key \ -- npx @kaidn/mcp@latest --allow-writes
What it will not do
Read-only unless you opt in. Handing an agent a tool that can blocklist an entity is a decision, not a default. Ten of the twelve tools cannot change anything about your tenant, and the other two are simply not registered without --allow-writes.
A loop cannot spend your month. Agents retry, and a retry loop against a metered API is a real way to lose money. A per-process ceiling caps quota-consuming calls at 100 by default, configurable with KAIDN_MCP_MAX_QUOTA_CALLS.
Your key stays yours. The server runs locally as a process you launched, talking to your tenant with your key. Nothing is proxied through us beyond the ordinary API calls you would have made anyway.
Try it on your own traffic
10,000 events a month free, no card. Score a few events, then ask the model why one of them came back the way it did.