Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Descripción del creador (original en inglés)
Monarch Money API client with 30 MCP tools for accounts, transactions, budgets, and cashflow.
Estos tres nunca se combinan en una sola puntuación: las opiniones, las mediciones y la popularidad son cosas distintas.
Todavía no escribimos un resumen sencillo para este. Abajo están los datos que leímos del registro.
Elige la app de IA que usas y copia la configuración.
MONARCH_TOKENLos valores marcados como secretos son llaves de tu cuenta. Nunca los compartas ni los pegues en un chat.
Necesitas
¿Qué app usas?
Elige tu app arriba. La recordamos, así que la próxima vez el botón dirá “Instalar en …”.
Abre Claude Desktop → Settings → Developer → Edit Config y pega esto en claude_desktop_config.json
{
"mcpServers": {
"monarchmoney": {
"command": "npx",
"args": [
"-y",
"@hakimelek/monarchmoney"
],
"env": {
"MONARCH_TOKEN": "your-value"
}
}
}
}Ejecuta esto en tu terminal
claude mcp add monarchmoney --env MONARCH_TOKEN=your-value -- npx -y @hakimelek/monarchmoneyCompleta los valores vacíos antes de ejecutarlo.
Pégalo en .cursor/mcp.json de tu proyecto, o en ~/.cursor/mcp.json
{
"mcpServers": {
"monarchmoney": {
"command": "npx",
"args": [
"-y",
"@hakimelek/monarchmoney"
],
"env": {
"MONARCH_TOKEN": "your-value"
}
}
}
}Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.
Pégalo en .vscode/mcp.json de tu proyecto
{
"servers": {
"monarchmoney": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@hakimelek/monarchmoney"
],
"env": {
"MONARCH_TOKEN": "your-value"
}
}
}
}Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.
Este se ejecuta en tu computadora, y ChatGPT solo puede conectarse a servidores en internet. Elige otra app.
Tu elección se guarda en una cookie en este dispositivo; no necesitas cuenta.
Esta configuración se genera a partir de la ficha del creador en el registro. Si el README dice otra cosa, sigue el README.
Se ejecuta en tu computadora; la lista de herramientas aparece en tu app de IA después de instalarlo.
Revisamos información que cualquiera puede ver; no hemos leído el código. Las revisiones que no aplican no se cuentan. · Revisado el 8 nov 2026
El nombre en el registro se verificó con la cuenta de GitHub hakimelek, dueña del repo
Todavía no hemos leído este repo en GitHub
Todavía no hemos leído este repo en GitHub
Este se ejecuta en tu computadora; no hay endpoint en internet
Se ejecuta en tu computadora y usa ajustes locales en su lugar
Se ejecuta en tu computadora; solo podemos leer listas de herramientas de endpoints en internet
Comparado con todos los servidores activos de esta categoría en el registro. Las estrellas solo cuentan cuando quien lo publica es dueño del repo.
Superó 1 de 1 revisiones básicas aplicables. No hemos leído el código. Antes de agregar una clave o un token, revisa qué acceso pide el servidor y usa una clave que tenga solo los permisos que necesitas.
Debes completar: MONARCH_TOKEN
Se ejecuta en tu computadora. Tu app de IA lo inicia cuando hace falta, y los datos no pasan por los servidores del creador (a menos que el propio servidor llame a un servicio en línea).
El repo de GitHub cambió por última vez –, y la última versión (0.3.1) llegó al registro hace 8 meses.
Las apps compatibles con MCP, como Claude Desktop, Claude Code, Cursor y VS Code. También necesitas Node.js en tu computadora.
En la misma categoría: Spec Driven Development, Remote Desktop Commander, SwarmMemo
Servidores de la misma categoría hechos por otros creadores, ordenados por estrellas.
Cómo leer una tarjeta:↓ Descargas por semanai★ Estrellas de GitHubiTres pilares: reseñas · revisiones · usoiActualizado = fecha en que se publicó la última versión en el registroi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Talk with agent swarms: rooms, private messages and paid tasks for AI agents
Copiado tal cual del repo del creador. PopNx MCP no lo ha revisado ni lo respalda. Se quitaron HTML, imágenes y scripts. Los enlaces llevan fuera de este sitio.
Node.js/TypeScript library for accessing Monarch Money data.
Disclaimer: This project is unofficial and not affiliated with Monarch Money.
npm install @hakimelek/monarchmoney
Requires Node.js 18+ (uses native fetch and AbortSignal.timeout).
import {
MonarchMoney, EmailOtpRequiredException, RequireMFAException, } from "@hakimelek/monarchmoney";
const mm = new MonarchMoney();
try { await mm.login("your@email.com", "password"); } catch (e) { if (e instanceof EmailOtpRequiredException) { // Monarch sent a verification code to your email const code = await promptUser("Enter the code from your email:"); await mm.submitEmailOtp("your@email.com", "password", code); } else if (e instanceof RequireMFAException) { // TOTP-based MFA is enabled on the account await mm.multiFactorAuthenticate("your@email.com", "password", "123456"); } }
// Fetch data — fully typed responses const { accounts } = await mm.getAccounts(); console.log(accounts[0].displayName, accounts[0].currentBalance);
Monarch's API requires email verification (OTP) for new devices/sessions, even when MFA is disabled. The library handles this with distinct exception types so your app can respond appropriately.
try {
await mm.login(email, password); } catch (e) { if (e instanceof EmailOtpRequiredException) { // A code was sent to the user's email — prompt them for it const code = await yourApp.promptForEmailCode(); await mm.submitEmailOtp(email, password, code); } }
await mm.login("email", "password", {
mfaSecretKey: "YOUR_BASE32_SECRET", });
The MFA secret is the "Two-factor text code" from Settings > Security > Enable MFA in Monarch Money.
After a successful login (including email OTP), you can save the token to avoid re-authenticating on every run:
// Save token after login
mm.saveSession(); // writes to .mm/mm_session.json (mode 0o600)
// Next time, login() loads the saved session automatically await mm.login(email, password); // uses saved token, no network call
// Or pass the token directly (skip login entirely) const mm = new MonarchMoney({ token: "your-saved-token" });
mm.saveSession(); // save to disk
mm.loadSession(); // load from disk mm.deleteSession(); // remove the file mm.setToken("..."); // set token programmatically
await mm.interactiveLogin(); // prompts for email, password, email OTP or MFA code
All methods return typed responses. Hover over any method in your editor for full JSDoc and type information.
| Method | Returns | Description |
|---|---|---|
getAccounts() | GetAccountsResponse | All linked accounts |
getAccountTypeOptions() | GetAccountTypeOptionsResponse | Available account types/subtypes |
getRecentAccountBalances(startDate?) | GetRecentAccountBalancesResponse | Daily balances (default: last 31 days) |
getAccountSnapshotsByType(startDate, timeframe) | GetSnapshotsByAccountTypeResponse | Snapshots by type ("year" / "month") |
getAggregateSnapshots(options?) | GetAggregateSnapshotsResponse | Aggregate net value over time |
getAccountHoldings(accountId) | GetAccountHoldingsResponse | Securities in a brokerage account |
getAccountHistory(accountId) | AccountHistorySnapshot[] | Daily balance history |
getInstitutions() | GetInstitutionsResponse | Linked institutions |
getBudgets(startDate?, endDate?) | GetBudgetsResponse | Budgets with actuals (default: last month → next month) |
getSubscriptionDetails() | GetSubscriptionDetailsResponse | Plan status (trial, premium, etc.) |
getTransactionsSummary() | GetTransactionsSummaryResponse | Aggregate summary |
getTransactions(options?) | GetTransactionsResponse | Transactions with full filtering |
getAllTransactions(options?) | Transaction[] | All matching transactions (auto-paginates) |
getTransactionPages(options?) | AsyncGenerator | Async generator yielding pages |
getTransactionCategories() | GetTransactionCategoriesResponse | All categories |
getTransactionCategoryGroups() | GetTransactionCategoryGroupsResponse | Category groups |
getTransactionDetails(id) | typed response | Single transaction detail |
getTransactionSplits(id) | typed response | Splits for a transaction |
getTransactionTags() | GetTransactionTagsResponse | All tags |
getCashflow(options?) | GetCashflowResponse | Cashflow by category, group, merchant |
getCashflowSummary(options?) | GetCashflowSummaryResponse | Income, expense, savings, savings rate |
getRecurringTransactions(start?, end?) | GetRecurringTransactionsResponse | Upcoming recurring transactions |
isAccountsRefreshComplete(ids?) | boolean | Check refresh status |
| Method | Returns | Description | |
|---|---|---|---|
createManualAccount(params) | CreateManualAccountResponse | Create manual account | |
updateAccount(id, updates) | UpdateAccountResponse | Update account settings/balance | |
deleteAccount(id) | DeleteAccountResponse | Delete account | |
requestAccountsRefresh(ids) | boolean | Start refresh (non-blocking) | |
requestAccountsRefreshAndWait(opts?) | boolean | Refresh and poll until done | |
createTransaction(params) | CreateTransactionResponse | Create transaction | |
updateTransaction(id, updates) | UpdateTransactionResponse | Update transaction | |
deleteTransaction(id) | boolean | Delete transaction | |
updateTransactionSplits(id, splits) | UpdateTransactionSplitResponse | Manage splits | |
createTransactionCategory(params) | CreateCategoryResponse | Create category | |
deleteTransactionCategory(id, moveTo?) | boolean | Delete category | |
deleteTransactionCategories(ids) | `(boolean \ | Error)[]` | Bulk delete |
createTransactionTag(name, color) | CreateTransactionTagResponse | Create tag | |
setTransactionTags(txId, tagIds) | SetTransactionTagsResponse | Set tags on transaction | |
setBudgetAmount(params) | SetBudgetAmountResponse | Set/clear budget | |
uploadAccountBalanceHistory(id, csv) | void | Upload balance history CSV |
import {
MonarchMoneyError, // base class for all errors EmailOtpRequiredException, // email verification code needed — call submitEmailOtp() RequireMFAException, // TOTP MFA required — call multiFactorAuthenticate() LoginFailedException, // bad credentials or auth error (includes .statusCode) RequestFailedException, // API/GraphQL failure (includes .statusCode, .graphQLErrors) } from "@hakimelek/monarchmoney";
try { await mm.login(email, password); } catch (e) { if (e instanceof EmailOtpRequiredException) { // e.code === "EMAIL_OTP_REQUIRED" // Prompt user for the code sent to their email const code = await getCodeFromUser(); await mm.submitEmailOtp(email, password, code); } else if (e instanceof RequireMFAException) { // e.code === "MFA_REQUIRED" // Prompt for TOTP code or use mfaSecretKey } else if (e instanceof LoginFailedException) { // e.code === "LOGIN_FAILED", e.statusCode console.error("Login failed:", e.message); } }
try { await mm.getAccounts(); } catch (e) { if (e instanceof RequestFailedException) { console.error(e.statusCode); // HTTP status, if applicable console.error(e.graphQLErrors); // GraphQL errors array, if applicable console.error(e.code); // "HTTP_ERROR" | "REQUEST_FAILED" } }
const mm = new MonarchMoney({
sessionFile: ".mm/mm_session.json", // session file path timeout: 10, // API timeout in seconds token: "pre-existing-token", // skip login retry: { maxRetries: 3, // retry on 429/5xx (default: 3, set 0 to disable) baseDelayMs: 500, // base delay with exponential backoff + jitter }, rateLimit: { requestsPerSecond: 10, // token-bucket throttle (default: 0 = unlimited) }, });
mm.setTimeout(30); // change timeout later
Retry automatically handles transient failures (429 Too Many Requests, 500, 502, 503, 504) with exponential backoff and jitter. The Retry-After header is respected on 429 responses.
getTransactions() returns a single page. For large datasets, use the auto-pagination helpers:
// Async generator — yields one page at a time (memory-efficient)
for await (const page of mm.getTransactionPages({ startDate: "2025-01-01", endDate: "2025-12-31" })) { for (const tx of page) { console.log(tx.merchant?.name, tx.amount); } }
// Or collect everything into a flat array const all = await mm.getAllTransactions({ startDate: "2025-01-01", endDate: "2025-12-31", pageSize: 100, // transactions per page (default: 100) }); console.log(${all.length} total transactions);
Both methods accept the same filter options as getTransactions() (date range, category, account, tags, etc.).
Track account refresh progress with the onProgress callback:
await mm.requestAccountsRefreshAndWait({
timeout: 300, delay: 10, onProgress: ({ completed, total, elapsedMs }) => { console.log(${completed}/${total} accounts refreshed (${(elapsedMs / 1000).toFixed(0)}s)); }, });
This package includes a built-in Model Context Protocol server with 30 tools, making your Monarch Money data accessible to AI assistants like Claude Desktop, Cursor, and any MCP-compatible client.
mm.token.claude_desktop_config.json):{
"mcpServers": { "monarch-money": { "command": "npx", "args": ["@hakimelek/monarchmoney"], "env": { "MONARCH_TOKEN": "your-token-here" } } } }
Or run it directly:
MONARCH_TOKEN=your-token npx @hakimelek/monarchmoney
Read (18 tools): get_accounts, get_account_holdings, get_account_history, get_account_type_options, get_recent_account_balances, get_aggregate_snapshots, get_institutions, get_budgets, get_subscription_details, get_transactions, get_transactions_summary, get_transaction_details, get_transaction_categories, get_transaction_category_groups, get_transaction_tags, get_cashflow, get_cashflow_summary, get_recurring_transactions
Write (12 tools): create_transaction, update_transaction, delete_transaction, create_manual_account, update_account, delete_account, refresh_accounts, is_refresh_complete, set_budget_amount, create_transaction_tag, set_transaction_tags, create_transaction_category
Every tool has typed parameters with descriptions, so AI agents know exactly what arguments to pass.
src/
index.ts — public exports client.ts — MonarchMoney class with all API methods mcp.ts — MCP server (30 tools for AI agents) errors.ts — error classes (MonarchMoneyError hierarchy) endpoints.ts — API URL constants queries.ts — all GraphQL query/mutation strings types.ts — TypeScript interfaces for all API responses
npm test # run tests once
npm run test:watch # run tests in watch mode npm run test:coverage # run with coverage report
Tests use [Vitest](https:/
Solo se muestra el principio; lee el resto en el repo