agnifolio-mcp
The agnifolio-mcp server provides two sets of tools:
Public Tools (no authentication): Calculate FIRE number, retrieve high-interest savings/fixed deposit/treasury rates (SG, IN, US), find net worth percentile globally/by country/age/gender, and get information about Agni Folio and how to connect to personal data.
Personal Financial Tools (hosted, OAuth required): Read portfolio holdings, account summaries, performance, FIRE/Coast FIRE status, crypto P&L, exchange balances, open positions, trades, insurance summaries, and nominees; write operations (add/delete portfolio entries, transactions, policies, set crypto cost basis, update FIRE goals) with confirmation gates.
Agni Folio MCP Server
Official Model Context Protocol server for Agni Folio — a free, multi-currency wealth & portfolio tracker (stocks, crypto, real estate, fixed deposits, mutual funds, insurance, and loans across 20+ markets).
This is a hosted remote server. There is nothing to install or run — you connect your MCP client to the production endpoint and authenticate with your own Agni Folio account.
Endpoint:
https://agnifolio.com/mcp(streamable HTTP)Auth: OAuth 2.1 with Dynamic Client Registration + PKCE — any MCP client can onboard without pre-registration
Scopes:
agnifolio:read,agnifolio:write(per-user, revocable from Settings → Connected AI)Server card:
/.well-known/mcp/server-card.jsonAgent skills:
/.well-known/agent-skills/index.jsonDocs: Connect Your AI · auth.md · llms.txt
Quick connect
Claude (web/desktop): Settings → Connectors → Add custom connector → https://agnifolio.com/mcp → complete the OAuth sign-in.
Cursor / Cline / Continue / other stdio-first clients — bridge via mcp-remote:
{
"mcpServers": {
"agnifolio": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://agnifolio.com/mcp"]
}
}
}The first call opens a browser window for the OAuth consent flow; tokens are cached locally by mcp-remote.
Related MCP server: personal-finance-mcp
Public-tools server (open source, in this repo)
This repo also contains a small runnable MCP server for Agni Folio's public tools — no account needed:
Tool | What it does |
| FIRE number, progress %, years-to-FIRE, Coast FIRE — pure local math |
| Current savings/FD/treasury rates across SG, IN, US (public API) |
| Net-worth percentile by country/age/gender (anonymized public dataset) |
| About Agni Folio + how to connect to the personal-data server |
npm install && npm run build
node dist/index.js # stdio MCP server
# or via Docker
docker build -t agnifolio-public-mcp .
docker run -i --rm agnifolio-public-mcpClaude Desktop / Cursor config:
{
"mcpServers": {
"agnifolio-public": {
"command": "node",
"args": ["/path/to/agnifolio-mcp/dist/index.js"]
}
}
}The public-tools server never sees credentials; personal portfolio data is only available through the hosted OAuth server above.
Tools (23)
Read — portfolio: query_holdings, query_holding_by_symbol, query_account_summary, query_performance_summary, query_classification_warnings
Read — FIRE planning: query_user_fire_status, query_user_coast_fire, query_fire_what_if
Read — crypto & trading: query_crypto_pnl, query_exchange_spot_balances, query_open_positions, query_margin_detail, query_recent_trades
Read — protection & legacy: query_insurance_summary, query_nominees
Write (confirm-gated): add_portfolio_entry, add_transaction, add_insurance_policy, delete_portfolio_entry, parse_text_into_entries, set_crypto_cost_basis, recover_crypto_cost_basis, update_user_fire_goals
Every mutating tool is confirm-before-execute: the change is staged and must be approved inside the Agni Folio app before it takes effect. Every external call — read or write — is recorded in a per-user audit log.
Security model
Per-user OAuth tokens; the server never sees your client's credentials
Scoped access (
readvswrite) chosen at consent timeRevocation: one click in Settings → Connected AI kills the grant
Confirm-gated writes + full audit trail
Agni Folio is not a brokerage and executes no trades; it is a tracking/analytics tool
About this repository
The server implementation is part of the Agni Folio production backend and is not open source; this repository is the canonical public home for connection docs and issue reports for the MCP surface. Found a problem with a tool? Open an issue or use contact.
Available Tools
4 toolscalculate_fire_numberA
Calculate the FIRE (Financial Independence, Retire Early) number from annual expenses and a safe withdrawal rate, plus — when current net worth, savings and return assumptions are given — progress %, estimated years to FIRE, and the Coast FIRE number. Pure local math, no data leaves the machine.
| Name | Required | Description | Default |
|---|---|---|---|
| current_age | No | Current age (enables Coast FIRE) | |
| annual_expenses | Yes | Expected annual expenses in retirement (any currency) | |
| monthly_savings | No | Monthly amount added to investments | |
| current_net_worth | No | Current invested net worth | |
| withdrawal_rate_pct | No | Safe withdrawal rate percent (default 4) | |
| target_retirement_age | No | Target retirement age (enables Coast FIRE) | |
| expected_annual_return_pct | No | Expected annual return percent (default 7) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the disclosure burden. It adds meaningful behavioral context: 'pure local math, no data leaves the machine' indicates a privacy-safe, deterministic operation. It also discloses conditional output behavior based on optional parameters, though it could mention error/edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two well-structured sentences: the first conveys the core function and conditional outputs, the second adds a privacy guarantee. No redundant information; every word serves a purpose, and the main verb appears immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with no annotations or output schema, the description covers the core calculation, conditional extensions, and privacy. It lacks explicit return format details or edge-case handling, but the domain is simple enough that the description provides a reasonably complete picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining parameter interactions (e.g., annual expenses + withdrawal_rate yield base FIRE; adding net worth/savings/return gives progress and years). This goes beyond individual schema descriptions and helps the agent understand how parameters combine.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool calculates a FIRE number from explicit inputs (annual expenses, withdrawal rate) and extends to progress metrics when additional data is provided. It distinguishes itself from sibling tools (info/percentile lookups) by focusing on financial calculation, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly defines when to use the tool (for FIRE calculations) and explains that optional parameters enable advanced outputs. It doesn't explicitly mention alternatives or exclusions, but the sibling tools are topically distinct, making the usage context clear without needing direct comparisons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_networth_percentileA
Find what percentile a given net worth falls into, globally or within specific countries, optionally segmented by age and gender. Uses Agni Folio's anonymized public dataset.
| Name | Required | Description | Default |
|---|---|---|---|
| age | No | Optional age for cohort comparison | |
| gender | No | Optional gender for cohort comparison | |
| currency | No | Currency code of the amount (default USD) | USD |
| countries | No | Optional list of countries to compare within | |
| across_world | No | Compare against the global dataset (default false) | |
| networth_amount | Yes | Net worth amount |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It discloses the data source and optional segments, but does not explain default behavior when across_world is false and no countries are provided, nor the return format. This is adequate but with notable gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the action and scoping, with no wasted words. It is efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 6 parameters and no output schema, so the description needs to explain return values and default behavior. It mentions the dataset but does not explain what happens when across_world is false and no countries are given, nor what the output percentile looks like. This is a significant gap for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters, so the baseline is 3. The description adds context by mapping 'globally or within specific countries' to across_world/countries and 'segmented by age and gender' to age/gender, but adds no syntax or format details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Find' and clearly identifies the resource: net worth percentile, with scope (global/countries) and optional segments. It is distinct from siblings like calculate_fire_number, which addresses different use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly indicates the tool is for percentile lookups and mentions global vs country scoping, implying when to use it. However, it doesn't explicitly name alternative tools or state exclusions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_agnifolio_infoB
What Agni Folio is, what this public server can do, and how to connect an AI to a user's own portfolio via the hosted OAuth MCP server.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full responsibility. It describes the tool's subject matter but does not disclose what happens when called (e.g., returns documentation, requires no side effects, output format). This is a significant gap for a tool with no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that efficiently lists three key aspects of the tool's content. It is appropriately short and front-loaded, though it could be slightly more structured with separators.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema tool, the description provides a reasonable high-level overview. However, it does not specify the form of the information returned (e.g., text, structured data) or depth of content, leaving some uncertainty for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema already reflects this with 100% coverage. No parameter semantics are needed, and the description appropriately says nothing about parameters. Baseline for 0 params is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides information about Agni Folio, the public server's capabilities, and OAuth connection guidance. It distinguishes from sibling tools that focus on specific financial calculations, though it lacks an explicit verb like 'returns'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for users wanting to understand the platform and how to connect an AI to a portfolio. It does not explicitly state when to use it vs. alternatives or any exclusions, but the context ('public server', 'hosted OAuth') suggests an overview role.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_high_interest_productsA
List current high-interest savings accounts, fixed deposits, treasury products and similar across Singapore, India and the USA, with rates and conditions. Community-verified data from Agni Folio's public rates database.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | Optional country filter, e.g. 'SG', 'IN', 'US' (matches the product's country field) | |
| product_type | No | Optional type filter, substring match (e.g. 'savings', 'fixed deposit', 'treasury') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the transparency burden. It discloses that data is community-verified and from a public database, and that results include rates and conditions. However, it does not describe return format, sorting, or whether the data updates automatically, leaving some behavioral aspects ambiguous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that immediately states the tool's purpose, scope, and data source. Every word adds value and there is no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity and full schema coverage, the description covers the main aspects: geography, product types, and data provenance. It doesn't mention default behavior when no filters are applied, but that is implicit in the schema. Overall, it is sufficiently complete for a simple list endpoint without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage for both parameters (country and product_type), each with descriptions. The tool description adds no additional parameter detail, so it neither compensates nor detracts from the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists high-interest savings accounts, fixed deposits, and treasury products across specific countries (Singapore, India, USA), with rates and conditions. The verb 'List' is specific and the resource is well-defined, distinguishing it from siblings like calculate_fire_number or find_networth_percentile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: when needing current high-interest product rates across the mentioned countries. It does not explicitly mention alternatives or exclusions, but the context is unambiguous given the sibling tools serve different purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
4 tool updates
v0.1.0- First observed
calculate_fire_number - First observed
find_networth_percentile - First observed
get_agnifolio_info - First observed
get_high_interest_products
TDQS
Scored across 4 tools
Each tool targets a distinct domain: FIRE calculation, server information, high-interest products, and net worth percentiles. There is no functional overlap or ambiguity.
All tool names follow a consistent verb_noun pattern in snake_case (calculate_, get_, find_). Even though 'find' and 'get' differ, they are both action verbs and the pattern is clear.
With 4 tools, the server is well-scoped for a personal finance assistant. Each tool provides meaningful functionality without unnecessary bloat.
The core financial planning workflows (FIRE calculation, rate lookup, percentile comparison) are covered. A minor gap is the absence of a tool for detailed investment or expense tracking, but it does not hinder the main purpose.
Maintenance
Related MCP Connectors
Open-source MCP server for Zerodha Kite Connect. Portfolio, market data, backtesting, alerts.
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
MCP server for Gainium — manage trading bots, deals, and balances via AI assistants
Related MCP Servers
- AlicenseAqualityCmaintenanceA portfolio analysis MCP server that enables AI agents to manage investment portfolios, fetch financial data from Yahoo Finance and CoinGecko, and perform advanced analysis like weight optimization and Monte Carlo simulations. It utilizes reference-based caching to efficiently handle large datasets without bloating the LLM's context window.261MIT
- AlicenseAqualityCmaintenanceSelf-hosted, read-only MCP server that connects banks, credit cards, loans, and brokerage accounts via Plaid. 9 tools for balances, transactions, recurring charges, liabilities, and investment holdings.97MIT
- AlicenseBqualityAmaintenanceopen-source personal finance app with a first-party MCP server. 91 HTTP tools (OAuth 2.1 + DCR) and 87 stdio tools cover transactions, budgets, accounts, portfolio analytics, FX conversion, loans, subscriptions, goals, importers, and rules. Users self-host with Docker + PostgreSQL or use the managed cloud8913AGPL 3.0
- AlicenseNot gradedqualityAmaintenanceOfficial MCP server for the FinancialReports API. Provides direct access to regulatory filings, financial data, and corporate information from listed companies worldwide via 15 curated tools.2MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nivela-tech/agnifolio-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server