Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者による説明(英語の原文)
Monarch Money API client with 30 MCP tools for accounts, transactions, budgets, and cashflow.
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
使っているAIアプリを選んで、設定をコピーしてください。
MONARCH_TOKEN「秘密」と表示された値は、あなたのアカウントの鍵です。絶対に人に教えたり、チャットに貼り付けたりしないでください。
必要なもの
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます
{
"mcpServers": {
"monarchmoney": {
"command": "npx",
"args": [
"-y",
"@hakimelek/monarchmoney"
],
"env": {
"MONARCH_TOKEN": "your-value"
}
}
}
}ターミナルでこれを実行します
claude mcp add monarchmoney --env MONARCH_TOKEN=your-value -- npx -y @hakimelek/monarchmoney動かす前に、空欄の値を入力してください。
プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"monarchmoney": {
"command": "npx",
"args": [
"-y",
"@hakimelek/monarchmoney"
],
"env": {
"MONARCH_TOKEN": "your-value"
}
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"monarchmoney": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@hakimelek/monarchmoney"
],
"env": {
"MONARCH_TOKEN": "your-value"
}
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月8日にチェック
レジストリ名は、リポジトリを所有するGitHubアカウント hakimelek で確認済みです
このリポジトリはまだGitHubから読み取っていません
このリポジトリはまだGitHubから読み取っていません
これはパソコンで動くため、インターネット上のエンドポイントはありません
パソコンで動き、代わりにローカルの設定を使います
パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
入力が必要なもの:MONARCH_TOKEN
あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。
GitHubリポジトリの最終更新は–、最新バージョン(0.3.1)がレジストリに届いたのは8 か月前です。
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにNode.jsも必要です。
同じカテゴリには:Spec Driven Development, Remote Desktop Commander, Tethered Trust
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:↓ 週あたりのダウンロードi★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
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.
Fit, compatibility and recall checks for AI agents before they buy: verdicts, evidence, receipts.
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
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:/
冒頭だけを表示しています。続きはリポジトリで読めます