Ghostfolio MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LOG_LEVEL | No | Logging level (e.g., DEBUG, INFO, WARNING, ERROR) | INFO |
| SENTRY_DSN | No | Sentry DSN for error tracking and performance monitoring | |
| MCP_HTTP_HOST | No | Host to bind the HTTP server (used when MCP_TRANSPORT=sse or http) | 0.0.0.0 |
| MCP_HTTP_PORT | No | Port to bind the HTTP server | 8000 |
| MCP_TRANSPORT | No | Transport type: stdio, sse, or http | stdio |
| GHOSTFOLIO_URL | Yes | The URL of your Ghostfolio instance (e.g., https://domain.tld:3333) | |
| READ_ONLY_MODE | No | Set to true to disable all write operations | false |
| SENTRY_RELEASE | No | Release version (auto-detected if not set) | |
| GHOSTFOLIO_TOKEN | Yes | Your Ghostfolio API token | |
| GHOSTFOLIO_TIMEOUT | No | Connection timeout in seconds | 30 |
| RATE_LIMIT_ENABLED | No | Set to true to enable rate limiting | false |
| SENTRY_ENABLE_LOGS | No | Enable log capture as breadcrumbs and events | true |
| SENTRY_ENVIRONMENT | No | Environment name (e.g., production, staging) | |
| TOOL_SEARCH_ENABLED | No | Set to true to replace full tool listings with search_tools + call_tool | false |
| TOOL_SEARCH_STRATEGY | No | Search strategy: bm25 (natural language) or regex (pattern match) | bm25 |
| GHOSTFOLIO_VERIFY_SSL | No | Enable SSL certificate verification | true |
| MCP_HTTP_BEARER_TOKEN | No | Optional bearer token for authentication on HTTP transports | |
| RATE_LIMIT_MAX_REQUESTS | No | Maximum requests allowed per rate limit window | 100 |
| SENTRY_SEND_DEFAULT_PII | No | Include personally identifiable information in Sentry events | true |
| TOOL_SEARCH_MAX_RESULTS | No | Maximum number of tools returned by search_tools | 5 |
| GHOSTFOLIO_DISABLED_TAGS | No | Comma-separated list of tags to disable tools for (e.g., portfolio,symbol) | |
| SENTRY_PROFILE_LIFECYCLE | No | Profiling lifecycle mode: all, continuation, or trace | trace |
| RATE_LIMIT_WINDOW_MINUTES | No | Rate limit window size in minutes | 1 |
| SENTRY_TRACES_SAMPLE_RATE | No | Performance monitoring sample rate (0.0-1.0) | 1.0 |
| SENTRY_PROFILE_SESSION_SAMPLE_RATE | No | Continuous profiling sample rate (0.0-1.0) | 1.0 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": true
} |
| resources | {
"subscribe": false,
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_account_balancesB | Get account balances for a specific account. Retrieves balance information for a specific account including current balance, currency, and balance history. |
| get_accountsB | 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. |
| create_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. |
| delete_accountA | 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! |
| get_account_detailsB | Get details for a specific account. |
| update_accountA | Update settings or details of an existing account. Ghostfolio's update endpoint replaces the whole account record, so
Setting |
| transfer_account_balanceA | Transfer cash balances between two accounts. |
| create_account_balanceA | 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 The balance is recorded in the account's own currency; Ghostfolio's API does not accept a separate currency for this endpoint. |
| delete_account_balanceA | Delete a single entry from an account's balance history. |
| get_ordersA | 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. |
| create_activityC | Create a single new transaction/activity. |
| update_activityA | Update an existing activity/transaction. Ghostfolio's update endpoint replaces the whole activity record, so
Ghostfolio identifies the asset by The GET and PUT are separate requests, so an edit made to the same activity in between (e.g. in the Ghostfolio UI) is overwritten for every field not passed here. |
| delete_activityA | Delete a single activity/transaction by its ID. |
| get_asset_profileA | Get asset profile information for a specific symbol. Retrieves detailed profile information about an asset including company information, sector, industry, and other metadata. |
| upsert_asset_profileA | Create-or-update an asset profile. POSTs an empty profile-data record (idempotent — Ghostfolio answers HTTP 400 "already exists" when the profile is already there, and HTTP 500 on some first-time-create paths while still persisting the record, so this tolerates both). Then PATCHes metadata (name, currency, asset class, optional sub-class, optional country and sector allocations). PATCH is the source of truth — if the profile doesn't exist after the POST, PATCH will surface the error. Calling twice with the same input yields the same end state. |
| delete_asset_profileA | 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! |
| get_benchmarksA | Get all configured benchmarks. |
| get_benchmark_performanceB | Compare portfolio performance against a benchmark symbol starting from a specific date. |
| get_exchange_rateA | Get the exchange rate for a given currency symbol on a specific date. |
| export_portfolioA | Export portfolio activities/transactions data as JSON. Retrieves portfolio transactions with optional query filters. |
| import_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. |
| get_dividends_for_importA | Fetch historical dividend data formatted for import for a specific symbol. |
| get_market_data_for_assetB | 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. |
| add_market_data_pointsA | 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. |
| get_portfolio_detailsB | 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. |
| get_dividendsC | 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. |
| get_portfolio_holdingsB | 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. |
| get_investmentsB | 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. |
| get_portfolio_performanceB | 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. |
| get_positionA | 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. |
| get_symbol_dataB | 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. |
| get_historical_dataB | 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. |
| lookup_symbolsA | 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. |
| get_healthA | 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. |
| get_platformsA | Get available platforms. Retrieves a list of all available platforms (brokers, exchanges, etc.) that can be used when tracking accounts or transactions. |
| get_user_infoB | Get user information and settings. Retrieves information about the current user including settings, preferences, and account details. |
| get_watchlistB | Get all items in the user's watchlist. Retrieves list of all watchlisted symbols. |
| add_to_watchlistA | Add a symbol to the user's watchlist. |
| remove_from_watchlistA | Remove a symbol from the user's watchlist. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 39 tools
Several tool clusters overlap: get_symbol_data, get_market_data_for_asset, get_historical_data, get_position, and get_asset_profile all retrieve symbol/asset-level data, and get_portfolio_details, get_portfolio_holdings, get_portfolio_performance, get_investments, and get_dividends all return time-grouped portfolio breakdowns. Descriptions do differentiate them (e.g. current price vs. historical date vs. position quantity vs. company metadata), which keeps selection mostly possible, but an agent must read carefully to pick correctly.
Nearly all tools are snake_case with a leading verb, but the verb set is broad (get/create/update/delete/add/upsert/remove/lookup/transfer/export/import) and there are minor inconsistencies like lookup_symbols vs get_*, upsert_asset_profile vs update_activity, and remove_from_watchlist vs delete_*. Still, the pattern is largely predictable and readable.
39 tools is heavy even for a full portfolio-management API, spanning accounts, activities, balances, asset profiles, market data, watchlist, benchmarks, import/export, and health. It exceeds the 25+ 'too many' threshold and could be consolidated (e.g. merging the asset-data getters).
Coverage is broad: CRUD for accounts and activities, balance history, asset profiles, market data, watchlist add/remove, benchmarks, portfolio reporting, import/export, and health. Minor gaps exist (no create/update benchmark, no get-single-activity by ID), but most workflows are fully covered.