Skip to main content
Glama

You:    Here's my IBKR trade history [trades.csv]. Set up firma.
Claude: I see 47 transactions. Logging in chronological order... done.
        Syncing prices and FX history... your portfolio: $179K, +61% all-time. TSLA is 78%.

You:    My portfolio feels really volatile lately. Should I be worried?
Claude: TSLA is 74% of your equity, a 10% TSLA move is a 7% net worth move.
        Cash flow is solid at $6.4k/month saved. The volatility is market, not lifestyle.

You:    That July expense spike looks alarming.
Claude: That was $57k in TSLL, a leveraged bet, not spending.
        Strip it out: expenses flat at ~$7k/month, savings rate 47.8%.

You:    Give me a full overview with charts.
Claude: Net worth: $294k → $490k in 8 months, pulled back to $427k with TSLA's Q1 dip.
        [builds net worth trend, income vs expenses, portfolio allocation, unrealized P&L]

Your brokerage app shows you a number. firma shows you the truth.

  • It talks to Claude. Natively. Every command lives behind MCP, log trades, sync prices, render charts, reason about your money. You type plain English; Claude does the rest.

  • Local-first, no exceptions. Everything sits in ~/.firma/firma.db. No server, no sync, no account. Your financial data never leaves your machine. Ever.

  • Nine markets, one source of truth. US, KRX, KOSDAQ, JP, HK, LSE, XETRA, NSE, TW, plus crypto, commodities, and real estate. Stored in USD, shown in any currency, with historical FX from FRED: a 2018 balance gets the 2018 rate, not today's.

  • No holdings table to lie to you. Portfolio, cost basis, P&L, all derived live from your trade log. Nothing drifts out of sync, because there's nothing to drift.

  • A brief that actually has an opinion. get_market_brief doesn't dump data, it takes a stance. A weekly lean (aggressive or defensive), a ranked call per holding (BUY / ADD / HOLD / TRIM / SELL / AVOID with conviction and an English thesis), and a watchlist of what to look at next. Every holding is classified, run through a category playbook, and checked by a correlation guard that catches "more of what you already own" before it lands.

  • A simulator nobody else ships. project_net_worth runs multi-scenario Monte Carlo over your portfolio at any horizon, next month or 30 years, one tool. simulate_scenario does the deterministic day-to-week version ("PCE comes in hot Thursday, how much does that cost me?"). You supply the assumptions, Claude discloses them verbatim, firma does the math. No hidden "advisor view."

  • Time-series features from day one. The first firma sync backfills 90 days of daily history. Correlation, Sharpe, max drawdown, volatility, CAGR, populated immediately, not 30 days from now.

  • It tracks your decisions, not just your positions. show_thesis_track reads your own trade reasons back to you against the outcome. show_anti_portfolio follows what you sold, the data brokerages hide because it exposes bad exits.


Related MCP server: FinLynq

Get started

# 1. Install
npm install -g @evan-moon/firma

# 2. Set API keys (both free)
firma config set finnhub-key YOUR_KEY   # finnhub.io, prices, news, earnings
firma config set fred-key YOUR_KEY      # fred.stlouisfed.org, macro & FX history

# 3. Connect Claude Desktop, then restart it
firma mcp install

Rather not touch a terminal? Grab the macOS or Windows installer, Node.js is bundled, Claude is wired up for you.

Then drop your data into Claude, a CSV, a brokerage export, plain text. It logs everything and syncs prices automatically.

If firma helps you see where your money went, ⭐ star the repo, it's the cheapest way to help others find it.


How it's split: MCP thinks, the CLI keeps you safe

firma is MCP-first. Analysis, briefs, recommendations, news, valuation, projections, all of it happens in conversation with Claude. The CLI exists for the three things a chat can't safely own: setup, manual data entry, and repair.

# Setup
firma config set <key>        # finnhub-key / fred-key / currency
firma mcp install             # register with Claude Desktop
firma doctor                  # check keys, data state, FX cache, coverage

# Manual entry
firma add txn                 # buy / sell / deposit / dividend / tax, any of 9 markets
firma add monthly             # month-end balance + cash flow in one flow
firma add snapshot            # sync prices, snapshot today's portfolio

# Repair (when Claude or you got it wrong)
firma edit txn / balance / flow / snapshot
firma delete txn / ...        # alias: firma rm

# Verify (read-only, just confirm what landed in the DB)
firma show portfolio / txns / balance / flow / snapshot / profile / fx

# Sync
firma sync                    # prices (Finnhub) + FX history (FRED) + correlation cache
firma sync fx                 # FX history only

Everything analytical (get_market_brief, every show_*, report, project_net_worth, simulate_scenario) lives in Claude. Two tool families that never mix: diagnostic (what's true right now, no fortune-telling) and thought experiment (what-ifs, assumptions always disclosed).


Architecture

A Yarn Berry monorepo with a strict port-and-adapter layout. The application layer never imports an external API directly, it talks to domain interfaces, and adapters implement them.

packages/
  domain/        ports + types, zero external-API knowledge
  external-api/  raw clients (finnhub, fred, worldbank, gdacs, yahoo, …), zero domain knowledge
  adapter/       the only layer that imports both sides
  use-case/      business logic (portfolio, brief, advisor, projection, scenario)
  shared/        db + utils
apps/
  cli/  mcp/  docs/

The rule: external-API packages know nothing about firma's domain; domain packages know nothing about any external API. @firma/adapters is the single bridge. Adding a data source touches no command and no business logic, a new raw client, one adapter, one registration line.

See CONTRIBUTING.md for the full walkthrough and the recipe for adding a provider.

Development

Requires Node.js 22+ and Yarn Berry.

corepack enable
yarn install
yarn dev:cli show portfolio    # CLI dev mode
yarn typecheck
yarn test

The ecosystem

firma is one of three local-first tools that share one principle, your data stays on your machine, and the AI comes to it. They interoperate through any MCP client, and none depends on the others.

flowchart TB
    U([You])
    subgraph I["Interfaces, talk to your tools"]
        direction LR
        CD[Claude Desktop]
        CC[Claude Code]
        H["Herald · voice"]
    end
    subgraph T["Local-first tools, each owns its data, on your machine"]
        direction LR
        F["firma · money<br/>~/.firma"]
        M["memex · memory<br/>~/.memex"]
        S["skope · news<br/>~/.skope"]
    end
    U --> I
    I -- MCP --> F & M & S
    F <-. never call each other .-> M
    M <-.-> S
  • firma · money, portfolio, net worth, cash flow

  • memex · memory, notes and the context behind them, across sessions

  • skope · news, a personalized lens on the world

You reach them through Claude Desktop, Claude Code, Cursor, or Herald, a voice interface. The tools compose through the model, never by calling each other.


License

MIT © Evan Moon

Available Tools

37 tools
add_balanceA

Upsert one or more balance sheet entries (also edits — same composite key overwrites). entries is an array: pass one entry to record a single balance item, many to import a net-worth spreadsheet (rows = months, columns = categories) in one call. Prefer add_monthly for full month-end settlement. sub_type: cash|investment|other (assets) or short_term|long_term (liabilities). VALID BALANCE CATEGORIES — assets: cash, savings, housing_sub, usd_cash, cash_other, domestic_stock, overseas_stock, real_estate, pension, vehicle, deposit, asset_other. Liabilities: credit_card, short_term_other, loan, long_term_other. Use ONLY these category strings — do NOT invent your own. For non-USD users: pass currency as the native currency (e.g. "KRW") and amount in that currency — converted to USD via historical FX at date. Use category="usd_cash" (currency="USD") for USD-denominated assets held alongside home-currency ones.

A single-entry call returns the upserted entry; a multi-entry call returns counts grouped by period.

ParametersJSON Schema
NameRequiredDescriptionDefault
entriesYesOne or more balance entries to upsert

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: upsert semantics (overwrite on same composite key), currency conversion, and return values for single vs multi-entry calls. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively long but every sentence serves a purpose. It is front-loaded with the core action and then provides necessary details. Minor redundancy could be trimmed, but overall well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the tool (upsert, multi-entry, currency conversion) and no output schema, the description covers all necessary aspects: categories, sub_types, currency handling, return values, and appropriate sibling tool reference. It is fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds substantial meaning beyond the schema: explains array usage patterns, valid category strings, sub_type mapping, currency conversion details, and return value behavior. This significantly aids correct usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Upsert one or more balance sheet entries (also edits — same composite key overwrites)' and distinguishes from sibling 'add_monthly' by advising to prefer that for full month-end settlement. The verb and resource are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool vs alternatives: 'Prefer add_monthly for full month-end settlement.' Also provides detailed instructions on category, sub_type, and currency usage, guiding correct invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_flowA

Upsert one or more cash flow entries (also edits — same composite key overwrites). entries is an array: pass one entry to record a single flow item, many to import an income/expense spreadsheet (rows = months, columns = categories) in one call. Prefer add_monthly for full month-end settlement. VALID FLOW CATEGORIES — income (sub_type=employment): salary, business. Income (sub_type=investment): dividends, interest. Income (sub_type=other): income_other. Expense (sub_type=consumption): personal. Expense (sub_type=fixed): insurance, phone, utilities. Expense (sub_type=housing): rent, maintenance. Expense (sub_type=debt): loan_repayment. Expense (sub_type=other): expense_other. Use ONLY these category strings — do NOT invent your own.

A single-entry call returns the upserted entry; a multi-entry call returns counts grouped by period.

ParametersJSON Schema
NameRequiredDescriptionDefault
entriesYesOne or more flow entries to upsert

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given no annotations, the description discloses that it performs upserts (overwrites on same key), describes single vs multi-entry return behavior, but does not cover authorization or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and usage, but the long list of categories, while necessary, adds length. Still efficient overall.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description covers return behavior (single vs multi-entry), upsert semantics, and category constraints, making it complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds significant value by explaining that entries can be one or many for spreadsheet-like import, listing valid categories, and describing return values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool upserts cash flow entries and mentions that the same composite key overwrites, which distinguishes it from siblings like add_balance and add_monthly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises to prefer add_monthly for full month-end settlement and warns to use only predefined categories, providing clear alternative and constraint.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_monthlyA

Batch upsert balance and flow entries for a single period in one call. Primary tool for month-end settlement / 월말 결산. When the user says "결산", "월말 결산", "month-end closing", or "record this month" — do NOT just display data. Instead: (1) ask for each balance category and each cash flow category; (2) confirm the numbers; (3) call this tool once with the full arrays. VALID BALANCE CATEGORIES — assets: cash, savings, housing_sub, usd_cash, cash_other, domestic_stock, overseas_stock, real_estate, pension, vehicle, deposit, asset_other. Liabilities: credit_card, short_term_other, loan, long_term_other. VALID FLOW CATEGORIES — income: salary (employment), business (employment), dividends (investment), interest (investment), income_other (other). Expense: personal (consumption), insurance (fixed), phone (fixed), utilities (fixed), rent (housing), maintenance (housing), loan_repayment (debt), expense_other (other). Use ONLY these category strings and their matching sub_type — do NOT invent your own. After recording, call report with target "settle" to show the confirmed summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodYesYYYY-MM
dateYesYYYY-MM-DD (typically month-end)
balanceNo
flowNo

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It explains the batch 'upsert' behavior for a single period, which implies creation/update, but doesn't disclose whether it replaces or appends existing period data, or mention authorization or rate limits. Some transparency but gaps remain.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and includes necessary detail on valid categories and workflow. While lengthy, every sentence serves a purpose for correct tool invocation. Could be slightly more concise but remains efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 2 required and 2 optional parameters with no output schema, the description covers the main use case, data constraints, and post-call action (call report). It lacks error handling or behavior on duplicate periods, but is sufficiently complete for the intended monthly settlement task.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%, but the description adds significant value by listing all valid category strings and their required sub_type (e.g., 'assets: cash, savings, ...'). This compensates for the schema's free-text sub_type and category fields, ensuring correct parameter usage beyond schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Batch upsert balance and flow entries for a single period in one call', specifying the verb (batch upsert) and resource (balance and flow entries). It distinguishes from siblings by highlighting it as the primary tool for month-end settlement, unlike individual add_balance/add_flow tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit step-by-step instructions for when to use: 'When the user says "결산", "월말 결산", "month-end closing", or "record this month"' and outlines the required workflow (ask for categories, confirm numbers, call tool once). It also lists valid categories and sub_types, preventing misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_priceA

Set the current price of ONE non-stock asset (crypto / commodity / real_estate / other). These assets have no market data provider, so their market value is entered manually — unlike stocks, which are auto-priced by sync (scope='prices'). Resolve name against the user's non-stock holdings (case-insensitive). value is in currency (default USD) and is converted to USD at today's date before storing. Calling it for a stock returns an error (stocks are auto-priced — use sync with scope='prices'); an unknown name returns a clear not-found error.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe non-stock asset name as entered on its transactions (e.g. "Bitcoin", "Seoul apartment"). Matched case-insensitively against current holdings.
valueYesCurrent price / market value of the asset, a positive number in `currency`.
currencyNoCurrency of `value` (USD/KRW/JPY/EUR/CNY/GBP/HKD/INR/TWD). Non-USD values are converted to USD via historical FX at today's date.USD

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description carries full burden. It discloses behavior: resolves name case-insensitively, converts currency to USD at today's date, returns error for stocks and unknown names. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very concise yet comprehensive. Front-loaded with purpose, then details. No redundant sentences. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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, description covers purpose, usage, parameters, behavior, and error cases. Complete for a simple mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds context: explains asset types, currency conversion, and stock restriction, which adds value beyond schema fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Set the current price of ONE non-stock asset' and lists categories. It distinguishes from stocks, which are auto-priced by sync. Purpose is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: for non-stock assets without market data. Provides clear exclusion: not for stocks (use sync instead). Also describes error handling for unknown names and stock attempts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_snapshotA

Sync latest prices from Finnhub then record a portfolio snapshot for today. Required before snapshot data is useful.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description discloses external dependency (Finnhub) and the two-step process (sync then record). But it does not clarify idempotency, side effects on existing prices, or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with two clear clauses, no redundancy, and front-loads the key action and prerequisite.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters, no output schema, and no annotations, the description adequately explains purpose and precondition. It could mention return value or error handling, but it is still fairly complete for a simple creation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters, the description adds meaningful context by explaining that the tool uses today's date implicitly and involves syncing external prices, which goes beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool syncs latest prices from Finnhub and records a snapshot for today, which distinguishes it from sibling tools like add_balance, edit_snapshot, or show_snapshot.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says it is 'required before snapshot data is useful', providing clear context for when to use it. However, it does not mention alternatives or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_txnA

Insert one or more transactions in a single call. transactions is an array — pass one entry for a single trade, many for a CSV / brokerage export / paste import. Rows are sorted by date ascending before insertion (average cost depends on insertion order). For bulk imports: first show the user your detected column mapping and total row count, wait for their confirmation, then call this once with all rows. Types: buy/sell move shares; deposit adds shares (set price=0 for grants/transfers, or actual cost basis); dividend/tax record cash events (price = total amount, shares = 1).

Reason capture (critical for thesis tracking): For NEW buy/sell trades — not historical bulk imports — the reason field is the single highest-leverage input you can capture for the user's long-term self-feedback loop (powers show_thesis_track later). When the user logs a NEW single buy/sell without supplying a reason, ALWAYS ask before calling: "What's your reason for this trade? Even one short sentence — 'earnings beat thesis', 'rebalancing toward defensive', 'avg-down on dip' — is enough." Then include their answer in reason. Skip the ask only when (a) the user is explicitly migrating historical data, or (b) the trade type is deposit/dividend/tax (no investment decision).

Each row carries its own asset_type (default 'stock'), which splits two flows:

  • stock: price is in the market's native currency (US→USD, KRX/KOSDAQ→KRW, JP→JPY, HK→HKD, LSE→GBP, XETRA→EUR, NSE→INR, TW→TWD) — market determines it, the currency param is ignored. Non-US holdings must set market to the listing exchange; ticker stays the bare local code (e.g. market: "KRX", ticker: "005930").

  • crypto / commodity / real_estate / other: there is no market or price provider — these are priced manually (not auto-synced). market is ignored and stored null, ticker is a free-form name (e.g. "Bitcoin", "Seoul apartment"), and price is in the currency param (default USD).

In both cases price is converted to USD at the transaction date before storing — every stored price is USD.

A single-entry call returns the inserted transaction; a multi-entry call returns a per-ticker / per-type summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
transactionsYesOne or more transactions to insert

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description fully bears the transparency burden. It discloses critical behaviors: rows sorted by date ascending, price conversion to USD, asset-type-specific handling (stock vs non-stock), ignoring currency for stocks, and the different return formats for single vs multi-entry calls. This is comprehensive and leaves little ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively long but well-organized, with clear sections and front-loaded core action. Every sentence adds value given the tool's complexity. It could be slightly more concise, but the structured presentation (type-specific details, reason capture guidelines) justifies the length. Score 4 for being slightly verbose but highly efficient in content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple transaction types, asset classes, markets, currencies) and absence of an output schema, the description is remarkably complete. It covers the full behavioral model: asset-type flow splits, currency conversion rules, reason capture protocols, and return format. No notable gaps remain for an agent to infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

While the input schema already has 100% coverage of parameters, the description enriches meaning far beyond the schema descriptions. For example, it explains the semantic difference between 'buy/sell' and 'deposit/dividend/tax', clarifies the interplay between 'market' and 'currency', and provides detailed guidance on the 'reason' parameter's importance for thesis tracking. This significantly aids correct parameter usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Insert one or more transactions in a single call', specifying the verb (insert) and resource (transactions). It goes beyond a simple statement by explaining the array structure and common use cases (single trade vs bulk import), effectively distinguishing this tool from sibling tools like delete_txn or edit_txn.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use and when-to-avoid guidance. It details the bulk import workflow (show mapping, wait for confirmation), and specifies when to ask for the 'reason' field (new buy/sell trades) versus skip (historical data or non-buy/sell types). This level of procedural instruction is exemplary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_balanceA

Delete balance entries for a period. If category is provided, only that single entry is removed; otherwise all entries for the period are deleted.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodYesYYYY-MM
typeNoRequired when category is provided
sub_typeNoRequired when category is provided
categoryNoSpecific category — if omitted, deletes all entries for the period

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully disclose behavior. It covers the conditional deletion logic but lacks details on side effects, permissions required, reversibility, or return value. The behavioral context is incomplete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, efficiently conveying the core purpose and conditional logic with no extraneous words. It is well-structured and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 4 parameters, conditional behavior, and no output schema, the description is adequate but minimal. It lacks details on return format, prerequisites (e.g., period must exist), or risk warnings for bulk deletion. Not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already describes each parameter. The description adds little new meaning beyond restating the conditional behavior for category. It does not enhance understanding significantly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'delete' and resource 'balance entries', and distinguishes between single-entry deletion (with category) and bulk deletion (all entries for the period). This differentiates it from sibling tools like delete_flow or delete_txn.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (delete balance entries) and gives conditional behavior, but does not explicitly state when not to use or provide alternative tools for other record types. The agent must infer usage from context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_flowB

Delete flow entries for a period. If category is provided, only that single entry is removed; otherwise all entries for the period are deleted.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodYesYYYY-MM
typeNoRequired when category is provided
sub_typeNoRequired when category is provided
categoryNoSpecific category — if omitted, deletes all entries for the period

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It discloses that deletion is conditional on category, but fails to mention whether the operation is irreversible, requires special permissions, or has any side effects (e.g., cascading deletes). This is insufficient for a potentially destructive action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no redundancy, and the conditional logic is front-loaded. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of annotations and output schema, the description is too minimal. It omits critical details for a mutation tool, such as whether the operation is reversible, what happens to related records, and expected return values. The schema covers parameter meanings but not behavioral context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the parameter descriptions already explain the conditional behavior (e.g., category: 'Specific category — if omitted, deletes all entries for the period'). The description adds no new semantic meaning beyond what the schema provides, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('delete'), resource ('flow entries'), and scope ('for a period'), with conditional logic for category. It effectively distinguishes from sibling tools like delete_balance, delete_snapshot, and delete_txn by specifying the resource type and conditional behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for deleting flow entries by period or specific category, but provides no explicit guidance on when to choose this tool over other delete tools or any alternatives. There are no usage conditions or exclusions stated beyond the conditional logic.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_snapshotA

Delete all portfolio snapshot rows for a given date (YYYY-MM-DD). Use only when the user explicitly asks to remove a bad snapshot — destructive.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesSnapshot date (YYYY-MM-DD)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the destructive nature of the operation ('Delete all portfolio snapshot rows'). With no annotations provided, the description carries the full burden, and it does so adequately, though it could mention irreversibility or confirmation needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences: first gives action and format, second gives usage guidance. Every sentence is necessary and front-loaded with critical information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with no output schema or annotations, the description is fairly complete. It covers the action, parameter format, and usage context. Some may want confirmation details, but overall it's sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the description repeats the date format already present in the schema. It adds no new semantic meaning beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action (delete), resource (portfolio snapshot rows), and condition (for a given date in YYYY-MM-DD format). It distinguishes itself from sibling tools like add_snapshot and show_snapshot.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use only when the user explicitly asks to remove a bad snapshot — destructive,' providing clear when-to-use and warning of destructiveness. This is high-quality guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_txnA

Delete a single transaction by its id. The user must confirm — never call this without explicit instruction (e.g. "delete transaction #42"). Removing a transaction recalculates all subsequent positions/avg cost since holdings are derived from the log.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description reveals that deletion recalculates positions and average cost—an important side effect. It also notes the need for explicit user confirmation. Not fully detailed (e.g., reversibility, permissions), but adequate for a simple delete operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, all relevant: purpose, usage guideline, and behavioral effect. No redundancy, front-loaded with the action. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given one parameter and no output schema, the description covers the essential aspects: purpose, confirmation requirement, and side effect. Could mention constraints or error cases, but the current information is sufficient for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It only says 'by its id,' which adds minimal meaning beyond the schema's 'id' field. No details on valid ID values or formats beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with 'Delete a single transaction by its id,' which uses a specific verb and resource. It clearly distinguishes from sibling delete tools (e.g., delete_balance, delete_flow, delete_snapshot) by naming 'transaction.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the user must confirm and never call without explicit instruction. This provides strong when-to-use guidance. Lacks explicit alternatives or when-not-to-use scenarios, but the warning is clear and sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_snapshotA

Update shares, avg_price, or current_price for a holding in a snapshot. Identified by date + the asset (asset_type + market + ticker). Works for non-stock assets too — pass their asset_type; market is ignored for non-stock.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesSnapshot date (YYYY-MM-DD)
asset_typeNoAsset class of the holdingstock
marketNoStock market — required for stock assets, ignored otherwise
tickerYesTicker symbol (stock) or asset name (non-stock)
sharesNo
avg_priceNo
current_priceNo

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It reveals that market is ignored for non-stock assets, but does not disclose error behavior (e.g., if snapshot does not exist), whether updates are partial or full replacements, or any authorization needs. This is adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, concise and well-structured. Every sentence adds value without redundancy, making it easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 7 parameters and no output schema, the description covers identification and field updates but omits important context such as the requirement for an existing snapshot (presumably created via add_snapshot) or idempotency behavior. It is adequate for basic use but leaves gaps for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 57%, and the description adds value beyond schema by clarifying identification logic (date + asset_type + market + ticker) and the market handling for non-stock assets. It compensates for missing schema descriptions and provides business context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool updates shares, avg_price, or current_price for a holding in a snapshot, identified by date and asset details. It distinguishes from siblings like edit_txn by focusing on snapshot holdings, and explains special handling for non-stock assets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly indicates when to use (updating snapshot holdings) but does not explicitly mention when not to use or provide alternative tools. It gives context for non-stock assets, which is helpful, but lacks direct guidance on exclusion cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_txnA

Update fields of an existing transaction by id. Only provided fields are changed.

When price is supplied it is converted to USD at the transaction date before storing. The native currency it is interpreted in depends on the (effective) asset type: for a stock it is the market's native currency (the new market if passed, else the existing one); for a non-stock asset it is the currency param (default USD).

Changing asset_type mirrors add_txn's fork: switching TO a non-stock type (crypto/commodity/real_estate/other) clears market to null (any market arg is ignored); switching TO 'stock' uses the supplied market (or keeps the existing one, defaulting to US).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
tickerNo
asset_typeNoAsset class: stock or crypto/commodity/real_estate/other. Switching to non-stock clears market.
dateNoYYYY-MM-DD
typeNo
sharesNo
priceNoPrice per share — native to the market (stock) or to `currency` (non-stock); stored converted to USD.
marketNoStock market (listing exchange)
currencyNoCurrency of `price` for a NON-stock asset (default USD). Ignored for stocks.
reasonNoWhy this trade? (free-form)

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses price conversion rules (to USD, dependent on asset type and market) and asset_type change side effects (clearing market). Missing details on idempotency, error handling, and return value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three well-organized sentences: purpose, price behavior, asset_type behavior. No wasted words, but could be more concise by removing redundancy (e.g., 'only provided fields' repeated).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers core update semantics and key behavioral traits. However, lacks return value information (no output schema), error conditions, and additional constraints for other parameters like date format validation or ticker requirements. Adequate for moderately complex tool but not fully comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 60%. Description adds significant detail for 'price' (conversion logic) and 'asset_type' (clearing behavior). For other params (date, type, shares, etc.), it relies on schema descriptions, which are adequate but not enhanced. Overall adds meaningful value beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb 'update' and resource 'transaction' with scoping 'by id' and 'only provided fields changed'. Distinguishes from create/delete siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage for modifying existing transactions but lacks explicit when-to-use, when-not, or alternative tool references. Sibling context hints at create/delete, but no direct guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_market_briefA

Diagnostic: ALL-IN-ONE composite read of current portfolio state. Call this FIRST for any portfolio, market, regime, or check-in question - it returns a comprehensive snapshot in a single response, so you almost never need multiple tool calls just to answer 'how am I doing today'. Returns deterministic, rule-derived facts only — no forward-looking probability distributions, no caller-supplied assumptions. For probabilistic projections (FIRE timelines, short-horizon outlooks under explicit assumptions), use project_net_worth. All monetary values come back in display_currency (default USD). Bundles: meta (single gate capsule with base_date, fx state, fx_caveat, is_nyse_open, display_currency, presentational_constraints), portfolio + holdings (with per-stock fundamentals), concentration (HHI + effective_n + 90d correlations), diversification_insight + diversification_gaps, movers, news (with rule-derived attribution), earnings_upcoming + ipo_calendar + dividend_calendar + economic_calendar, macro + signals (regime, stress, next_week_scenarios), global_macro + disasters, commodities, snapshot_comparison + week_performance, risk_summary, goal_tracking (measured CAGR vs needed CAGR — no projected_net_worth), stance, recommendations (with size_hint.phases / event_window / proceeds / funded_by_rec_ids / is_ceiling_breached), rebalance_chain, watchlist. show_* tools are drill-downs, not peers - call them only when the user asks for a single dimension in more detail than the brief carries. Cached per day on disk.

ParametersJSON Schema
NameRequiredDescriptionDefault
refreshNoForce regenerate, bypass today's cache
display_currencyNoDisplay currency for FX context (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). USD = no FX line. Defaults to USD.USD

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, but the description thoroughly covers behavioral traits: it is deterministic (no forward-looking probabilities), cached per day, and returns a composite snapshot. It does not mention side effects, but none are expected for a read operation. The description compensates well for the lack of annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense (about 150 words) but well-structured: purpose first, then usage, then deterministic nature, currency details, comprehensive list of return bundles, sibling differentiation, and caching. Every sentence adds value, though slightly more conciseness could be achieved.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and two optional parameters, the description provides a full picture: what the tool does, when to use it, what it returns (detailed bundle list), its deterministic and cached behavior, and how it relates to sibling tools. It is comprehensive for a complex diagnostic tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters are documented in the schema (100% coverage), and the description adds value by explaining display_currency's role ('USD = no FX line') and listing allowed currencies. It also clarifies refresh as 'force regenerate, bypass today's cache'. This enriches the schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is a 'composite read of *current* portfolio state' and differentiates from siblings like project_net_worth (probabilistic projections) and show_* tools (drill-downs). It uses a specific verb (read) and resource (current portfolio state), 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises 'Call this FIRST' and explains that it obviates multiple tool calls for common questions. It provides direct alternatives: use project_net_worth for probabilistic projections and show_* tools only for detail when needed. This is exemplary usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_net_worthA

Thought experiment: forward-looking Monte Carlo projection of net worth under caller-supplied assumptions, multi-scenario. Runs monthly GBM under one or more (return, vol) pairs in parallel, adds a fixed monthly contribution, applies one-time life events, and returns P10 / P25 / P50 / P75 / P90 trajectories per scenario. horizon_months accepts any length from 1 (next month) to 720 (60 years) — same tool answers short-horizon outlooks and long-horizon FIRE planning. target_value is optional: when supplied, the response includes probability of reaching it and median months to reach; when omitted, just the distribution at the horizon. All monetary inputs/outputs are in the requested currency (default USD). YOU MUST set scenarios[].expected_annual_return and scenarios[].annual_volatility explicitly and disclose them verbatim to the user — firma does NOT bake in defaults. For reference, brief.risk_summary carries the user's realized 90d annualized_return_pct and annualized_vol_pct — those make a natural 'historical' scenario you can contrast with bear/bull overlays. All scenarios share the same seeded shock sequence so cross-scenario differences reflect (return, vol) — not random noise. For current portfolio state, use get_market_brief — that is the diagnostic tool; this is the thought-experiment tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
currencyNoCurrency for every monetary input and output (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Default USD. The projection is unit-agnostic; this value is metadata for the response.USD
initial_valueYesStarting net worth in `currency`.
monthly_contributionYesNet monthly contribution in `currency` (income − expenses). Can be negative.
target_valueNoOptional net-worth target in `currency`. When provided, the response includes probability_of_reaching_target + median_months_to_target per scenario. Omit for pure distribution output.
horizon_monthsYesProjection horizon in months. 1 = next month outlook; 60 = 5-year planning; 360 = 30-year FIRE. Same tool for short and long horizons.
scenariosYesOne or more scenarios to run side-by-side. Each carries its own label, expected_annual_return, and annual_volatility. For single-scenario calls just pass an array of length 1.
life_eventsNoOptional one-time cash flows along the horizon.
iterationsNoMonte Carlo iterations per scenario. Default 1000 (P-band ±1.5%, ~500ms per scenario). Raise toward 10000 for smoother fan-chart curves at the cost of latency; lower to 100 for a quick sanity check.
seedNoOptional integer seed for reproducible runs.
include_pathsNoInclude the percentile trajectories per scenario (needed for fan-chart visualization). Set false for a lighter response (finals + probability + reach-month only).
path_resolutionNoPath sample frequency when include_paths=true. 'yearly' samples every 12 months (≈10× smaller payload, sufficient for trajectory curves); 'monthly' returns every month (needed only for month-precise visualization). All monetary values are rounded to the nearest currency unit in the response — full precision stays in the projection engine.yearly

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Discloses: monthly GBM, cross-scenario shared seed, target_value behavior, horizon range, iteration precision, path resolution impact. Covers most behavioral aspects, but could be more explicit about probabilistic nature of output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is long but each sentence adds value, front-loaded with core purpose. Could be slightly more concise by grouping related concepts, but overall efficient given complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, description fully explains output (percentiles, probability, median months), simulation process, and all parameter options. Covers how to obtain historical reference via brief.risk_summary. Complete for a complex tool with 11 parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline 3. Description adds value by explaining how horizon_months covers short/long horizons, target_value changes response, scenarios share same seed, and iteration defaults affect precision. Provides context beyond schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'forward-looking Monte Carlo projection of net worth under caller-supplied assumptions, multi-scenario', clearly defining the resource (net worth projection), method (Monte Carlo), and scope. It distinguishes from sibling 'get_market_brief' by positioning this as the thought-experiment tool vs. a diagnostic tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear guidance: use get_market_brief for current portfolio state, this tool for projections. Explains how to set scenarios (must set return/vol explicitly, disclose to user), and references brief.risk_summary for a historical scenario. Does not explicitly state when not to use, but covers when to use and alternatives well.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reportA

Aggregated wealth reports. target selects the view: balance — monthly net worth trend; flow — monthly income, expenses, net flow, savings rate; settle — single-period balance + cash flow summary with computed totals (defaults to current month, use period to pick another); combined (default) — both balance and flow trends in one call. Primary entry point for wealth-trajectory questions ("are my assets growing?", "is my net worth trending up?", "am I getting wealthier?") — portfolio value alone is insufficient because it ignores cash savings, debt paydown, and savings rate. Pair with show_snapshot when the user wants the market-driven slice of the trajectory.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNoWhich report to produce (default: combined)combined
periodNoPeriod in YYYY-MM format for settle (defaults to current month)
currencyNoDisplay currency
limitNoMax number of periods per trend report (default: 36)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries full burden. It describes the outputs of each view (monthly trends, income/expenses, single-period summary) without revealing side effects or auth needs. Implies read-only behavior but does not explicitly state it; lacks explicit idempotency guarantee.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized, using bold and backticks for clarity. It front-loads the core purpose and maps targets to outputs. Minor redundancy could be trimmed, but remains efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must cover return values. It describes outputs for each view and explains the relationship to sibling tools. Lacks structural details (e.g., data types), but is sufficient for a reporting tool given the context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, baseline is 3. The description adds value for 'target' by detailing each enum value and for 'period' by noting default behavior. For 'currency' and 'limit', it provides minimal extra context beyond the schema, but overall compensates adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool produces aggregated wealth reports and lists four distinct views (balance, flow, settle, combined) with specific use cases. It also differentiates from sibling tool show_snapshot by noting when to pair them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly identifies it as the primary entry point for wealth-trajectory questions and explains why portfolio value alone is insufficient. Provides guidance on when to pair with show_snapshot, offering clear when-to-use and when-not-to-use context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_profileA

Update the user's profile. Partial updates — only provided fields are changed. All fields are optional; capture only what the user volunteers, never invent values. Birth year and retirement target year are 4-digit years; target_net_worth is in the supplied currency (default USD) and stored internally as USD via the latest FX rate; risk tolerance is one of conservative/moderate/aggressive; notes is free-form for preferences/constraints.

ParametersJSON Schema
NameRequiredDescriptionDefault
birth_yearNo
retirement_target_yearNo
target_net_worthNoTarget net worth in the supplied `currency` (default USD).
currencyNoCurrency of `target_net_worth` (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.USD
risk_toleranceNo
notesNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Details partial update behavior, field constraints (4-digit years, currency conversion to USD, enum values), and free-form notes. No annotations are present, so the description carries the burden; it adequately discloses key behaviors without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first states purpose and partial update, second lists field constraints. Every sentence adds value; no fluff. Front-loaded with core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple update tool with 6 optional parameters and no output schema, the description covers the essential behavior, field formatting, and currency conversion. No critical gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds significant meaning beyond the schema: explains 4-digit years for birth_year and retirement_target_year, currency conversion for target_net_worth, enum values for risk_tolerance, and free-form for notes. Schema coverage is only 33%, but description compensates fully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with 'Update the user's profile,' clearly stating the verb and resource. It specifies partial updates, distinguishing it from sibling tools like 'show_profile' (read) and others.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Partial updates — only provided fields are changed' and 'All fields are optional; capture only what the user volunteers, never invent values.' Provides clear context but does not explicitly mention when not to use or alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

setup_statusA

One-shot setup diagnostic. Call this at the start of every conversation, and any time the user asks for analysis but you're unsure what data is available. Returns: API key state, data counts (transactions / balance / flow / prices / snapshots / FX), profile, next_steps for onboarding, capabilities (which kinds of analysis are currently possible), and analyst_context (the persona, principles, data_gating rules, and reasoning frameworks). Treat capabilities as a hard gate — if a required capability is false, follow the matching data_gating rule instead of fabricating an answer.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully covers what the tool returns: API key state, data counts, profile, next steps, capabilities, and analyst_context. It also explains how to treat capabilities as a hard gate, preventing fabrication.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise yet comprehensive single paragraph. Front-loaded with purpose and usage, followed by return values and critical instructions. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and no output schema, the description provides all necessary context: purpose, when to call, what it returns, and how to interpret results. Complete for the tool's role.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so baseline is 4. The description adds value by detailing the return fields, which compensates for missing output schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly identifies as a one-shot setup diagnostic tool. Distinguishes from sibling tools like add_balance or show_txns which operate on specific data, while this tool checks data availability and capabilities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to call at the start of every conversation and any time unsure of data availability. Provides clear context for use without needing exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_anti_portfolioA

Track the post-exit performance of positions the user has fully sold — the data brokerage apps deliberately don't show (because it would highlight bad sells). For each ticker the user once held but no longer does, returns the last sell date, last sell price, current price, days since exit, post-sell price change %, and a label: missed_rebound (+20% or more since sell — sell was likely premature), good_call (-20% or more — sell saved losses), neutral_exit, or too_recent (<14 days, signal noise). Use when the user is contemplating a sell, reviewing past decisions, or asking 'have my sells worked out?'. Pair with show_thesis_track to connect the original buy thesis to the sell outcome. The summary counts make the user's overall sell discipline visible at a glance.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax number of sold positions to return (most recently sold first).
display_currencyNoDisplay currency (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.USD

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, description thoroughly explains output and implied read-only nature. Could explicitly state no side effects, but is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is informative but slightly verbose; still well-structured with purpose first, then details and usage guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without output schema, description fully explains return values, including label conditions. Also covers usage context and pairing, making it complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters have clear descriptions. Description adds no extra meaning beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool tracks post-exit performance of fully sold positions, with specific metrics and labels. Differentiates from peers like show_thesis_track and show_portfolio.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: when contemplating a sell, reviewing past decisions, or asking about sell outcomes. Also suggests pairing with show_thesis_track.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_balanceA

Stored balance sheet entries (assets + liabilities) by period. Each entry has type (asset|liability), sub_type (cash|investment|other|short_term|long_term), category, amount in display_currency (default USD), and the entry date. Without period, returns ALL periods — use this for trends; with period (YYYY-MM), returns one month's snapshot.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoPeriod filter e.g. "2025-03"
display_currencyNoDisplay currency for amounts (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.USD

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes return structure (type, sub_type, category, amount, date) and behavior with period. However, no annotations exist, and the description does not explicitly state this is a read-only operation, though implied by 'show'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each serving a purpose: purpose, structure, and usage guidance. No wasted words, front-loaded with key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, parameters, return structure, and usage modes. Lacks explicit read-only declaration and pagination details, but sufficient for a simple listing tool given no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds value by explaining the optionality of 'period' (all vs. snapshot) and listing currencies for 'display_currency' beyond the schema's short description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool retrieves balance sheet entries (assets + liabilities) by period. Distinguishes itself from sibling 'show_' tools by specifying the data type (balance sheet) and behavior with/without period.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains when to use without period (trends) and with period (snapshot). Does not mention exclusions or alternatives, but the guidance is clear for common use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_benchmarkA

Compare portfolio return against benchmark indices (default: SPY and QQQ). Uses daily snapshot history when available for accurate time-series comparison; falls back to cost-basis vs current value when no snapshots exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
fromNoStart date YYYY-MM-DD (default: earliest snapshot or transaction date)
toNoEnd date YYYY-MM-DD (default: today)
benchmarksNoTickers to compare against (default: ["SPY", "QQQ"])

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given no annotations, the description discloses two distinct behaviors: using daily snapshot history when available, otherwise falling back to cost-basis vs current value. This provides useful transparency about data dependencies, though it could mention output format or potential limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences cover purpose, default benchmarks, and fallback behavior. Every word is necessary; no fluff. Efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains the tool's mechanism but does not describe the output format or what the agent can expect as a result. Since no output schema exists, the description should fill that gap, which it does not.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds no new parameter-level meaning beyond what the schema already provides (defaults are stated in schema). The fallback behavior is tool-level context, not parameter-specific.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool compares portfolio return against benchmark indices, specifying default benchmarks (SPY and QQQ). It effectively distinguishes from sibling tools like show_portfolio or show_risk by focusing on benchmark comparison.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how the tool operates (snapshot-based or fallback) but does not explicitly state when to use it over alternatives or when not to use it. The purpose is clear, but guidance on context is lacking.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_concentrationA

Portfolio concentration measured by Herfindahl-Hirschman Index (HHI) across ticker, currency, sector, and country dimensions. HHI ranges 0–10000; >2500 is high, >5000 very high. Returns top contributors per dimension, plus the pairwise 90-day correlation matrix and an effective-N (correlation-adjusted holdings count): two holdings at 0.9 correlation count as roughly one for diversification. effective_n / correlation_matrix_90d are null/empty until firma sync populates the correlation cache.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully bears the burden. It explains HHI range and thresholds, the dependency on sync for correlation data, and the interpretation of effective-N, providing thorough 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph of four sentences, well-structured and front-loaded with the main purpose. Slightly verbose in places but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even without an output schema, the description comprehensively details all return components (HHI per dimension, top contributors, correlation matrix, effective-N) and their interpretation, making it fully complete for an agent to understand the tool's output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist; schema coverage is 100% (empty). The description adds value by clarifying what the tool returns, even without inputs, so baseline is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description precisely states it measures portfolio concentration via HHI across ticker, currency, sector, and country dimensions, clearly distinguishing it from sibling tools like show_portfolio or show_risk.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It notes that effective_n/correlation_matrix require a prior 'firma sync' to be populated, giving implicit usage context. However, it does not explicitly compare to alternatives or state when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_dividendA

Estimated annual dividend income for all holdings. Returns per-ticker yield, annual DPS, and estimated income in display_currency (default USD). Only includes tickers with dividend data.

ParametersJSON Schema
NameRequiredDescriptionDefault
display_currencyNoDisplay currency for monetary fields (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.USD

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses that values are estimated and that only tickers with dividend data are included, which is good transparency. However, it does not explicitly state that it is a read-only operation, though that is implied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences: one stating the main purpose and output, and another providing scope limitation. Every word adds value, and it is front-loaded with the primary function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple one-parameter input and no output schema, the description is fairly complete. It explains what is returned, the currency handling, and the limitation to tickers with data. It could mention the calculation basis for yield, but overall adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a clear description of the display_currency parameter. The description reinforces the default and usage in context, but adds no significant new meaning beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reports estimated annual dividend income for all holdings, including per-ticker yield, annual DPS, and estimated income in a specified currency. It distinguishes from sibling tools like show_earnings by focusing specifically on dividend data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for retrieving dividend information, but lacks explicit guidance on when not to use or how it compares to alternatives. The sibling tools list is extensive, but the description does not directly address when to choose this tool over others.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_earningsA

Fetch earnings calendar. Without a ticker, returns upcoming earnings for all held tickers. With a ticker, returns history + upcoming.

ParametersJSON Schema
NameRequiredDescriptionDefault
tickerNoTicker symbol. Omit to get upcoming earnings for all holdings.
weeksNoLook-ahead window in weeks (default: 4)
historyNoInclude past quarters (only applies when ticker is provided)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the dual behavior (with/without ticker) but lacks details on authentication needs, rate limits, data freshness, or error handling. Since no annotations are provided, the description carries full burden; it is adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the action, and contains no unnecessary words or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple earnings calendar tool with no output schema, the description covers the main usage modes. It could be improved by hinting at return format or error cases, but overall it is sufficient for the complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents all three parameters. The description adds no additional parameter information beyond the schema. Per guidelines, baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it fetches earnings calendar and distinguishes two modes: without ticker for upcoming earnings for all held tickers, and with ticker for history plus upcoming. This differentiates it from sibling tools like show_financials or show_valuation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly guides usage by describing the two modes (omit ticker for portfolio overview, include ticker for specific company data). It does not explicitly state when not to use or mention alternatives, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_financialsB

Fetch SEC-reported financials for a ticker. Returns key income statement, cash flow, and balance sheet metrics extracted from XBRL filings.

ParametersJSON Schema
NameRequiredDescriptionDefault
tickerYesStock ticker symbol (e.g. AAPL)
freqNoquarterly
limitNoNumber of periods to return (default: 4)

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, and the description does not disclose behavioral traits such as data freshness, rate limits, permissions, or limitations. The extraction from XBRL filings is mentioned but without implications for availability.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no redundancy. The first sentence states purpose, the second lists output components. Every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema, the description should detail return values more. It mentions 'key metrics' from three statements but does not specify which metrics. Parameter context is not enhanced. Adequate but incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67% (ticker and limit have descriptions, freq only has enum). The tool description adds no additional meaning beyond the schema, so it meets the baseline but does not compensate for the missing freq description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches SEC-reported financials for a ticker, specifying the resource (financial statements) and what is returned. However, it does not explicitly distinguish it from sibling tools like show_balance or show_earnings, which may overlap.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives or any prerequisites (e.g., US companies only). The description implies general usage but lacks explicit context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_flowA

Stored monthly cash flow entries (income + expenses) by period. Each entry has type (income|expense), sub_type, category, amount in display_currency (default USD), date. Without period returns all periods; with period (YYYY-MM) returns one month. For trend analysis use report with target "flow" which aggregates and adds savings rate.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoPeriod filter e.g. "2025-03"
display_currencyNoDisplay currency for amounts (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.USD

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description implies read-only behavior by saying 'stored entries' but does not explicitly state side effects, auth needs, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences front-load purpose and cover parameter behavior and alternative, with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Describes return entry structure and parameter effects. No output schema but description covers what to expect. Could mention pagination or response format but not required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so description adds minimal value beyond schema. It reiterates period format and display_currency default already in schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves stored monthly cash flow entries with fields and explains behavior with/without period, distinguishing it from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use without period vs with period, and suggests an alternative (report with target 'flow') for trend analysis, but does not explicitly state when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_fxA

Inspect the local FX rate cache (foreign per 1 USD). Without currency, returns per-currency coverage (count + first/last date). With currency + date, returns the point-in-time rate, falling back to the most recent within lookback_days. With currency + from/to, returns the cached series for that range. With currency alone, returns the limit most-recent rows. USD has no rows (it's the base, always 1.0).

ParametersJSON Schema
NameRequiredDescriptionDefault
currencyNoCurrency code (KRW/JPY/EUR/CNY/GBP/HKD/INR/TWD). Omit for coverage summary.
dateNoYYYY-MM-DD — point-in-time lookup for `currency`
fromNoStart date YYYY-MM-DD
toNoEnd date YYYY-MM-DD
limitNoMax rows when no date range (default 60)
lookback_daysNoDays to look back for a point lookup if exact date not cached

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: caching, fallback using lookback_days, and the special case for USD. It outlines return types for each invocation mode, making the tool's behavior transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise (5 sentences) and front-loads the core purpose. Each sentence adds distinct information about a different invocation pattern, with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description fully explains return values for all parameter combinations, covers edge cases (USD, fallback), and addresses all six parameters. It is complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds significant value by explaining combinatorial logic (e.g., 'with currency + from/to returns series'), which is beyond the individual parameter descriptions in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states specific verb ('Inspect') and resource ('local FX rate cache'), and clearly explains the base unit (USD). It distinguishes from sibling tools by focusing on FX rates, which is unique among the many 'show_*' tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description provides clear context for different parameter combinations and their outputs. It does not explicitly compare to sibling tools or state when not to use this tool, but the specificity of the tool makes its usage context obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_macroA

Curated macro snapshot in one view: 8 indicators (VIX, 10Y Treasury, yield curve, USD index, HY credit spread, breakeven inflation, Fed funds, plus FX vs the requested display currency, each with current value, 30d/90d delta, and 5y average), plus an Economic Stress Index (0–100 from 5 FRED series with per-component breakdown), and a macro regime bias (Risk-on / Mixed / Risk-off from 5 binary signals). The display_currency arg drives the FX series selection (USD = no FX line).

ParametersJSON Schema
NameRequiredDescriptionDefault
display_currencyNoDisplay currency for the FX snapshot (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.USD

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description discloses all output components (8 indicators, stress index, regime bias) and the effect of display_currency. It lacks mention of idempotency or rate limits but is otherwise transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences efficiently convey full scope with front-loaded overview, zero wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description fully explains the three output sections (indicators, stress index, regime bias) with enough detail for an agent to know what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds concrete meaning: 'display_currency arg drives the FX series selection (USD = no FX line)', which is not in the schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provides a 'curated macro snapshot' with specific indicators, stress index, and regime bias. It distinguishes from siblings like get_market_brief by detailing exact contents.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for macro overview but does not explicitly state when to use versus alternatives like get_market_brief, nor provides exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_newsA

Recent company news from Finnhub for a single ticker — headline, summary, source, published timestamp, URL. Default lookback is 7 days, capped to limit items (default 10). For news across all holdings in one call, prefer get_market_brief which aggregates the last 24h.

ParametersJSON Schema
NameRequiredDescriptionDefault
tickerYesStock ticker symbol (e.g. AAPL)
daysNoDays to look back (default: 7)
limitNoMax articles to return (default: 10)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations available, but description discloses defaults (7 days, limit 10), output structure, and data source (Finnhub). Could mention idempotency or lack of side effects, but overall clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no wasted words. Front-loads purpose, then provides usage guidance efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool without output schema, description covers purpose, parameters, behavior, and alternative. No gaps given tool complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all 3 parameters with descriptions (100% coverage). Description adds context about 'cap' and defaults but doesn't significantly extend beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Recent company news from Finnhub for a single ticker' with specific output fields (headline, summary, source, timestamp, URL). Distinguishes from sibling get_market_brief which aggregates across holdings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use and when not: 'For news across all holdings in one call, prefer get_market_brief which aggregates the last 24h.' Also provides default lookback and limit behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_portfolioA

Current holdings derived from the user's transaction log: ticker, shares, avg cost, current price, market value, P&L (absolute and %), plus an optional risk summary (Sharpe, volatility, drawdown) from snapshot history and FX return decomposition when a non-USD display currency is requested. All monetary values are returned in display_currency (default USD). Each holding carries asset_type (stock for listed equities; crypto/commodity/real_estate/other for manually-valued assets) and syncedAt — the price as-of date. For non-stock holdings syncedAt reflects the last add_price entry; a null syncedAt (or currentPrice) means the asset has never been priced. This is a drill-down tool: for any check-in or portfolio question, call get_market_brief first — it already includes this data plus weights, news, earnings, and macro context. Use show_portfolio only when the holdings table itself is the sole thing asked for, or to inspect FX decomposition.

ParametersJSON Schema
NameRequiredDescriptionDefault
display_currencyNoDisplay currency for monetary fields and FX return decomposition (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD. When non-USD, returns fx_decomposition per holding showing how much of P&L came from price vs exchange rate movement.USD

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but the description compensates fully: it explains return fields, currency handling, asset_type values, syncedAt semantics, edge cases (null syncedAt/currentPrice), and optional risk summary. All behavioral traits are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but well-structured, front-loaded with purpose and key fields. While it could be slightly more concise, every sentence adds value and the flow is logical.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully covers return fields, edge cases, and usage context. It leaves no critical gaps for an agent to understand what the tool does and returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single parameter (display_currency). The description adds extra context: lists allowed currency codes and explains FX decomposition behavior when non-USD, enhancing meaning beyond the schema's brief description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it returns 'Current holdings derived from the user's transaction log' and lists specific fields (ticker, shares, avg cost, etc.). It also distinguishes itself from siblings by positioning itself as a drill-down tool and recommending get_market_brief for broader queries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool ('when the holdings table itself is the sole thing asked for, or to inspect FX decomposition') and when not to ('call get_market_brief first'). Names a clear alternative (get_market_brief) that provides broader context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_profileA

Read the user's stored profile (birth year, retirement target year, target net worth, risk tolerance, free-form notes). Target net worth is returned in display_currency (default USD). Returns null if no profile is set. Use this to anchor analysis to the user's actual goals rather than generic advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
display_currencyNoDisplay currency for target_net_worth (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.USD

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Describes read-only behavior, return format (fields and null case), and default currency. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first states purpose and fields, second gives usage guidance. Front-loaded, no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers what is returned, null case, currency default, and usage context. No output schema needed for this simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Single parameter (display_currency) with 100% schema coverage. Description adds context that target net worth is returned in display_currency (default USD), reinforcing schema info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Read the user's stored profile' and lists specific fields (birth year, retirement target, etc.). Differentiates from sibling tools like set_profile and other show tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this to anchor analysis to the user's actual goals rather than generic advice,' providing clear context. Lacks explicit 'when not to use' but sufficient for most agents.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_riskA

Portfolio risk metrics derived from snapshot history: annualized volatility, max drawdown, Sharpe ratio, Sortino ratio, win rate, and beta vs benchmark. Requires at least 10 daily snapshots — if the user has fewer, suggest running firma add snapshot regularly.

ParametersJSON Schema
NameRequiredDescriptionDefault
fromNoStart date YYYY-MM-DD
toNoEnd date YYYY-MM-DD (default: today)
benchmarkNoTicker for beta calculation (default: SPY)
risk_free_rateNoAnnual risk-free rate % for Sharpe/Sortino (default: 5.0)

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral transparency. It discloses that the tool derives metrics from snapshot history and requires a minimum data count, but it does not mention idempotency, side effects, or return format. The disclosure is adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no fluff. It front-loads the tool's purpose and output in the first sentence, and provides a critical prerequisite and actionable advice in the second. Every phrase adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool computes multiple risk metrics but lacks an output schema, so the description should clarify the return format. It lists metrics but does not specify if they are returned as an object, array, or single value. For a tool with no output schema and moderate complexity, the description is partly complete but missing structural details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with each parameter already described (e.g., 'Start date YYYY-MM-DD'). The description does not add additional meaning or usage tips beyond the schema, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool computes portfolio risk metrics from snapshot history, listing specific metrics (annualized volatility, Sharpe, etc.). It distinguishes itself from sibling 'show_' tools by focusing on risk metrics and requiring snapshot data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states a prerequisite of at least 10 daily snapshots and suggests an alternative action (running 'firma add snapshot') if the user lacks sufficient data. This provides clear guidance on when and how to use the tool, though it doesn't explicitly compare to alternative sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_snapshotA

Query portfolio snapshot history. Without ticker, returns daily total market value in display_currency (default USD). With ticker, returns per-holding time series with prices in display_currency. IMPORTANT: For any projection, goal-timeline, or "when will I reach X" question, this tool alone is insufficient — it only provides historical trajectory. You must also call get_market_brief (for current macro regime, stress score, and signals) and use risk_summary.annualized_vol + signals.regime to build bear/base/bull scenarios rather than extrapolating linearly from past returns. Linear extrapolation from snapshot history is a category error for forward-looking questions.

ParametersJSON Schema
NameRequiredDescriptionDefault
tickerNoFilter by ticker symbol
fromNoStart date (YYYY-MM-DD, inclusive)
toNoEnd date (YYYY-MM-DD, inclusive)
display_currencyNoDisplay currency for monetary fields (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.USD

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully explains the behavioral distinction between with/without ticker, and warns about the tool's limitation for projections. It does not mention authentication or rate limits, but covers the key behavioral traits for correct usage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and efficiently adds contextual warnings. It is slightly long but every sentence contributes meaning, maintaining a good structure for quick scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and moderate complexity, the description covers parameter effects, currency, and the critical caveat about projection questions, while also referencing complementary tools. It lacks return format details but is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value by explaining the semantic difference between ticker present/absent, and mentions the default and effect of display_currency, going beyond the schema's field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it queries portfolio snapshot history, with a specific distinction between aggregate (without ticker) and per-holding (with ticker) data. This specificity and contrast with the sibling tool set effectively communicates 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises when not to rely solely on this tool, especially for forward-looking questions, and names specific alternatives (get_market_brief, risk_summary). This provides exceptional guidance on when to use and when to avoid.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_thesis_trackA

Review past trades that have a recorded reason (the thesis) and check whether each thesis played out. Returns each thesis trade with the buy price, current price, days held, price change %, whether the position is still held, and an outcome label (validated_holding / underwater_holding / cut_loss / etc — these are descriptive labels, not judgments). Use this when the user asks 'did my last trade work', 'what's the track record of my AAPL theses', 'review my decisions', or when reasoning about a new buy in the same name as past trades. Coverage_pct tells you what fraction of trades have a recorded reason — if low, encourage the user to add reason when logging future trades.

ParametersJSON Schema
NameRequiredDescriptionDefault
tickerNoFilter to a single ticker (case-insensitive). Omit for portfolio-wide review.
limitNoMax number of thesis entries to return (most recent first).
display_currencyNoDisplay currency for prices (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.USD

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, but the description clearly indicates this is a read-only review tool by using verbs like 'review' and 'returns'. It describes the output fields in detail, including outcome labels and coverage_pct, which helps the agent understand what to expect. However, it doesn't explicitly state that no data is modified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph that front-loads the main purpose and includes important usage details. It is concise but covers all necessary aspects, though it could be slightly shorter by combining sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description thoroughly explains the return fields (buy price, current price, days held, price change %, still held, outcome label, coverage_pct). It also provides usage context and guidance on encouraging user to add reasons, making it complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters (ticker, limit, display_currency) have descriptions in the input schema, achieving 100% coverage. The description adds context about portfolio-wide review when ticker is omitted and mentions coverage_pct in output, but doesn't add significant meaning beyond the schema for the parameters themselves.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific action ('Review past trades that have a recorded reason') and resource (thesis trades), clearly distinguishing from sibling tools like show_portfolio or show_txns. It explicitly states the tool evaluates theses, which is unique among the listed siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage examples ('did my last trade work', 'what's the track record of my AAPL theses') and guidance on when to use it (reasoning about a new buy). It also gives advice on interpreting coverage_pct, helping the agent decide when to prompt the user.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_txnsA

Full transaction log (buys, sells, deposits, dividends, taxes) ordered by date ascending. Pass ticker to filter to one symbol — useful for "show me all my AAPL trades" or computing a per-position story. Works for non-stock asset names too (e.g. "Bitcoin"); the match is case-insensitive. Each row has the original currency it was entered in; price is returned in display_currency (default USD).

ParametersJSON Schema
NameRequiredDescriptionDefault
tickerNoFilter by ticker or asset name (e.g. AAPL, Bitcoin)
display_currencyNoDisplay currency for price (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.USD

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description takes on full disclosure responsibility. It explains the ascending date order, case-insensitive ticker filtering for both stocks and non-stocks, and the currency handling (original currency per row, price in display_currency). These are useful behavioral traits, though pagination or row limits are not addressed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (four sentences), front-loaded with the core purpose, and each sentence adds new information without repetition. It is well-structured and efficient for an AI agent to quickly grasp the tool's function and usage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although the description covers the main transaction types, ordering, and currency behavior, it lacks details about the full set of output fields (e.g., date, quantity, transaction type) since there is no output schema. For a log tool, listing typical columns would improve completeness, but the given info is minimally adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (baseline 3). The description adds value beyond the schema: it clarifies that ticker filter works for non-stock assets and is case-insensitive, and it explains how display_currency affects the returned price. This enriches parameter understanding beyond the schema's basic text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it returns a 'Full transaction log (buys, sells, deposits, dividends, taxes) ordered by date ascending.' This specific verb-resource combination with transaction types and ordering makes the purpose unmistakable, and it distinguishes itself from sibling 'show_*' tools by focusing on individual transaction records.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for per-transaction queries like 'show me all my AAPL trades' but does not explicitly state when to prefer this over sibling tools like show_portfolio (aggregated holdings) or show_balance. No exclusions or alternative tool names are mentioned, leaving the agent to infer the context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_valuationA

Valuation deep-dive for a single ticker: PEG ratio, Price/Sales, and FCF yield — computed from 8 quarters of SEC filings. Use when the user asks 'is X overvalued / cheap?', 'what's the PEG?', 'how does the valuation look?'. Requires Finnhub key. Market cap and PE come from the price cache; revenue, EPS, operating cash flow, and capex come from XBRL filings.

ParametersJSON Schema
NameRequiredDescriptionDefault
tickerYesStock ticker symbol (e.g. AAPL)

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses data sources (price cache for market cap/PE, XBRL filings for other data) and a prerequisite (Finnhub key). It doesn't specify error behavior, but the transparency is high for a simple tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no wasted words. The first sentence lists the output metrics, the second gives usage triggers, and the third mentions data sources and prerequisites. It is front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has one parameter, no output schema, and no annotations, the description adequately covers purpose, usage, data sources, and a prerequisite. It could be more complete by noting possible errors or return format, but it's sufficient for its simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (only one parameter with description). The description adds value by explaining that the ticker parameter is used to fetch data from multiple sources, going beyond the schema's simple description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it performs a 'valuation deep-dive for a single ticker' and lists specific metrics (PEG ratio, Price/Sales, FCF yield). It distinguishes itself from sibling tools like show_earnings and show_financials by focusing on valuation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides usage examples: 'Use when the user asks is X overvalued / cheap?, what's the PEG?, how does the valuation look?'. This directly guides an AI agent on when to invoke the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simulate_scenarioA

Call this for any short-horizon outlook question (1 day to 1 week). Trigger phrases: "내일", "tomorrow", "이번 주", "next week", "화요일", "수요일", "this Thursday", "how might X day look", "what if [macro event] happens", "FOMC 영향", "earnings 영향", "포트 어떻게 될까", "내 포트는 어떨까". DO NOT answer these from the brief alone — the brief is diagnostic only. This tool turns the brief's measured data into a quant answer. Thought experiment: deterministic conditional analysis. Given hypothetical market shocks, returns per-holding and portfolio P&L impact based on beta. Unlike project_net_worth (stochastic forward distribution over months/years), this is a point estimate per scenario for the immediate future — "if S&P moves −2% and your TSLA beta is 1.6, your TSLA P&L is impact_usd". Workflow: (1) call get_market_brief, (2) read holdings[].fundamentals.beta_5y into beta_overrides, (3) read risk_summary.daily_vol_pct into daily_vol_pct, (4) construct 2-3 scenarios (e.g. bear / base / bull at equity_pct -0.02 / 0 / +0.02; or hawkish / dovish for a Fed event). Caller MUST supply the shocks (the assumption) and disclose them in the answer. Without beta_overrides each ticker defaults to 1.0; without daily_vol_pct the one-sigma range is null. Use for next-day outlook ("if FOMC is hawkish?"), idiosyncratic event sizing ("my biggest position reports tomorrow, what's the dollar range?"), specific-day outlook ("화요일 시장 어떨까"), and rebalance impact ("if I trim TSLA and rotate to JNJ?"). For long-horizon projection (months/years, FIRE planning) use project_net_worth instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
display_currencyNoDisplay currency for output amounts (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD).USD
scenariosYesOne to eight shock scenarios to evaluate in one call. Each is independent; results are returned in input order. Conventional patterns: directional triplet (bear/base/bull), conditional pair (event happens / does not), idiosyncratic single (one ticker stress).
beta_overridesNoPer-ticker beta overrides keyed by ticker. Pull from `get_market_brief` → `holdings[].fundamentals.beta_5y` for the user's actual exposure. Tickers with no override and no beta data default to 1.0.
daily_vol_pctNoPortfolio's measured 1-day stddev as a percentage (from `get_market_brief` → `risk_summary.daily_vol_pct`). Used to compute `one_sigma_range_usd` so each scenario can be sized against the portfolio's natural daily volatility.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description fully bears the burden. It transparently explains the deterministic conditional analysis approach, how beta_overrides and daily_vol_pct affect results, and what defaults occur (beta=1.0, one_sigma_range null). This gives a clear mental model of the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is thorough but slightly lengthy. However, it is well-structured with bold key terms, workflow steps, and examples. Every sentence serves a purpose, earning its place. Minor shortening could be possible without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (4 parameters, nested objects) and the absence of an output schema, the description provides complete context: workflow, sourcing parameters, constructing scenarios, and distinguishing from sibling tools. No gaps remain for an AI agent to infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds significant value beyond the schema: it explains how to structure scenarios (bear/base/bull, conditional pairs), how beta_overrides are sourced from `get_market_brief`, and the conventional patterns. This greatly aids correct usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description precisely states the tool's purpose: answering short-horizon outlook questions (1 day to 1 week) by converting market brief data into quantitative scenario analysis. It clearly distinguishes from the sibling tool `project_net_worth` which handles long-horizon projections.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage guidance: trigger phrases, workflow steps (call get_market_brief first, then construct scenarios), and when NOT to use (long-horizon questions). It also specifies that the caller must supply shocks and disclose them, and directs to `project_net_worth` for months/years projections.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

syncA

Refresh local caches. scope='prices' fetches latest stock prices (US via Finnhub, non-US via Yahoo, all stored in USD; requires finnhub_api_key). scope='fx' backfills the historical FX rate cache from FRED (KRW/JPY/EUR/CNY/GBP/HKD/INR/TWD per USD, increment-only; requires fred_api_key). scope='all' (default) runs prices then fx, mirroring firma sync.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoall

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: it specifies data sources (Finnhub, Yahoo, FRED), storage format (USD), incremental updates ('increment-only' for fx), and dependencies (API keys). No relevant behavioral aspects are omitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, using three sentences to cover the purpose and all scope details. No redundancy; every word adds value. The structure is logical: general purpose first, then specific scopes, then default.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with no output schema, the description covers all necessary context: what it does, all scope options with detailed explanations, dependencies, and default behavior. It is self-contained and sufficient for correct tool invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides only enum values with no descriptions. The description adds substantial meaning by explaining what each scope does, the data sources involved, and the default behavior. This far exceeds the schema's bare enumeration.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool refreshes local caches and details each scope option. The verb 'refresh' combined with 'local caches' and explicit scope explanations differentiates it from sibling tools that are primarily for viewing or adding data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description provides clear context for each scope, including data sources and required API keys. While it does not explicitly state when not to use the tool, the context makes it evident that this is for cache refreshing, distinct from other operations.

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.

  1. 42 tool updatesv0.20.0
    • Changedadd_balance10 fields changed
      • removedInput schema / properties / amount
        Removed value: -{
        -  "description": "Amount in `currency` units (whole units, no decimals)",
        -  "type": "integer"
        -}
      • removedInput schema / properties / category
        Removed value: -{
        -  "description": "Must be one of the predefined balance categories: assets: cash, savings, housing_sub, usd_cash, cash_other, domestic_stock, overseas_stock, real_estate, pension, vehicle, deposit, asset_other. Liabilities: credit_card, short_term_other, loan, long_term_other.",
        -  "type": "string"
        -}
      • removedInput schema / properties / currency
        Removed value: -{
        -  "default": "USD",
        -  "description": "Currency of `amount` (USD/KRW/JPY/EUR/CNY/GBP). Defaults to USD. Non-USD values are converted to USD via historical FX at `date` for storage.",
        -  "type": "string"
        -}
      • removedInput schema / properties / date
        Removed value: -{
        -  "description": "YYYY-MM-DD (typically month-end)",
        -  "type": "string"
        -}
      • addedInput schema / properties / entries
        Added value: +{
        +  "description": "One or more balance entries to upsert",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "amount": {
        +        "description": "Amount in `currency` units (whole units, no decimals)",
        +        "type": "integer"
        +      },
        +      "category": {
        +        "description": "Must be one of the predefined balance categories: assets: cash, savings, housing_sub, usd_cash, cash_other, domestic_stock, overseas_stock, real_estate, pension, vehicle, deposit, asset_other. Liabilities: credit_card, short_term_other, loan, long_term_other.",
        +        "type": "string"
        +      },
        +      "currency": {
        +        "default": "USD",
        +        "description": "Currency of `amount` (USD/KRW/JPY/EUR/CNY/GBP/HKD/INR/TWD). Defaults to USD. Non-USD values are converted to USD via historical FX at `date` for storage.",
        +        "type": "string"
        +      },
        +      "date": {
        +        "description": "YYYY-MM-DD (typically month-end)",
        +        "type": "string"
        +      },
        +      "memo": {
        +        "type": "string"
        +      },
        +      "period": {
        +        "description": "YYYY-MM",
        +        "type": "string"
        +      },
        +      "sub_type": {
        +        "description": "cash | investment | other | short_term | long_term",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "asset",
        +          "liability"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "period",
        +      "date",
        +      "type",
        +      "sub_type",
        +      "category",
        +      "amount"
        +    ],
        +    "type": "object"
        +  },
        +  "minItems": 1,
        +  "type": "array"
        +}
      • removedInput schema / properties / memo
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / period
        Removed value: -{
        -  "description": "YYYY-MM",
        -  "type": "string"
        -}
      • removedInput schema / properties / sub_type
        Removed value: -{
        -  "description": "cash | investment | other | short_term | long_term",
        -  "type": "string"
        -}
      • removedInput schema / properties / type
        Removed value: -{
        -  "enum": [
        -    "asset",
        -    "liability"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "period",
        -  "date",
        -  "type",
        -  "sub_type",
        -  "category",
        -  "amount"
        -]New value: +[
        +  "entries"
        +]
    • Removedadd_balances
    • Changedadd_flow10 fields changed
      • removedInput schema / properties / amount
        Removed value: -{
        -  "description": "Amount in `currency` units (whole units)",
        -  "type": "integer"
        -}
      • removedInput schema / properties / category
        Removed value: -{
        -  "description": "Must be one of the predefined flow categories. Income: salary, business, dividends, interest, income_other. Expense: personal, insurance, phone, utilities, rent, maintenance, loan_repayment, expense_other.",
        -  "type": "string"
        -}
      • removedInput schema / properties / currency
        Removed value: -{
        -  "default": "USD",
        -  "description": "Currency of `amount` (USD/KRW/JPY/EUR/CNY/GBP). Non-USD converted via historical FX at `date`.",
        -  "type": "string"
        -}
      • removedInput schema / properties / date
        Removed value: -{
        -  "description": "YYYY-MM-DD (typically month-end)",
        -  "type": "string"
        -}
      • addedInput schema / properties / entries
        Added value: +{
        +  "description": "One or more flow entries to upsert",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "amount": {
        +        "description": "Amount in `currency` units (whole units)",
        +        "type": "integer"
        +      },
        +      "category": {
        +        "description": "Must be one of the predefined flow categories. Income: salary, business, dividends, interest, income_other. Expense: personal, insurance, phone, utilities, rent, maintenance, loan_repayment, expense_other.",
        +        "type": "string"
        +      },
        +      "currency": {
        +        "default": "USD",
        +        "description": "Currency of `amount` (USD/KRW/JPY/EUR/CNY/GBP/HKD/INR/TWD). Non-USD converted via historical FX at `date`.",
        +        "type": "string"
        +      },
        +      "date": {
        +        "description": "YYYY-MM-DD (typically month-end)",
        +        "type": "string"
        +      },
        +      "memo": {
        +        "type": "string"
        +      },
        +      "period": {
        +        "description": "YYYY-MM",
        +        "type": "string"
        +      },
        +      "sub_type": {
        +        "description": "Must match the category sub_type. Income: employment, investment, other. Expense: consumption, fixed, housing, debt, other.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "income",
        +          "expense"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "period",
        +      "date",
        +      "type",
        +      "sub_type",
        +      "category",
        +      "amount"
        +    ],
        +    "type": "object"
        +  },
        +  "minItems": 1,
        +  "type": "array"
        +}
      • removedInput schema / properties / memo
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / period
        Removed value: -{
        -  "description": "YYYY-MM",
        -  "type": "string"
        -}
      • removedInput schema / properties / sub_type
        Removed value: -{
        -  "description": "Must match the category sub_type. Income: employment, investment, other. Expense: consumption, fixed, housing, debt, other.",
        -  "type": "string"
        -}
      • removedInput schema / properties / type
        Removed value: -{
        -  "enum": [
        -    "income",
        -    "expense"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "period",
        -  "date",
        -  "type",
        -  "sub_type",
        -  "category",
        -  "amount"
        -]New value: +[
        +  "entries"
        +]
    • Removedadd_flows
    • Addedadd_price
    • Changedadd_txn9 fields changed
      • removedInput schema / properties / currency
        Removed value: -{
        -  "default": "USD",
        -  "type": "string"
        -}
      • removedInput schema / properties / date
        Removed value: -{
        -  "description": "Transaction date (YYYY-MM-DD)",
        -  "type": "string"
        -}
      • removedInput schema / properties / price
        Removed value: -{
        -  "description": "Price per share in USD (use 0 for price=unknown deposits)",
        -  "minimum": 0,
        -  "type": "number"
        -}
      • removedInput schema / properties / reason
        Removed value: -{
        -  "description": "Why this trade? (free-form). Most useful on buy/sell — leave blank for dividends/grants/etc.",
        -  "type": "string"
        -}
      • removedInput schema / properties / shares
        Removed value: -{
        -  "exclusiveMinimum": 0,
        -  "type": "number"
        -}
      • removedInput schema / properties / ticker
        Removed value: -{
        -  "description": "Stock ticker symbol (e.g. AAPL)",
        -  "type": "string"
        -}
      • addedInput schema / properties / transactions
        Added value: +{
        +  "description": "One or more transactions to insert",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "asset_type": {
        +        "default": "stock",
        +        "description": "Asset class: stock (default, has a market + price provider) or crypto/commodity/real_estate/other (no market, priced manually).",
        +        "enum": [
        +          "stock",
        +          "crypto",
        +          "commodity",
        +          "real_estate",
        +          "other"
        +        ],
        +        "type": "string"
        +      },
        +      "currency": {
        +        "default": "USD",
        +        "description": "Currency of `price` for NON-stock assets (USD/KRW/JPY/EUR/CNY/GBP/HKD/INR/TWD). Ignored for stocks (their currency comes from `market`). Non-USD prices are converted to USD via historical FX at `date`.",
        +        "enum": [
        +          "USD",
        +          "KRW",
        +          "JPY",
        +          "EUR",
        +          "CNY",
        +          "GBP",
        +          "HKD",
        +          "INR",
        +          "TWD"
        +        ],
        +        "type": "string"
        +      },
        +      "date": {
        +        "description": "Transaction date (YYYY-MM-DD)",
        +        "type": "string"
        +      },
        +      "market": {
        +        "default": "US",
        +        "description": "Stock market — only used when asset_type is stock (ignored, stored null, for non-stock). US for US-listed; KRX/KOSDAQ Korean, JP Tokyo, HK Hong Kong, LSE London, XETRA Frankfurt, NSE India, TW Taiwan. Determines the native currency of `price`.",
        +        "enum": [
        +          "US",
        +          "KRX",
        +          "KOSDAQ",
        +          "JP",
        +          "HK",
        +          "LSE",
        +          "XETRA",
        +          "NSE",
        +          "TW"
        +        ],
        +        "type": "string"
        +      },
        +      "price": {
        +        "description": "Price per share (use 0 for price=unknown deposits). For a stock it is in the market's native currency; for a non-stock asset it is in the `currency` param. Stored converted to USD at the transaction date.",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "reason": {
        +        "description": "Why this trade? (free-form). Most useful on buy/sell — leave blank for dividends/grants/etc.",
        +        "type": "string"
        +      },
        +      "shares": {
        +        "exclusiveMinimum": 0,
        +        "type": "number"
        +      },
        +      "ticker": {
        +        "description": "Stock ticker (e.g. AAPL) or, for non-stock assets, a free-form name",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "buy",
        +          "sell",
        +          "deposit",
        +          "dividend",
        +          "tax"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "ticker",
        +      "date",
        +      "type",
        +      "shares",
        +      "price"
        +    ],
        +    "type": "object"
        +  },
        +  "minItems": 1,
        +  "type": "array"
        +}
      • removedInput schema / properties / type
        Removed value: -{
        -  "enum": [
        -    "buy",
        -    "sell",
        -    "deposit",
        -    "dividend",
        -    "tax"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "ticker",
        -  "date",
        -  "type",
        -  "shares",
        -  "price"
        -]New value: +[
        +  "transactions"
        +]
    • Removedadd_txns
    • Changededit_snapshot3 fields changed
      • addedInput schema / properties / asset_type
        Added value: +{
        +  "default": "stock",
        +  "description": "Asset class of the holding",
        +  "enum": [
        +    "stock",
        +    "crypto",
        +    "commodity",
        +    "real_estate",
        +    "other"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / market
        Added value: +{
        +  "description": "Stock market — required for stock assets, ignored otherwise",
        +  "enum": [
        +    "US",
        +    "KRX",
        +    "KOSDAQ",
        +    "JP",
        +    "HK",
        +    "LSE",
        +    "XETRA",
        +    "NSE",
        +    "TW"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / ticker / description
        Previous value: -"Stock ticker symbol"New value: +"Ticker symbol (stock) or asset name (non-stock)"
    • Changededit_txn4 fields changed
      • addedInput schema / properties / asset_type
        Added value: +{
        +  "description": "Asset class: stock or crypto/commodity/real_estate/other. Switching to non-stock clears market.",
        +  "enum": [
        +    "stock",
        +    "crypto",
        +    "commodity",
        +    "real_estate",
        +    "other"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / currency
        Added value: +{
        +  "description": "Currency of `price` for a NON-stock asset (default USD). Ignored for stocks.",
        +  "enum": [
        +    "USD",
        +    "KRW",
        +    "JPY",
        +    "EUR",
        +    "CNY",
        +    "GBP",
        +    "HKD",
        +    "INR",
        +    "TWD"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / market
        Added value: +{
        +  "description": "Stock market (listing exchange)",
        +  "enum": [
        +    "US",
        +    "KRX",
        +    "KOSDAQ",
        +    "JP",
        +    "HK",
        +    "LSE",
        +    "XETRA",
        +    "NSE",
        +    "TW"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / price / description
        Added value: +"Price per share — native to the market (stock) or to `currency` (non-stock); stored converted to USD."
    • Removedfetch_fred_series
    • Removedget_brief
    • Removedget_fx_rate
    • Addedget_market_brief
    • Addedproject_net_worth
    • Addedreport
    • Removedreport_balance
    • Removedreport_combined
    • Removedreport_flow
    • Removedreport_settle
    • Removedsearch_fred_series
    • Changedset_profile3 fields changed
      • addedInput schema / properties / currency
        Added value: +{
        +  "default": "USD",
        +  "description": "Currency of `target_net_worth` (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.",
        +  "type": "string"
        +}
      • addedInput schema / properties / target_net_worth
        Added value: +{
        +  "description": "Target net worth in the supplied `currency` (default USD).",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • removedInput schema / properties / target_net_worth_usd
        Removed value: -{
        -  "minimum": 0,
        -  "type": "number"
        -}
    • Addedshow_anti_portfolio
    • Changedshow_balance1 field changed
      • addedInput schema / properties / display_currency
        Added value: +{
        +  "default": "USD",
        +  "description": "Display currency for amounts (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.",
        +  "type": "string"
        +}
    • Changedshow_dividend2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / display_currency
        Added value: +{
        +  "default": "USD",
        +  "description": "Display currency for monetary fields (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.",
        +  "type": "string"
        +}
    • Changedshow_flow1 field changed
      • addedInput schema / properties / display_currency
        Added value: +{
        +  "default": "USD",
        +  "description": "Display currency for amounts (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.",
        +  "type": "string"
        +}
    • Addedshow_fx
    • Removedshow_fx_history
    • Removedshow_insider
    • Changedshow_macro2 fields changed
      • addedInput schema / properties / display_currency
        Added value: +{
        +  "default": "USD",
        +  "description": "Display currency for the FX snapshot (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.",
        +  "type": "string"
        +}
      • removedInput schema / properties / home_currency
        Removed value: -{
        -  "default": "USD",
        -  "description": "User's home currency: USD/KRW/EUR/JPY/CNY/GBP",
        -  "type": "string"
        -}
    • Changedshow_portfolio2 fields changed
      • removedInput schema / properties / currency
        Removed value: -{
        -  "description": "Display currency for FX return decomposition (e.g. KRW, JPY). When provided and not USD, returns fx_decomposition per holding showing how much of P&L came from price vs exchange rate movement.",
        -  "type": "string"
        -}
      • addedInput schema / properties / display_currency
        Added value: +{
        +  "default": "USD",
        +  "description": "Display currency for monetary fields and FX return decomposition (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD. When non-USD, returns fx_decomposition per holding showing how much of P&L came from price vs exchange rate movement.",
        +  "type": "string"
        +}
    • Removedshow_prices
    • Changedshow_profile2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / display_currency
        Added value: +{
        +  "default": "USD",
        +  "description": "Display currency for target_net_worth (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.",
        +  "type": "string"
        +}
    • Removedshow_regime
    • Changedshow_snapshot1 field changed
      • addedInput schema / properties / display_currency
        Added value: +{
        +  "default": "USD",
        +  "description": "Display currency for monetary fields (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.",
        +  "type": "string"
        +}
    • Removedshow_stress
    • Addedshow_thesis_track
    • Changedshow_txns2 fields changed
      • addedInput schema / properties / display_currency
        Added value: +{
        +  "default": "USD",
        +  "description": "Display currency for price (USD/KRW/EUR/JPY/CNY/GBP/HKD/INR/TWD). Defaults to USD.",
        +  "type": "string"
        +}
      • changedInput schema / properties / ticker / description
        Previous value: -"Filter by ticker (e.g. AAPL)"New value: +"Filter by ticker or asset name (e.g. AAPL, Bitcoin)"
    • Removedshow_world_intel
    • Addedsimulate_scenario
    • Addedsync
    • Removedsync_fx_rates
    • Removedsync_prices
  2. 3 tool updatesv0.18.1
    • Changedshow_portfolio2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / currency
        Added value: +{
        +  "description": "Display currency for FX return decomposition (e.g. KRW, JPY). When provided and not USD, returns fx_decomposition per holding showing how much of P&L came from price vs exchange rate movement.",
        +  "type": "string"
        +}
    • Addedshow_valuation
    • Addedshow_world_intel
  3. 23 tool updatesv0.1.3
    • Changedadd_balance3 fields changed
      • changedInput schema / properties / amount / description
        Previous value: -"Amount in USD (whole dollars)"New value: +"Amount in `currency` units (whole units, no decimals)"
      • changedInput schema / properties / category / description
        Previous value: -"Specific category name"New value: +"Must be one of the predefined balance categories: assets: cash, savings, housing_sub, usd_cash, cash_other, domestic_stock, overseas_stock, real_estate, pension, vehicle, deposit, asset_other. Liabilities: credit_card, short_term_other, loan, long_term_other."
      • addedInput schema / properties / currency
        Added value: +{
        +  "default": "USD",
        +  "description": "Currency of `amount` (USD/KRW/JPY/EUR/CNY/GBP). Defaults to USD. Non-USD values are converted to USD via historical FX at `date` for storage.",
        +  "type": "string"
        +}
    • Addedadd_balances
    • Changedadd_flow4 fields changed
      • changedInput schema / properties / amount / description
        Previous value: -"Amount in USD (whole dollars)"New value: +"Amount in `currency` units (whole units)"
      • addedInput schema / properties / category / description
        Added value: +"Must be one of the predefined flow categories. Income: salary, business, dividends, interest, income_other. Expense: personal, insurance, phone, utilities, rent, maintenance, loan_repayment, expense_other."
      • addedInput schema / properties / currency
        Added value: +{
        +  "default": "USD",
        +  "description": "Currency of `amount` (USD/KRW/JPY/EUR/CNY/GBP). Non-USD converted via historical FX at `date`.",
        +  "type": "string"
        +}
      • addedInput schema / properties / sub_type / description
        Added value: +"Must match the category sub_type. Income: employment, investment, other. Expense: consumption, fixed, housing, debt, other."
    • Addedadd_flows
    • Changedadd_monthly2 fields changed
      • addedInput schema / properties / balance / items / properties / currency
        Added value: +{
        +  "default": "USD",
        +  "description": "Currency of `amount` (default USD). Non-USD converted via historical FX at `date`.",
        +  "type": "string"
        +}
      • addedInput schema / properties / flow / items / properties / currency
        Added value: +{
        +  "default": "USD",
        +  "description": "Currency of `amount` (default USD). Non-USD converted via historical FX at `date`.",
        +  "type": "string"
        +}
    • Changedadd_txn2 fields changed
      • removedInput schema / properties / memo
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / reason
        Added value: +{
        +  "description": "Why this trade? (free-form). Most useful on buy/sell — leave blank for dividends/grants/etc.",
        +  "type": "string"
        +}
    • Addedadd_txns
    • Changededit_txn2 fields changed
      • removedInput schema / properties / memo
        Removed value: -{
        -  "type": [
        -    "string",
        -    "null"
        -  ]
        -}
      • addedInput schema / properties / reason
        Added value: +{
        +  "description": "Why this trade? (free-form)",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Addedfetch_fred_series
    • Addedget_brief
    • Addedget_fx_rate
    • Addedsearch_fred_series
    • Addedset_profile
    • Addedsetup_status
    • Addedshow_benchmark
    • Addedshow_concentration
    • Addedshow_fx_history
    • Addedshow_macro
    • Addedshow_profile
    • Addedshow_regime
    • Addedshow_risk
    • Addedshow_stress
    • Addedsync_fx_rates
  4. 24 tool updatesv0.1.2
    • Changedadd_balance4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / amount / description
        Previous value: -"Amount in KRW"New value: +"Amount in USD (whole dollars)"
      • removedInput schema / properties / amount / maximum
        Removed value: -9007199254740991
      • removedInput schema / properties / amount / minimum
        Removed value: --9007199254740991
    • Changedadd_flow4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / amount / description
        Previous value: -"Amount in KRW"New value: +"Amount in USD (whole dollars)"
      • removedInput schema / properties / amount / maximum
        Removed value: -9007199254740991
      • removedInput schema / properties / amount / minimum
        Removed value: --9007199254740991
    • Addedadd_monthly
    • Addedadd_snapshot
    • Changedadd_txn1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changeddelete_balance1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changeddelete_flow1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Addeddelete_snapshot
    • Changeddelete_txn2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / id / maximum
        Removed value: -9007199254740991
    • Addededit_snapshot
    • Changededit_txn4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / id / maximum
        Removed value: -9007199254740991
      • removedInput schema / properties / memo / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / memo / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Addedreport_balance
    • Addedreport_combined
    • Addedreport_flow
    • Changedreport_settle1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedshow_balance1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Addedshow_dividend
    • Changedshow_earnings1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedshow_financials1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedshow_flow1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedshow_insider1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedshow_news1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Addedshow_snapshot
    • Changedshow_txns1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
  5. 18 tool updatesv0.1.0
    • First observedadd_balance
    • First observedadd_flow
    • First observedadd_txn
    • First observeddelete_balance
    • First observeddelete_flow
    • First observeddelete_txn
    • First observededit_txn
    • First observedreport_settle
    • First observedshow_balance
    • First observedshow_earnings
    • First observedshow_financials
    • First observedshow_flow
    • First observedshow_insider
    • First observedshow_news
    • First observedshow_portfolio
    • First observedshow_prices
    • First observedshow_txns
    • First observedsync_prices

TDQS

A4/5.0
Disambiguation4/5

Tools are grouped by domain (transactions, balance, flow, portfolio, market analysis) with clear descriptions. Some overlap exists between get_market_brief and show_portfolio, but descriptions clarify the primary vs drill-down roles. Overall, distinct purposes are well-maintained.

Naming Consistency5/5

Almost all tools follow a consistent verb_noun pattern (add_*, delete_*, edit_*, show_*, etc.). Exceptions like 'report' and 'sync' are still clear and do not break the pattern. Excellent consistency.

Tool Count3/5

At 37 tools, the server is heavy but covers a broad domain (personal finance, investments, market data). While many tools are justified, the count is on the high side for typical MCP servers, potentially overwhelming for users.

Completeness5/5

The tool surface is remarkably complete: CRUD for transactions, balance, flow, snapshots; analytical reports, market data, projections, risk metrics, thesis tracking, and profile management. Nearly every common financial operation is supported without obvious gaps.

Maintenance

ActivityActive
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    mcprice ⚡ MCP Server for real-time stock & crypto prices in Claude Desktop / Cursor. Stocks → Yahoo Finance (no API key needed) Crypto → Binance Public API (no API key needed) Companion to: revolut-pulse (insider trades)
    -
  • A
    license
    B
    quality
    A
    maintenance
    open-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 cloud
    89
    12
    AGPL 3.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Self-hosted financial data terminal for AI agents. Scrapes and serves SEC filings (full-text search), 13F institutional holdings, insider and congressional trades, FINRA short data, FRED economic indicators, CFTC futures positioning, VIX/put-call ratios, and daily stock prices over MCP.
    208
    AGPL 3.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Local-first markdown vault with a built-in MCP server (streamable HTTP). 16 tools and 2 resources for Claude Code / Desktop / Cursor: read/write/search plus context_for_query, find_orphans, weekly_digest, compare_notes, semantic_outline. Per-folder agent permissions, LanceDB vectors, local Xenova ONNX embedder swappable to Ollama. Single Bun binary. AGPL.
    33
    AGPL 3.0

Latest Blog Posts

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/evan-moon/firma'

If you have feedback or need assistance with the MCP directory API, please join our Discord server