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.
| Server URL | https://api.fyn.fyi/v1/mcp |
|---|---|
| Transport | Streamable HTTP: JSON-RPC 2.0 over HTTPS POST with JSON responses. It is stateless, with no session ID and no SSE stream. |
| Protocol versions | 2025-06-18 (default), 2025-03-26, 2024-11-05 |
| Auth | OAuth 2.1 authorization code + PKCE (S256), with dynamic client registration |
| Scope | fyn.read, the only scope (read-only) |
| Registry name | fyi.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.
FYN implements the MCP authorization spec:
WWW-Authenticate: Bearer resource_metadata="https://api.fyn.fyi/.well-known/oauth-protected-resource".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.https://api.fyn.fyi/.well-known/oauth-authorization-server| Endpoint | URL | Notes |
|---|---|---|
| Registration (RFC 7591) | POST https://api.fyn.fyi/v1/oauth/register | Public 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. |
| Authorization | GET https://api.fyn.fyi/v1/oauth/authorize | response_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. |
| Token | POST https://api.fyn.fyi/v1/oauth/token | Accepts 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.
tools/list, and calling one returns Unknown tool.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.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.
| Tool | Title | Class | Plan | What it does (inputs → output) |
|---|---|---|---|---|
| analyze_discretionary_spending | Discretionary spending | Read | Free + Pro | Sums 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_affordability | Check affordability | Read | Free + Pro | Shows 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_periods | Compare spending periods | Read | Free + Pro | Compares 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_claim | Draft a return or warranty claim | Read | Free + Pro · AI | Drafts 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_balance | Account balance | Read | Free + Pro | Current balance of linked accounts matching optional account_name or account_type (checking, savings, credit, investment, loan, other). |
| get_all_balances | All account balances | Read | Free + Pro | Balances for every linked account, grouped by class, plus account count and total (credit and loans subtracted). |
| get_budget_status | Budget status | Read | Free + Pro | Saved 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_summary | Cash flow summary | Read | Free + Pro | Income, 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_budget | Categories over budget | Read | Free + Pro | Categories verified as over their saved allocation this period, plus categories whose comparison cannot be verified. |
| get_cost_of_living | Cost of living comparison | Read | Pro | Estimates 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_staples | Grocery staples | Read | Pro | Recurring food purchases from the household's receipts, with buying cadence and the cheapest store seen. Optional limit (default 10). |
| get_holdings | Investment holdings | Read | Free + Pro | Investment holdings with symbol, quantity, value, cost basis, and gain or loss. |
| get_net_worth | Net worth | Read | Free + Pro | Assets minus liabilities for linked accounts, with cash and invested totals. |
| get_portfolio_summary | Portfolio summary | Read | Free + Pro | Linked investment portfolios with name, type, and value, plus total. |
| get_price_adjustments | Price drops on recent purchases | Read | Free + Pro | Up 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_history | Item price history | Read | Pro | Item 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_spending | Receipt spending | Read | Free + Pro | Totals spending from scanned receipts, filtered by location, merchant, or date range. Duplicate scans are collapsed. Covers scanned receipts only. |
| get_recent_transactions | Recent transactions | Read | Free + Pro | Transactions newest first (limit default 10; filters: merchant, category, dates), with receipt line items when linked. |
| get_savings_rate | Savings rate | Read | Free + Pro | (Income − expenses) ÷ income for period, with amounts saved, income, and expenses. |
| get_spending_breakdown | Spending breakdown | Read | Free + Pro | Spending grouped by group_by (required: merchant or category), with purchase counts and average ticket. Optional category, dates, and limit (default 5). |
| get_subscription_total | Subscription total | Read | Free + Pro | Monthly and yearly totals for subscriptions and bills, with irregular charges listed separately. |
| get_subscriptions | Subscriptions | Read | Free + Pro | Active recurring charges with amount, frequency, next and last charge, and kind (subscription, bill, transfer). |
| get_transaction_sum | Transaction total | Read | Free + Pro | Sums transactions matching merchant, category, and dates. direction selects expense (default), income, net, credit, or transfer. |
| get_trip_summary | Trip spending summary | Read | Pro | Past 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_finances | Search receipts and transactions | Read | Free + Pro · AI | Semantic 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_items | Search receipt items | Read | Free + Pro | Itemized receipt lines matching a product or brand (query) and/or merchant and dates. At least one of query or merchant is required. |
| split_bill | Split a receipt | Read | Free + Pro | Splits 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. |
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.update_transaction_category, exclude_from_budget) are never offered over MCP, and calls to them are refused.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.
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.
| Plan | Tool calls / day | AI-assisted calls / day (search_finances, draft_claim) |
|---|---|---|
| Free | 500 | 50 |
| Pro | Unlimited | 500 |
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.
| Status | When | Body |
|---|---|---|
| 401 | Missing, invalid, expired, or revoked token | {"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"Unauthorized"}} plus WWW-Authenticate (start or restart OAuth) |
| 503 | Authorization check temporarily unavailable | JSON-RPC error -32603 "Authorization is temporarily unavailable. Try again shortly." Retry; do not re-authenticate. |
| 405 / 404 | Non-POST request | Only POST (and CORS OPTIONS) is supported. GET currently returns 404 at the gateway. |
HTTP 200: -32700 parse error · -32600 invalid JSON-RPC request · -32601 method not found · -32602 unknown tool or unknown resource · -32603 internal server error.
HTTP 200, result.isError: true, with a readable message in content[0].text:
Missing required argument(s): <names>"<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>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 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).
check_affordability activity record stays in your household's log. FYN does not sell data, use it for advertising, or train models on it.Full details: Privacy Policy · Security
[email protected] · fyn.fyi/support. Security reports: [email protected].
Ready to connect an assistant?
Connect ChatGPT or Claude