Ghostfolio MCP Server
This MCP server exposes Ghostfolio portfolio management and market data through readable, filterable tools — with guarded write operations for accounts, activities, and asset data.
Accounts: list accounts, fetch details and balance history, create/update/delete accounts, transfer cash between accounts, and set or delete dated balance entries
Portfolio analysis: retrieve performance, holdings, full portfolio details, individual positions, investments, and dividends (with date-range and grouping options)
Orders & activities: list activities/orders (optionally by account) and create or delete individual transactions such as BUY, SELL, DIVIDEND, INTEREST, or FEE
Benchmarks: list configured benchmarks and compare portfolio performance against a benchmark symbol from a start date
Market data & symbols: fetch market and historical data, add manual market data points, search/look up symbols, and get or upsert/delete asset profiles (name, currency, asset class, country/sector allocations)
Watchlist: view the watchlist and add or remove symbols
Exchange rates: look up a currency's exchange rate on a given date
Import/export: bulk-import transactions, fetch dividend data formatted for import, and export portfolio activities as JSON
System & user: check backend health, list available platforms, and read user info/settings
Safety controls: read-only mode, tag-based tool filtering, rate limiting, SSL/timeout settings, and bearer-token or OIDC/OAuth auth for HTTP transports
Optional error tracking and performance monitoring integration for Ghostfolio MCP server, capturing exceptions, performance metrics, and logs.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Ghostfolio MCP Servershow me my portfolio performance for this year"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Ghostfolio MCP Server
Let AI agents analyze and manage your Ghostfolio investment portfolio
Installation · Tools · Configuration · Security
Ghostfolio MCP Server is a Python-based Model Context Protocol (MCP) server designed to provide advanced, programmable access to Ghostfolio portfolio management and financial data. It exposes a modern API for querying, analyzing, and managing your investment portfolio through Ghostfolio's comprehensive features. The server supports both read and write operations, robust security features, and is suitable for integration with automation tools, financial dashboards, and custom portfolio management applications.
✨ Features
Core Features
Query portfolio performance, holdings, and positions with flexible time ranges
Retrieve comprehensive investment data including dividends, returns, and allocations
Access detailed market data, asset profiles, and historical price information
Monitor portfolio metrics, benchmarks, and performance comparisons
Track orders, transactions, and account balances across multiple accounts
Search and lookup financial symbols, stocks, ETFs, and other assets
Get user information, settings, and account details
Management Operations
Create and manage investment accounts with different currencies and platforms
Create, delete, and manage individual transactions and activities
Import transactions and historical data from other platforms
Configure read-only mode to restrict all write operations for safe monitoring
Support for bulk transaction imports and portfolio data management
Monitor system health and platform availability
Advanced Capabilities
Rate limiting and API security features
Real-time portfolio monitoring and performance tracking
Comprehensive logging and audit trails
SSL/TLS support and configurable timeouts
Extensible with custom middlewares and tag-based tool filtering
Optional tool-search transform for large tool catalogs
Bearer token or OIDC/OAuth authentication for HTTP transports
Related MCP server: Wealthfolio MCP Server
🚀 Installation
Prerequisites
Python 3.11 to 3.15
Access to a Ghostfolio instance
Valid Ghostfolio API token
Quick Install from PyPI
The easiest way to get started is to install from PyPI:
# Using UV (recommended)
uvx ghostfolio-mcp
# Or using pip
pip install ghostfolio-mcpRemember to configure the environment variables for your Ghostfolio instance before running the server:
# Create environment configuration
export GHOSTFOLIO_URL=https://domain.tld:3333
export GHOSTFOLIO_TOKEN=your-ghostfolio-tokenFor more details, visit: https://pypi.org/project/ghostfolio-mcp/
Install from Source
Clone the repository:
git clone https://github.com/mhajder/ghostfolio-mcp.git
cd ghostfolio-mcpInstall dependencies:
# Using UV (recommended)
uv sync
# Or using pip
pip install -e .Configure environment variables:
cp .env.example .env
# Edit .env with your Ghostfolio URL and tokenRun the server:
# Using UV (recommended)
uv run ghostfolio-mcp
# Or using the installed command directly
ghostfolio-mcpDevelopment Setup
For development with additional tools:
# Clone and install with development dependencies
git clone https://github.com/mhajder/ghostfolio-mcp.git
cd ghostfolio-mcp
uv sync --group dev
# Run tests
uv run pytest
# Run with coverage
uv run pytest --cov=src/
# Run linting and formatting
uv run ruff check .
uv run ruff format .
# Run type checking
uv run ty check .
# Setup prek hooks
uv run prek install🔧 Configuration
Environment Variables
A blank or whitespace-only value counts as unset and uses the default.
Boolean settings accept true/false, 1/0, yes/no and on/off (any case).
Any other value stops the server at startup, so a typo cannot silently turn
read-only mode or TLS verification off.
# Ghostfolio Connection Details
GHOSTFOLIO_URL=https://domain.tld:3333
GHOSTFOLIO_TOKEN=your-ghostfolio-token
# SSL Configuration
GHOSTFOLIO_VERIFY_SSL=true
GHOSTFOLIO_TIMEOUT=30
# Read-Only Mode
# Set READ_ONLY_MODE true to disable all write operations (put, post, delete)
READ_ONLY_MODE=false
# Disabled Tags
# Comma-separated list of tags to disable tools for (empty by default)
# Example: GHOSTFOLIO_DISABLED_TAGS=portfolio,symbol
GHOSTFOLIO_DISABLED_TAGS=
# Logging Configuration
LOG_LEVEL=INFO
# Rate Limiting (requests per minute)
# Set RATE_LIMIT_ENABLED true to enable rate limiting
RATE_LIMIT_ENABLED=false
RATE_LIMIT_MAX_REQUESTS=60
RATE_LIMIT_WINDOW_MINUTES=1
# Tool Search Transform (Optional)
# Set TOOL_SEARCH_ENABLED true to replace full tool listings with search_tools + call_tool
TOOL_SEARCH_ENABLED=false
# Search strategy: bm25 (natural language) or regex (pattern match)
TOOL_SEARCH_STRATEGY=bm25
# Maximum number of tools returned by search_tools
TOOL_SEARCH_MAX_RESULTS=5
# Sentry Error Tracking (Optional)
# Set SENTRY_DSN to enable error tracking and performance monitoring
# SENTRY_DSN=https://your-key@o12345.ingest.us.sentry.io/6789
# Optional Sentry configuration
# SENTRY_TRACES_SAMPLE_RATE=1.0
# SENTRY_SEND_DEFAULT_PII=false
# SENTRY_ENVIRONMENT=production
# SENTRY_RELEASE=1.2.3
# SENTRY_PROFILE_SESSION_SAMPLE_RATE=1.0
# SENTRY_PROFILE_LIFECYCLE=trace
# SENTRY_ENABLE_LOGS=true
# MCP Transport Configuration
# Transport type: 'stdio' (default), 'sse' (Server-Sent Events), or 'http' (HTTP Streamable)
# 'streamable-http' is accepted as an alias for 'http'. Any other value stops
# the server at startup.
MCP_TRANSPORT=stdio
# HTTP Transport Settings (used when MCP_TRANSPORT=sse or MCP_TRANSPORT=http)
# Host to bind the HTTP server (default: 127.0.0.1)
# MCP_HTTP_HOST=127.0.0.1
# Port to bind the HTTP server (default: 8000)
# MCP_HTTP_PORT=8000
# Optional bearer token for authentication (leave empty for no auth)
# MCP_HTTP_BEARER_TOKEN=
# OIDC / OAuth Authentication (optional, for remote hosting)
# Set all four to enable; takes precedence over MCP_HTTP_BEARER_TOKEN
# OIDC_CONFIG_URL=https://id.example.com/.well-known/openid-configuration
# OIDC_CLIENT_ID=
# OIDC_CLIENT_SECRET=
# OIDC_BASE_URL=https://ghostfolio-mcp.example.com
# Optional OIDC settings
# OIDC_REDIRECT_PATH=/auth/callback
# OIDC_REQUIRED_SCOPES=
# OIDC_ALLOWED_REDIRECT_URIS=
# OIDC_VERIFY_ID_TOKEN=false
# OIDC_FORWARD_RESOURCE=falseSentry Error Tracking & Monitoring (Optional)
The server optionally supports Sentry for error tracking, performance monitoring, and debugging. Sentry integration is completely optional and only initialized if configured.
Installation
To enable Sentry monitoring, install the optional dependency:
# Using UV (recommended)
uv sync --extra sentryConfiguration
Enable Sentry by setting the SENTRY_DSN environment variable in your .env file:
# Required: Sentry DSN for your project
SENTRY_DSN=https://your-key@o12345.ingest.us.sentry.io/6789
# Optional: Performance monitoring sample rate (0.0-1.0, default: 1.0)
SENTRY_TRACES_SAMPLE_RATE=1.0
# Optional: Include personally identifiable information (default: false).
# When true, tool inputs and outputs (portfolio data) are sent to Sentry.
SENTRY_SEND_DEFAULT_PII=false
# Optional: Environment name (e.g., "production", "staging")
SENTRY_ENVIRONMENT=production
# Optional: Release version (auto-detected from package if not set)
SENTRY_RELEASE=1.2.2
# Optional: Profiling - continuous profiling sample rate (0.0-1.0, default: 1.0)
SENTRY_PROFILE_SESSION_SAMPLE_RATE=1.0
# Optional: Profiling - lifecycle mode for profiling (default: "trace")
# Options: "all", "continuation", "trace"
SENTRY_PROFILE_LIFECYCLE=trace
# Optional: Enable log capture as breadcrumbs and events (default: true)
SENTRY_ENABLE_LOGS=trueFeatures
When enabled, Sentry automatically captures:
Exceptions & Errors: All unhandled exceptions with full context
Performance Metrics: Request/response times and traces
MCP Integration: Detailed MCP server activity and interactions
Logs & Breadcrumbs: Application logs and event trails for debugging
Context Data: Environment, client info, and request parameters
Getting a Sentry DSN
Create a free account at sentry.io
Create a new Python project
Copy your DSN from the project settings
Set it in your
.envfile
Disabling Sentry
Sentry is completely optional. If you don't set SENTRY_DSN, the server will run normally without any Sentry integration, and no monitoring data will be collected.
🧰 Available Tools
Account Management Tools
get_accounts: Get all accounts in your portfolio including account types and balancesget_account_balances: Get account balances for a specific accountcreate_account: Create a new account in your portfoliodelete_account: Delete an existing account from your portfolio (destructive operation)get_account_details: Get details for a specific accountupdate_account: Update settings or details of an existing accounttransfer_account_balance: Transfer cash balances between two accountscreate_account_balance: Set an account's balance for a specific date in its balance history (defaults to today)delete_account_balance: Delete a single entry from an account's balance history
Portfolio & Transaction Management Tools
get_portfolio_performance: Get portfolio performance data including returns, benchmarks, and performance metricsget_portfolio_holdings: Get portfolio holdings and positions including allocations and asset breakdownsget_portfolio_details: Get comprehensive portfolio details including accounts, positions, and summaryget_position: Get position details for a specific symbol from a data sourceget_investments: Get investment data grouped by time period showing cash flows and contributionsget_dividends: Get dividend data grouped by time period showing dividend payments and yieldget_orders: Get all activities/orders from your portfolio, optionally filtered by accountcreate_activity: Create a single new transaction/activity in your portfolio (BUY, SELL, DIVIDEND, INTEREST, FEE, etc.), optionally with tagsupdate_activity: Update an existing activity/transaction, including its tags; fields you don't pass keep their current valuesdelete_activity: Delete a single activity/transaction by its ID (destructive operation)
Benchmark Tools
get_benchmarks: Get all configured benchmarksget_benchmark_performance: Compare portfolio performance against a benchmark symbol starting from a specific date
Watchlist Tools
get_watchlist: Get all items in the user's watchlistadd_to_watchlist: Add a symbol to the user's watchlistremove_from_watchlist: Remove a symbol from the user's watchlist
Exchange Rate Tools
get_exchange_rate: Get the exchange rate for a given currency symbol on a specific date
Data Export Tools
export_portfolio: Export portfolio activities/transactions data as JSON
Market Data & Symbol Tools
get_market_data_for_asset: Get market data for a specific assetadd_market_data_points: Add one or more market data points for an asset (typically aMANUALdata source — Ghostfolio rejects writes for auto-fetched sources)get_symbol_data: Get symbol data for a specific asset from a data sourceget_historical_data: Get historical data for a specific symbol on a specific datelookup_symbols: Search for symbols using a query stringget_asset_profile: Get asset profile information for a specific symbolupsert_asset_profile: Create-or-update an asset profile, including optionalcountriesandsectorsallocations (idempotent; tolerates Ghostfolio's HTTP 500 on the create step and relies on the subsequent PATCH as the source of truth)delete_asset_profile: Delete an asset profile (destructive operation; may delete associated activities and market data depending on backend rules)
Data Import Tools
import_transactions: Import transactions into your portfolio (bulk import operation)get_dividends_for_import: Fetch historical dividend data formatted for import for a specific symbol
System & Platform Tools
get_health: Get system health status of the Ghostfolio backend serviceget_platforms: Get list of available platforms (brokers, exchanges, etc.) for account tracking
User Management Tools
get_user_info: Get user information and settings
🔒 Security & Safety Features
Read-Only Mode
The server supports a read-only mode that disables all write operations for safe monitoring:
READ_ONLY_MODE=trueWhen enabled, this mode prevents any modifications to your portfolio data while still allowing full read access to all information.
Tag-Based Tool Filtering
You can disable specific categories of tools by setting disabled tags:
GHOSTFOLIO_DISABLED_TAGS=portfolio,symbol,importAvailable tags include:
account- Account management tools (create, delete, update, get accounts)portfolio- Portfolio analysis and performance toolssymbol- Symbol lookup and data toolsimport- Data import toolsasset- Asset profile toolsuser- User information toolssystem- System health and platform information toolsactivities- Activity/transaction management tools (create, update, delete activities)watchlist- Watchlist management toolsexchange-rate- Currency exchange rate toolsexport- Data export toolsbenchmark- Benchmark tools
Rate Limiting
The server supports rate limiting to control API usage and prevent abuse. If enabled, requests are limited per client using a sliding window algorithm.
Enable rate limiting by setting the following environment variables in your .env file:
RATE_LIMIT_ENABLED=true
RATE_LIMIT_MAX_REQUESTS=60 # Maximum requests allowed per window
RATE_LIMIT_WINDOW_MINUTES=1 # Window size in minutesIf RATE_LIMIT_ENABLED is set to true, the server will apply rate limiting middleware. Adjust RATE_LIMIT_MAX_REQUESTS and RATE_LIMIT_WINDOW_MINUTES as needed for your environment. While rate limiting is on, both must be at least 1; while it is off, they are not read.
Tool Search for Large Toolsets
FastMCP tool search can reduce prompt size for servers with many tools.
When enabled, list_tools returns two synthetic tools:
search_tools: Finds matching tools and returns their full schemascall_tool: Executes any discovered tool by name
Enable it with:
TOOL_SEARCH_ENABLED=true
TOOL_SEARCH_STRATEGY=bm25 # bm25 or regex
TOOL_SEARCH_MAX_RESULTS=8 # optional, default is 5bm25 supports natural language queries, while regex uses a regex
pattern input for deterministic matching. While tool search is on, any other
strategy, or a TOOL_SEARCH_MAX_RESULTS below 1, stops the server at startup;
while it is off, these settings are not read.
Tool search respects existing visibility controls (read-only mode and disabled tags).
SSL/TLS Configuration
The server supports SSL certificate verification and custom timeout settings:
GHOSTFOLIO_VERIFY_SSL=true # Enable SSL certificate verification
GHOSTFOLIO_TIMEOUT=30 # Connection timeout in secondsTransport Configuration
The server supports multiple transport protocols for different deployment scenarios:
STDIO Transport (Default)
The default transport uses standard input/output for communication. This is ideal for local usage and integration with tools that communicate via stdin/stdout:
MCP_TRANSPORT=stdioHTTP SSE Transport (Server-Sent Events)
For network-based deployments, you can use HTTP with Server-Sent Events. This allows the MCP server to be accessed over HTTP with real-time streaming:
MCP_TRANSPORT=sse
MCP_HTTP_HOST=127.0.0.1 # Localhost
MCP_HTTP_PORT=8000 # Port to listen on
MCP_HTTP_BEARER_TOKEN=your-secret-token # Optional authentication tokenWhen using SSE transport with a bearer token, clients must include the token in their requests:
curl -H "Authorization: Bearer your-secret-token" http://localhost:8000/sseHTTP Streamable Transport
The HTTP Streamable transport provides HTTP-based communication with request/response streaming. This is ideal for web integrations and tools that need HTTP endpoints:
MCP_TRANSPORT=http
MCP_HTTP_HOST=127.0.0.1 # Localhost
MCP_HTTP_PORT=8000 # Port to listen on
MCP_HTTP_BEARER_TOKEN=your-secret-token # Optional authentication tokenWhen using streamable transport with a bearer token:
curl -H "Authorization: Bearer your-secret-token" \
-H "Accept: application/json, text/event-stream" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' \
http://localhost:8000/mcpNote: The HTTP transport requires proper JSON-RPC formatting with jsonrpc and id fields. The server may also require session initialization for some operations.
Health Endpoint
Both HTTP transports (sse and http) serve GET /health, which answers 200 ok
when the server is handling requests. It needs no bearer token or OIDC login and
does not contact Ghostfolio, so a Ghostfolio outage does not mark the MCP server
unhealthy. The Docker image's HEALTHCHECK uses it:
curl http://localhost:8000/healthOIDC / OAuth Authentication (Optional)
A static bearer token is enough for machine-to-machine clients, but many MCP clients can only authenticate over OAuth with Dynamic Client Registration. For those, the server can act as an OAuth interface in front of an existing OIDC identity provider (Authentik, Keycloak, PocketID, Auth0, Entra ID, ...) using FastMCP's OIDCProxy. Clients register and authenticate against this server; the server brokers the flow upstream. No Ghostfolio credential ever reaches the client.
This applies to the sse and http transports only.
Registering the client
Create a confidential client (client ID + secret) on your identity provider with the redirect URI set to OIDC_BASE_URL + OIDC_REDIRECT_PATH, for example https://ghostfolio-mcp.example.com/auth/callback.
Configuration
MCP_TRANSPORT=http
MCP_HTTP_HOST=0.0.0.0
MCP_HTTP_PORT=8000
# All four are required to enable OIDC
OIDC_CONFIG_URL=https://id.example.com/.well-known/openid-configuration
OIDC_CLIENT_ID=your-client-id
OIDC_CLIENT_SECRET=your-client-secret
# Public URL where this server is reachable, used to build its OAuth endpoints.
# Must be HTTPS (except on localhost), as required for an OAuth issuer.
OIDC_BASE_URL=https://ghostfolio-mcp.example.comOIDC is entirely optional. Leaving these unset keeps the existing behaviour, and a partially configured setup is ignored with a warning rather than half-enabled. When OIDC is configured it takes precedence over MCP_HTTP_BEARER_TOKEN.
Optional settings:
# Callback path registered on the identity provider (default: /auth/callback)
OIDC_REDIRECT_PATH=/auth/callback
# Comma-separated scopes required on presented tokens
OIDC_REQUIRED_SCOPES=openid,profile
# Comma-separated allowed client redirect URI patterns (wildcards accepted)
OIDC_ALLOWED_REDIRECT_URIS=https://example.com/*
# Verify the id_token instead of the access token (default: false)
OIDC_VERIFY_ID_TOKEN=false
# Forward the RFC 8707 'resource' indicator upstream (default: false)
OIDC_FORWARD_RESOURCE=falseOIDC_ALLOWED_REDIRECT_URIS restricts which clients may complete the flow. Leaving it unset accepts any redirect URI a client registers, so set it to the hosts you expect, for example https://example.com/*.
Set OIDC_VERIFY_ID_TOKEN=true if your identity provider issues opaque (non-JWT) access tokens; the id_token is then verified instead.
OIDC_FORWARD_RESOURCE is off by default because identity providers that do not implement RFC 8707 resource indicators reject the authorization request with invalid_request, which breaks login immediately after consent. Turn it on only if your provider supports resource indicators. Token audience binding is unaffected either way.
Persisting OAuth state
Client registrations and encrypted tokens are stored on disk, under FastMCP's data directory. If that directory is not persistent, every restart forces all clients to register and authenticate again. The Docker image sets FASTMCP_HOME=/data, so mount a volume there:
docker run -v ghostfolio-mcp-data:/data --env-file .env ghcr.io/mhajder/ghostfolio-mcp:latestRunning behind a reverse proxy
OIDC_BASE_URL must be the externally reachable HTTPS URL, and the proxy must forward the Host header unchanged, otherwise the OAuth metadata this server advertises will point at the wrong host.
📊 Data Sources
Ghostfolio supports multiple data sources for market data and symbols:
YAHOO - Yahoo Finance data source
COINGECKO - CoinGecko for cryptocurrency data
MANUAL - Manually entered data
And other configured data sources in your Ghostfolio instance
When using tools that require a data source parameter, specify the appropriate source for your asset type.
🐳 Using Docker
A Docker image is available on GitHub Packages for easy deployment. It runs the
HTTP Streamable transport on port 8000 (/mcp).
docker pull ghcr.io/mhajder/ghostfolio-mcp:latestWhen OIDC authentication is enabled, mount a volume on /data so OAuth client registrations survive container recreation.
Open WebUI
Open WebUI 0.6.31 and later connect to the image directly; the separate MCPO
image (ghcr.io/mhajder/ghostfolio-mcpo) is no longer published. In Open WebUI,
go to Admin Settings > Integrations > External Tool Servers, add a connection
of type MCP (Streamable HTTP) with the URL http://<host>:8000/mcp, and set
Bearer authentication to your MCP_HTTP_BEARER_TOKEN.
If OIDC authentication is enabled, it
takes precedence and the bearer token is not accepted. Use the URL
OIDC_BASE_URL + /mcp and choose OAuth 2.1 authentication instead; Open
WebUI registers itself as a client, so if you set OIDC_ALLOWED_REDIRECT_URIS,
include your Open WebUI URL in it.
🤝 Contributing
Contributions are welcome. See CONTRIBUTING.md for the dev setup, checks and commit message format, and use the issue templates for bugs and feature requests.
Found a security problem? Please report it privately as described in SECURITY.md.
📜 License
GNU Affero General Public License v3.0 or later - see LICENSE for details.
Available Tools
39 toolsadd_market_data_pointsAdd Market Data PointsAIdempotent
Add one or more market data points for a specific asset.
Posts to the market-data endpoint for the given data source and symbol. Same (symbol, date) overwrites the existing point; passing the same input twice yields the same end state.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Symbol/ticker of the asset (e.g., 'TRUE-UNLISTED', 'PILLAR3A-FINPENSION-X') | |
| data_source | Yes | Data source for the symbol. Typically 'MANUAL' — Ghostfolio rejects market-data writes for auto-fetched sources like 'YAHOO' or 'COINGECKO' | |
| market_data | Yes | List of market data points. Each entry must include 'date' (ISO 8601, e.g. '2026-04-30T00:00:00.000Z') and 'marketPrice' (numeric value of the asset at that date) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by spelling out the overwrite rule ('Same (symbol, date) overwrites the existing point') and the idempotency consequence ('passing the same input twice yields the same end state'). This aligns with idempotentHint=true and adds practical knowledge about effects on previously stored values. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the primary action, and each sentence adds a distinct fact: scope, endpoint, and repeated-call behavior. There is no filler or redundant repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the fully described input schema and presence of an output schema, the description covers the operation, scope, and repeated-call semantics. The MANUAL-only data source constraint is not in the description text but is covered in the schema, so nothing essential is missing. Explicit routing guidance versus read siblings would push this to a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the baseline is 3. The description adds meaning by establishing the (symbol, date) tuple as the uniqueness key and by clarifying that multiple market data points can be passed in one call. This semantic linkage goes beyond the schema's syntactic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence uses a specific verb ('Add') and resource ('market data points for a specific asset'), and the second sentence disambiguates the exact endpoint and keying ('symbol, date'). This clearly separates it from read-only siblings like get_market_data_for_asset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for writing/upserting market data points and notes that repeated calls are idempotent, but it never explicitly states when to prefer this tool over alternatives or when not to use it. No exclusions or alternative tool names are given, leaving routing mostly to the name and context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_to_watchlistAdd To WatchlistAIdempotent
Add a symbol to the user's watchlist.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Symbol/ticker of the asset to add to the watchlist | |
| data_source | Yes | Data source for the symbol (e.g. 'YAHOO', 'COINGECKO', 'MANUAL') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as non-read-only, idempotent, and non-destructive, so the safety profile is covered. The description adds the 'user's watchlist' scope, which is useful context, but it does not disclose behavior such as what happens if the symbol already exists or whether the data_source must match an existing platform. This is acceptable given the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no filler. The core action and target are front-loaded, making it immediately scannable for an agent. Nothing extraneous is included.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation tool, the description, combined with the schema, annotations, and presence of an output schema, provides enough context for correct invocation. The annotations cover idempotency and non-destructiveness, the schema fully documents parameters, and the output schema handles return-value expectations, so no critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters with clear descriptions and 100% coverage. The tool description adds no additional parameter-level meaning beyond the schema, so the baseline of 3 is appropriate. It does not clarify allowed values for data_source or any relationship between symbol and data_source, but the schema provides adequate guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Add'), a specific resource ('symbol'), and the target context ('user's watchlist'). This clearly distinguishes it from sibling tools like get_watchlist and remove_from_watchlist, so an agent can identify the correct operation without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case: use this when the user wants to add a symbol to their watchlist. However, it does not explicitly mention alternatives or when not to use it, such as using remove_from_watchlist for removal or get_watchlist for viewing. Usage context is clear but not explicitly differentiated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_accountCreate AccountA
Create a new account in your portfolio.
Creates a new account with the specified name, currency, and optional balance. This is useful for organizing your investments across different account types or platforms.
Note: current Ghostfolio versions have no boolean "excluded" flag on an account - exclusion from analysis is done by tagging the account, which is outside this tool's scope.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the account (e.g., 'My Brokerage Account', 'Retirement Fund') | |
| balance | No | Initial balance for the account (defaults to 0) | |
| comment | No | Optional comment or note for the account | |
| currency | Yes | Currency code for the account (e.g., 'USD', 'EUR', 'GBP') | |
| platform_id | No | Optional platform ID for the account (e.g., broker or exchange identifier) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal that this is not read-only and not idempotent. The description adds valuable behavioral context beyond the annotations by explaining that Ghostfolio currently has no boolean 'excluded' flag on accounts, so agents should not expect to exclude accounts directly through this tool. This is a useful limitation disclosure that helps set expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively short and front-loads the core purpose in the first sentence. It is slightly redundant because 'Create a new account' appears in both the first and second sentences, but the additional note is well-placed and earns its place by explaining a relevant version-specific limitation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has an output schema, annotations, and 100% parameter documentation in the schema, the description is mostly complete. It covers purpose, typical use, and an important scope limitation. It does not discuss possible duplicate behavior or error conditions, but that is not critical given the rich structured data already available.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter already has a meaningful description. The tool description mentions name, currency, and optional balance, but adds no semantic detail beyond what the schema provides. This meets the baseline but does not elevate the parameter knowledge available to the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action and resource ('Create a new account in your portfolio') and mentions the key fields (name, currency, optional balance). While this is specific and unambiguous, it does not explicitly differentiate from the sibling create_account_balance; the distinction relies on the resource name rather than an explicit contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear purpose ('useful for organizing your investments across different account types or platforms') and adds an explicit limitation: the tool cannot handle the 'excluded' flag because that is done via tagging outside this tool's scope. It stops short of naming alternative tools or when-not-to-use scenarios, but the context is sufficient for typical account-creation cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_account_balanceCreate Account BalanceAIdempotent
Set an account's balance for a specific date in its balance history.
This writes directly to the balance-history series that
get_account_balances returns and that get_portfolio_holdings derives
its cash figure from - it is not the same as the account's summary
balance field. Calling this again for the same account and date
updates that entry instead of duplicating it, so setting today's
balance is just this call with date omitted.
The balance is recorded in the account's own currency; Ghostfolio's API does not accept a separate currency for this endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ISO-8601 date for this balance entry, e.g. '2026-08-27'. Defaults to today. | |
| balance | Yes | Balance value to record for the given date | |
| account_id | Yes | Account ID to record a balance entry for |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false; the description expands meaningfully on each. It explains the direct write side effect on balance history, the idempotent upsert behavior, the date omission default, and the currency limitation. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, well-organized paragraphs front-load the core purpose, then cover side effects and a currency caveat. There is no filler; each sentence contributes operational knowledge an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 100%-covered schema, existing annotations, and output schema, the description covers the remaining operational essentials: which data it affects, idempotent update behavior, date semantics, and currency constraint. An agent has enough information to select and call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining the currency context—recorded in the account's own currency with no separate currency accepted—and the semantic of omitting date to set today's balance, supplementing the schema's 'defaults to today.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Set an account's balance for a specific date in its balance history,' which gives a clear verb and resource. It further differentiates from read siblings by stating it writes directly to the balance-history series consumed by get_account_balances and get_portfolio_holdings, and explicitly says it is 'not the same as the account's summary balance field.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent this is the write path for balance-history entries and contrasts it with the summary balance field, implying when not to use it. It also gives practical guidance: re-calling with the same account and date updates rather than duplicates, and omitting date targets today. It doesn't name a specific alternative like transfer_account_balance, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_activityCreate ActivityC
Create a single new transaction/activity.
| Name | Required | Description | Default |
|---|---|---|---|
| fee | No | Optional fee amount | |
| date | Yes | Date in ISO 8601 format (e.g. 2026-05-09T00:00:00.000Z) | |
| tags | No | Optional list of tag IDs to attach to this activity (from get_tags). Omit for no tags. | |
| type | Yes | Type of activity: BUY, SELL, DIVIDEND, INTEREST, FEE, LIABILITY | |
| symbol | Yes | Symbol profile ID or actual ticker symbol | |
| comment | No | Optional comment | |
| currency | Yes | Currency code for the transaction | |
| quantity | Yes | Number of shares/units | |
| account_id | Yes | The account ID where this activity will be recorded | |
| unit_price | Yes | Price per unit | |
| data_source | Yes | Data source (e.g., 'YAHOO', 'COINGECKO', 'MANUAL') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the write/non-idempotent profile is covered structurally. The description adds nothing beyond that – no mention that repeated calls create duplicate activities, no validation rules tying fields to the activity type, no permission or account-ownership requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler. It is efficient, though its brevity is close to under-specification for an 8-required-parameter mutation tool rather than genuine tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation with 8 required parameters, an output schema, and type-dependent semantics (e.g. how fields apply to DIVIDEND vs BUY vs FEE), the description says nothing about valid field combinations or what a successful creation returns or affects. The structured fields cover definitions but not usage correctness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 11 parameters including type, symbol, date, and data_source are documented in the schema itself. The description contributes no additional meaning, which is the baseline 3 when the schema carries the full load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Create a single new transaction/activity.' The word 'single' implicitly distinguishes it from bulk paths like import_transactions, but no sibling tool is named to make the distinction explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus update_activity (for existing records) or import_transactions (for bulk loads). An agent must infer from sibling names that this is the one-at-a-time creation path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_accountDelete AccountADestructive
Delete an existing account from your portfolio.
Deletes an account specified by its ID. Be careful, this might delete associated transactions depending on backend rules!
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | Account ID to delete (e.g., 'cb547e5c-..') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations' destructiveHint=true, the description adds meaningful behavioral detail: deleting the account may also delete associated transactions depending on backend rules. This warns the agent about side effects that the structured annotations don't specify.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with the primary action front-loaded and the critical caveat placed right after. Every sentence earns its place with no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with an output schema and destructive/read-only annotations, the description covers purpose, target selection, and the key side effect. Nothing essential is missing for an agent to decide to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with account_id already explained as the ID to delete and given an example. The description adds little beyond restating 'specified by its ID,' so the schema carries the semantic weight; a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action and resource: 'Delete an existing account' specified by its ID, from the portfolio. It distinguishes the tool from sibling tools like delete_account_balance and delete_activity by naming the account as the target.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the intended use clear—deleting a portfolio account—and adds a caution about cascading transaction deletion. It doesn't explicitly name alternatives or say when not to use the tool, but the resource-specific phrasing and sibling names provide enough context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_account_balanceDelete Account BalanceADestructive
Delete a single entry from an account's balance history.
| Name | Required | Description | Default |
|---|---|---|---|
| balance_id | Yes | ID of the balance-history entry to delete, from get_account_balances (not the account ID) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnly=false. The description adds useful context by specifying the deleted object is a single balance-history entry, and the schema warns that the ID must come from get_account_balances rather than the account ID. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One focused sentence delivers the verb, object, and scope with no filler. The most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter destructive tool with a well-documented schema, annotations, and output schema, this description is nearly complete. It could briefly mention permanence or explicitly route delete_account elsewhere, but the essential information for a correct call is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the parameter description already explains that balance_id is the ID of the balance-history entry, not the account ID. The tool description itself adds no parameter-level detail beyond what the schema already provides, so the baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Delete') and a precise resource ('a single entry from an account's balance history'). This clearly distinguishes it from sibling tools like delete_account, which would delete an entire account.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'a single entry' implies this tool is for removing one balance-history record rather than an account or a batch of records. However, it does not explicitly mention alternatives or provide when-to-use/when-not-to-use guidance, leaving some routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_activityDelete ActivityADestructive
Delete a single activity/transaction by its ID.
| Name | Required | Description | Default |
|---|---|---|---|
| activity_id | Yes | The unique ID of the activity to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already communicate destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the core safety profile is covered. The description adds the scope detail that exactly one activity is deleted, but it does not disclose irreversibility, side effects, or permission requirements beyond what annotations already provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or redundancy. Every word contributes directly to understanding the tool's operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one required parameter fully described in the schema, an output schema present, and annotations marking the operation destructive, the description is sufficient for an agent to invoke the tool correctly. No additional invocation details appear necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the activity_id parameter is already documented as 'The unique ID of the activity to delete.' The description's phrase 'by its ID' adds no meaningful information beyond the schema, so it remains at the baseline for fully covered parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Delete'), names the exact resource ('activity/transaction'), and specifies the identification mechanism ('by its ID'). This clearly distinguishes it from sibling tools like delete_account, delete_account_balance, or remove_from_watchlist.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what the tool does but gives no guidance on when to use it versus alternatives, and names no exclusions or conditions. There is no mention of bulk deletion, related cleanup, or when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_asset_profileDelete Asset ProfileADestructive
Delete an asset profile.
Removes the profile-data record for the given data source and symbol. Be careful, this might delete associated activities and market data depending on backend rules!
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Symbol/ticker of the asset to delete | |
| data_source | Yes | Data source for the symbol. Typically 'MANUAL' — Ghostfolio rejects profile-data deletes for auto-fetched sources |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations already set destructiveHint=true, the description adds important behavioral context: deleting the profile-data record may also delete associated activities and market data 'depending on backend rules'. This is genuinely useful beyond what the structured annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the core action, with a useful warning at the end. The opening sentence 'Delete an asset profile' is largely redundant with the title and with the second sentence, but this is a minor inefficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive operation with a fully documented schema and an output schema, the description provides sufficient context. It names the target record, the identifying parameters, and the potential cascading effects, making the tool safe to invoke.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already well documented in the input schema. The description only echoes 'given data source and symbol' and adds no new semantic detail about parameter formats or allowed values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb and resource ('Delete an asset profile', 'Removes the profile-data record') and names the exact identifying inputs (data source and symbol). It cleanly distinguishes this as the destructive counterpart to get_asset_profile and upsert_asset_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but gives no explicit guidance on when to use it versus alternatives such as get_asset_profile or upsert_asset_profile. It also does not state prerequisites or conditions that should be checked before deleting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_portfolioExport PortfolioARead-onlyIdempotent
Export portfolio activities/transactions data as JSON.
Retrieves portfolio transactions with optional query filters.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional comma-separated list of tags to filter by | |
| symbol | No | Optional symbol/ticker to filter by | |
| accounts | No | Optional comma-separated list of account IDs to filter by | |
| data_source | No | Optional data source to filter by (e.g. 'YAHOO', 'COINGECKO') | |
| activity_ids | No | Optional comma-separated list of activity IDs to filter by | |
| asset_classes | No | Optional comma-separated list of asset classes to filter by | |
| activity_types | No | Optional comma-separated list of activity types to filter by (e.g., BUY, SELL, DIVIDEND) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds that the output is JSON and that filtering is supported, but it does not reveal additional behavioral details such as pagination, result limits, or whether all matching transactions are returned at once.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the core purpose. The second sentence is slightly redundant with the first ('portfolio transactions' appears twice), but overall it is efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 100% schema description coverage, an output schema, and safe read-only annotations, the description is mostly sufficient. It clearly conveys the export/retrieval purpose and available filtering. It would benefit from naming alternatives or clarifying the export behavior, but nothing critical is missing for invoking the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and every parameter already has a clear description in the schema. The description only adds that filters are optional, which is also evident from the default: null values. It does not add meaningful parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Export portfolio activities/transactions data as JSON') and identifies the resource clearly. However, it does not explicitly differentiate itself from sibling tools like get_investments or get_portfolio_transactions, so it relies on the word 'export' and format emphasis to stand apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: use this when you need portfolio transaction data with optional query filters. But it provides no explicit guidance on when not to use it, nor does it mention alternatives such as get_investments or get_portfolio_details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_balancesGet Account BalancesBRead-onlyIdempotent
Get account balances for a specific account.
Retrieves balance information for a specific account including current balance, currency, and balance history.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | Account ID to get balances for |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds only that balance history is included, but does not reveal additional behavioral details such as authentication requirements, data freshness, or response limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and mostly front-loaded, but the first sentence essentially repeats the tool name and title. The second sentence repeats 'specific account' while adding the useful balance fields, so the two sentences could be consolidated without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, one required parameter, rich annotations, and presence of an output schema, the description is adequate for correct invocation. It doesn't explain balance history semantics in depth, but the output schema likely covers return details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the only parameter, account_id, is already described as 'Account ID to get balances for.' The description's 'specific account' phrasing adds little beyond the schema, so the description does not carry extra parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific verb and resource: get account balances for a specific account. It also lists what is included (current balance, currency, balance history), which distinguishes it from general account listing tools, though it does not explicitly differentiate from get_account_details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used when a specific account's balance information is needed. However, it provides no explicit when-not-to-use guidance or alternatives, leaving potential ambiguity with sibling tools like get_account_details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_detailsGet Account DetailsBRead-onlyIdempotent
Get details for a specific account.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | Account ID to retrieve details for |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds only the single-account scope and discloses no additional traits such as auth requirements, pagination, or response size caveats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler, front-loading the operation. Slightly generic wording means it does not add much structural value beyond the title, but it is nonetheless concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the one required parameter, strong annotations, and presence of an output schema, this is mostly complete for invoking the tool. However, it does not disambiguate which 'details' are covered relative to sibling endpoints, so an agent may need to inspect schemas to choose correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema fully documents account_id. The description repeats that the account is specific but adds no format, validation, or value semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb ('Get') and resource ('details for a specific account'). It accurately states what the tool does, but it does not explicitly distinguish it from sibling account endpoints such as get_accounts or get_portfolio_details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to prefer this tool over alternatives like get_account_balances, get_portfolio_details, or get_accounts. The phrase 'for a specific account' hints at scope, but the description does not state exclusions or decision rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountsGet AccountsBRead-onlyIdempotent
Get all accounts in your portfolio including account types and balances.
Retrieves a list of all accounts in your portfolio including account types, balances, and account-specific information.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds only a sketch of the returned fields, with no mention of pagination, ordering, or whether the list is scoped to a single portfolio — though the presence of an output schema lowers the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The two sentences say essentially the same thing twice ('including account types and balances' / 'including account types, balances, and account-specific information'), so half the text is redundant rather than adding information. Front-loading the core purpose is done well.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters, full annotation coverage, and an output schema, the description only needs to position the tool against its siblings — and it doesn't. Nothing about return values is required, but the missing routing guidance leaves a real gap in a crowded account-related tool family.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline applies and there is nothing for the description to disambiguate. The description correctly implies a no-argument, portfolio-wide listing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get all accounts in your portfolio') and names the payload fields (account types, balances). However, it does not distinguish itself from close siblings like get_account_details or get_account_balances, which the 'including ... balances' phrasing partially overlaps with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus get_account_details, get_account_balances, or get_portfolio_details, all of which sit adjacent in the sibling list. The agent must infer the boundary from names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_asset_profileGet Asset ProfileARead-onlyIdempotent
Get asset profile information for a specific symbol.
Retrieves detailed profile information about an asset including company information, sector, industry, and other metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Symbol/ticker of the asset (e.g., 'AAPL', 'BTC-USD') | |
| data_source | Yes | Data source for the symbol (e.g., 'YAHOO', 'COINGECKO', 'MANUAL') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is established. The description adds that the tool returns company, sector, industry, and other metadata, which is useful context, but it does not disclose additional behavioral traits beyond what annotations already cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and well-structured, with the core purpose stated early and supporting detail in the second sentence. The first sentence is slightly redundant with the tool name, but overall it is efficient with no unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple two-parameter schema, full schema coverage, presence of an output schema, and read-only annotations, the description is largely sufficient for an agent to invoke the tool correctly. It could be more complete by addressing what happens when no profile exists for the symbol, but that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both 'symbol' and 'data_source' clearly documented and given examples. The description does not add meaningful parameter semantics beyond the schema, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'asset profile information' for a specific symbol, and elaborates with concrete content examples such as company information, sector, and industry. This distinguishes it from siblings like get_symbol_data, upsert_asset_profile, and delete_asset_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when needing detailed profile metadata for a specific symbol, but it does not explicitly say when to use this tool over alternatives like get_symbol_data or lookup_symbols, nor does it state exclusions such as 'not for price history'. Guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_benchmark_performanceGet Benchmark PerformanceBRead-onlyIdempotent
Compare portfolio performance against a benchmark symbol starting from a specific date.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional comma-separated list of tags to filter by | |
| symbol | Yes | Symbol/ticker of the benchmark (e.g. 'URTH', 'AAPL') | |
| accounts | No | Optional comma-separated list of account IDs to filter by | |
| date_range | No | Time range. Options: 1d, 1w, 1m, 3m, 6m, 1y, 2y, 5y, max | max |
| start_date | Yes | Start date in YYYY-MM-DD format for comparison | |
| data_source | Yes | Data source for the benchmark (e.g. 'YAHOO', 'COINGECKO') | |
| asset_classes | No | Optional comma-separated list of asset classes to filter by | |
| filter_symbol | No | Optional symbol/ticker to filter by | |
| filter_data_source | No | Optional data source to filter by | |
| with_excluded_accounts | No | Whether to include excluded accounts in the calculations |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description does not contradict them. However, the description adds no behavioral context beyond the schema, such as how filters interact, what happens with missing benchmark data, or any calculation nuances.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no filler. It front-loads the core purpose and does not waste words, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema and full parameter descriptions cover the invocation details, and annotations cover safety. However, the description lacks usage differentiation and does not address the many optional filtering parameters or default date_range behavior, leaving the agent with some ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description references 'benchmark symbol' and 'specific date', which map to symbol and start_date, but it does not add any meaning beyond the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Compare portfolio performance') and a specific resource ('benchmark symbol starting from a specific date'). It is distinct enough from sibling tools like get_portfolio_performance and get_benchmarks, though it does not explicitly name those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus sibling tools such as get_portfolio_performance or get_benchmarks. The description implies a benchmark comparison use case, but there are no explicit conditions, exclusions, or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_benchmarksGet BenchmarksARead-onlyIdempotent
Get all configured benchmarks.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds only that results cover all configured benchmarks (no filtering, no subsetting), which is modest context beyond structured fields. With an output schema present, no further disclosure of return values is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with zero filler, naming the resource and scope up front. Nothing is wasted and nothing needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, read-only listing with annotations and an output schema, the description covers what an agent needs to invoke it correctly. The remaining gap is not clarifying the boundary with get_benchmark_performance, which matters given how similarly named the siblings are.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline is 4. The phrase 'all configured' appropriately confirms there is no filtering input to supply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('benchmarks') with a scope qualifier ('all configured'), which tells the agent this is an unfiltered listing. It does not distinguish itself from the sibling get_benchmark_performance, which an agent could plausibly confuse it with when looking for benchmark data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, no prerequisites, and no mention of alternatives such as get_benchmark_performance for actual performance data. The only implied guidance is 'all configured', which hints at a metadata listing rather than a data query, but the agent must infer that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dividendsGet DividendsCRead-onlyIdempotent
Get dividend data grouped by time period showing dividend payments and yield.
Retrieves dividend income data grouped by the specified time period, showing dividend payments, yield, and income patterns over time.
| Name | Required | Description | Default |
|---|---|---|---|
| group_by | No | Grouping period for dividend data. Options: day, week, month, quarter, year | month |
| date_range | No | Time range for dividend data. Options: 1d, 1w, 1m, 3m, 6m, 1y, 2y, 5y, max | max |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey read-only, idempotent, non-destructive behavior. The description adds that results are grouped by time period and emphasize payments, yield, and income patterns, but this mostly restates schema semantics rather than revealing deeper behavioral traits like pagination, currency handling, or data sources.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but redundant: the second sentence largely paraphrases the first and adds only the vague phrase 'income patterns over time.' It is front-loaded, but not every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema and comprehensive parameter descriptions cover most invocation needs. However, the description lacks guidance for choosing between get_dividends and the closely named sibling get_dividends_for_import, which is a meaningful completeness gap given the sibling context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and both parameters have clear descriptions with defaults and allowed option lists. The description does not add meaningful details beyond the schema, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (dividend data), the grouping behavior, and the output dimensions (payments, yield). It is distinct enough from the sibling get_dividends_for_import, though it does not explicitly call out any sibling or differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as get_dividends_for_import or other data retrieval tools. The description implies a reporting/analytics use case but never states exclusions or selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dividends_for_importGet Dividends For ImportARead-onlyIdempotent
Fetch historical dividend data formatted for import for a specific symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Symbol/ticker of the asset to get dividends for | |
| data_source | Yes | Data source for the symbol (e.g. 'YAHOO', 'COINGECKO', 'MANUAL') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent safety profile, so the bar for extra behavioral disclosure is lower. The description adds 'historical' and 'formatted for import' as output-context clues, but it does not mention pagination, date-range limits, or data-source-specific behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the operation and its distinguishing output purpose. It contains no filler, no repetition of annotations, and every phrase earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with full schema coverage and an output schema, this description is nearly sufficient. The main missing element is an explicit pointer to get_dividends to prevent selection confusion.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both required parameters are already documented. The phrase 'specific symbol' essentially restates the symbol parameter and adds no concrete guidance about symbol formats or data-source values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation: fetching historical dividend data for a specific symbol, explicitly formatted for import. The 'for import' qualifier distinguishes it from the sibling get_dividends, though it never names that alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the phrase 'for import' and the required symbol/data_source parameters, but the description does not explicitly state when to use this tool over get_dividends or import_transactions, nor does it provide when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_exchange_rateGet Exchange RateARead-onlyIdempotent
Get the exchange rate for a given currency symbol on a specific date.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date in YYYY-MM-DD format to retrieve the rate for | |
| symbol | Yes | Currency symbol to get exchange rate for (e.g. 'USD', 'CHF', 'EUR') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds some behavioral context by limiting the lookup to a specific symbol and date, but it does not disclose deeper traits such as the base currency or rate source. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single focused sentence with no filler or redundancy. It front-loads the operation and the two key constraints, making it immediately scannable for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only, two-parameter tool with a complete input schema, output schema, and safety annotations, the description is nearly complete. The only minor gap is that the base currency or rate direction is not stated, but the output schema likely resolves this and it does not prevent correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both 'symbol' and 'date' are fully documented in the input schema. The description only restates the parameters at a high level without adding format, constraints, or examples beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('get') and names the resource ('exchange rate') with precise qualifiers: currency symbol and specific date. This clearly separates it from the sibling tools, none of which target exchange-rate retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used when you need a rate for a currency symbol on a particular date, but it does not explicitly state when to prefer it over sibling tools such as get_market_data or get_historical_data, nor does it mention exclusions. The context is clear but the guidance is not explicit enough for a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_healthGet HealthARead-onlyIdempotent
Get system health status.
Retrieves the health status of the Ghostfolio backend service. This is useful to verify if the server is up and running correctly.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds only that this is a backend service check; it says nothing about authentication requirements, rate limiting, or what a degraded vs healthy response implies (though the output schema likely covers the payload).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the purpose in the first line. The second sentence ('Retrieves the health status of the Ghostfolio backend service') largely restates the first, adding only the backend-service detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only probe with annotations and an output schema, the description gives enough to select and call it. Only edge details such as auth requirements or what failure looks like are absent, which is minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline applies. No parameter text is needed and none is missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('get system health status') and names the concrete target (Ghostfolio backend service), so intent is unambiguous. It doesn't need to differentiate from siblings since none of them touch health, but it also makes no explicit contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Useful to verify if the server is up and running correctly' gives a clear but generic use case. There are no exclusions, prerequisites, or mentions of when a different diagnostic tool would be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_historical_dataGet Historical DataBRead-onlyIdempotent
Get historical data for a specific symbol on a specific date.
Retrieves historical market data for a symbol on a specific date, including price and volume information.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date in YYYY-MM-DD format for historical data | |
| symbol | Yes | Symbol/ticker of the asset (e.g., 'AAPL', 'BTC-USD') | |
| data_source | Yes | Data source for the symbol (e.g., 'YAHOO', 'COINGECKO', 'MANUAL') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds only limited context about returned content ('price and volume information') and nothing about authentication, rate limits, or failure behavior. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is short, but the first and second sentences largely repeat each other. The second sentence adds only the price/volume detail, making the opening sentence redundant. It is acceptable but not tightly written.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Core call requirements are covered by the input schema, output schema, and annotations. Missing are differentiation from close siblings and explicit edge-case guidance, such as historical date range limitations or data-source behavior. The definition is minimally complete but not fully contextual.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all three parameters. The description adds little beyond restating 'symbol' and 'date' generically, with no format, constraint, or source-selection guidance beyond the schema. This matches the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the operation: 'Get historical data for a specific symbol on a specific date' and adds that it returns price and volume information. This is a specific verb-object pair with clear scope. However, it does not differentiate from similar sibling tools like get_symbol_data or get_market_data_for_asset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The text implies a point-in-time historical lookup but gives no explicit guidance on when to use this tool versus alternatives. No sibling tools, exclusions, or preferred contexts are mentioned. An agent would not know whether to choose this over get_symbol_data or get_market_data_for_asset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_investmentsGet InvestmentsBRead-onlyIdempotent
Get investment data grouped by time period showing cash flows and contributions.
Retrieves investment activity data grouped by the specified time period, showing cash flows, contributions, and investment patterns over time.
| Name | Required | Description | Default |
|---|---|---|---|
| group_by | No | Grouping period for investment data. Options: day, week, month, quarter, year | month |
| date_range | No | Time range for investment data. Options: 1d, 1w, 1m, 3m, 6m, 1y, 2y, 5y, max | max |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds no behavioral context beyond restating the data grouping; it does not mention any side effects, auth requirements, or pagination, but those are less critical given the read-only annotations and output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, but the first and second sentences are largely redundant ('showing cash flows and contributions' is restated). It could be tightened to a single sentence without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, idempotent tool with two optional and well-documented parameters and an output schema, the description is functionally adequate. The main missing element is usage differentiation from closely related portfolio/historical reporting tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully documented in the schema with default values and allowed options, so schema description coverage is 100%. The description only reiterates 'grouped by time period' and adds no parameter-level 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a clear verb and resource ('Get investment data') and specifies it is grouped by time period with cash flows and contributions. It is strong enough to distinguish from most siblings like get_watchlist or get_orders, though it does not explicitly differentiate from get_portfolio_performance or get_historical_data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the intended use for retrieving investment activity grouped by time period, but it never states when to choose this over sibling tools such as get_portfolio_performance or get_dividends. There is no explicit when-to-use or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_market_data_for_assetGet Market Data For AssetBRead-onlyIdempotent
Get market data for a specific asset.
Retrieves current market data for a specific symbol including price, volume, market cap, and other relevant market information.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Symbol/ticker of the asset (e.g., 'AAPL', 'BTC-USD') | |
| data_source | Yes | Data source for the symbol (e.g., 'YAHOO', 'COINGECKO', 'MANUAL') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is read-only, idempotent, and non-destructive, so the description does not need to restate safety. It adds useful scope by specifying 'current' market data and naming returned fields, but it does not disclose further behavior such as data-source compatibility or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and readable, with the substantive details contained in the second sentence. The first sentence is a mild restatement of the title and could be trimmed, but overall there is minimal redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With both required parameters fully described in the schema, an output schema present, and annotations covering safety, an agent has enough to invoke this tool correctly. It could be more complete by noting when to choose this over get_symbol_data or by clarifying data_source/symbol compatibility, but the core call context is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both symbol and data_source already described with concrete examples. The description does not add parameter-level meaning, but it does not need to because the schema fully documents both required parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieves') and clearly identifies the resource: current market data for a specific symbol, including price, volume, and market cap. It is clear, though it does not explicitly distinguish itself from similarly named siblings like get_symbol_data or get_historical_data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives such as get_symbol_data or get_historical_data. The word 'current' implies it is for present market data rather than historical queries, but no explicit exclusions or alternative recommendations are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ordersGet OrdersARead-onlyIdempotent
Get all activities/orders from your portfolio, optionally filtered by account.
Retrieves a list of all buy/sell orders in your portfolio, optionally filtered by a specific account.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to filter orders by specific account |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description's 'Retrieves a list' is consistent with these and adds no contradiction. It provides the optional filtering behavior, which is a minor extra, but does not disclose anything beyond what annotations imply (e.g., no auth details, rate limits, or side effects). Since annotations cover safety, the description's contribution is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences that essentially repeat the same information: the first says 'Get all activities/orders from your portfolio, optionally filtered by account' and the second says 'Retrieves a list of all buy/sell orders in your portfolio, optionally filtered by a specific account.' This is redundant and could be condensed to a single sentence without losing any meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (1 optional parameter, 0 required), has an output schema (not shown), and annotations cover safety. The description covers the core function and the filter option. Given that it has an output schema, it doesn't need to explain return format. It could be more complete regarding sorting or pagination, but these are likely in the output schema. Overall, it is complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter account_id, which already fully explains it as 'Optional account ID to filter orders by specific account.' The description repeats this without adding any new semantics, so it adds no value beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves all portfolio orders, optionally filtered by account. It uses specific verbs ('get', 'retrieves') and a clear resource (orders/activities), and distinguishes itself from sibling tools that handle balances, accounts, watchlists, and other domains. The purpose is unambiguous and not a tautology.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (for retrieving orders) but does not explicitly contrast it with alternatives like get_portfolio_holdings or get_investments. It mentions optional filter by account but doesn't state conditions under which one would prefer another tool. It provides basic usage context but no explicit 'when not to use' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_platformsGet PlatformsARead-onlyIdempotent
Get available platforms.
Retrieves a list of all available platforms (brokers, exchanges, etc.) that can be used when tracking accounts or transactions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that the tool is read-only, idempotent, and non-destructive, so the description does not need to repeat safety behavior. The description adds that it returns 'all available platforms' and gives examples of platform types, but it does not discuss pagination, authentication requirements, or other behavioral details. With strong annotations and an output schema, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, stating the action first and then elaborating on what platforms are. There is minor redundancy between 'Get available platforms' and 'Retrieves a list of all available platforms,' but no significant waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with annotations and an output schema, the description gives enough context to understand what the tool does and when it might be useful. It could be slightly more complete by naming related tools or prerequisites, but nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so parameter semantics are not a concern. The schema is empty and the description correctly does not introduce any parameter-related details. Baseline 4 applies for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get available platforms' and clarifies that these are 'brokers, exchanges, etc.' used when tracking accounts or transactions. It is clear what the tool returns, but it does not explicitly distinguish itself from sibling tools such as get_accounts, get_benchmarks, or lookup_symbols.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'that can be used when tracking accounts or transactions' gives implied usage context, but there is no explicit guidance on when to call this tool versus alternatives. No exclusions, prerequisites, or sibling alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolio_detailsGet Portfolio DetailsBRead-onlyIdempotent
Get comprehensive portfolio details including accounts, positions, and summary.
Retrieves a complete overview of your portfolio including account information, current positions, performance summary, and portfolio metrics.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds nothing beyond them: no auth requirements, no mention of scope (all accounts vs. one), no statement of how large the response may be or whether it is expensive to call. The second sentence largely restates the first rather than disclosing behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the useful sentence, but the second sentence repeats the same content ('complete overview ... account information, current positions, performance summary, portfolio metrics') without adding information. It is short overall, yet roughly half of it does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, an output schema, and full annotation coverage, this is a simple read tool requiring little more than a purpose statement. The description says what the payload contains, which is sufficient; only the missing sibling disambiguation keeps it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; there is nothing for the description to disambiguate. It does not need to explain parameter syntax, and the enumeration of returned content is supplementary rather than required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get comprehensive portfolio details') and enumerates contents: accounts, positions, performance summary, metrics. It does not, however, distinguish itself from siblings such as get_portfolio_holdings, get_portfolio_performance, or get_investments, so an agent must infer the overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no named alternatives despite a crowded sibling set with several portfolio-reading tools. The word 'complete overview' hints at broad-scope usage but never says to prefer the narrower siblings when only one aspect is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolio_holdingsGet Portfolio HoldingsBRead-onlyIdempotent
Get portfolio holdings and positions including allocations and asset breakdowns.
Retrieves current portfolio holdings including positions, allocations, and asset breakdowns for the specified time period.
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Time range for holdings data. Options: 1d, 1w, 1m, 3m, 6m, 1y, 2y, 5y, max | max |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description is not responsible for conveying safety. It adds the 'specified time period' context, which is useful, but it does not mention pagination, response size, or any other behavioral traits beyond that. With annotations covering the main safety profile, the description adds modest value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description has two sentences that are largely redundant: the first states holdings/positions/allocations/asset breakdowns, and the second repeats nearly the same list with slight rephrasing. It is not overly long, but the redundancy wastes space. A single well-structured sentence would have been sufficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one optional parameter and an output schema, the description covers the essentials. The main gap is the lack of differentiation from sibling tools, which is important given the large set of similar tools. Otherwise, it is reasonably complete for what it does.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers the only parameter (date_range) with a complete description and enum-like options (though not formally enumerated). The description merely references 'specified time period' without adding new semantic insight, so it meets the baseline for high schema coverage but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get portfolio holdings') and the specific data returned (positions, allocations, asset breakdowns). However, it does not differentiate from closely related sibling tools like get_portfolio_details or get_position, so an agent might not know which tool to pick based on this description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. With many sibling tools (e.g., get_portfolio_details, get_portfolio_performance, get_position), the description should specify the distinguishing use case. The description only states what it does, not when it is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolio_performanceGet Portfolio PerformanceBRead-onlyIdempotent
Get portfolio performance data including returns, benchmarks, and performance metrics.
Retrieves comprehensive performance metrics for your portfolio including returns, benchmarks, and performance comparisons over the specified time period.
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Time range for performance data. Options: 1d, 1w, 1m, 3m, 6m, 1y, 2y, 5y, max | max |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is clear. The description adds a bit of context about the data returned (returns, benchmarks, comparisons) and the time period, but does not disclose any behavioral traits beyond what the annotations and simple read operation already imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but noticeably redundant: the first and second sentences restate nearly the same list of returns, benchmarks, and performance metrics. It is not bloated, but it does not use every sentence efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one optional parameter and has an output schema, so the description does not need to explain return values. However, given a large sibling list with closely related tools, the lack of any selection guidance leaves the context incomplete for an agent deciding between this and get_benchmark_performance or get_portfolio_details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single parameter date_range is fully documented with options and a default. The description adds no additional meaning about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a get operation on portfolio performance data, listing returns, benchmarks, and performance metrics. It is understandable and distinct in topic, though it does not explicitly differentiate itself from related siblings like get_benchmark_performance or get_portfolio_details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus the many related sibling tools such as get_benchmark_performance, get_portfolio_details, or get_portfolio_holdings. It only describes what the tool returns, not the conditions or scenarios that make it the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_positionGet PositionARead-onlyIdempotent
Get position details for a specific symbol from a data source.
Retrieves detailed information about a specific position including current value, quantity, performance, and market data.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Symbol/ticker of the asset (e.g., 'AAPL', 'BTC-USD') | |
| data_source | Yes | Data source for the symbol (e.g., 'YAHOO', 'COINGECKO', 'MANUAL') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds some useful context by listing returned aspects (current value, quantity, performance, market data), but it does not add deeper behavioral details such as error cases, authentication needs, or data-source-specific behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The main action is front-loaded in the first sentence, and the second sentence provides a concise, useful enumeration of what the result contains.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with full schema coverage, output schema present, and annotations covering safety, the description is largely complete. It could be stronger by explicitly distinguishing from sibling lookup tools, but nothing essential to invoking it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the symbol and data_source parameters with examples. The description mostly restates the parameter concepts ('specific symbol', 'data source') without adding extra semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and a clear resource ('position details for a specific symbol from a data source'). It also distinguishes itself from sibling tools by emphasizing position-level details (value, quantity, performance, market data) rather than generic symbol or account data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for a specific symbol' gives clear context that this is for single-position lookups, which implies when to use it. However, it does not explicitly mention alternatives like get_portfolio_holdings or get_symbol_data, or state when not to use this tool, so usage guidance is only implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_symbol_dataGet Symbol DataBRead-onlyIdempotent
Get symbol data for a specific asset from a data source.
Retrieves detailed information about a specific symbol including current price, market data, and asset information.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Symbol/ticker of the asset (e.g., 'AAPL', 'BTC') | |
| data_source | Yes | Data source for the symbol (e.g., 'YAHOO', 'COINGECKO', 'MANUAL') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds only that it returns price, market data, and asset information, which is partly redundant with the output schema and does not disclose extra behavioral traits such as caching, freshness, or data-source limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the core action in the first sentence. The second sentence is somewhat redundant with the first but does add concrete return-content details, so it earns its place mostly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only, two-parameter tool with an output schema, the description covers the basics. However, the large sibling set creates ambiguity — especially with get_market_data_for_asset — and the description does not clarify the distinction, so an agent cannot confidently select it over similar tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters already have clear descriptions with examples. The description does not add meaningful constraints, formats, or domain-specific detail beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Get symbol data for a specific asset from a data source,' and the second sentence adds what is included: current price, market data, asset information. It is clear on its own but does not differentiate it from siblings such as get_market_data_for_asset or get_historical_data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives like get_market_data_for_asset, lookup_symbols, get_asset_profile, or get_historical_data. The description only restates what the tool does, leaving selection entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_infoGet User InfoBRead-onlyIdempotent
Get user information and settings.
Retrieves information about the current user including settings, preferences, and account details.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds scope of returned data (settings, preferences, account details) but nothing about breadth, sensitivity of the data, or whether it reflects the authenticated principal only — modest added value given a read-only, zero-argument call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded with the action. The second sentence largely restates the first ('user information and settings' vs 'settings, preferences, and account details'), so one of the two sentences is close to redundant, but nothing is padded or buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters, an output schema documenting the return shape, and annotations covering safety, the description only needs to establish who and what. It does that, though 'settings' stays vague and no sibling routing is offered in a 39-tool namespace where several get_* tools could plausibly be chosen.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, and the schema is fully described, so there is no parameter semantics burden to discharge. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific verb and resource ('Get/Retrieves information about the current user') and scopes the payload to settings, preferences, and account details, which distinguishes it from account-scoped siblings like get_account_details. It stops short of naming any sibling explicitly, so the differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisite, and no mention of alternatives such as get_accounts or get_account_details. The only implicit signal is 'current user', and the agent must guess that this is the profile/self-lookup tool rather than an account-lookup tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_watchlistGet WatchlistBRead-onlyIdempotent
Get all items in the user's watchlist.
Retrieves list of all watchlisted symbols.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is fully covered. The description's only added behavioral fact is the word 'all', implying no filtering or pagination options. It says nothing about ordering or what an empty watchlist yields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the intent front-loaded, but the second sentence largely restates the first ('items in the watchlist' vs 'watchlisted symbols') rather than adding information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A zero-parameter read tool with an output schema and exhaustive annotations needs very little prose. The description covers the what and scope sufficiently; only caller-facing behavior for an empty list or ordering is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. The schema is trivially complete at 100% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('items in the user's watchlist') and the second sentence clarifies that the items are watchlisted symbols. It doesn't explicitly name add_to_watchlist / remove_from_watchlist as the alternatives, but the read-only retrieval intent is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus the sibling mutation tools, no mention that it requires no arguments, and no indication of prerequisites. Usage is only inferable from the sibling naming.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_transactionsImport TransactionsA
Import transactions into your portfolio. This is a write operation.
Imports a batch of transactions (buy/sell orders) into your Ghostfolio portfolio. This is useful for bulk importing historical data or transactions from other platforms.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Transaction data in the format expected by Ghostfolio API. Should contain an 'activities' list. Each activity must have: 'currency', 'dataSource', 'date' (ISO-8601, e.g. 2021-09-15T00:00:00.000Z), 'quantity', 'symbol', 'type' (BUY, SELL, etc), 'unitPrice', and usually 'fee' (can be 0). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states it is a write operation, and the annotations already indicate readOnlyHint=false. It adds useful batch-import context beyond the annotations, but does not cover duplicate handling, whether existing transactions are affected, or required permissions. With annotations present, this level is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, but the second paragraph largely restates the first: both mention importing transactions into the portfolio. 'This is a write operation' also duplicates what readOnlyHint=false already conveys, so not every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema carries significant detail and an output schema exists, so the description doesn't need to explain return values. However, it could more explicitly distinguish batch import environment behavior from create_activity and clarify what happens on conflict or re-import. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage with a detailed description of the expected 'activities' list and required fields. The tool description adds no parameter-level semantics, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource ('Import transactions into your portfolio') and adds that it handles a batch of buy/sell orders. It is not as explicit as naming sibling alternatives, but the batch framing distinguishes it from single-activity tools like create_activity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a clear use case: 'useful for bulk importing historical data or transactions from other platforms.' This signals when the tool is appropriate, though it does not explicitly state when not to use it or name a preferred alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_symbolsLookup SymbolsARead-onlyIdempotent
Search for symbols using a query string.
Search for financial symbols, stocks, ETFs, and other assets using a text query. Optionally include market indices in the results.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query for symbol lookup. Can be company name, ticker symbol, or partial match | |
| include_indices | No | Include market indices in search results |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds useful scoping context by noting that market indices are only included when requested, but it does not disclose additional behavior such as matching semantics, result limits, or search coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the primary purpose. The second sentence slightly restates the first, but overall each part earns its place by adding asset-class scope and the optional index behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter search tool with an output schema and strong read-only annotations, the description is adequately complete. An agent can confidently invoke the tool with a query and understand the optional index behavior; no critical missing information is apparent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the input schema. The description mostly restates the query and optional include_indices behavior without adding meaning beyond what the schema provides; the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool searches for financial symbols using a text query, and also identifies the resource types (stocks, ETFs, other assets). It does not explicitly differentiate itself from siblings like get_symbol_data or get_asset_profile, but the verb 'search' plus the query-string input makes the core purpose clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used when an agent needs to resolve a company name, ticker, or partial match into a symbol. It does not explicitly state when to prefer this over sibling lookup tools or mention any exclusions, so usage guidance is present but only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_from_watchlistRemove From WatchlistADestructiveIdempotent
Remove a symbol from the user's watchlist.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Symbol/ticker of the asset to remove from the watchlist | |
| data_source | Yes | Data source for the symbol (e.g. 'YAHOO', 'COINGECKO', 'MANUAL') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is destructive and idempotent. The description adds that the destructive action is scoped to removing a symbol from the watchlist, but it does not disclose edge-case behavior such as what happens if the symbol is not present. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no filler. It is appropriately sized for the simplicity of the operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, both parameters are fully documented in the schema, annotations cover the destructive and idempotent behavior, and an output schema exists. The description is complete enough for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both 'symbol' and 'data_source' clearly described in the input schema. The tool description adds no additional parameter semantics, so the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Remove'), a specific resource ('symbol'), and a clear scope ('user's watchlist'). This clearly distinguishes it from sibling tools like get_watchlist and add_to_watchlist.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the tool's purpose obvious, but it does not explicitly state when to use this tool versus alternatives or mention that add_to_watchlist is the inverse operation. Usage guidance is only implied by the tool name and sibling context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transfer_account_balanceTransfer Account BalanceA
Transfer cash balances between two accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| balance | Yes | The amount of cash to transfer | |
| account_id_to | Yes | The target account ID to transfer cash to | |
| account_id_from | Yes | The source account ID to transfer cash from |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/destructive hints, so the description need not restate them. It adds no extra context about side effects beyond 'Transfer' (source decreases, destination increases), and does not warn about duplicate transfers or insufficient funds. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no redundancy or filler. Every word contributes: the verb, the resource, and the source/destination relationship are all present and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a complete input schema and an output schema, the description leaves little ambiguity for a simple two-account transfer. It could additionally state constraints like positive amounts or distinct account IDs, but these are reasonable defaults for a transfer operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes all three parameters with 100% coverage, so the description does not need to explain them. It adds no additional parameter-level semantics (e.g., positivity, distinct accounts), keeping it at the baseline for well-covered schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Transfer'), resource ('cash balances'), and relationship ('between two accounts'), making the tool's function unambiguous. This also differentiates it from siblings like create_account_balance and delete_account_balance, which lack the two-account movement semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended usage is implied by 'between two accounts' — the tool is for moving cash from one account to another. However, it does not explicitly say when to prefer this over create_account_balance/delete_account_balance or mention prerequisites like verifying balances.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_accountUpdate AccountADestructiveIdempotent
Update settings or details of an existing account.
Ghostfolio's update endpoint replaces the whole account record, so
name, currency and platform_id are required on every request even
when they are not changing. Any left unset here are backfilled from the
account's current state with a GET before the PUT, so you only need to
pass the fields you actually want to change. If name or currency
can't be backfilled (e.g. the account doesn't exist), the update stops
before the PUT and names them.
Setting balance here applies it as today's entry in the account's
balance history (the same series get_account_balances returns and
get_portfolio_holdings derives its cash figure from) - it is not a
separate stale field. Use create_account_balance to set the balance
for a specific past date instead of today.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional new name of the account | |
| balance | No | Optional new balance for the account | |
| comment | No | Optional new comment or note for the account | |
| currency | No | Optional new currency code for the account (e.g., 'USD', 'EUR') | |
| account_id | Yes | Account ID to update | |
| platform_id | No | Optional new platform ID for the account |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only declare non-read-only, idempotent, destructive) by explaining the PUT-replaces-whole-record semantics, the pre-PUT GET backfill, the failure mode when name/currency can't be backfilled, and where the balance lands in the history series. This directly de-fangs the destructiveHint=true concern.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then layers mechanism and the balance/date distinction. Dense but every sentence carries operational value; slightly long for a single tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive-replacing mutation with an output schema present, the description covers required-field quirks, backfill behavior, failure handling, and balance-history semantics — nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds real meaning by clarifying that name/currency/platform_id are required server-side yet optional client-side due to backfill, and that balance means today's entry rather than a stale field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update settings or details of an existing account') and implicitly separates it from create_account, delete_account, and create_account_balance, which the description later names explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear routing guidance: 'Use create_account_balance to set the balance for a specific past date instead of today,' and reassures that unset fields are backfilled so callers need only pass changed fields. No explicit when-not-to-use for the whole tool, hence 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_activityUpdate ActivityADestructiveIdempotent
Update an existing activity/transaction.
Ghostfolio's update endpoint replaces the whole activity record, so
type, symbol, date, quantity, unitPrice, currency,
dataSource and fee are required on every request even when they
are not changing. Any left unset here (including tags, account_id
and comment) are backfilled from the activity's current state with a
GET before the PUT, so you only need to pass the fields you actually
want to change. If a required field can't be backfilled (Ghostfolio
redacts quantity and fee in restricted views), pass it explicitly.
A restricted view also redacts comment, and Ghostfolio clears the
comment whenever the update carries none, so in that case comment
is required too (pass an empty string to clear it).
Ghostfolio identifies the asset by dataSource and symbol together,
and the current currency belongs to that asset. So changing either
symbol or data_source requires passing symbol, data_source and
currency together; backfilling the rest from the old asset would
attach the activity to the wrong asset profile or price it in the
wrong currency. Ghostfolio ignores an asset change (without an error)
when the resulting activity is a FEE, INTEREST or LIABILITY, or a BUY
on the MANUAL data source; delete and re-create the activity instead.
The GET and PUT are separate requests, so an edit made to the same activity in between (e.g. in the Ghostfolio UI) is overwritten for every field not passed here.
| Name | Required | Description | Default |
|---|---|---|---|
| fee | No | Optional new fee amount | |
| date | No | Optional new date in ISO 8601 format (e.g. 2026-05-09T00:00:00.000Z) | |
| tags | No | Optional new list of tag IDs (from get_tags) to replace this activity's tags. Omit to leave existing tags unchanged; pass an empty list to clear all tags. | |
| type | No | Optional new type: BUY, SELL, DIVIDEND, INTEREST, FEE, LIABILITY | |
| symbol | No | Optional new ticker symbol. Changing the asset (symbol or data_source) requires symbol, data_source and currency together. | |
| comment | No | Optional new comment | |
| currency | No | Optional new currency code | |
| quantity | No | Optional new number of shares/units | |
| account_id | No | Optional new account ID. Pass an empty string to detach the activity from its account. | |
| unit_price | No | Optional new price per unit | |
| activity_id | Yes | The unique ID of the activity to update | |
| data_source | No | Optional new data source (e.g., 'YAHOO', 'COINGECKO', 'MANUAL'). Changing it requires symbol and currency too. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark this as destructive and idempotent, but the description adds substantial hidden behavior: the PUT replaces the whole record, unset fields are backfilled with a GET first, restricted views redact quantity/fee/comment, comments are cleared unless supplied, asset changes require symbol/data_source/currency together, and concurrent edits can be overwritten. These are exactly the beyond-annotation behaviors an agent needs to avoid incorrect updates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads the action and then spends each sentence on a non-obvious constraint such as replacement semantics, backfill behavior, restricted-view redaction, and ignored asset changes. The length is justified by 12 parameters and the tool's complex update behavior, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations, full parameter descriptions, and an output schema already present, the description covers the behavioral gaps an agent needs in order to call this tool correctly. Return-value details are appropriately left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds important cross-parameter meaning: unchanged required fields must still be passed or backfilled, tags/account_id/comment default to current state, comment may be required in restricted views, and symbol/data_source/currency must be changed together. This goes well beyond the individual schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb ('Update') and resource ('an existing activity/transaction'), which clearly distinguishes it from create_activity and delete_activity siblings. The replacement semantics are additional detail, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for updating an existing activity and explicitly says to delete and re-create instead when an asset change would be silently ignored for FEE, INTEREST, LIABILITY, or MANUAL BUY activities. However, it does not provide broad routing guidance versus create_activity or delete_activity, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_asset_profileUpsert Asset ProfileAIdempotent
Create-or-update an asset profile.
POSTs an empty profile-data record (idempotent — Ghostfolio answers HTTP 400 "already exists" when the profile is already there, and HTTP 500 on some first-time-create paths while still persisting the record, so this tolerates both). Then PATCHes metadata (name, currency, asset class, optional sub-class, optional country and sector allocations). PATCH is the source of truth — if the profile doesn't exist after the POST, PATCH will surface the error. Calling twice with the same input yields the same end state.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable name for the asset | |
| symbol | Yes | Symbol/ticker of the asset. Permanent — renaming orphans associated activities and market data | |
| sectors | No | Optional sector allocation. Entries must contain exactly 'name' and 'weight' (a fraction between 0 and 1, e.g. 0.2431); any extra key is rejected with HTTP 400. Omit to leave the stored value untouched; pass [] to reset (on 'MANUAL' this empties the list, on fetched sources it drops the override and the data provider's own sectors apply again) | |
| currency | Yes | Currency code of the asset (e.g., 'USD', 'CHF', 'EUR') | |
| countries | No | Optional country allocation. Entries must contain exactly 'code' (ISO 3166-1 alpha-2, e.g. 'US') and 'weight' (a fraction between 0 and 1, e.g. 0.6907) — any extra key, such as the 'continent' and 'name' that reads add, is rejected with HTTP 400. Omit to leave the stored value untouched; pass [] to reset (on 'MANUAL' this empties the list, on fetched sources it drops the override and the data provider's own countries apply again) | |
| asset_class | Yes | Asset class: 'EQUITY', 'FIXED_INCOME', 'REAL_ESTATE', 'COMMODITY', 'LIQUIDITY' (cash), or 'ALTERNATIVE_INVESTMENT'. Note: Ghostfolio's enum does not include 'CASH' — use 'LIQUIDITY' | |
| data_source | Yes | Data source for the symbol. Typically 'MANUAL' — Ghostfolio rejects profile-data writes for auto-fetched sources | |
| asset_sub_class | No | Optional asset sub-class (e.g., 'MUTUALFUND', 'CASH', 'ETF') |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses concrete error tolerance (HTTP 400 when already exists, HTTP 500 on some first-time paths while still persisting), the POST-then-PATCH flow, and that PATCH is the source of truth. This level of detail prevents an agent from misinterpreting non-standard idempotency behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately dense for the complexity of an idempotent upsert with non-standard HTTP behavior. Every sentence carries information: purpose, POST behavior, PATCH source-of-truth, and end-state guarantee. No filler or redundant schema repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-paramt tool with a 100%-covered schema, annotations, and an output schema, the description covers the only real gaps: the two-step operation, edge-case error handling, and idempotency guarantees. Nothing an agent needs to correctly invoke this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so baseline is 3. The description adds meaningful flow context by stating that the POST creates an empty profile and the PATCH applies metadata parameters, and that PATCH errors surface if the POST did not persist. This goes beyond simply echoing parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Create-or-update an asset profile') and clarifies the two-step POST/PATCH mechanism. This clearly distinguishes it from the sibling get_asset_profile and delete_asset_profile tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Create-or-update' framing gives a clear context for when to call it, and the idempotent behavior explains repeated-invocation safety. It does not explicitly name alternatives or exclusions, but the sibling names and the verb make the intended use unambiguous.
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.
2 tool updates
v1.8.0- Changed
create_activity2 fields changed- added
Input schema / properties / tagsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional list of tag IDs to attach to this activity (from get_tags). Omit for no tags." +} - changed
Input schema / properties / type / descriptionPrevious value: -"Type of activity: BUY, SELL, DIVIDEND, INTEREST, FEE, ITEM, LIABILITY"New value: +"Type of activity: BUY, SELL, DIVIDEND, INTEREST, FEE, LIABILITY"
- Added
update_activity
1 tool update
v1.7.0- Changed
upsert_asset_profile2 fields changed- added
Input schema / properties / countriesAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional country allocation. Entries must contain exactly 'code' (ISO 3166-1 alpha-2, e.g. 'US') and 'weight' (a fraction between 0 and 1, e.g. 0.6907) — any extra key, such as the 'continent' and 'name' that reads add, is rejected with HTTP 400. Omit to leave the stored value untouched; pass [] to reset (on 'MANUAL' this empties the list, on fetched sources it drops the override and the data provider's own countries apply again)" +} - added
Input schema / properties / sectorsAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional sector allocation. Entries must contain exactly 'name' and 'weight' (a fraction between 0 and 1, e.g. 0.2431); any extra key is rejected with HTTP 400. Omit to leave the stored value untouched; pass [] to reset (on 'MANUAL' this empties the list, on fetched sources it drops the override and the data provider's own sectors apply again)" +}
4 tool updates
v1.6.2- Changed
create_account1 field changed- removed
Input schema / properties / is_excludedRemoved value: -{ - "default": false, - "description": "Whether to exclude this account from portfolio calculations", - "type": "boolean" -}
- Added
create_account_balance - Added
delete_account_balance - Changed
update_account1 field changed- removed
Input schema / properties / is_excludedRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional boolean to exclude/include in portfolio calculations" -}
36 tool updates
v1.5.0- First observed
add_market_data_points - First observed
add_to_watchlist - First observed
create_account - First observed
create_activity - First observed
delete_account - First observed
delete_activity - First observed
delete_asset_profile - First observed
export_portfolio - First observed
get_account_balances - First observed
get_account_details - First observed
get_accounts - First observed
get_asset_profile - First observed
get_benchmark_performance - First observed
get_benchmarks - First observed
get_dividends - First observed
get_dividends_for_import - First observed
get_exchange_rate - First observed
get_health - First observed
get_historical_data - First observed
get_investments - First observed
get_market_data_for_asset - First observed
get_orders - First observed
get_platforms - First observed
get_portfolio_details - First observed
get_portfolio_holdings - First observed
get_portfolio_performance - First observed
get_position - First observed
get_symbol_data - First observed
get_user_info - First observed
get_watchlist - First observed
import_transactions - First observed
lookup_symbols - First observed
remove_from_watchlist - First observed
transfer_account_balance - First observed
update_account - First observed
upsert_asset_profile
TDQS
Scored across 39 tools
Several tool clusters overlap: get_symbol_data, get_market_data_for_asset, get_historical_data, get_position, and get_asset_profile all retrieve symbol/asset-level data, and get_portfolio_details, get_portfolio_holdings, get_portfolio_performance, get_investments, and get_dividends all return time-grouped portfolio breakdowns. Descriptions do differentiate them (e.g. current price vs. historical date vs. position quantity vs. company metadata), which keeps selection mostly possible, but an agent must read carefully to pick correctly.
Nearly all tools are snake_case with a leading verb, but the verb set is broad (get/create/update/delete/add/upsert/remove/lookup/transfer/export/import) and there are minor inconsistencies like lookup_symbols vs get_*, upsert_asset_profile vs update_activity, and remove_from_watchlist vs delete_*. Still, the pattern is largely predictable and readable.
39 tools is heavy even for a full portfolio-management API, spanning accounts, activities, balances, asset profiles, market data, watchlist, benchmarks, import/export, and health. It exceeds the 25+ 'too many' threshold and could be consolidated (e.g. merging the asset-data getters).
Coverage is broad: CRUD for accounts and activities, balance history, asset profiles, market data, watchlist add/remove, benchmarks, portfolio reporting, import/export, and health. Minor gaps exist (no create/update benchmark, no get-single-activity by ID), but most workflows are fully covered.
Maintenance
Related MCP Connectors
- BonsaveOAuthapp.bonsave
Query your real net worth, spending, transactions, budgets and portfolio from any MCP client.
Financial data MCP server for Claude, ChatGPT, Cursor and Codex. Real-time stock quotes, financial statements, options flow, SEC filings, insider trades, 13F holdings, macro data and market news from gloom.sh, the open-source Bloomberg Terminal alternative.
Historical tick, order book and settlement data for Polymarket and Predict.fun crypto up/down markets, plus smart-money lists and backtest quotes, over a read-only MCP server.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables interaction with the Morpho GraphQL API, providing tools for accessing market data, vaults, positions, and transactions through a Model Context Protocol (MCP) server.144 npmMIT
- FlicenseNot gradedqualityFmaintenanceIntegrates with Wealthfolio to provide real-time portfolio data, valuations, account management, and historical performance analytics through a Model Context Protocol interface compatible with OpenWebUI and automation tools.1-
- AlicenseNot gradedqualityDmaintenanceFastMCP server exposing brokerage and market tools (Angel One, Coinbase, News) via the Model Context Protocol, enabling portfolio queries and trade execution through natural language.1MIT
- AlicenseNot gradedqualityDmaintenanceA read-only Model Context Protocol server that connects your Schwab brokerage account to LLM applications for portfolio monitoring and market data retrieval.MIT