{"mcpVersion":"1.0","name":"MyHold App","description":"Crypto portfolio operating system for AI agents. Track wallets, set personalized alerts, run portfolio rebalancing, and connect AI agents via MCP.","url":"https://api.myhold.app/mcp","transport":["streamable-http"],"authentication":{"type":"bearer","description":"API token (format: mha_...). Create one at https://myhold.app/my/settings/api-tokens/"},"documentation":"https://myhold.app/docs","contact":"https://myhold.app","tools":[{"name":"list-portfolios","description":"List all investment portfolios for the authenticated user. Docs: https://myhold.app/docs/portfolios"},{"name":"get-portfolio-summary","description":"Get a portfolio summary including all wallets and their current values. Docs: https://myhold.app/docs/portfolios"},{"name":"create-portfolio","description":"Create a new investment portfolio. Docs: https://myhold.app/docs/portfolios"},{"name":"update-portfolio","description":"Update a portfolio's name, description, or shareholders setting. Docs: https://myhold.app/docs/portfolios"},{"name":"set-portfolio-staged","description":"Enable or disable staged (paper trading) mode for a portfolio. When enabled, changes are tracked as commits instead of being applied directly. Docs: https://myhold.app/docs/portfolios"},{"name":"get-portfolio-rebalance","description":"Get a portfolio rebalance analysis showing which assets need adjustment to reach target allocations. Docs: https://myhold.app/docs/portfolios"},{"name":"list-wallets","description":"List all wallets in a portfolio. Docs: https://myhold.app/docs/portfolios"},{"name":"get-wallet-summary","description":"Get a wallet summary including its coins and current values. Docs: https://myhold.app/docs/portfolios"},{"name":"create-wallet","description":"Create a new wallet inside a portfolio. IMPORTANT: This tool does NOT work on staged portfolios and will return an error. For staged portfolios, use commit-staged-portfolio with type \"wallet_create\" instead. Docs: https://myhold.app/docs/portfolios"},{"name":"update-wallet","description":"Update a wallet's name, description, or target weight. IMPORTANT: This tool does NOT work on staged portfolios and will return an error. For staged portfolios, use commit-staged-portfolio with type \"wallet_update\" instead. Docs: https://myhold.app/docs/portfolios"},{"name":"delete-wallet","description":"Delete a wallet from a portfolio. IMPORTANT: This tool does NOT work on staged portfolios and will return an error. For staged portfolios, use commit-staged-portfolio with type \"wallet_delete\" instead. Docs: https://myhold.app/docs/portfolios"},{"name":"get-wallet-rebalance","description":"Get a wallet rebalance analysis showing which coins need adjustment to reach target weights. Docs: https://myhold.app/docs/portfolios"},{"name":"list-wallet-coins","description":"List all coins held in a wallet including quantities and current prices. Docs: https://myhold.app/docs/portfolios"},{"name":"add-coin-to-wallet","description":"Add a cryptocurrency to a wallet. Required fields: portfolioId, walletId, coinId (find with search-coins), quantity (amount held), weight (target allocation 0–100). IMPORTANT: This tool does NOT work on staged portfolios and will return \"Cannot directly edit a staged portfolio\". For staged portfolios, use commit-staged-portfolio with type \"coin_add\" instead. Docs: https://myhold.app/docs/portfolios"},{"name":"update-wallet-coin","description":"Update the quantity or target weight of a coin in a wallet. IMPORTANT: This tool does NOT work on staged portfolios and will return an error. For staged portfolios, use commit-staged-portfolio with type \"coin_update\" instead. Docs: https://myhold.app/docs/portfolios"},{"name":"remove-coin-from-wallet","description":"Remove a cryptocurrency from a wallet. IMPORTANT: This tool does NOT work on staged portfolios and will return an error. For staged portfolios, use commit-staged-portfolio with type \"coin_remove\" instead. Docs: https://myhold.app/docs/portfolios"},{"name":"search-coins","description":"Search available cryptocurrencies by symbol or name. Returns up to 20 results."},{"name":"get-coin","description":"Get detailed information about a cryptocurrency including its latest price"},{"name":"get-coin-by-slug","description":"Get detailed information about a cryptocurrency by its CoinMarketCap slug (e.g. \"bitcoin\", \"ethereum\")"},{"name":"add-coin","description":"Add a cryptocurrency to the MyHold database by CoinMarketCap UCID or slug. Provide ucid or slug to identify the coin (the server returns an error if neither is provided). Returns the coin if it already exists, or creates it if new. Requires a paid subscription."},{"name":"list-news","description":"List published daily crypto news articles (paginated). Docs: https://myhold.app/docs/daily-news"},{"name":"get-news-today","description":"Get today's AI-generated crypto market news article. Docs: https://myhold.app/docs/daily-news"},{"name":"get-news-by-date","description":"Get a crypto news article for a specific date. Docs: https://myhold.app/docs/daily-news"},{"name":"get-market-insights","description":"Get the latest crypto market insights including the Fear & Greed Index and global market metrics. Docs: https://myhold.app/docs/insights"},{"name":"get-technical-indicators","description":"Get technical indicators (RSI, MACD, ADX, Bollinger Bands, etc.) for one or more cryptocurrencies. Docs: https://myhold.app/docs/insights"},{"name":"list-notifications","description":"List all price alerts and notification rules. Docs: https://myhold.app/docs/notifications"},{"name":"get-notification","description":"Get a single notification rule by its ID"},{"name":"create-notification","description":"Create a new price alert or portfolio notification rule. Docs: https://myhold.app/docs/notifications"},{"name":"update-notification","description":"Update a notification's name, description, channels, active state, execution policy, or interval. The rule and level are immutable after creation — delete and recreate the notification to change them. Docs: https://myhold.app/docs/notifications"},{"name":"delete-notification","description":"Delete a price alert or notification rule by its ID"},{"name":"get-notification-logs","description":"Get logs for a specific notification rule. Each log entry includes a \"context\" field with a snapshot of all variables referenced in the rule at trigger time—not just the variable(s) whose condition was satisfied. Both branches of \"and\"/\"or\" rules are captured."},{"name":"get-notification-current-context","description":"Get the current live context for a notification rule. Returns { context, isSatisfied } where context contains the live variable values referenced in the rule and isSatisfied indicates whether the rule currently evaluates to true. Use this to check whether a rule is firing right now."},{"name":"mark-notification-log-read","description":"Mark a specific notification log entry as read"},{"name":"list-notification-logs","description":"List all notification logs for the user, optionally filtered by notification or unread status. Each log entry includes a \"context\" field with a snapshot of all variables referenced in the rule at trigger time—not just the variable(s) whose condition was satisfied. Both branches of \"and\"/\"or\" rules are captured."},{"name":"get-portfolio-agent","description":"Get a portfolio's AI agent configuration including triggers and cron schedules. Agent data created or updated with create-portfolio-agent or update-portfolio-agent is immediately readable — reads after successful writes are strongly consistent. Returns 404 if no agent exists for this portfolio. Docs: https://myhold.app/docs/agents"},{"name":"create-portfolio-agent","description":"Create an AI agent configuration for a portfolio, including triggers and cron schedules. Docs: https://myhold.app/docs/agents"},{"name":"update-portfolio-agent","description":"Update an existing AI agent configuration for a portfolio. Docs: https://myhold.app/docs/agents"},{"name":"delete-portfolio-agent","description":"Delete the AI agent configuration for a portfolio. Docs: https://myhold.app/docs/agents"},{"name":"list-portfolio-agent-triggers","description":"List all time-based triggers for a portfolio AI agent. Docs: https://myhold.app/docs/agents"},{"name":"create-portfolio-agent-trigger","description":"Create a new time-based trigger for a portfolio AI agent. Docs: https://myhold.app/docs/agents"},{"name":"update-portfolio-agent-trigger","description":"Update a specific trigger for a portfolio AI agent by its ID. Only provided fields are updated; the trigger ID is preserved. Docs: https://myhold.app/docs/agents"},{"name":"delete-portfolio-agent-trigger","description":"Delete a specific trigger from a portfolio AI agent by its ID. Docs: https://myhold.app/docs/agents"},{"name":"get-agent-executions","description":"Get a portfolio AI agent's execution history. Docs: https://myhold.app/docs/agent-executions"},{"name":"commit-staged-portfolio","description":"Apply a set of changes to a staged portfolio as a single atomic commit.\n\nPREREQUISITE: The portfolio must be in staged mode. Enable it first with set-portfolio-staged (staged=true).\n\nIMPORTANT STRUCTURE RULE: Every coin/wallet field must be nested under a \"data\" key. Do NOT place coinId, quantity, weight, name, etc. at the top level of the change object.\n\nVALID CHANGE TYPES (10 total):\n1. wallet_create      — requires: data.name | optional: data.description, data.weight\n2. wallet_update      — requires: walletId | optional: data.name, data.description, data.weight\n3. wallet_delete      — requires: walletId\n4. coin_add           — requires: walletId, data.coinId, data.quantity, data.weight\n5. coin_update        — requires: walletCoinId | optional: data.quantity, data.weight\n6. coin_remove        — requires: walletCoinId\n7. shareholder_add    — requires: data.name, data.percentage | optional: data.email\n8. shareholder_remove — requires: shareholderId\n9. shareholder_deposit  — requires: shareholderId, amount, updates[].shareholderId, updates[].newPercentage\n10. shareholder_withdraw — requires: shareholderId, amount, updates[].shareholderId, updates[].newPercentage\n\nTYPICAL WORKFLOW: list-staged-commits → commit-staged-portfolio. Docs: https://myhold.app/docs/portfolios"},{"name":"list-staged-commits","description":"List commit history for a staged portfolio. Each commit contains a full snapshot of the portfolio at that point in time. Docs: https://myhold.app/docs/portfolios"},{"name":"get-staged-commit","description":"Get a specific staged portfolio commit by its ID including the full portfolio snapshot. Docs: https://myhold.app/docs/portfolios"},{"name":"list-rationales","description":"List all investment rationales. Docs: https://myhold.app/docs/rationales"},{"name":"get-portfolio-rationale","description":"Get a portfolio's investment rationale. Docs: https://myhold.app/docs/rationales"},{"name":"set-portfolio-rationale","description":"Create or update a portfolio's investment rationale (Markdown supported). Docs: https://myhold.app/docs/rationales"},{"name":"get-commit-rationale","description":"Get the rationale for a specific portfolio commit. A rationale created or updated with set-commit-rationale is immediately readable — reads after successful writes are strongly consistent. Returns 404 if no rationale exists for this commit yet. Docs: https://myhold.app/docs/rationales"},{"name":"set-commit-rationale","description":"Create or update the rationale for a specific portfolio commit (Markdown supported). Use this to document why a commit was made, what changes were applied, and the reasoning behind those decisions. Docs: https://myhold.app/docs/rationales"},{"name":"delete-commit-rationale","description":"Delete the rationale for a specific portfolio commit. Docs: https://myhold.app/docs/rationales"},{"name":"get-notification-rationale","description":"Get a notification's rationale. Docs: https://myhold.app/docs/rationales"},{"name":"set-notification-rationale","description":"Create or update a notification's rationale (Markdown supported). Use this to document why the notification was created, what signal it captures, and what action to take when it fires. Docs: https://myhold.app/docs/rationales"},{"name":"delete-notification-rationale","description":"Delete a notification's rationale. Docs: https://myhold.app/docs/rationales"},{"name":"connection-health","description":"Check the MCP server connection health. Returns the server status, version, and current timestamp. Use this tool to verify that the MCP server is reachable and responding before running other tools. If this tool succeeds but other tools fail, the issue is likely rate-limiting or a backend error rather than a connection problem."}]}