ping tool — a successful response confirms the Hub is reachable and your token is valid.
Connection Issues
"NEBULA_TOKEN not set" error on startup
"NEBULA_TOKEN not set" error on startup
NEBULA_TOKEN at startup and exits immediately if it is missing.Fix: Set the environment variable before launching the MCP server. For Claude Desktop, add it to your mcpServers config:nbl_live_.If you are running the server from a terminal, export the variable first:"Refusing to start: NEBULA_TOKEN looks like a Stellar secret key"
"Refusing to start: NEBULA_TOKEN looks like a Stellar secret key"
NEBULA_TOKEN starts with S and is longer than 50 characters — the signature of a Stellar secret key. The server refuses to start to protect you from accidentally exposing your private key.Fix: Replace the value with your nbl_live_… token from the Connect page. Never put a Stellar secret key (S…) in NEBULA_TOKEN or anywhere in your MCP configuration. Your secret key should never leave Nebula’s secure infrastructure.If you are unsure which value to use, visit the Connect page, find or create your agent entry, and copy the token shown there.MCP tools not showing in Claude Desktop or Cursor
MCP tools not showing in Claude Desktop or Cursor
ping, get_balance, transfer) do not appear in your AI client’s tool list, the MCP server either failed to start or the configuration was not picked up.Steps to fix:- Restart your AI client after any configuration change. Claude Desktop and Cursor only read
mcpServersconfig at launch. - Validate your JSON. Open your config file (
claude_desktop_config.jsonor equivalent) and run it through a JSON validator. A single misplaced comma or missing quote will silently prevent the config from loading. - Check for startup errors. Run the MCP server directly in a terminal with your token set to see if it prints any errors:
- Verify the package can be fetched. If
npxcannot download@nebula/mcp, check your internet connection or npm registry access. - Check
NEBULA_HUB. If you set a customNEBULA_HUB, ensure the URL is reachable and does not have a trailing slash.
"Hub error: HTTP 401" when calling a tool
"Hub error: HTTP 401" when calling a tool
- Go to nebulaonchain.xyz/connect and verify your agent entry still exists.
- Regenerate the token for your agent if needed.
- Update
NEBULA_TOKENin your configuration with the new token value. - Restart your AI client or MCP process.
Payment Failures
"exceeds_per_tx_cap" — transfer rejected
"exceeds_per_tx_cap" — transfer rejected
max_per_call limit in your spending policy.Fix: Go to the Policy section of the Nebula dashboard and raise max_per_call to a value that covers your intended transaction size.Before changing the limit, consider whether the transaction amount is expected or if your agent is doing something unintended. You can review recent activity with the spending_report tool.max_per_call is denominated in USDC. If you are sending XLM, Nebula converts the amount at the live rate before checking the cap."exceeds_daily_cap" — transfer rejected
"exceeds_daily_cap" — transfer rejected
max_per_day limit today. All further transfers are blocked until the daily counter resets.Fix options:- Wait for the daily reset. The counter resets each calendar day.
- Raise
max_per_dayin the Policy dashboard if your agent legitimately needs more budget. - Review recent spending with
spending_reportto understand what consumed the budget. If you see unexpected activity, consider pausing your agent while you investigate.
"destination_denylisted" — transfer rejected
"destination_denylisted" — transfer rejected
denylist. This is always rejected, regardless of amount or whitelist status.Fix: If the address was added by mistake, go to the Policy section of the dashboard and remove it from the denylist. If the address was intentionally blocked, the transfer should not proceed."policy_paused" — all transfers rejected
"policy_paused" — all transfers rejected
paused flag enabled. No transactions will go through while this is active.Fix: Go to the Policy section of the Nebula dashboard and toggle Pause off. Changes take effect immediately on the next tool call.Your agent can also detect this state by calling get_policy_status and checking paused: true in the response.Confirmation Issues
`await_confirmation` keeps returning "still pending"
`await_confirmation` keeps returning "still pending"
await_confirmation call before returning a “still pending” result — this prevents serverless timeouts while a human reviews the approval.Fix: Your agent should treat “still pending” as a signal to call await_confirmation again with the same confirmation_id. Continue polling until the response is approved, rejected, or expired. A simple retry loop with a short delay works well.Make sure your agent is not discarding the confirmation_id between calls — it must be the same ID returned in the original confirmation_required response.A confirmation expired before anyone approved it
A confirmation expired before anyone approved it
expired status and either:- Re-initiate the transfer (this creates a new confirmation request for the human to review), or
- Notify the user that the operation was cancelled and ask whether to try again.
I do not know the URL to approve a pending confirmation
I do not know the URL to approve a pending confirmation
confirmation_required response your agent receives includes a confirmation_url field with a direct link to the approval page.Treasury and Yield Issues
Agent has low liquid balance but high Blend balance
Agent has low liquid balance but high Blend balance
`blend_check_rates` returns an error
`blend_check_rates` returns an error