Config is the same across clients — only the file and path differ.
{
"mcpServers": {
"upi-mcp-server": {
"command": "<see-readme>",
"args": []
}
}
}Are you the author?
Add this badge to your README to show your security score and help users find safe servers.
A UPI transaction intelligence server built with Rust and the Model Context Protocol (MCP). Exposes transaction analytics as tools that Claude can call directly — search, aggregate, detect recurring payments, and rank merchants from natural language queries.
No automated test available for this server. Check the GitHub README for setup instructions.
Five weighted categories — click any category to see the underlying evidence.
No known CVEs.
No package registry to scan.
Be the first to review
Have you used this server?
Share your experience — it helps other developers decide.
Sign in to write a review.
Others in finance
A Model Context Protocol server for building an investor agent
Real-time financial market data: stocks, forex, crypto, commodities, and economic indicators
MCP server that provides LLMs with tools for interacting with EVM networks
A Model Context Protocol (MCP) server that provides AI assistants with direct access to the Spreedly payments API. Enables LLMs to manage gateways, process transactions, tokenize payment methods, and more, through structured, validated tool calls.
MCP Security Weekly
Get CVE alerts and security updates for Upi Mcp Server and similar servers.
Start a conversation
Ask a question, share a tip, or report an issue.
Sign in to join the discussion.
A UPI transaction intelligence server built with Rust and the Model Context Protocol (MCP). Exposes transaction analytics as tools that Claude can call directly — search, aggregate, detect recurring payments, and rank merchants from natural language queries.
Instead of dumping raw transaction data into Claude's context, this server exposes purpose-built tools. Claude routes queries to the right tool, gets back pre-computed results, and answers accurately without doing arithmetic in-context.
| Tool | Description |
|---|---|
search_txn | Filter raw transactions by date, amount, merchant, category |
get_spending_breakdown | Category-wise spend breakdown for a date range |
compare_periods | Side-by-side delta between two time periods by category |
detect_recurring_payments | Detect monthly subscriptions using interval analysis |
get_merchant_insights | Total spent, count, average for a specific merchant |
get_top_merchants | All merchants ranked by spend, count, or average |
cargo build
cargo run # starts the server over stdio
cargo check # fast type-check
cargo clippy # lint
cargo test # run unit tests
Connect via Claude Desktop — the binary communicates over stdio, Claude Desktop spawns and manages the process.
src/
main.rs # entry: loads TransactionStore, starts stdio MCP server
server.rs # UpiServer: tool definitions (#[tool] methods) + ToolRouter
model.rs # Transaction, Category, TransactionType, response structs
data/
store.rs # TransactionStore: data loading, filter helpers, analytics methods
data/
transaction.json # 202 mock transactions, Jan–Apr 2024 (compiled into binary)
Data is embedded at compile time via include_str! — no runtime file path needed.
Why dedicated tools instead of one generic query tool? Claude is a language model, not a calculator. Aggregating 200 transactions and computing percentage deltas in-context will drift. Code-side computation is exact, deterministic, and token-efficient.
Why compare_periods instead of calling get_spending_breakdown twice?
One tool call vs two stdio round-trips. Pre-diffed output with change_pct and total_delta fields Claude can't compute reliably itself.
Why interval-based recurring detection instead of day-of-month matching? Day-of-month breaks in February and across month boundaries. Checking that consecutive occurrences are 28–32 days apart is robust to subscription drift.
detect_recurring_payments window is derived from the latest transaction date, not system timeDebug formatting — coupled to enum implementation detail