Connect Your AI

Ask Claude, Cursor, Windsurf, or any MCP client about your finances

Checking MCP server…

Your API Key

Use this key in the config snippets below to authenticate with the MCP server.
Hidden — regenerate from Settings to view

Sign in at finlynq.com/cloud (free), then visit Settings → API Key to generate one. We only store a hash — the raw key is shown to you once at creation and cannot be re-shown.

Setup Instructions

    Claude Desktop natively supports MCP. Add Finlynq to your config file and restart Claude.

  1. 1

    Open Claude Desktop settings

    Go to Claude menu → Settings → Developer → Edit Config

    Mac: ~/Library/Application Support/Claude/claude_desktop_config.json
    Windows: %APPDATA%\Claude\claude_desktop_config.json
  2. 2

    Add this to your config file

    {
      "mcpServers": {
        "finlynq": {
          "type": "streamable-http",
          "url": "http://localhost:3000/api/mcp",
          "headers": {
            "Authorization": "Bearer YOUR_API_KEY"
          }
        }
      }
    }
  3. 3

    Restart Claude Desktop

    Finlynq tools will appear in Claude's tool panel (hammer icon). Make sure Finlynq is running at http://localhost:3000.

Example Prompts

Click any prompt to copy it, then paste into your AI assistant.

Try a full flow

Paste any of these into Claude to see a preview / confirm / execute flow end-to-end. Claude asks before it commits anything destructive.

What Claude can do

Capability groups below; for the exhaustive name-by-name list (with category, transport, and OAuth scope per tool) see the full MCP tool catalog. Or use /api-docs / /.well-known/mcp.json for the JSON-Schema view.

Import transactions (CSV / OFX)

Drop a CSV or OFX into Finlynq with the Upload button, then ask Claude to take it from there. Claude lists pending uploads, shows you a preview with duplicate detection, and only commits after you confirm.

list_pending_uploadspreview_importexecute_importcancel_import

Bulk cleanup

Recategorize, retag, or delete many transactions at once. Every bulk operation is two steps: a preview that returns a sample and a signed confirmation token, then an execute call that commits. Claude can't skip the confirmation — the token is scoped to the exact payload.

preview_bulk_updateexecute_bulk_updatepreview_bulk_deleteexecute_bulk_deletepreview_bulk_categorizeexecute_bulk_categorize

Find and manage subscriptions

Detect recurring charges from your transaction history, then add, update (pause/resume/cancel via status), or delete subscriptions without leaving the chat.

list_subscriptionsdetect_subscriptionsbulk_add_subscriptionsadd_subscriptionupdate_subscriptiondelete_subscriptionget_subscription_summary

Manage loans and plan payoff

Track balances, generate amortization schedules, and compare avalanche vs. snowball payoff plans across all your loans.

list_loansadd_loanupdate_loandelete_loanget_loan_amortizationget_debt_payoff_plan

Currency conversion

Ask for live or historical FX rates, convert amounts between currencies, or pin your own rate overrides for bookkeeping.

get_fx_rateconvert_amountlist_fx_overridesset_fx_overridedelete_fx_override

Split transactions

Split a single transaction across multiple categories — useful for $200 grocery runs that include household goods, or Costco trips that mix food and electronics.

list_splitsadd_splitupdate_splitdelete_splitreplace_splits

Rule management

Create, list, reorder, test, and delete auto-categorization rules. Dry-run any rule against your history before you apply it.

list_rulescreate_ruleupdate_ruledelete_ruletest_rulereorder_rulesapply_rules_to_uncategorized

Portfolio holdings

Manually create, rename, move, or delete portfolio positions (the import pipeline auto-creates them from CSV/ZIP, but for one-offs use these). Plus the read tools for portfolio metrics, performance, deep-dive on a single position, and rebalancing/benchmark insights. Renames cascade to all transactions automatically; deletes leave the transactions in place with the holding link cleared.

add_portfolio_holdingupdate_portfolio_holdingdelete_portfolio_holdingget_portfolio_analysisget_portfolio_performanceanalyze_holdingtrace_holding_quantityget_investment_insights

Accounts and aliases

Add or update accounts, including a short alias (e.g. last 4 digits of a card, or a receipt label) so Claude can match a transaction even when the source document doesn't use the canonical name. The account parameter on every write tool fuzzy-matches your account names and exact-matches aliases — pass either.

add_accountupdate_accountdelete_accountget_account_balances

Suggest payee / category

Before recording a transaction, ask Claude to guess the right category and tags based on your rules and history.

suggest_transaction_details

Reads & dashboards

Balances, net worth, budgets, goals, spending trends, income statements, health score, spotlight alerts, weekly recap, cash flow forecast, anomalies — all the dashboards, queryable in natural language. Portfolio metrics live in the Portfolio holdings card above.

get_account_balancesget_net_worthsearch_transactionsget_budget_summaryget_spending_trendsget_income_statementget_goalsget_cash_flow_forecastget_recurring_transactionsget_spotlight_itemsget_weekly_recapget_spending_anomaliesget_financial_health_scoreget_categoriesfinlynq_help

How destructive ops stay safe:bulk updates, deletes, imports, and subscription-detection all use a preview → confirm → execute pattern. The preview returns a signed token scoped to the exact payload; the execute step rejects unless the token matches. Claude can't skip the preview, and it can't mutate the payload between steps without invalidating the token.

Troubleshooting

Common issues and fixes when connecting an AI assistant to Finlynq. Click any item to expand.

“Failed to connect” or OAuth flow stuck
Sign out of the integration (Settings → Integrations → Finlynq → Sign out), then restart the OAuth flow from the Claude side. Most common cause: your session expired after a Finlynq deploy. We rotate DEPLOY_GENERATION on every release, which force-logs out in-flight tokens for security. Re-OAuth and you're back in within seconds.
HTTP 401 Unauthorized from /api/mcp
Bearer token expired or missing. For Claude.ai web, re-add the integration from Settings → Integrations. For Claude Desktop / Cursor / Windsurf using API-key auth, generate a fresh key at finlynq.com/settings/account and replace the old one in your client config.
HTTP 403 Forbidden
The request Originheader isn't on our allowlist. Custom MCP clients should send Origin as one of: claude.ai, claude.com, chatgpt.com, cursor.com, windsurf.dev, or codeium.com. CLI clients that send no Origin header at all are allowed through.
HTTP 423 Locked
Your encryption key (DEK) isn't loaded for the current session. This happens after a long idle (>2h) or a Finlynq deploy. Sign out of finlynq.com and sign back in to reload the DEK, then retry the tool call.
“No holdings tracked” when running portfolio analysis
If you're on the public demo account, portfolio data is reseeded nightly — querying right after a deploy may return a stale cache. Open a fresh chat and re-query. On your own account, ensure every transaction in an investment account is bound to a holding: Finlynq requires portfolio_holding_id on every row in an is_investment=true account. Cash legs are auto-bound to a per-account Cash sleeve.
Tool call returns “stale data” after a write
Per-user transaction-aggregation caches are invalidated automatically on every MCP write. If you ever see truly stale data in Claude.ai, sign out and back in to clear the per-user cache. Long-running conversations don't hold cached results — every tool call hits the live database.
Self-hosted: stdio MCP exits at startup
Set BOTH DATABASE_URL and PF_USER_ID (a UUID matching a row in users.id). The stdio transport has no HTTP auth layer — it binds to one user at process startup. Without PF_USER_ID the process exits 1 immediately.
Self-hosted: stdio refuses create / update on accounts, categories, goals, loans, subscriptions, or holdings
As of the Stream D Phase 4 rollout (2026-05-03), plaintext name columns are physically dropped from those six tables — names are stored encrypted under your DEK. The stdio transport has no DEK, so it can't compute the encrypted-name siblings on write. Use the HTTP MCP transport or the Finlynq web UI for create/update on those tables. Read tools across all six tables continue to work on stdio (names render as “—” without a DEK).

Issue not listed? Open a GitHub issue at github.com/finlynq/finlynq/issues — we triage daily.