FYN MCP server

FYN's MCP server lets an AI assistant read your own FYN data, with your permission. That data covers transactions, budgets, recurring charges, cash flow, net worth, investments, and itemized receipts. Access is read-only. No tool creates, changes, or deletes your FYN data, and FYN never moves money.

Connect

Server URL
https://api.fyn.fyi/v1/mcp
TransportStreamable HTTP: JSON-RPC 2.0 over HTTPS POST with JSON responses. It is stateless, with no session ID and no SSE stream.
Protocol versions2025-06-18 (default), 2025-03-26, 2024-11-05
AuthOAuth 2.1 authorization code + PKCE (S256), with dynamic client registration
Scopefyn.read, the only scope (read-only)
Registry namefyi.fyn/finance (official MCP Registry)

Most assistants only need the URL. Add https://api.fyn.fyi/v1/mcp as a connector, sign in to FYN when asked, and select Allow. Setup steps for ChatGPT, Claude, Cursor, and Claude Code are on fyn.fyi/agents.

Authentication

FYN implements the MCP authorization spec:

  1. A request without a valid token gets HTTP 401 with WWW-Authenticate: Bearer resource_metadata="https://api.fyn.fyi/.well-known/oauth-protected-resource".
  2. Protected resource metadata (RFC 9728): https://api.fyn.fyi/.well-known/oauth-protected-resource lists the resource https://api.fyn.fyi/v1/mcp, the authorization server https://api.fyn.fyi, and scope fyn.read.
  3. Authorization server metadata (RFC 8414): https://api.fyn.fyi/.well-known/oauth-authorization-server
EndpointURLNotes
Registration (RFC 7591)POST https://api.fyn.fyi/v1/oauth/registerPublic clients only (token_endpoint_auth_method: none, no secret). Redirect URIs must be https, or http loopback (127.0.0.1, localhost, [::1], any port). At most 5 URIs, and client_name can be up to 100 characters. A registration expires after 30 days if nobody consents.
AuthorizationGET https://api.fyn.fyi/v1/oauth/authorizeresponse_type=code and code_challenge_method=S256 are required. The user signs in on fyn.fyi and approves read-only access on FYN's consent page.
TokenPOST https://api.fyn.fyi/v1/oauth/tokenAccepts form-urlencoded or JSON. Grants: authorization_code (with code_verifier) and refresh_token.

Token lifetimes: access tokens last 30 days. Refresh tokens last 180 days and rotate on every use (the old one stops working). Authorization codes last 10 minutes.

Account scope: a token is bound to one FYN household. The household is taken from the token and never from request parameters.

Notice: FYN emails the account holder whenever a new app connects.

Alternative for developer tools: a bearer key from FYN Settings → Agent access (Authorization: Bearer fyn_ak_…), with the same read-only access.

Permissions and plans

  • Free plan ($0): connects and can use the tools listed below as Free + Pro. Limit: 500 tool calls per day, and 50 AI-assisted calls per day. A free account has receipts and receipt-created transactions. It does not sync bank accounts, so balance, transaction, budget, cash-flow, net-worth, subscription, and investment tools return little or no data.
  • FYN Pro ($9.99/month): live bank sync through Plaid, plus four tools offered only to Pro households (marked Pro). Limit: unlimited tool calls per day, and 500 AI-assisted calls per day. For other plans these four tools are not listed in tools/list, and calling one returns Unknown tool.
  • AI-assisted tools: search_finances and draft_claim use FYN's AI, which processes data within FYN's own AWS environment under zero data retention: model providers do not store your prompts or data, and your data is never used to train AI models. They count against the AI-assisted daily limit above, separate from the general tool-call limit.

Tools

All 27 tools are classified as Read: they retrieve information without changing data, account state, or permissions. None is a Write or a Sensitive write. Every tool carries the MCP annotations readOnlyHint: true, destructiveHint: false, and openWorldHint: false, plus a title. Dates use YYYY-MM-DD. Amounts are in USD.

ToolTitleClassPlanWhat it does (inputs → output)
analyze_discretionary_spendingDiscretionary spendingReadFree + ProSums posted expenses over months (default 3) and labels categories discretionary or essential. Returns totals, top categories with monthly averages and 25% and 50% reduction figures, and top merchants.
check_affordabilityCheck affordabilityReadFree + ProShows whether amount (required) fits the checking balance (or account) minus a safety buffer. Also returns budget left in the category, money left after bills still due, and data freshness. Optional: merchant, category, recurring. Preview only: holds, approves, and spends nothing. Side effect: see below.
compare_periodsCompare spending periodsReadFree + ProCompares spending between period1 and period2 (required; a month, date, or this_month / last_month), optionally for one category. Returns the difference, percent change, and direction.
draft_claimDraft a return or warranty claimReadFree + Pro · AIDrafts a return, warranty, or price-adjustment message for one receipt (receipt_id required; optional kind, product). Returns subject, body, missing placeholders, and how to send. Does not send anything or contact the merchant.
get_account_balanceAccount balanceReadFree + ProCurrent balance of linked accounts matching optional account_name or account_type (checking, savings, credit, investment, loan, other).
get_all_balancesAll account balancesReadFree + ProBalances for every linked account, grouped by class, plus account count and total (credit and loans subtracted).
get_budget_statusBudget statusReadFree + ProSaved budget allocations against spending for the current period, overall or for one category. Includes verification status (over_budget is null when the comparison cannot be verified).
get_cashflow_summaryCash flow summaryReadFree + ProIncome, expenses, and net cash flow for period (default this_month; also last_month, this_year, last_year, or a month or date).
get_categories_over_budgetCategories over budgetReadFree + ProCategories verified as over their saved allocation this period, plus categories whose comparison cannot be verified.
get_cost_of_livingCost of living comparisonReadProEstimates the household's spending mix in another US state or metro (destination required; optional origin) using BEA 2024 Regional Price Parities. These are area averages, not quotes, taxes, or homeowner costs.
get_grocery_staplesGrocery staplesReadProRecurring food purchases from the household's receipts, with buying cadence and the cheapest store seen. Optional limit (default 10).
get_holdingsInvestment holdingsReadFree + ProInvestment holdings with symbol, quantity, value, cost basis, and gain or loss.
get_net_worthNet worthReadFree + ProAssets minus liabilities for linked accounts, with cash and invested totals.
get_portfolio_summaryPortfolio summaryReadFree + ProLinked investment portfolios with name, type, and value, plus total.
get_price_adjustmentsPrice drops on recent purchasesReadFree + ProUp to 10 items whose later receipt at the same store shows a lower price while the return window is open. Uses only the household's own receipts.
get_price_historyItem price historyReadProItem price changes and the cheapest comparable stores in the household's receipt history. Optional query and limit. Prices are observed, not live quotes.
get_receipt_spendingReceipt spendingReadFree + ProTotals spending from scanned receipts, filtered by location, merchant, or date range. Duplicate scans are collapsed. Covers scanned receipts only.
get_recent_transactionsRecent transactionsReadFree + ProTransactions newest first (limit default 10; filters: merchant, category, dates), with receipt line items when linked.
get_savings_rateSavings rateReadFree + Pro(Income − expenses) ÷ income for period, with amounts saved, income, and expenses.
get_spending_breakdownSpending breakdownReadFree + ProSpending grouped by group_by (required: merchant or category), with purchase counts and average ticket. Optional category, dates, and limit (default 5).
get_subscription_totalSubscription totalReadFree + ProMonthly and yearly totals for subscriptions and bills, with irregular charges listed separately.
get_subscriptionsSubscriptionsReadFree + ProActive recurring charges with amount, frequency, next and last charge, and kind (subscription, bill, transfer).
get_transaction_sumTransaction totalReadFree + ProSums transactions matching merchant, category, and dates. direction selects expense (default), income, net, credit, or transfer.
get_trip_summaryTrip spending summaryReadProPast trips detected from transaction and receipt locations, with cost per day and dining compared with home. Optional dates and limit. Past costs, not travel quotes.
search_financesSearch receipts and transactionsReadFree + Pro · AISemantic search (query required). Returns up to 10 relevance-ranked receipts with line items and up to 15 matching transactions. May include a receipt photo link that expires after 15 minutes.
search_receipt_itemsSearch receipt itemsReadFree + ProItemized receipt lines matching a product or brand (query) and/or merchant and dates. At least one of query or merchant is required.
split_billSplit a receiptReadFree + ProSplits one receipt (receipt_id and assignments required; optional shared_item_indexes) and allocates tax and tip in proportion to each person's items. Returns each share and pre-filled Venmo request links. Does not send requests or move money.

Side effects

  • check_affordability adds one record of the check (amount, merchant, category, and FYN's assessment) to the household's agent activity log, which the household sees in Settings → Agent access. It does not change balances, budgets, or transactions.
  • Every tool call is counted toward the household's daily limit and monthly usage counters (tool name only).
  • No other tool writes anything. The in-app write tools (update_transaction_category, exclude_from_budget) are never offered over MCP, and calls to them are refused.

Results

Results come back as JSON text in content. search_finances and search_receipt_items also return structuredContent, which a client can render as a receipt card. Internal transaction and category IDs are removed. A household with no linked bank gets empty results, and the server's initialize instructions say why.

Rate limits

Limits apply per FYN household per UTC day, reset at midnight UTC, and count only calls that would run. Listing tools and connecting never count.

PlanTool calls / dayAI-assisted calls / day (search_finances, draft_claim)
Free50050
ProUnlimited500

When a limit is reached, the call returns a tool error (not HTTP 429), for example: "FYN's daily limit for connected-app tool calls is reached for this household. It resets at midnight UTC." FYN does not publish a separate per-second limit. Calls can still be slowed by shared infrastructure throttling.

Errors

HTTP level

StatusWhenBody
401Missing, invalid, expired, or revoked token{"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"Unauthorized"}} plus WWW-Authenticate (start or restart OAuth)
503Authorization check temporarily unavailableJSON-RPC error -32603 "Authorization is temporarily unavailable. Try again shortly." Retry; do not re-authenticate.
405 / 404Non-POST requestOnly POST (and CORS OPTIONS) is supported. GET currently returns 404 at the gateway.

JSON-RPC errors

HTTP 200: -32700 parse error · -32600 invalid JSON-RPC request · -32601 method not found · -32602 unknown tool or unknown resource · -32603 internal server error.

Tool errors

HTTP 200, result.isError: true, with a readable message in content[0].text:

  • Missing required argument(s): <names>
  • A daily limit was reached (see above). Other tools keep working where allowed.
  • "<tool>" is not available to connected apps: FYN access is read-only. (write tools)
  • AI_CONSENT_REQUIRED: … Applies only when FYN's AI provider is an external model. It does not apply while AI processes data within FYN's own AWS environment under zero data retention.
  • Tool "<tool>" failed: <reason>

Results that report a problem

A successful call whose JSON says why there is no answer. For example, {"error":"Receipt not found."} for draft_claim and split_bill, or status: "category_not_found" / "ambiguous_category" for get_budget_status.

OAuth errors

OAuth errors follow RFC 6749 / 7591, as JSON {"error","error_description"}: invalid_request, invalid_grant (including "Access was revoked"), unsupported_grant_type, server_error, invalid_client_metadata, invalid_redirect_uri. The authorize endpoint answers bad requests with HTTP 400 OAuth error: <reason> (plain text).

Data handling

  • What the server reads: only the connected household's FYN records, for the tool being called.
  • What it receives from the assistant: the tool name and arguments (for example a search phrase or a dollar amount). FYN does not receive your conversation.
  • Where it runs: AWS in the United States (us-east-1). Traffic is encrypted with TLS, and data is encrypted at rest with AES-256. FYN's AI for the AI-assisted tools processes data within FYN's own AWS environment under zero data retention: model providers do not store your prompts or data, and your data is never used to train AI models.
  • What FYN keeps from connector use: usage counts by tool name. Operational logs (tool name, timing, and errors) are kept for 90 days. Traces of AI-assisted calls are kept for 90 days. The check_affordability activity record stays in your household's log. FYN does not sell data, use it for advertising, or train models on it.
  • Bank data comes from your bank through Plaid with read-only access. The MCP server never calls Plaid or your bank; it serves FYN's stored copy of your records.

Full details: Privacy Policy · Security

Revoke access

  • In FYN: Settings → Agent access. Find the connected app and revoke it. Its tokens stop working, and its refresh token cannot mint new ones.
  • Removing the connector inside your assistant stops the assistant from using it. To end FYN-side access too, revoke it in FYN as above.
  • Delete your FYN account and data: fyn.fyi/remove-account.

Support

Ready to connect an assistant?

Connect ChatGPT or Claude