Ghostfolio MCP Server
Ghostfolio MCP Server lets you programmatically read, analyze, and manage a Ghostfolio investment portfolio through MCP tools.
Portfolio analysis: Get performance, holdings, positions, investments, dividends, and comprehensive portfolio details over configurable time ranges.
Account management: List, create, update, delete, and transfer balances between accounts; manage account balance history.
Transactions & activities: Create, delete, and import buy/sell/dividend transactions; filter orders by account; export portfolio data.
Market & symbol data: Look up symbols, fetch asset profiles, symbol data, historical data, and market data; add manual market data points.
Asset profile management: Create/update (upsert) and delete asset profiles.
Benchmarks: View configured benchmarks and compare portfolio performance against a benchmark symbol.
Watchlist: View, add, and remove watchlist symbols.
Exchange rates: Retrieve exchange rates for a currency on a specific date.
Import tools: Bulk import transactions and fetch historical dividend data formatted for import.
System & user info: Check backend health, list platforms, and get current user information/settings.
Optional error tracking and performance monitoring integration for Ghostfolio MCP server, capturing exceptions, performance metrics, and logs.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@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
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: Alpaca Trading MCP Server
Installation
Prerequisites
Python 3.11 or higher
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 installConfiguration
Environment Variables
# 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=100
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=true
# 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)
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: true)
SENTRY_SEND_DEFAULT_PII=true
# 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.)delete_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 (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, 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=100 # 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.
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.
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.
OIDC / 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 images are available on GitHub Packages for easy deployment.
# Normal STDIO image
docker pull ghcr.io/mhajder/ghostfolio-mcp:latest
# MCPO image for usage with Open WebUI
docker pull ghcr.io/mhajder/ghostfolio-mcpo:latestWhen OIDC authentication is enabled, mount a volume on /data so OAuth client registrations survive container recreation.
Contributing
Fork the repository
Create a feature branch (
git checkout -b feature/amazing-feature)Make your changes
Run tests and ensure code quality (
uv run pytest && uv run ruff check .)Commit your changes (
git commit -m 'Add amazing feature')Push to the branch (
git push origin feature/amazing-feature)Open a Pull Request
License
GNU Affero General Public License - see LICENSE file for details.
Available Tools
38 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 ActivityB
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) | |
| type | Yes | Type of activity: BUY, SELL, DIVIDEND, INTEREST, FEE, ITEM, 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 indicate readOnlyHint:false, idempotentHint:false, and destructiveHint:false, and the description's 'Create' is consistent with those settings. However, the description adds no additional behavioral context such as validation rules, permission requirements, or side effects on related entities, so it does not exceed the annotations' coverage in a meaningful way.
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 containing the key scoping word 'single' and no filler. It is appropriately minimal given the rich schema underneath.
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 and output schema provide strong technical coverage for the 10-parameter create operation, so return-value documentation is unnecessary. However, the description omits usage context, especially when an agent should select create_activity over import_transactions, and does not mention any account-existence or symbol-resolution constraints.
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 each of the 10 parameters already documented by name, type, required status, and default values. The description itself adds no parameter-level detail beyond the word 'transaction/activity', so the schema carries the full burden and the baseline score 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 states a specific verb ('Create') and resource ('single new transaction/activity'), clearly distinguishing it from read/list, update, and delete tools. It does not directly contrast with the batch-style sibling import_transactions, so it misses a bit of 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?
The description provides no guidance on when to use this tool versus alternatives such as import_transactions, nor does it mention any prerequisites or when not to use it. The sibling list implies alternatives exist, but the description itself leaves usage decisions to the agent.
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.
Returns: Dictionary containing account information including accounts list and total value
| 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 communicate readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds a small behavioral detail about the return shape ('Dictionary containing account information including accounts list and total value'), but does not disclose additional behaviors like pagination, rate limits, or authorization 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?
The first two sentences are near-duplicates: 'Get all accounts...' and 'Retrieves a list of all accounts...' restate the same scope and fields. Only the Returns line adds meaningful new information (total value). The description could be cut to one efficient sentence without losing substance.
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 list operation with an output schema and safety annotations, the description provides sufficient context: it covers what is returned and that it is portfolio-wide. The main gap is lack of explicit sibling differentiation, but that is not critical for invoking 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?
The tool has zero parameters and schema description coverage is 100%, so the baseline of 4 applies. There is nothing about parameters the description needs to compensate for.
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 ('Get all accounts') and resource ('your portfolio'), and lists the relevant fields (account types, balances, account-specific information). However, it does not explicitly distinguish itself from the sibling get_account_balances, so some differentiation is left to inference.
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 usage context is implied: use this when you need all accounts and their balances. But there is no explicit guidance about when to prefer get_account_balances or get_account_details instead, and no 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_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.
Returns: Dictionary containing the list of 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 cover read-only, idempotent, and non-destructive behavior. The description adds only that the return is a dictionary containing the benchmark list, which is mild extra context beyond annotations and does not contradict them.
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, focused sentences with the core purpose front-loaded and no filler or 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?
For a zero-parameter, read-only getter with an output schema and safety annotations, the description provides enough information to call the tool correctly. No critical behavioral or usage detail is missing for this simple case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so there is nothing for the description to clarify. Schema coverage is trivially 100%, matching the baseline of 4 for zero-parameter tools.
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 clear verb and resource ('Get all configured benchmarks') with scope ('all configured'). It does not explicitly contrast with the sibling get_benchmark_performance, so it stops short of full 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?
No guidance is given about when to use this tool versus alternatives like get_benchmark_performance. The intended use is implied by the name but not stated, and no exclusions or alternative references are provided.
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.
Returns: Dictionary containing health status 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?
The annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds minimal behavioral context beyond those annotations, such as that it retrieves backend service status and returns a dictionary. No contradictions or additional safety disclosures are present.
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 sentence 'Get system health status.' largely repeats the tool title and the second sentence repeats the same idea ('Retrieves the health status'). Some redundancy means not every sentence fully 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 zero-parameter, read-only health-check tool with an output schema, the description covers what the tool does, why it might be used, and what it returns. It could mention availability or error behavior, but the output schema supplies return details and the annotations cover safety, 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 tool has zero parameters and the schema describes no inputs, so the baseline for this dimension is 4. The description adds no parameter details because none are needed, but it does mention the return shape, which is useful context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource ('health status of the Ghostfolio backend service') and a concrete purpose ('verify if the server is up and running correctly'). This clearly distinguishes it from the sibling tools, which all operate on accounts, orders, portfolio data, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to call this tool: to verify the server is running. It does not mention exclusions or alternative tools, but no sibling tool appears to offer a comparable health-check function, so the guidance is adequate.
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.
Returns: Dictionary containing available platforms
| 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=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds meaningful context about what the platforms are and their intended use, which enriches the annotation-only information without contradicting it.
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 opening line 'Get available platforms' largely repeats the title and first sentence. The additional explanation and return note are useful and compact, with only minor 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?
For a simple, parameterless, read-only getter with rich annotations and an existing output schema, the description provides sufficient context: what platforms are, examples of platform types, and why they are used. Nothing essential is missing for an agent to invoke 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?
The tool has zero parameters and the input schema is fully documented with an empty properties object, so there is no parameter meaning for the description to add. With no parameters, the baseline of 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?
The description clearly identifies the resource (platforms), specifies they include brokers and exchanges, and states their purpose in tracking accounts or transactions. It is unambiguous and distinct from sibling tools that target accounts, watchlists, orders, or portfolio data, though it does not explicitly compare itself to any sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when this tool is relevant: retrieving platforms to use when tracking accounts or transactions. It does not explicitly mention alternatives or exclusion criteria, but none of the sibling tools appear to serve this same purpose.
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.
Returns: Dictionary containing complete portfolio information including accounts, positions, and summary
| 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 communicate readOnly, idempotent, and non-destructive behavior. The description reinforces 'Retrieves' and mentions a dictionary return value, but adds little beyond that; no auth needs, rate limits, or side-effect context is provided. Since annotations carry the safety profile, this is adequate but not enriched.
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 repeats itself three times: the first sentence, the second sentence, and the 'Returns' block all say essentially the same thing. While the opening is front-loaded, the redundancy means several sentences do not earn their 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?
With no parameters, strongly safety-relevant annotations, and an output schema present, the description needs to do very little beyond identifying the tool's scope. It states the main content areas, so an agent can understand what the call returns. The only real gap is sibling differentiation, already penalized in usage guidelines.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema description coverage is 100%, so there is nothing meaningful for the description to add. It correctly avoids inventing parameter context, meeting the baseline for parameter-free tools.
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-resource structure: 'Get comprehensive portfolio details including accounts, positions, and summary.' The content scope is stated, but it does not explicitly distinguish this aggregate tool from closely related siblings like get_accounts, get_portfolio_holdings, or get_portfolio_performance.
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. The phrases 'complete overview' and 'comprehensive portfolio details' imply high-level use, but there are no explicit conditions, exclusions, or references to sibling tools, so an agent gets no selection guidance.
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 InfoARead-onlyIdempotent
Get user information and settings.
Retrieves information about the current user including settings, preferences, and account details.
Returns: Dictionary containing user information and settings
| 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=true, idempotentHint=true, and destructiveHint=false. The description adds minimal behavioral context beyond stating it retrieves information and returns a dictionary, but 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 description is short but repetitive: 'Get user information and settings' and 'Retrieves information about the current user including settings...' cover nearly the same ground. The Returns block is useful but could be trimmed.
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 tool with an output schema and clear annotations, the description is complete enough. It states what is returned and scopes the operation to the current user, leaving no critical gap for 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 the description carries no parameter-semantics burden. The baseline of 4 applies because there is nothing for the description to explain about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the specific operation: retrieving information about the current user, including settings, preferences, and account details. It distinguishes itself from sibling tools like get_account_details by focusing on the current user's aggregate information.
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 'current user' implies when this tool should be used, but no explicit exclusions or alternatives are mentioned. With many sibling tools present, an explicit pointer to when not to use it would have been stronger.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_watchlistGet WatchlistARead-onlyIdempotent
Get all items in the user's watchlist.
Retrieves list of all watchlisted symbols.
Returns: Dictionary containing the watchlist items.
| 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, so the safety profile is clear. The description adds a minor detail that the return value is a dictionary of watchlist items, but no additional behavioral context such as pagination, limits, or user scoping is disclosed.
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 two sentences are near-duplicates ('Get all items in the user's watchlist' and 'Retrieves list of all watchlisted symbols'). This redundancy means 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?
For a zero-parameter, read-only, idempotent getter with an output schema, the description is complete enough for an agent to call it correctly. No hidden prerequisites, inputs, or expected side effects are 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 tool has zero parameters and schema description coverage is 100%, so there are no parameter semantics for the description to clarify. This matches the baseline for a 0-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 clearly identifies the resource ('user's watchlist') and the operation ('Get all items') with a specific verb. It is immediately distinguishable from sibling tools like add_to_watchlist and remove_from_watchlist, which involve mutation rather than 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 provides no guidance on when to use this tool versus siblings such as add_to_watchlist or remove_from_watchlist. An agent must infer from the tool name and sibling structure that this is the read operation for the watchlist.
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 AccountAIdempotent
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.
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 by disclosing that the endpoint replaces the whole record, that unset fields are backfilled via a GET before PUT, and that balance is applied as today's entry in the history series. This is valuable behavioral context not present in readOnlyHint/idempotentHint/destructiveHint.
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 front-loaded with the core purpose, then adds critical behavioral details in a logical order. Every sentence contributes meaningful information, and there is no redundant restatement of the schema.
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 output schema exists, return values need no explanation. The description covers the tricky replacement semantics, parameter backfilling, balance history behavior, and the key sibling alternative, making the tool fully usable without further inference.
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%, but the description still adds significant meaning, especially for `balance` (today's history entry, not a stale field) and for `name`/`currency`/`platform_id` (required by the underlying endpoint but backfilled by the wrapper). This resolves ambiguity the schema alone could not.
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 clear verb and resource: updating settings or details of an existing account. The distinction from create/delete/transfer siblings is apparent from the wording 'existing account' and 'settings or 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?
Explicitly explains when to use this tool and provides an alternative: 'Use create_account_balance to set the balance for a specific past date instead of today.' It also clarifies that only changed fields need to be passed, which is essential practical guidance.
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 returns HTTP 500 on both duplicate-create and some first-time-create paths while still persisting the record, so this tolerates 500). Then PATCHes metadata (name, currency, asset class, optional sub-class). PATCH is the source of truth — if the profile doesn't exist after the POST, PATCH will surface a 404. 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 | |
| currency | Yes | Currency code of the asset (e.g., 'USD', 'CHF', 'EUR') | |
| 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?
The description goes well beyond the annotations by disclosing the POST-then-PATCH sequence, tolerance of Ghostfolio's HTTP 500 on first-time and duplicate creates, PATCH as the source of truth, the 404 consequence if the POST did not persist, and the same-end-state guarantee across repeated calls. This is rich, accurate behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long, front-loaded with the core purpose, and packs in essential behavioral details without repeating the schema's parameter descriptions or padding the text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has unusual error behavior and a two-step write path, and the description covers all of it: idempotency, 500 tolerance, 404 surfacing, and final-state guarantee. The output schema exists, so explaining return values is unnecessary.
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 operation-to-parameter mapping: name, currency, asset_class, and asset_sub_class are PATCHed metadata, while the POST concerns the profile-data record. This helps an agent reason about which parameters participate in which step.
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 'Create-or-update an asset profile,' a specific verb+resource statement that clearly differentiates it from get_asset_profile and delete_asset_profile. The two-step POST/PATCH mechanism further removes ambiguity about what the tool does.
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 first sentence establishes the exact trigger for using this tool: when an asset profile needs to be created or updated. It does not explicitly name alternatives or exclusion conditions, but the sibling list contains no equivalent create-or-update tool, so the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
4 tool updates
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
Each tool has a clearly distinct purpose. Write operations (add, create, delete, import, etc.) and read operations (get) are well-separated. The only potential confusion might be between get_portfolio_details, get_portfolio_holdings, and get_portfolio_performance, but each serves a unique informational need.
Tool names follow a consistent verb_noun pattern (e.g., get_accounts, create_activity, delete_asset_profile). All use snake_case. A few mixed verbs (upsert, lookup) are standard in the domain and do not break consistency.
With 36 tools, the set is large but justifiable for the breadth of portfolio management (accounts, activities, assets, watchlist, benchmarks, dividends, etc.). While comprehensive, a few tools could potentially be consolidated (e.g., get_portfolio_* endpoints) without losing clarity.
The tool set covers most major operations (CRUD for accounts, activities, asset profiles, watchlist). Notable gaps include lacking an update activity tool and missing benchmark create/delete operations. Overall, the surface is robust but has minor omissions that agents may need to work around.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Query your real net worth, spending, transactions, budgets and portfolio from any MCP client.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
A Model Context Protocol (MCP) server for Selise Blocks Cloud integration
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.149MIT
- AlicenseAqualityDmaintenanceA Model Context Protocol server that interfaces with Alpaca trading API, allowing users to manage portfolios, place trades, and access market data through natural language interactions.835MIT
- 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
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mhajder/ghostfolio-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server