xp-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@xp-mcpList my positions grouped by asset class"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
portfolio-mcp
Talk to your XP Investimentos portfolio through Claude — 100% local, read-only, zero scraping.
What is this?
portfolio-mcp is a Model Context Protocol server that exposes your XP Investimentos portfolio to Claude Desktop (or any MCP-compatible client). You feed it the official PDF/CSV exports XP already gives you — the server parses them, normalizes everything into a local SQLite database, and answers questions through MCP tools.
🔒 Local-first — data lives in
~/.xp-mcp/data.db. Core tools make zero outbound HTTP calls; advisor tools (v0.4+) are opt-in.📵 No credentials, no scraping — you control what goes in (PDF/CSV exports).
👁 Read-only by design — no tool can place orders or modify anything at XP.
🧱 Stdio transport — Claude spawns the process; nothing listens on a port.
Built for personal use, but the architecture works for any custodian that lets you export reports (Rico, NuInvest, Inter, Avenue, ...). PRs welcome.
Related MCP server: Caixa Econômica Federal MCP
Why does this exist?
Custodian apps are great at "show me what I have" but terrible at:
"Compare my current allocation against my target portfolio."
"Which of my CDBs mature in the next 12 months?"
"What's my real yield-to-maturity weighted by position size?"
"How concentrated am I in a single issuer's FGC limit?"
MCP lets you bolt that intelligence onto Claude without giving the LLM provider your credentials, sending your positions to a third-party SaaS, or trusting browser-scraping that breaks every quarter.
Demo
After connecting the server, just chat with Claude:
You: Liste minhas posições agrupadas por classe de ativo.
Claude (using portfolio-mcp.get_positions):
TESOURO (53.28%) R$ 16,644.31
• Tesouro Selic 2031 R$ 14,556.80
• Tesouro Selic 2028 R$ 2,087.51
RENDA_FIXA_PRIVADA (20.98%) R$ 6,554.32
• CDB BANCO XP - AGO/2026 - 15,00% R$ 2,203.85
• CDB BANCO XP - SET/2026 - 14,95% R$ 2,197.10
• CDB BANCO XP - OUT/2026 - 14,55% R$ 1,083.63
• CDB BANCO XP - NOV/2027 - 100,00% CDI R$ 1,069.74
FUNDO (10.48%) R$ 3,273.71
ACAO ( 7.44%) R$ 2,325.12 (BBAS3)
FII ( 7.81%) R$ 2,439.20 (MXRF11, GTWR11)
Total: R$ 31,236.66
You: Quais CDBs vencem em 2026?
Claude (filters by asset_class + maturity_date):
3 CDBs maturing in 2026:
• Aug/2026 — 15.00% pre-fixed R$ 2,203.85
• Sep/2026 — 14.95% pre-fixed R$ 2,197.10
• Oct/2026 — 14.55% pre-fixed R$ 1,083.63
All issued by BANCO XP S.A. (within single-issuer FGC limit ✓)
You: Estou bem alocado em relação ao meu target?
Claude (using portfolio-mcp.calculate_allocation_drift):
Lendo ~/.xp-mcp/allocation.json (target: 40% Tesouro, 20% RF, 15% FII,
15% Ações, 5% ETF, 5% Fundos, tolerância ±2pp).
Mais fora do alvo:
• TESOURO: 53.28% (target 40%) → vender ~R$ 4.148
• ACAO: 7.44% (target 15%) → comprar ~R$ 2.362
• FII: 7.81% (target 15%) → comprar ~R$ 2.247
Dentro da banda:
• RENDA_FIXA_PRIVADA: 20.98% (target 20%) ✓
Fora da banda, magnitude menor:
• FUNDO: 10.48% (target 5%) — vender ~R$ 1.712
• ETF: 0.00% (target 5%) — comprar ~R$ 1.562
Net rebalance: -R$ 152 (aporte pequeno sugerido pra fechar).
You: Me dá um panorama do meu portfólio.
Claude (using portfolio-mcp.get_portfolio_summary):
Total: R$ 31.236,66 (12 posições, ref. 2026-05-21)
P&L: +R$ 2.736,66 (+9,60% sobre R$ 28.500 investidos · 8/12 com P&L computável)
Por classe:
TESOURO 53,28% R$ 16.644,31
RENDA_FIXA_PRIVADA 20,98% R$ 6.554,32 (+4,04%)
FUNDO 10,48% R$ 3.273,71
ACAO 7,44% R$ 2.325,12
FII 7,81% R$ 2.439,20
FGC: R$ 6.554,32 (20,98%) cobertos
Vencimentos: curto R$ 5.484 · médio R$ 16.625 · longo R$ 1.070 · sem maturity R$ 8.038
Reconciliação: declarado R$ 31.250,00 vs computado R$ 31.236,66
→ gap −R$ 13,34 (−0,04%, dentro de tolerância)Architecture
┌─────────────────┐
│ Claude Desktop │
└────────┬────────┘
│ stdio (JSON-RPC 2.0)
▼
┌─────────────────────┐ PDF / CSV ┌──────────────────────┐
│ portfolio-mcp │◀──────────────────────│ XP exports │
│ TypeScript + MCP │ │ (your machine) │
└────────┬────────────┘ └──────────────────────┘
│ SQL (better-sqlite3, WAL mode)
▼
┌─────────────────────┐
│ SQLite │
│ ~/.xp-mcp/ │
└─────────────────────┘
No network. No credentials. Read-only at XP.Stack: TypeScript · @modelcontextprotocol/sdk · better-sqlite3 · pdf-parse · papaparse · zod
Tools
Tool | Purpose | Status |
| Parse XP's official portfolio PDF (XPerformance). Idempotent on re-import. | ✅ |
| Parse a Posição Consolidada / Extrato CSV. Auto-detects delimiter and column aliases. | ✅ |
| List positions with quantity, market value, indexer, maturity. Optional class filter. | ✅ |
| Aggregate stats + declared-vs-computed reconciliation gap. Output now includes a | ✅ |
| History of buys/sells | ⏳ |
| Income / proventos | ⏳ |
| Compare current vs target allocation from | ✅ |
| Save the advisor profile (risk, horizon, objective, exclusions, outbound gate, brapi token). | ✅ |
| Read the saved profile. Returns | ✅ |
| Quotes / fundamentals from brapi.dev for 1-50 tickers, SQLite-cached. Opt-in. | ✅ |
| Rank B3 FIIs / stocks / ETFs by DY, P/VP, P/L, ROE, market cap. Opt-in. | ✅ |
| Parse broker-note PDFs for transaction history | ⏳ |
| Import a PDF exported from XP's Conta Digital Extrato. Filters for investment-account transfers only (APORTE/RESGATE). Idempotent. | ✅ |
| List cash flows with optional date/kind filters; returns aggregate totals (aporte/resgate/net) over all matching rows. | ✅ |
| Suggest BUYs per underweight class using profile objective × asset class matrix (FII/ACAO/ETF). Non-screenable classes (TESOURO/RF/FUNDO) reported in | ✅ |
| Time-weighted return (TWR) over XPerformance imports. Modified Dietz chained — GIPS-compliant for portfolios without daily NAV. Requires ≥ 2 imports. | ✅ |
| Money-weighted return (MWR / IRR) via bisection over signed cash flows. Reports converged=false cleanly when no sign change. Requires ≥ 2 imports. | ✅ |
| Spot crypto quotes in BRL via Mercado Bitcoin. Per-ticker partial failure, 15-min cache, outbound-gated. Quote-only (not yet a tracked asset_class). | ✅ |
| Manually track a crypto holding ( | ✅ |
Quick Start
Add this to your claude_desktop_config.json:
{
"mcpServers": {
"portfolio": {
"command": "npx",
"args": ["-y", "portfolio-mcp"]
}
}
}Config file location:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Restart Claude Desktop. Done.
See Development below for clone + build instructions if you want to hack on the server.
How to export from XP
XP has no single "export everything" button. Try in this order:
XPerformance PDF (recommended) — Investimentos → XPerformance → ⬇ PDF. The richest single-file snapshot.
Portal XP web — Investimentos → Posição Consolidada → Exportar CSV
Hub XP / Assessor Digital — Meus Investimentos → Posição → Exportar
Notas de corretagem (PDF) — Conta → Documentos → Notas de Corretagem (phase 2)
Extrato de movimentação — Conta → Extrato → filtrar período → Exportar
The CSV parser auto-detects ;, ,, \t, | delimiters and fuzzy-matches common XP column names (Quantidade, Qtd, Preço médio, Valor aplicado, ...). If a column is missed, extend HEADER_ALIASES in src/parsers/csv-extract.ts.
Configuring your target allocation
calculate_allocation_drift reads ~/.xp-mcp/allocation.json. A starter file is included at examples/allocation.example.json. Copy it once and edit the percentages:
mkdir -p ~/.xp-mcp
cp examples/allocation.example.json ~/.xp-mcp/allocation.jsonThe seven valid keys are TESOURO, RENDA_FIXA_PRIVADA, FII, ETF, ACAO, FUNDO, CRIPTO. Values must sum to 1.00 (±0.001). tolerance_pp is optional — when set, drifts within the band are reported as "ok" with no action.
Try it without Claude
The server speaks JSON-RPC 2.0 over stdio. Smoke test from any terminal:
node dist/index.js <<'EOF'
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"smoke","version":"0.0.0"}}}
{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/list"}
EOFYou should see the server announce itself and list the registered tools.
Advisor (opt-in)
v0.4 adds four MCP tools that turn portfolio-mcp into an investment-analysis advisor. These tools are opt-in: they only make outbound HTTP calls when the user has set outbound_enabled: true in their profile and accepted the disclaimer.
Configure your profile
The profile lives at ~/.xp-mcp/advisor-profile.json. Create or update it with set_advisor_profile:
{
"risk_tolerance": 6,
"horizon_years": 15,
"objective": "balanced",
"monthly_income_target_brl": 3000,
"excluded_classes": ["FUNDO"],
"excluded_tickers": ["XYZW3"],
"notes": "evitar tabaco, prefiro logística e shoppings",
"outbound_enabled": true,
"brapi_token": "..."
}When you flip outbound_enabled to true, the tool requires accept_disclaimer: true in the same call and stamps accepted_disclaimer_at on the saved profile.
Disclaimer
Análise educacional baseada em dados públicos. Não constitui recomendação de investimento. Decisões financeiras são de sua responsabilidade.
The disclaimer is also returned in warnings[0] of every advisor tool that ranks or suggests assets.
Source: brapi.dev
v0.4 uses brapi.dev as the sole market-data source. Anonymous calls work for personal use; if you hit rate limits, set brapi_token in the profile. Quotes are cached for 60 minutes, fundamentals for 24 hours, universe lists for 7 days. Override per call via cache_ttl_minutes.
Example flow
set_advisor_profile— saves the profile, enables outboundget_market_data { tickers: ["BBAS3","MXRF11"] }— quotesscreen_assets { asset_class: "FII", criteria: { sort_by: "dividend_yield", order: "desc", filters: { min_dividend_yield_pct: 8 }, limit: 10 } }
Project layout
src/
├── index.ts # MCP server entrypoint (stdio transport)
├── tools/
│ ├── import-xperformance-pdf.ts # XPerformance PDF → positions
│ ├── import-extract-csv.ts # XP CSV → positions
│ └── get-positions.ts # SQL → positions list with P&L
├── parsers/
│ ├── pdf-xperformance.ts # PDF text → rows
│ ├── csv-extract.ts # papaparse + fuzzy header matching
│ ├── classify.ts # asset-class heuristics + name metadata
│ └── normalize.ts # BRL / date / quantity normalizers
├── storage/
│ ├── db.ts # better-sqlite3 singleton, WAL, env override
│ ├── schema.ts # CREATE TABLE + AssetClass enum
│ └── positions-repo.ts # UPSERT, listPositions, import records
└── util/
└── zod-to-json-schema.ts # minimal zod → JSON Schema for MCPData model
imports every parse attempt with row counts, timestamps, source path
positions one row per (asset_class, external_id); upserted on re-import
transactions buys/sells from broker notes (phase 2)
dividends income / proventos (phase 2)All monetary values are stored as INTEGER cents. Float math + currency is a well-known source of off-by-a-cent bugs; integers make every aggregation exact.
The UNIQUE (asset_class, external_id) constraint + ON CONFLICT DO UPDATE makes re-importing the same file idempotent — no duplicates, no manual deduping.
Design decisions worth calling out
Wide
positionstable with nullable per-class columns. A table-per-asset-class would be cleaner in theory but adds JOINs for every read, and the column set is small. The wide table fits the access pattern (Claude almost always wants "all positions, maybe filtered by class").Stdio over HTTP. Claude Desktop spawns the process directly. Zero ports listening, no auth surface, no CORS to misconfigure. Trade-off: no remote clients without a wrapper.
stderr-only logging. stdout is the JSON-RPC wire. One stray
console.logsilently corrupts every response. All logs go to stderr, where Claude Desktop captures them into~/Library/Logs/Claude/mcp-server-xp.log.No price fetching in MVP. Adding it means a network dependency and a rate-limit problem. When it lands (phase 2), it'll be behind an opt-in env var with a clearly-documented data source.
Privacy
The SQLite file (
~/.xp-mcp/data.db) is the only place your position data lives..gitignoreblocks*.db,*.sqlite, anddata/from ever being committed.The server makes no outbound HTTP calls for the core import/inspection tools (
import_xperformance_pdf,import_extract_csv,get_positions,calculate_allocation_drift). No telemetry. No analytics.The v0.4 advisor tools (
get_market_data,screen_assets) call brapi.dev only whenoutbound_enabled: truein~/.xp-mcp/advisor-profile.jsonand the user has accepted the disclaimer. Disabled by default.
Roadmap
PDF parser for XPerformance (XP's official portfolio report)
CSV parser for Posição Consolidada / Extrato
get_positionswith class filter, P&L when invested-value is knownimport_nota_corretagem(broker-note PDF → transactions)CSV parser for proventos export
calculate_allocation_driftagainst~/.xp-mcp/allocation.jsonv0.3 — npm publish + Smithery + awesome-mcp PR
v0.4 — Investment advisor foundations:
set_advisor_profile,get_advisor_profile,get_market_data,screen_assets(brapi.dev, SQLite cache)v0.5 — Portfolio summary + reconciliation gap:
get_portfolio_summary(aggregate stats, declared-vs-computed gap)v0.6 — Bank extract import + cash flows:
import_bank_extract_pdf(XP Conta Digital Extrato →cash_flowstable, schema v3),get_cash_flows(filterable query with aggregate totals)v0.7 — Suggest Buys:
suggest_buys(composes profile + drift + screening into deterministic BUY suggestions per underweight class; non-screenable classes surface inskipped_classes)v0.8 —
cash_flow_summaryinget_portfolio_summary: YTD + rolling 12m aporte/resgate aggregates in the panorama output (no new tool, additive field).v0.9 —
calculate_twr+calculate_mwr: time-weighted and money-weighted returns over XPerformance imports + cash_flows (Modified Dietz chained + bisection IRR; no schema change; tools MCP 12 → 14).v0.10 —
get_crypto_quote: spot crypto quotes in BRL via Mercado Bitcoin (CryptoQuoteSourceinterface +MercadoBitcoinSourceimpl; per-ticker partial failure; 15-min cache; outbound-gated; quote-only; tools MCP 14 → 15).v0.11 — multi-source crypto:
get_crypto_quotenow falls back across Mercado Bitcoin → Foxbit → Binance (MultiSourceCryptoQuoteSourcechain), with Binance USDT quotes converted to BRL via the MB USDT/BRL rate; widens altcoin coverage (internal only — still 15 tools).v0.12 — crypto as a tracked asset_class:
set_crypto_position(manual entry,CRIPTOadded toASSET_CLASSES, snapshot valuation via the v0.11 multi-source chain, no cost basis; flows into summary/drift/suggest_buys with no service change; tools MCP 15 → 16).Adapters for other Brazilian brokers (Rico, NuInvest, Inter, Avenue)
Open Finance Brasil investment module when the standard matures
Changelog
v0.12.0 — crypto as a tracked asset_class (2026-05-25)
New tool
set_crypto_position: manual entry that makes crypto a first-class trackedasset_class(CRIPTO). Fetches a live quote via the v0.11 multi-source chain (Mercado Bitcoin → Foxbit → Binance) and upserts apositionsrow with a snapshot market value (quantity × current price). Outbound-gated.quantity: 0removes the holding (idempotent single tool). Re-running the tool refreshes the snapshot in place.Snapshot valuation, no cost basis / P&L: manual entry records quantity + current market value only (
avg_price_cents/invested_centsstay null), so crypto shows market value but no profit/loss — mirroring how XP positions are snapshots from the last import.Crypto flows into
get_portfolio_summaryandcalculate_allocation_driftautomatically — both already aggregate byasset_class, so no service change was needed. A crypto holding with no target key shows as over-target vs 0% in drift; insuggest_buysit lands inskipped_classes(CRIPTO is non-screenable).Additive:
"CRIPTO"added toASSET_CLASSES, no DDL change, noSCHEMA_VERSIONbump, no new dependency. Tools MCP: 15 → 16.
v0.11.0 — multi-source crypto (2026-05-25)
get_crypto_quotenow defaults to a multi-source fallback chain (MultiSourceCryptoQuoteSource): Mercado Bitcoin → Foxbit → Binance. Tries each in order, falling through onTickerNotFoundErroror a recoverable error, returning the first successful quote.New
FoxbitSource(BRL-native) widens Brazilian coverage; newBinanceSource(USDT-native) covers the altcoin long tail, converting every monetary field to BRL via a USDT/BRL rate from the already-integrated Mercado Bitcoin/USDT/ticker/endpoint (MbUsdBrlRate) — no new external FX dependency.CryptoQuotegains additive optional fieldsprice_usdandfx_rate_brl_per_usdfor conversion transparency (BRL-native sources leave them undefined).The cache row records the source that actually answered (e.g.
binance), not the strategy namemulti; top-level resultsourceis"multi"while eachquote.sourcekeeps the real origin.Internal only —
get_crypto_quoteis still one tool. Tools MCP: 15.
v0.10.0 — get_crypto_quote (2026-05-24)
New tool
get_crypto_quote: spot crypto quotes in BRL via Mercado Bitcoin's public ticker API. 1-20 symbols per call, per-ticker partial failure, 15-minute cache, outbound-gated.New
CryptoQuoteSourceinterface +MercadoBitcoinSourceimpl — slim interface (no equity fundamentals/universe), leaves the door open for Binance/Foxbit later.MarketDataCache.putgains an optionalsourceparam (default brapi.dev — no behaviour change).Crypto is NOT yet a tracked asset_class — quote-only foundation. Scope B (positions, schema migration, summary/drift integration) deferred to a future TODO.
Tools MCP: 14 → 15.
v0.9.0 — calculate_twr + calculate_mwr (2026-05-24)
New tool
calculate_twr: time-weighted return (Modified Dietz between consecutive XPerformance snapshots, geometric chain across sub-periods). GIPS-compliant for portfolios without daily NAV.New tool
calculate_mwr: money-weighted return (IRR via bisection on signed cash flows + synthetic initial/terminal NAV). Reportsconverged: falsecleanly when no sign change in[-99%, 1000%].New repo function
listValuationSnapshotsreads XPerformance imports as the NAV history — no schema change.New pure service
services/returns.tswith hand-computable test references (CFA Modified Dietz example + 1Y 10% MWR case).Quality warnings: sparse history, large cash flows, tiny period, MWR non-convergence, stale tail.
Tools MCP: 12 → 14.
v0.8.0 — cash_flow_summary in get_portfolio_summary (2026-05-24)
Additive field on
get_portfolio_summary:cash_flow_summaryblock with YTD + rolling 12-month aporte/resgate aggregates.New repo function
listCashFlowsSince(unbounded date-bounded query) insrc/storage/cash-flows-repo.ts.New pure service
computeCashFlowSummaryinsrc/services/cash-flow-summary.ts— YTD + rolling 12m aggregates overCashFlowRow[], no DB access. Averages divide bymonths_with_data(not 12) so short histories are not penalised.get_portfolio_summarywarns when no cash flows have been imported yet (cash_flow_summary: null).12 tools total (unchanged). No schema migration. No new MCP tool — additive field on existing tool.
v0.7.0 — Suggest Buys (2026-05-23)
New tool:
suggest_buys— composes advisor profile + allocation drift + asset screening into a deterministic list of BUY suggestions per underweight asset class.Encodes a fixed
objective × asset_classscreening matrix (income/growth/balanced×FII/ACAO/ETF).Non-screenable underweight classes (
TESOURO,RENDA_FIXA_PRIVADA,FUNDO) surface in a dedicatedskipped_classesfield rather than being silently dropped.Each suggestion includes
amount_brl(= class gap / actual_returned),score,rationale, andalready_owned.12 tools total (was 11). No schema migration.
Development
For contributors or anyone who wants to run a local checkout instead of the published npm package:
git clone https://github.com/Satsuj1n/portfolio-mcp
cd portfolio-mcp
npm install
npm run build
npm run testThen point claude_desktop_config.json at the local build:
{
"mcpServers": {
"portfolio": {
"command": "node",
"args": ["/absolute/path/to/portfolio-mcp/dist/index.js"]
}
}
}Run the type checker with npm run typecheck. Smoke-test the MCP server end-to-end with:
node dist/index.js <<'EOF'
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"local","version":"0.0.0"}}}
{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/list"}
EOFContributing
PRs welcome — especially:
New parsers (other brokers, other export formats)
Heuristics for
classifyAssetcovering edge cases your portfolio exposesAdditional tools (
calculate_allocation_drift,get_dividends, ...)Tests with anonymized fixtures (no real position values, no real account numbers)
Please never include real portfolio data, account numbers, or PDFs in your PR. Use the fixture pattern in tests/fixtures/ (synthetic data only).
License
MIT — see LICENSE.
Built by Felipe Lima · Powered by Model Context Protocol.
Available Tools
18 toolscalculate_allocation_driftA
Compare current portfolio allocation against a target defined in ~/.xp-mcp/allocation.json. Returns per-class drift in percentage points and BRL, with suggested BUY/SELL actions to rebalance. Optional 'target_path' argument overrides the default location. Optional 'tolerance_pp' field in the JSON treats drifts within the band as 'ok' (no action).
| Name | Required | Description | Default |
|---|---|---|---|
| target_path | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states that the tool returns drift and suggestions, implying a read-only operation, but it does not explicitly mention side effects or confirm no modifications are made. This is adequate but not fully explicit.
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 concise and well-structured, using two sentences to cover purpose, parameter details, and output. Every sentence adds value with no redundancy or fluff.
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 tool with no output schema, the description sufficiently describes the return (per-class drift in percentage points and BRL, plus BUY/SELL suggestions). It omits details about error handling or edge cases, but these are not critical for a basic understanding. The description is complete enough for an agent to invoke the tool correctly.
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 description explains the only parameter, 'target_path', as an optional override for the default location. It also clarifies the 'tolerance_pp' field in the config file, adding semantic meaning. The description does not specify the default location, which is a minor gap.
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's core function: comparing current portfolio allocation to a target file and returning per-class drift with BUY/SELL suggestions. It is specific and easily distinguishable from sibling tools, though it could be slightly more explicit about the expected output format.
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 guidance on optional parameters: 'target_path' to override the default and 'tolerance_pp' as a field in the target file to treat drifts within a band as 'ok'. However, it does not explicitly state when to prefer this tool over siblings like 'get_portfolio_summary' or 'suggest_buys', leaving some inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_mwrB
Money-weighted return (MWR / IRR) — the rate that reflects when you put money in vs. out. Computed via bisection over signed cash flows including synthetic initial/terminal NAV. Requires ≥ 2 XPerformance imports. Returns mwr_period, mwr_annualized, cash_flow_breakdown, convergence diagnostics, and warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| period_to | No | ||
| period_from | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It explains the computation method (bisection over signed cash flows), mentions synthetic initial/terminal NAV, and lists outputs including convergence diagnostics and warnings. This gives a good sense of behavior, though it does not explicitly state whether the operation is read-only or has no side effects.
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 compact and front-loaded with the tool's identity and purpose. It packs computation method, prerequisites, and outputs into a short paragraph without unnecessary filler 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?
The description covers what the tool calculates, how it computes, prerequisites, and return values. It is missing parameter format/usage details and does not provide explicit selection criteria versus calculate_twr or other sibling tools. This is adequate for basic understanding but not fully complete for confident invocation.
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 has two string parameters, period_to and period_from, with zero description coverage in the schema. The description does not explain the expected date format, whether the range is inclusive, or whether the parameters are optional/required. Since there is no schema description and no parameter explanation in the text, an agent cannot reliably construct valid inputs.
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 defines the tool as computing money-weighted return (MWR/IRR) and explains its core purpose: reflecting the timing of cash flows. It also names the expected return fields, which makes the purpose concrete. However, it does not explicitly contrast with calculate_twr, so differentiation from that sibling is only implicit.
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 gives a prerequisite ('Requires ≥ 2 XPerformance imports') and states the computation approach, which implies when the tool can be used. It does not explicitly say when to prefer this over calculate_twr or other portfolio analysis tools, so the guidance is not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_twrA
Time-weighted return (TWR) over the XPerformance import history. Removes the effect of when you contributed/withdrew — pure portfolio performance metric, GIPS-compliant. Uses Modified Dietz between consecutive imports and chains sub-periods geometrically. Requires ≥ 2 XPerformance imports. Returns period_return, annualized return, per-sub-period breakdown, and quality warnings (sparse history, large cash flows, stale tail).
| Name | Required | Description | Default |
|---|---|---|---|
| period_to | No | ||
| period_from | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the methodology (Modified Dietz between imports, geometric chaining), the requirement of ≥2 imports, and the output structure (period_return, annualized return, per-sub-period breakdown, quality warnings). This is transparent about what the tool does and what it returns. It does not mention side effects (likely none) or read-only status, but for a calculation tool this is less critical.
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 concise and well-structured: it leads with the core purpose, then explains the methodology, requirements, and output in a logical flow. Every sentence adds meaningful information without fluff. It is front-loaded with the key concept and avoids unnecessary details.
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 description covers the tool's purpose, methodology, requirements, and return values, which is substantial. However, it completely omits any explanation of the two optional parameters, which is a significant gap since the schema itself offers no descriptions. Without knowing what period_from and period_to do, an agent cannot confidently invoke the tool correctly. The lack of parameter semantics reduces overall completeness.
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 has two parameters (period_to, period_from) with no descriptions, and schema description coverage is 0%. The tool description does not mention these parameters at all, leaving the agent without any hint of their meaning, format, or whether they are date filters, limits, or something else. Since the description must compensate for the schema's lack of detail and it does not, this is a major gap.
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 time-weighted return over XPerformance import history, explicitly distinguishing it from money-weighted return by noting it removes the effect of contributions/withdrawals. The verb 'calculate' and resource 'time-weighted return' are specific, and the mention of GIPS compliance adds precision. It effectively differentiates itself from the sibling calculate_mwr without needing to name it explicitly.
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 when to use this tool: when you need a pure portfolio performance metric that excludes cash-flow timing effects. It also states a hard prerequisite (≥2 XPerformance imports) that tells the agent when the tool is applicable. However, it does not explicitly name calculate_mwr as the alternative or give a direct 'use this instead of X' statement, so it is not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_advisor_profileA
Read the advisor profile from ~/.xp-mcp/advisor-profile.json. Returns exists:false when the file is not yet configured; reports schema errors in the errors array.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses expected return behavior (exists:false when unconfigured) and error reporting (schema errors in errors array), which is helpful given there are no annotations. It does not cover side effects, but the tool is read-only by nature.
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 two sentences, direct, and includes only essential information. It is well-structured 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?
Given the simple nature of the tool and the absence of an output schema, the description adequately explains the return behavior and error handling. An agent can correctly invoke and interpret the result without additional context.
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?
There are zero parameters, so the baseline score of 4 applies. No parameter descriptions are needed.
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 reads the advisor profile from a specific file path, and distinguishes it from sibling tools that set or manage other data. The purpose is 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 implies usage (when you need to read the advisor profile) but does not explicitly state when to prefer this tool over siblings like 'set_advisor_profile' or when not to use it. No explicit alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cash_flowsA
List cash flows (APORTE/RESGATE) with optional date range and kind filters. Returns up to limit rows sorted by flow_datetime DESC, plus aggregate totals (aporte_total, resgate_total, net) computed over ALL matching rows.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| limit | No | ||
| date_to | No | ||
| date_from | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must convey behavior. It states the operation is a 'list' (implying read-only), describes sorting by flow_datetime and aggregation of totals, which is transparent. It does not explicitly mention side effects, but the read-only nature is strongly implied.
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 two sentences, concise and highly informative. It front-loads the core purpose and then adds specific details about sorting and aggregation, with no wasted words.
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 description gives a good summary of the output: rows sorted by flow_datetime and aggregate totals. It does not enumerate every field, but given no output schema, this is sufficient for an agent to understand what will be returned.
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 schema has no parameter descriptions, but the description explains the purpose of the filters ('optional date range and kind filters') and the limit ('up to limit rows'). This covers the parameters adequately, though it does not specify formats or constraints individually.
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 cash flows (APORTE/RESGATE) with filters, distinguishing it from sibling tools like get_transactions and get_dividends. The specific resource and action are 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 mentions optional filters (date range, kind) and a limit parameter, giving a clear sense of when to apply them. It does not explicitly contrast with alternatives, but the specialized 'cash flows' scope makes the intended use evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_crypto_quoteA
Spot crypto quotes in BRL via Mercado Bitcoin (e.g. BTC, ETH, SOL). Per-ticker partial failure: one unknown symbol doesn't fail the batch. 15-minute cache, outbound-gated. Quote only — crypto is not yet a tracked portfolio asset_class.
| Name | Required | Description | Default |
|---|---|---|---|
| tickers | Yes | Crypto symbols, uppercase (e.g. ['BTC','ETH']). 1-20. | |
| cache_ttl_minutes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it discloses 15-minute caching, outbound-gating, per-ticker partial failure, and the fact that this is quote-only rather than a portfolio operation. This is strong behavioral transparency.
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 compact and to the point, with no filler or redundant wording. Every sentence adds meaningful information about scope, behavior, or failure semantics.
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 description covers scope and partial failure well, but it omits the meaning of cache_ttl_minutes and provides no output-shape information. Since there is no output schema, the lack of return-value context leaves some ambiguity 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?
The tickers parameter is reasonably described in the schema, but cache_ttl_minutes only has a type and no description. The description mentions '15-minute cache' but never explains that the parameter overrides this TTL, leaving its semantics undocumented. Schema coverage is only 50% and the description does not compensate for the missing parameter.
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 specifies the tool fetches spot crypto quotes in BRL via Mercado Bitcoin, with concrete examples (BTC, ETH, SOL). It also distinguishes scope by noting crypto is not yet a tracked portfolio asset class, which helps separate it from portfolio-related siblings.
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 provides practical usage context: quote-only, BRL-denominated, cache behavior, outbound-gated, and partial failure tolerance. It does not explicitly name an alternative for non-crypto market data, but the 'Quote only' and 'not yet a tracked portfolio asset_class' phrasing conveys appropriate boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dividendsA
List dividend/JCP payouts with optional ticker, asset_class, kind, and date-range filters. Returns up to limit rows sorted by pay_date DESC, with gross/tax/net in BRL. Zero outbound HTTP. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| limit | No | ||
| ticker | No | ||
| date_to | No | ||
| date_from | No | ||
| asset_class | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states 'Zero outbound HTTP' and 'Read-only', which are important side-effect disclosures despite the absence of annotations. It also reveals output behavior (sorted by pay_date DESC, includes gross/tax/net) providing a transparent view of what the tool does.
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 two sentences with no redundancy. All key information (filters, sorting, currency, side effects) is packed efficiently without fluff.
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 there is no output schema, the description provides a reasonable overview of the output: rows sorted by pay_date, with gross/tax/net in BRL. It does not enumerate all returned fields or specify data types, but for a list operation this is sufficient. The absence of a stated output schema is partially mitigated by the clear mention of the main fields.
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 schema provides no descriptions for the six parameters, and the description only partially explains them. It names the filters (ticker, asset_class, kind, date-range) and explains 'limit' rows and sorting, but does not define allowed values, formats (e.g., date format), or the meaning of 'kind'. This adds some meaning but leaves substantial gaps.
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 verb 'List' and the resource 'dividend/JCP payouts', distinguishing it from siblings like get_transactions and get_cash_flows. It is specific and unambiguous about the tool's primary function.
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 notes optional filters (ticker, asset_class, kind, date-range) and a limit, but does not explicitly state when to choose this tool over alternatives. It implies usage for dividend-specific queries but lacks an explicit when-not condition. Still, it provides enough context for typical use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_market_dataA
Fetch quotes and/or fundamentals from brapi.dev for 1-50 tickers, with SQLite caching. Requires outbound_enabled=true in the advisor profile. Per-ticker partial failures are reported in results[].error without failing the whole call. cache_ttl_minutes overrides the default TTL (60 quote / 1440 fundamentals).
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | ||
| tickers | Yes | Ticker symbols (e.g. ['BBAS3','MXRF11']). 1-50 entries. | |
| cache_ttl_minutes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses caching with SQLite, the permission requirement, and partial error handling. It also mentions TTL override. These are important behaviors not in the schema or 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?
Three sentences, front-loaded with the primary action, then requirement, then error behavior. No wasted words.
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?
It explains key behaviors and constraints, but without an output schema, it doesn't specify the full return shape. It gives enough for basic use, but could mention what the response contains beyond errors.
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 schema only documents one of three parameters, and the description adds details for tickers (1-50) and cache_ttl_minutes (override), but leaves 'include' unexplained. Since coverage is low, it partially compensates but not fully.
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 action (fetch quotes and/or fundamentals), the source (brapi.dev), the range (1-50 tickers), and a prerequisite (outbound_enabled=true). It distinguishes this from other tools like get_crypto_quote by focusing on general market data and multiple tickers.
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 provides specific usage conditions: requires outbound_enabled=true and explains partial failure behavior. It doesn't explicitly contrast with alternatives but the condition and multi-ticker scope give enough guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolio_summaryA
Aggregate stats + reconciliation gap for the portfolio. Returns total market value, per-class breakdown (% and BRL), top 5 positions, total/per-class P&L, FGC coverage, maturity buckets (short/medium/long), and the gap between the declared patrimônio total (from the last XPerformance PDF) vs computed total. Zero outbound HTTP. No inputs.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states 'Zero outbound HTTP' and 'No inputs', which provides some behavioral clarity. However, with no annotations present, it does not explicitly confirm read-only behavior or lack of side effects, leaving some ambiguity.
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 dense but not verbose; it packs all relevant output details into a compact list without unnecessary filler. Each clause adds useful information.
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 lack of an output schema, the description does a good job listing the major return components and units (%, BRL). It does not specify exact data types or nested structures, but for a summary tool it provides sufficient context for an agent to understand what will be returned.
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 is empty; the description explicitly confirms 'No inputs,' which matches the schema. Since there are no parameters to document, the baseline score of 4 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?
Clearly states the tool's purpose with a specific verb ('get') and resource ('portfolio summary'), and enumerates the exact outputs (total value, per-class breakdown, top 5 positions, P&L, FGC coverage, maturity buckets, reconciliation gap). It is easily distinguished from sibling tools like get_positions or get_cash_flows.
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 usage for obtaining an aggregate portfolio overview and reconciliation metrics, but it does not explicitly state when to prefer this tool over siblings or when not to use it. Usage guidance is only implicit through the listed return values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_positionsA
List all positions in the portfolio. Optional filter by asset_class. Returns each position with quantity, avg/current price, invested vs market value, and unrealized P&L. Values in BRL (Brazilian Reais).
| Name | Required | Description | Default |
|---|---|---|---|
| asset_class | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided; the description explains the returned fields but does not mention side effects, costs, or limits. Since this is a read operation, the lack of destructive-behavior warnings is acceptable but still incomplete.
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 succinct and well-structured, covering core functionality and return fields without unnecessary verbosity.
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 description provides sufficient context for a straightforward listing operation, including the meaning of returned values; minor gaps exist around edge cases but are not critical.
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 single parameter asset_class is documented via its enum values but no description is given beyond the filter mention; the schema carries the possible values, and the description adds minimal extra context.
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?
Clearly states the tool lists all positions in the portfolio, with an optional filter by asset class, distinguishing it from related portfolio tools.
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?
While it describes what the tool does and the optional filter, it does not explicitly contrast with sibling tools like get_portfolio_summary or suggest_buys, though the scope is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transactionsA
List trade transactions (buys/sells) with optional ticker, asset_class, and date-range filters. Returns up to limit rows sorted by trade_date DESC, with amounts in BRL. Zero outbound HTTP. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| ticker | No | ||
| date_to | No | ||
| date_from | No | ||
| asset_class | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states 'Read-only' and 'Zero outbound HTTP', making side effects and safety clear. With no annotations provided, this transparency is especially valuable.
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 compact and front-loaded, conveying the core action and all relevant attributes in two sentences. No filler or redundant wording is present.
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 description mentions return ordering, currency, and row limiting, which is useful given the lack of an output schema. It does not specify exact response fields, but the description is sufficient for a straightforward listing tool.
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?
Although the schema has no per-parameter descriptions, the description explains the meaning of the ticker, asset_class, date-range, and limit parameters. This gives enough semantic context for callers to use them effectively.
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 trade transactions, identifies key filters (ticker, asset_class, date-range), and specifies sorting and currency. This makes the primary purpose immediately understandable.
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 fully defines what the tool does and its optional parameters, making it suitable for retrieving transaction data. It does not explicitly contrast with sibling tools like get_dividends or get_cash_flows, but the domain is clear enough for most use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_bank_extract_pdfA
Import a PDF exported from XP's Conta Digital Extrato (digital account statement). Filters for transfers between digital account and investment account only (deposits = APORTE, withdrawals = RESGATE). Idempotent: re-importing the same file skips duplicates. Persists to the cash_flows table.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | Absolute path to a PDF exported from XP's Conta Digital Extrato (digital account statement). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well by disclosing filtering, idempotency, and persistence to the cash_flows table. It does not mention potential side effects like file validation errors or partial imports, but the core behaviors are transparent.
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 concise and structured in short, information-dense sentences. Every sentence adds value—import source, filtering criteria, idempotency, and persistence—without unnecessary elaboration.
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 single parameter and lack of output schema, the description covers essential context: source, filter behavior, idempotency, and destination table. It could be slightly more complete by mentioning what happens on duplicate files or invalid PDFs, but the provided context is strong.
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 single parameter file_path has 100% schema description coverage and the description repeats the essential detail that it is an absolute path to an XP PDF. The description does not add significant new meaning beyond the input schema, so baseline 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?
Description clearly states the tool imports PDFs from XP's Conta Digital Extrato and specifies the exact filtering logic (transfers between digital and investment accounts, APORTE/RESGATE). It also clarifies idempotency and persistence, leaving no ambiguity about the tool's purpose.
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 explains what the tool does and its idempotent behavior, but it does not explicitly compare against sibling import tools like import_xperformance_pdf or import_extract_csv. There is no direct guidance on when to choose this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_extract_csvA
Import a CSV exported from XP Investimentos (Posicao Consolidada, Extrato). Idempotent: re-importing the same file updates existing positions instead of duplicating. Returns counts, warnings, and a preview of the first 5 parsed positions.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | Absolute path to a CSV exported from XP (Posicao Consolidada, Extrato, etc.). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses idempotency (re-import updates instead of duplicating) and mentions the return content (counts, warnings, preview). However, it does not clarify whether new positions are created if they don't exist, or any permission requirements or error conditions for a mutation tool. It provides useful but incomplete behavioral context.
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 two sentences with no fluff. It front-loads the primary purpose and idempotency, then briefly states return values. Every sentence earns its place, and the structure is easy to scan.
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 tool with one parameter and no output schema, the description covers the essential usage details: what input it expects, the idempotent behavior, and the nature of the return. It does not cover error scenarios or prerequisites beyond the file path, but these are minor for a straightforward import tool. The description is largely complete for an agent to call it correctly.
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 description coverage is 100% and the sole parameter file_path already includes the format details (CSV from XP, Posicao Consolidada, Extrato). The description repeats this information but adds no new meaning about the parameter, such as format constraints or path requirements. Baseline 3 is appropriate given the schema's completeness.
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 action (import), the resource (a CSV exported from XP Investimentos), and even specifies the export types (Posicao Consolidada, Extrato). It also notes the idempotent behavior and what it returns, so an agent can immediately understand what the tool does and how it differs from sibling import tools that handle PDFs.
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 when to use it (when you have a CSV from XP) but does not explicitly contrast it with alternatives like import_xperformance_pdf or import_bank_extract_pdf. There's no 'when not to use' or mention of conditions that would select another tool. The guidance is inferred from the resource type rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_xperformance_pdfA
Import the XPerformance PDF (XP's official portfolio report). Extracts patrimônio total, reference date, and per-asset position rows (quantity, market value, %allocation, indexer, maturity). Idempotent: re-importing the same file updates existing positions. Returns import counts, warnings, and a preview of up to 10 positions.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | Absolute path to the XPerformance PDF (XP's official portfolio report). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses idempotency (re-import updates existing positions), that it returns import counts, warnings, and a preview, and it implies mutation via 'updates existing positions'. It doesn't cover permissions or error handling, but it covers key behavioral traits beyond the schema. This is a solid disclosure.
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?
Three sentences with zero waste. The purpose is front-loaded, and each sentence adds distinct information: what it imports, what it extracts, and its idempotency/return behavior. Concise and well-structured.
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 single-parameter tool with no output schema and no annotations, the description covers the essential details: what it does, what it extracts, idempotency, and return preview. It lacks explicit return format details (e.g., structure of counts/warnings), but the mention of preview up to 10 positions is sufficient. It's adequate but not exhaustive.
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 only parameter file_path is fully described in the schema ('Absolute path to the XPerformance PDF'). The description adds the context that it's XP's official report, but that's redundant with the schema. Since schema coverage is 100%, the baseline is 3; the description does not add significant semantic meaning beyond what the schema provides.
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 states a specific verb ('Import') and a specific resource (XPerformance PDF, XP's official portfolio report). It distinguishes from sibling import tools like import_extract_csv and import_bank_extract_pdf by specifying the exact report type and the fields extracted. The purpose is 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 gives clear context: this tool is for XP's official portfolio report, which implicitly tells the agent when to use it over other import tools. However, it does not explicitly mention alternatives or conditions to avoid using it, so it lacks explicit exclusions. It's clear enough but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screen_assetsA
Rank B3 assets (FII | ACAO | ETF) against criteria (sort_by, filters, limit). Fetches the universe and per-ticker quote+fundamentals from brapi.dev (cached). Profile's excluded_classes/excluded_tickers are merged with the call's exclude_tickers. Output is educational analysis, not investment advice.
| Name | Required | Description | Default |
|---|---|---|---|
| criteria | Yes | ||
| asset_class | Yes | Universe to screen. FII = fundos imobiliários; ACAO = stocks; ETF = ETFs. TESOURO/RF/FUNDO not supported in v0.4 (no brapi coverage). | |
| exclude_tickers | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses network behavior ('Fetches the universe and per-ticker quote+fundamentals from brapi.dev (cached)'), merging behavior ('Profile's excluded_classes/excluded_tickers are merged with the call's exclude_tickers'), and output nature ('Output is educational analysis, not investment advice'). This provides substantive insight into side effects and constraints, though it stops short of explicitly stating read-only or idempotency.
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 three sentences, with the first sentence front-loading the core purpose. The subsequent sentences deliver essential behavioral details without fluff. It is compact and information-dense, though slightly longer than necessary.
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 no output schema and no annotations, the description covers the main operational aspects: purpose, data source, caching, exclusions, and output disclaimer. It does not detail the exact return structure, but the phrase 'output is educational analysis' gives a sense of what to expect. The criteria parameter's internal fields are named (sort_by, filters, limit) which helps. Overall, it is fairly complete for a ranking tool.
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 only 33% (only asset_class has a description). The description adds meaning to otherwise undocumented parameters: it specifies that 'criteria' contains sort_by, filters, and limit, and explains that exclude_tickers is merged with profile-level exclusions. This compensates for the sparse schema and helps an agent understand what each parameter controls.
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 opens with a specific verb 'Rank' and a clear resource 'B3 assets' with enumerated asset classes (FII, ACAO, ETF). It also specifies the action is against criteria. This distinguishes it from sibling tools like get_market_data or suggest_buys, which are retrieval or suggestion tools, making the purpose unmistakable.
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 usage for screening/ranking assets but does not explicitly mention when to use this tool versus alternatives or when not to use it. There is no direct contrast with sibling tools like suggest_buys or get_market_data. The intent is inferable but not explicitly stated, so guidance is implied rather than provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_advisor_profileA
Save (overwrite) the advisor profile at ~/.xp-mcp/advisor-profile.json. Required fields: risk_tolerance (1-10), horizon_years (>0), objective ('income'|'growth'|'balanced'). Optional: outbound_enabled (default false), excluded_classes, excluded_tickers, notes, brapi_token. Enabling outbound_enabled=true requires accept_disclaimer=true on the call.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | Yes | Full advisor profile. Required fields: risk_tolerance (1-10), horizon_years (>0), objective ('income'|'growth'|'balanced'). Optional fields fill defaults. See get_advisor_profile output for the canonical shape. | |
| accept_disclaimer | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the operation overwrites the existing profile, which is a key behavioral trait. It also mentions a conditional requirement (accept_disclaimer=true when outbound_enabled=true). It does not mention error cases or side effects beyond overwriting, but the core behavior is transparent given no annotations exist.
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 packs all essential information without redundancy or fluff. Each clause contributes to understanding the tool's function, parameters, and constraints.
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 set operation with no output schema, the description provides sufficient context: it names the file path, required and optional fields, and a conditional dependency. It lacks explicit success/error behavior, but that is not critical for a write tool. The description is complete enough for an agent to invoke it correctly.
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 schema only shows 'profile' and 'accept_disclaimer' with minimal type info. The description compensates by enumerating the required and optional fields inside the profile object, and explaining the conditional need for accept_disclaimer. This covers most semantic meaning, though it stops short of providing examples or edge-case validation rules.
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 action ('save (overwrite)') and the specific resource (advisor profile at a path). It is distinct from sibling tools like get_advisor_profile, which reads the profile, and other data import tools. The purpose is 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 implies usage when the advisor profile needs to be created or updated, but does not explicitly state 'use this when you want to change the profile' or contrast with read-only alternatives. However, the overwrite semantics and context make the intended use clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_crypto_positionA
Manually track a crypto holding (e.g. BTC, ETH). Fetches the current BRL quote (multi-source: Mercado Bitcoin → Foxbit → Binance) and stores a snapshot market value (quantity × current price) as a CRIPTO position, which then flows into get_portfolio_summary and calculate_allocation_drift. quantity=0 removes the holding (idempotent). Re-run to refresh the value. Outbound-gated. Snapshot only — no cost basis / P&L is recorded.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Crypto symbol, uppercase (e.g. 'BTC'). | |
| quantity | Yes | Amount held (fractional ok). 0 removes the holding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors: it fetches external quotes, stores a snapshot, flows into portfolio summary and allocation drift, and that quantity=0 removes the holding (idempotent). It also notes re-running refreshes the value and that no cost basis/P&L is recorded. The term 'Outbound-gated' is a hint but not fully explained, and rate limits are not covered.
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 information-dense but not overly verbose. It front-loads the core purpose and then adds necessary behavioral details. Each sentence adds value, and the structure flows logically from purpose to side effects to limitations.
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 no output schema, the description adequately explains what happens on invocation: it stores a snapshot, updates downstream summaries, and handles removal. It covers the essential context an agent needs to decide and execute the tool, though it does not mention return values or error scenarios, which are minor gaps.
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 descriptions already cover the basics (ticker symbol, quantity amount). The tool description adds meaning by specifying that ticker is a crypto symbol in the context of BRL, and crucially explains that quantity=0 removes the holding, which is not in the schema. This goes beyond the schema's baseline coverage.
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 verb 'Manually track' and the resource 'crypto holding', and explains the mechanism (fetches BRL quote, stores snapshot). It distinguishes itself from the sibling get_crypto_quote by describing the position-setting action rather than just quote retrieval.
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?
While the description implies when to use it (to record a crypto position), it does not explicitly contrast with alternatives like get_crypto_quote or state 'use this when...'. The downstream effects are mentioned, but there is no direct usage guidance beyond the functional description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_buysA
Suggest BUY actions per underweight asset class based on the advisor profile. Composes drift + screening per class (FII/ACAO/ETF) using a fixed objective × asset_class criteria matrix; non-screenable classes (TESOURO/RF/FUNDO) surface in skipped_classes with reason. Requires outbound_enabled=true. Output is educational analysis, not investment advice.
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | ||
| target_path | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses its internal behavior: it composes drift and screening, surfaces non-screenable classes in skipped_classes with a reason, and requires outbound_enabled. It also includes a disclaimer that output is educational, not investment advice. This provides good transparency.
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 reasonably concise and well-structured. It starts with the main purpose, then elaborates on the process and output, and ends with a requirement and disclaimer. It is slightly redundant but generally efficient.
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 description provides a good overview of the tool's inputs, process, and output, including the skipped_classes behavior and the outbound_enabled requirement. However, it omits any explanation of the two parameters, which are the only inputs an agent would pass. This gap affects completeness.
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 schema provides no descriptions for top_n and target_path (0% coverage), and the description does not mention or explain these parameters. Since the description fails to compensate for the missing schema information, it provides no semantic guidance for the parameters.
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's purpose: suggest BUY actions for underweight asset classes based on the advisor profile. It uses a specific verb ('Suggest'), identifies the resource (underweight asset classes) and provides context on the process (drift + screening). It also distinguishes non-screenable classes, giving a clear scope.
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 mentions a prerequisite (outbound_enabled=true) and outlines that it composes drift and screening, but it does not explicitly state when to use this tool versus alternatives or when not to use it. The guidance is implied rather than explicit, leaving some ambiguity.
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.
18 tool updates
v0.12.0- First observed
calculate_allocation_drift - First observed
calculate_mwr - First observed
calculate_twr - First observed
get_advisor_profile - First observed
get_cash_flows - First observed
get_crypto_quote - First observed
get_dividends - First observed
get_market_data - First observed
get_portfolio_summary - First observed
get_positions - First observed
get_transactions - First observed
import_bank_extract_pdf - First observed
import_extract_csv - First observed
import_xperformance_pdf - First observed
screen_assets - First observed
set_advisor_profile - First observed
set_crypto_position - First observed
suggest_buys
TDQS
Scored across 18 tools
Tools have mostly distinct purposes, but pairs like get_cash_flows vs get_transactions and get_dividends could overlap for financial data queries, though descriptors clarify them. calculate_twr and calculate_mwr are clearly differentiated by methodology.
Uses consistent verb_noun pattern (get_, import_, set_, calculate_) with clear domain terms. Minor inconsistency: 'calculate_twr' vs 'calculate_mwr' vs 'get_crypto_quote' where 'get' could be 'calculate' but overall pattern is coherent.
With 18 tools, the count is slightly high for a single server but reasonable given the breadth (portfolio, crypto, market data, performance). Some tools could be combined (e.g., get_transactions/get_dividends into one get_cash_flows), but still within acceptable scope.
Covers major portfolio management needs: data import, positions, performance, cash flow, and crypto. Missing features like trade execution or more advanced analytics, but for a read-only/advisory server it's complete. Minor gap: no way to manage allocation targets directly except via file overrides.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Connect your portfolio to Claude, ChatGPT, or Codex to analyze it and make smarter investments.
Connect your XP account to AI via Brazil's Open Finance: balances, statements, cards, investments. R
Brazilian Open Finance MCP — 30+ banks (Itaú, Nubank, etc.) to Claude/Cursor. Read-only.
Global stock research, ML forecasts, valuation signals, screeners & portfolio tracking in Claude
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceRead-only INDmoney portfolio access for Claude — Indian stocks, mutual funds, US stocks, gold, credit cards, loans, and Experian credit score. OTP browser login with AES-256-GCM encrypted sessions.MIT
- AlicenseNot gradedqualityDmaintenanceConnects Claude, ChatGPT, and other AI agents to Caixa Econômica Federal accounts via Open Finance Brasil, enabling natural language queries about balances, transactions, credit card bills, and investments in read-only mode.MIT
- AlicenseNot gradedqualityDmaintenanceConnects Nubank accounts to Claude, ChatGPT, and AI agents via Open Finance Brasil, enabling natural language queries about balances, statements, credit card bills, and investments in read-only mode.MIT
- AlicenseNot gradedqualityDmaintenanceEnables natural language queries about Porto Bank accounts via Open Finance, including balances, statements, credit card bills, and investments, using Claude, ChatGPT, and AI agents.MIT