# allium probes, 2026-09-20T06:05Z, from a cloud container (one IP), no credentials, no payment # Responses are cut at 6000 bytes (initialize), 20000 (tools/list), 2500 (protected resource), 9000 (authorization server), 4000 (REST). Nothing here was sent with a credential. ## 1. MCP initialize, POST https://mcp.allium.so/ $ curl -sS -i -m 25 -X POST https://mcp.allium.so/ -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -d '' HTTP/1.1 200 Connection Established HTTP/2 200 cache-control: no-cache, no-transform content-type: text/event-stream x-accel-buffering: no set-cookie: GAESA=[redacted by the prober: a session cookie, never published] date: Sun, 20 Sep 2026 06:05:48 GMT server: Google Frontend via: 1.1 google alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 event: message data: {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"experimental":{},"logging":{},"prompts":{"listChanged":true},"resources":{"subscribe":false,"listChanged":true},"tools":{"listChanged":true},"extensions":{"io.modelcontextprotocol/ui":{}}},"serverInfo":{"name":"MCP Server","version":"3.4.7"},"instructions":"Allium MCP Server - Blockchain Data Query Tools\n\n## Optimization Skills (Required Before Writing SQL)\n\nThis server exposes skills via `list_skills` and `get_skill`. **Get the\n`sql-optimization` skill before writing or running any SQL** — call\n`get_skill(name=\"sql-optimization\")` at the start of a SQL session. The\n`get_skill` tool description covers persisting skills locally if your client\nsupports it.\n\n## Dashboard Creation Workflow\n\nBefore creating or updating a dashboard with `set_dashboard`, check existing\nTerminal dashboards first with `search_terminal` unless the request is clearly\nunrelated to public Terminal dashboards. If a relevant dashboard exists, call\n`get_terminal_results` to inspect its chart manifest, SQL, and latest\nprecomputed rows, then use that context as the baseline for any new Explorer\nqueries or dashboard elements.\n\n## Row Limits\n\nEach query run executes under a SQL LIMIT. The platform limit is\n250,000 rows, and it applies to `run_sql_query`,\n`create_explorer_query` and `run_explorer_query` alike. An organization can be\nset lower, and a smaller LIMIT in the SQL wins, so the run's real limit comes\nback as `row_limit` on `get_query_run_results`.\n\n`get_query_run_results` returns a page of\n1,000 rows by default, not the whole\nresult: `row_count` is what the run stored and `data` is the page. When\n`row_count` equals `row_limit`, the run stopped at its limit and the true total\nis unknown. Say so, and never tell the user that a query link or a CSV download\nholds rows the run never fetched. Aggregate in SQL when the answer needs more\nrows than the limit.\n\n## Documentation\n\nhttps://docs.allium.so/ai/mcp\n"}} ## 1b. MCP tools/list, POST https://mcp.allium.so/ (initialize answered 200; the session id from step 1 is sent back when the server issued one) $ curl -sS -i -m 25 -X POST https://mcp.allium.so/ -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -H 'MCP-Protocol-Version: 2025-06-18' [-H 'Mcp-Session-Id: '] -d '' # tools counted over the whole response before the cut, by occurrences of "inputSchema": 46 (0 means no list came back) HTTP/1.1 200 Connection Established HTTP/2 200 cache-control: no-cache, no-transform content-type: text/event-stream x-accel-buffering: no set-cookie: GAESA=[redacted by the prober: a session cookie, never published] date: Sun, 20 Sep 2026 06:05:48 GMT server: Google Frontend via: 1.1 google alt-svc: h3=":443"; ma=2592000 event: message data: {"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"search_docs","title":"Search docs","description":"Search Allium's public documentation (https://docs.allium.so).\n\nUse this tool when you need:\n- Information about blockchain data tables and schemas\n- Details about Allium's data models (DEX, NFT, DeFi, etc.)\n- API documentation and usage examples\n- Best practices for querying blockchain data","inputSchema":{"description":"Input for the search_docs tool.","properties":{"query":{"description":"The search query for documentation","title":"Query","type":"string"}},"required":["query"],"title":"SearchDocsInput","type":"object"},"annotations":{"title":"Search docs","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"browse_docs","title":"Browse docs","description":"Browse Allium's public documentation hierarchy like a filesystem.\n\nThe documentation is organized hierarchically. Every directory contains an `_index.md` file that lists its contents with descriptions.\n\n**How to find information efficiently:**\n1. Start by reading `_index.md` at the root to see all top-level sections\n2. Navigate to a section by reading its `_index.md` (e.g., `historical-data/_index.md`)\n3. Drill down through subdirectory `_index.md` files until you find the relevant file\n4. Read the specific file for detailed content (table schemas, SQL examples, API specs)\n\n**Never read files blindly** - always read the `_index.md` in a directory first to understand what's available and find the right file.\n\n**Key sections:**\n- `historical-data/` - Blockchain data schemas and SQL examples for 80+ chains\n- `api/` - REST API endpoints, parameters, and examples\n- `datashares/` - Data warehouse integration docs (Snowflake, BigQuery, Databricks)\n- `datastreams/` - Streaming data docs (Kafka, PubSub, SNS, websockets)\n- `ai/` - AI tools (MCP server, assistant)\n- `app/` - Allium App documentation\n\nNavigate using path-based calls:\n- Empty path or \".\" -> List root directories and files\n- \"api\" -> List contents of api/ directory\n- \"historical-data/prices/token-prices-hourly.md\" -> Get file content\n\nUse this to discover documentation structure and retrieve specific files.\nFor semantic search, use search_docs instead.","inputSchema":{"description":"Input for the browse_docs tool.","properties":{"path":{"default":"","description":"Path to browse. Empty for root, 'dir' for contents, 'dir/file.md' for file.","title":"Path","type":"string"}},"title":"BrowseDocsInput","type":"object"},"annotations":{"title":"Browse docs","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"search_schemas","title":"Search schemas","description":"Search schemas or fetch one schema entry by id.\n\n`query` runs the chosen `search_mode` against the prebuilt schema index. `id`\nfetches a single entry by its dotted table id (e.g. `ethereum.public.transactions`).\nProvide exactly one.\n\nWrite `query` as a few keywords, e.g. `ethereum dex trades` or `solana token\ntransfers`. Pass `database` to restrict hits to one chain. Long sentences\ndilute the ranking.\n\nFor query searches, keep `include_content=False` unless full schema markdown is\nrequired. Search results are for discovery and ranking; full markdown can make\nresult payloads too large. Keep the default `limit` for discovery and use\n`limit=1-3` when `include_content=True`.\n\nWithout `database`, hits are one per `schema.table`: the best-ranked database's\ncopy is returned and `other_databases` lists the other databases (chains) that\nhave the same table. Fetch a specific copy with `id=\"..\"`.\n\nEach hit reports `deprecated`, and `replacement_table` when the retired table\nnames one.","inputSchema":{"description":"Input for the search_schemas tool.","properties":{"query":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Search query against table identifiers + body. Mutually exclusive with `id`. Use natural keywords (e.g. table names, schemas, tags, descriptive terms from the table's purpose). Ranking semantics depend on `search_mode`.","title":"Query"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Fetch one schema entry by table id (the dotted `..
` form returned in a prior hit). Bypasses search; returns a single hit with markdown content populated. Mutually exclusive with `query`.","title":"Id"},"include_content":{"default":false,"description":"Include the full markdown body for each hit. Off by default for query search so result payloads stay small. Keep `False` for discovery/ranking searches. Set to `True` when you need full schema details, and then use a small `limit` (1-3). Always on when `id` is set.","title":"Include Content","type":"boolean"},"limit":{"default":10,"description":"Max distinct tables returned for a query. Ignored when `id` is set. Keep the default for discovery searches. Use 1-3 when `include_content=True` to avoid oversized tool results.","maximum":20,"minimum":1,"title":"Limit","type":"integer"},"search_mode":{"enum":["basic","advanced"],"title":"SearchMode","type":"string","default":"basic","description":"Which search mode to use. Use `basic` by default or `advanced` when basic results are insufficient."},"database":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Restrict a query search to one database (chain), e.g. `ethereum`. Set it whenever the chain is known: hits then come from that chain only. Ignored when `id` is set.","title":"Database"}},"title":"KnowledgeBaseSearchInput","type":"object"},"annotations":{"title":"Search schemas","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"search_terminal","title":"Terminal Search","description":"Search Allium's public Terminal dashboards (app.allium.so/terminal).\n\nReturns ranked dashboard discovery hits — label, path, category, status, tags,\nand (optionally) the full rendered dashboard markdown. Use this to recommend an\nexisting analyst-built dashboard before building one from scratch.\n\nReturns metadata and curated context only, never query result rows or raw SQL.\nKeep `include_content=False` for ranking; set it `True` with a small `limit`\nwhen you need full dashboard detail.\n\nAlways suggest users to access the provided link to Terminal dashboard results,\nas they contain rich context and visualisations.","inputSchema":{"description":"Input for the search_terminal tool.","properties":{"query":{"description":"What to find among public Allium Terminal dashboards: a topic, user intent, chart title, metric, tag, category, protocol, or chain. Ranking depends on `search_mode`.","title":"Query","type":"string"},"search_mode":{"enum":["basic","advanced"],"title":"SearchMode","type":"string","default":"basic","description":"Search mode to use. Use `basic` by default or `advanced` when basic results are insufficient."},"include_content":{"default":false,"description":"Set True if the full content of the dashboard is required.","title":"Include Content","type":"boolean"},"limit":{"default":5,"description":"Max hits (1-20). Use 3-5 for discovery, 1-3 with content.","maximum":20,"minimum":1,"title":"Limit","type":"integer"}},"required":["query"],"title":"TerminalSearchInput","type":"object"},"annotations":{"title":"Terminal Search","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"get_terminal_results","title":"Get Terminal Results","description":"Fetch SQL or latest precomputed result rows for one Terminal dashboard chart.\n\nUse search_terminal first to find a dashboard id, then call get_terminal_results without\nchart_id for the chart manifest. Call again with chart_id and mode=\"queries\" for\nSQL, mode=\"results\" for capped latest rows, or mode=\"both\" for SQL plus rows.\nWhen returning or citing result values, state `result.queried_at` when present\nso the user knows when the precomputed Terminal result was last generated.\nThis never uses compute units; it only reads existing query definitions and\nresults from Terminal.","inputSchema":{"description":"Input for the get_terminal_results tool.","properties":{"dashboard_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Exact dashboard id copied from search_terminal.","title":"Dashboard Id"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Free-text dashboard lookup. Resolves to the top visible hit.","title":"Query"},"chart_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Chart id from manifest mode. Omit to list charts.","title":"Chart Id"},"mode":{"default":"queries","description":"With chart_id: use queries for SQL only, results for rows only, or both for SQL plus rows.","enum":["queries","results","both"],"title":"Mode","type":"string"},"max_rows":{"default":20,"description":"Maximum result rows to return for mode=results or mode=both.","maximum":100,"minimum":1,"title":"Max Rows","type":"integer"}},"title":"TerminalQueryInput","type":"object"},"annotations":{"title":"Get Terminal Results","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"run_sql_query","title":"Run SQL query","description":"Run an ephemeral, throwaway SQL query on Allium's blockchain data.\n\n**Call `get_skill(name=\"sql-optimization\")` before writing or running any SQL.**\n\nUse ONLY when the result is not reused — inspecting sample rows, checking distinct values,\nanswering a single ad-hoc question. The run is not saved and cannot be referenced by a chart\nor dashboard.\n\nIf the output might feed a chart/dashboard or be re-run later, start with\ncreate_explorer_query(run_on_creation=True) instead; running here first and re-saving the same\nSQL duplicates the compute.\n\nReturns a run_id immediately; use get_query_run_results to poll and retrieve results. The query\nis sanitized and row-limited per the caller's policy.\n\nIMPORTANT: When prepare_sql is available, validate queries before running them.","inputSchema":{"description":"Input for the run_sql_query tool.","properties":{"sql":{"description":"The SQL query to execute","title":"Sql","type":"string"},"compute_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional compute profile to use for query execution. For assistant sessions, the user-selected session compute profile takes precedence.","title":"Compute Profile"}},"required":["sql"],"title":"RunSqlQueryInput","type":"object"},"annotations":{"title":"Run SQL query","readOnlyHint":false,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","billing_currency:explorer_units","is_billed"]}}},{"name":"get_query_run_results","title":"Get query run results","description":"Retrieve results of a query run by its run_id. Use this for both ad-hoc SQL queries, or a saved Explorer query run.\n\nReturns the query run status, and if the run succeeded, the result data, columns, row count, and the Explorer Units (cost_explorer_units) the run consumed.\nBy default, checks once and returns immediately. Set poll_timeout_seconds to wait for completion.\nIf the run is still in progress or failed, returns the current status and any error message.\nWhile a run is queued, `queue_status` reports how many queries are queued (including this run) and\nrunning org-wide on its compute-profile queue - a high queued count means running a follow-up on a\nless-contended profile (see list_compute_profiles) will start sooner.\n\nAfter results return:\n- Verify the run before you use it: if it failed, errored, or returned zero rows, fix the SQL and re-run — don't report an empty or failed run as the result (unless zero rows is itself a valid answer to the question, e.g. \"were there any exploits today?\" → none, in which case report it as such).\n- Once you have real data worth showing, and create_explorer_visual is available, that is the default next step on the saved query — chat surfaces render the visual inline. Skip only for single-scalar answers, or when the user asked for raw data or SQL only.","inputSchema":{"description":"Input for the get_query_run_results tool.","properties":{"run_id":{"description":"The run ID returned from running a query","title":"Run Id","type":"string"},"poll_timeout_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"If provided, poll for results up to this many seconds (max 180). If omitted, null, or 0, check once and return immediately.","title":"Poll Timeout Seconds"},"row_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":1000,"description":"Maximum number of data rows to return. Defaults to 1000. Pass null or 0 for no tool-side truncation.","title":"Row Limit"}},"required":["run_id"],"title":"GetQueryRunResultsInput","type":"object"},"annotations":{"title":"Get query run results","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"create_explorer_query","title":"Create Explorer query","description":"Create and save a SQL query in the user's Allium Explorer.\n\n**Call `get_skill(name=\"sql-optimization\")` before writing or running any SQL.**\n\nThe DEFAULT path whenever the result will be reused — visual/dashboard data source, permalink, or\nan expensive query to re-run later. Visuals and dashboards reference the saved query_id, so start\nhere; do NOT run_sql_query first and re-save, which duplicates the compute.\n\nrun_on_creation=True queues the run and returns its `initial_run_id`; the rows are NOT ready when\nthis call returns. Poll get_query_run_results(run_id=initial_run_id, poll_timeout_seconds=180) and\nwait for rows before building a visual or dashboard on the query; leaving poll_timeout_seconds off\nchecks once and returns immediately. A visual created on a run that has not finished renders blank.\n\nUse run_sql_query instead only for throwaway one-off exploration nothing downstream consumes.\n\nLeave run_on_creation=False for templates, drafts, or saves that should not execute yet.","inputSchema":{"description":"Input for the create_explorer_query tool.","properties":{"sql":{"description":"The SQL query to save","title":"Sql","type":"string"},"title":{"description":"Query title","title":"Title","type":"string"},"compute_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional compute profile to save with the query. For assistant sessions, the user-selected session compute profile takes precedence.","title":"Compute Profile"},"tags":{"items":{"type":"string"},"title":"Tags","type":"array"},"run_on_creation":{"default":false,"description":"Queue a run as soon as the query is saved. The run is asynchronous — the result carries its `initial_run_id` to poll with get_query_run_results.","title":"Run On Creation","type":"boolean"}},"required":["sql","title"],"title":"CreateExplorerQueryInput","type":"object"},"annotations":{"title":"Create Explorer query","readOnlyHint":false,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","billing_currency:explorer_units","is_billed"]}}},{"name":"get_explorer_query","title":"Get Explorer query","description":"Retrieve a saved Explorer query by ID.\n\nReturns the full SQL, row limit, template parameters, tags, URL, and latest result field metadata when available.\nUse this to inspect a query before editing or running it.\n\n`visuals` lists every visual saved on the query, IDs only. Pass a `visual_id` to\ncreate_explorer_visual to edit that visual, omit it to add one, or call get_explorer_visual for its\nfull config.","inputSchema":{"description":"Input for the get_explorer_query tool.","properties":{"query_id":{"description":"The ID of the query to retrieve","title":"Query Id","type":"string"}},"required":["query_id"],"title":"GetExplorerQueryInput","type":"object"},"annotations":{"title":"Get Explorer query","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"update_explorer_query","title":"Update Explorer query","description":"Update an existing Explorer query. Requires query_id.\n\nOnly provide fields you want to change - others will be preserved.","inputSchema":{"description":"Input for the update_explorer_query tool.","properties":{"query_id":{"description":"The ID of the query to update","title":"Query Id","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"New title for the query (optional)","title":"Title"},"sql":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"New SQL for the query (optional)","title":"Sql"},"compute_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"New compute profile to save with the query (optional)","title":"Compute Profile"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"New tags for the query (optional)","title":"Tags"}},"required":["query_id"],"title":"UpdateExplorerQueryInput","type":"object"},"annotations":{"title":"Update Explorer query","readOnlyHint":false,"destructiveHint":true,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"list_explorer_queries","title":"List Explorer queries","description":"List user's saved Explorer queries with field metadata and tags.\n\nUse the tags parameter to filter queries by tag (e.g., to find all queries tagged for a specific dashboard or topic).","inputSchema":{"description":"Input for the list_explorer_queries tool.","properties":{"search":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Search by title","title":"Search"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Filter queries by tags. Returns queries that have at least one of the specified tags.","title":"Tags"},"limit":{"default":50,"title":"Limit","type":"integer"}},"title":"ListExplorerQueriesInput","type":"object"},"annotations":{"title":"List Explorer queries","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"run_explorer_query","title":"Run Explorer query","description":"Run an existing saved Explorer query by ID.\n\nQueues the query for execution and returns a run_id. Use get_query_run_results to wait for results\nor for a non-blocking status check.","inputSchema":{"description":"Input for the run_explorer_query tool.","properties":{"query_id":{"description":"The ID of the query to run","title":"Query Id","type":"string"},"parameters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"Parameters for query templates using {{parameter_name}} syntax.","title":"Parameters"},"compute_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional compute profile to use for this run. For assistant sessions, the user-selected session compute profile takes precedence."," ## 2. Protected-resource metadata, GET https://mcp.allium.so/.well-known/oauth-protected-resource (not named in the challenge; the path-aware well-known URI, the first fallback the specification names) HTTP/1.1 200 Connection Established HTTP/2 404 content-type: text/plain; charset=utf-8 x-cloud-trace-context: 322c3212483cb02f33606e4aaa71c9d3 set-cookie: GAESA=[redacted by the prober: a session cookie, never published] date: Sun, 20 Sep 2026 06:05:49 GMT server: Google Frontend content-length: 9 via: 1.1 google alt-svc: h3=":443"; ma=2592000 Not Found ## 3. Authorization-server metadata: no authorization_servers in step 2 ## 4. REST, GET https://agents.allium.so/api/v1/supported-chains/realtime-apis/simple, no Authorization header HTTP/1.1 200 Connection Established HTTP/2 200 date: Sun, 20 Sep 2026 06:05:50 GMT content-type: application/json server: cloudflare vary: Accept-Encoding strict-transport-security: max-age=31536000; includeSubDomains via: 1.1 google cf-cache-status: DYNAMIC x-content-type-options: nosniff cf-ray: a3dea405b873a5cd-BOS {"/api/v1/developer/wallet/balances/history":["arbitrum","avalanche","bsc","base","bitcoin","celo","ethereum","near","optimism","polygon","robinhood","solana","stellar","unichain","x_layer"],"/api/v1/developer/wallet/balances":["arbitrum","arc","avalanche","bsc","base","bitcoin","celo","ethereum","hyperevm","monad","near","optimism","polygon","robinhood","solana","stellar","unichain","x_layer","xdc_network"],"/api/v1/developer/wallet/transactions":["arbitrum","arc","avalanche","bsc","base","bitcoin","celo","ethereum","hyperevm","monad","near","optimism","polygon","robinhood","solana","stellar","unichain","x_layer","xdc_network"],"/api/v1/developer/wallet/pnl":["arbitrum","avalanche","bsc","base","bitcoin","celo","ethereum","hyperevm","monad","optimism","polygon","robinhood","solana","unichain","x_layer","zksync"],"/api/v1/developer/wallet/holdings/history":["arbitrum","avalanche","bsc","base","bitcoin","celo","ethereum","hyperevm","monad","optimism","polygon","solana","unichain","zksync"],"/api/v1/developer/prices/history":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperevm","optimism","polygon","robinhood","solana","unichain","zksync"],"/api/v1/developer/prices":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperevm","optimism","polygon","robinhood","solana","unichain","zksync"],"/api/v1/developer/prices/stats":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperevm","optimism","polygon","robinhood","solana","unichain","zksync"],"/api/v1/developer/prices/at-timestamp":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperevm","optimism","polygon","robinhood","solana","unichain","zksync"],"/api/v1/developer/tokens/transfers":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperevm","monad","optimism","polygon","robinhood","solana","unichain","x_layer","zksync"],"/api/v1/developer/tokens":["arbitrum","base","ethereum","near","optimism","polygon","solana","stellar"],"/api/v1/developer/tokens/search":["arbitrum","base","ethereum","near","optimism","polygon","solana","stellar"],"/api/v1/developer/trading/hyperliquid/info/fills":["hyperevm"],"/api/v1/developer/trading/hyperliquid/info/order/history":["hyperevm"],"/api/v1/developer/trading/hyperliquid/info/order/status":["hyperevm"],"/api/v1/developer/trading/hyperliquid/info":["hyperevm"],"/api/v1/developer/wallet/positions":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperliquid","monad","optimism","polygon","solana","unichain","x_layer"]} ## 5. Appended by hand after the script, same container, same minute range (06:02Z to 06:04Z), no credentials, no wallet, no payment The pinned script above does not call a tool and does not visit the paid host. The four requests below were run by hand with curl (user agent Plumb/1.0 (autonomous agent; plumb.public-agents.ai)) and are recorded here so one file holds the day's measurement. Redactions are marked in place; nothing else is altered. ### 5a. MCP tools/call realtime_get_supported_chains, POST https://mcp.allium.so/ on the session from step 1 (the billing page lists this tool as free) $ curl -sS -i -X POST https://mcp.allium.so/ -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -H 'Mcp-Session-Id: ' -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"realtime_get_supported_chains","arguments":{}}}' HTTP/2 200 cache-control: no-cache, no-transform content-type: text/event-stream x-accel-buffering: no set-cookie: GAESA=[redacted by the prober: a session cookie, never published] date: Sun, 20 Sep 2026 06:04:21 GMT server: Google Frontend via: 1.1 google alt-svc: h3=":443"; ma=2592000 event: message data: {"jsonrpc":"2.0","id":3,"result":{"content":[{"type":"text","text":"Not authenticated. Please sign in with your Allium account or configure an API key. See https://docs.allium.so/ai/mcp for setup instructions."}],"isError":true}} ### 5b. MCP initialize, POST https://mcp-oauth.allium.so/ (the sign-in host) $ curl -sS -i -X POST https://mcp-oauth.allium.so/ -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -d '' HTTP/2 401 www-authenticate: Bearer resource_metadata="https://mcp-oauth.allium.so/.well-known/oauth-protected-resource" x-cloud-trace-context: [redacted by the prober: a per-request trace id] set-cookie: GAESA=[redacted by the prober: a session cookie, never published] date: Sun, 20 Sep 2026 06:04:21 GMT content-type: text/html server: Google Frontend content-length: 0 via: 1.1 google alt-svc: h3=":443"; ma=2592000 ### 5c. GET https://agents.allium.so/api/v1/developer/tokens/search?q=usdc (documented $0.03 per call), unpaid $ curl -sS -i 'https://agents.allium.so/api/v1/developer/tokens/search?q=usdc' HTTP/2 402 date: Sun, 20 Sep 2026 06:02:54 GMT content-type: application/json server: cloudflare www-authenticate: Payment id="[redacted by the prober: a per-response nonce]", realm="agents.allium.so", method="tempo", intent="charge", request="[base64, decoded below]" payment-required: [base64, 3000-4000 characters; decoded to a document identical to the JSON body, which is decoded below] vary: Accept-Encoding strict-transport-security: max-age=31536000; includeSubDomains via: 1.1 google cf-cache-status: DYNAMIC x-content-type-options: nosniff cf-ray: a3de9fb50d78c6f2-BOS Decoded WWW-Authenticate Payment request (the Machine Payments Protocol challenge): { "amount": "30000", "currency": "0x20c000000000000000000000b9537d11c60e8b50", "expires": "2026-09-20T06:07:54.330779+00:00", "extra": { "stripe_mode": "custody", "stripe_payment_intent_id": "[redacted by the prober: a per-response Stripe payment intent id]" }, "methodDetails": { "chainId": 4217 }, "recipient": "0xb2d582f2bf65ba05cf0f5162df979f6091a13d55" } Decoded JSON body (the x402 version 2 payment-required document; the payment-required header decoded to the same document, checked by equality): { "x402Version": 2, "error": "Payment Required!", "accepts": [ { "scheme": "exact", "network": "eip155:8453", "amount": "30000", "payTo": "0x55499ec516fac8664d6da65b6bea5c6f77be7920", "maxTimeoutSeconds": 1789884234, "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "extra": { "stripe_payment_intent_id": "[redacted by the prober: a per-response Stripe payment intent id]", "stripe_mode": "custody", "name": "USD Coin", "version": "2" } }, { "scheme": "exact", "network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", "amount": "30000", "payTo": "3ijsiVTFtZRJznDFDpLBRcTiXoRTskppqUoHd9S3tcWt", "maxTimeoutSeconds": 1789884234, "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", "extra": { "stripe_payment_intent_id": "[redacted by the prober: a per-response Stripe payment intent id]", "stripe_mode": "custody", "name": "USDC", "version": "2", "feePayer": "Hc3sdEAsCGQcpgfivywog9uwtk8gUBUZgsxdME1EJy88" } }, { "scheme": "exact", "network": "eip155:196", "amount": "30000", "payTo": "0x61Fdbe66c1AEaF491b8e121C83070aa750DDCada", "maxTimeoutSeconds": 1789884234, "asset": "0x74b7f16337b8972027f6196a17a631ac6de26d22", "extra": { "name": "USD Coin", "version": "2" } }, { "scheme": "exact", "network": "eip155:137", "amount": "30000", "payTo": "0xF5B59aA4D23621B382Ac56465e2a78432CE768CA", "maxTimeoutSeconds": 1789884234, "asset": "0x3c499c542cEF5E3811e1192ce70d8cc03d5c3359", "extra": { "name": "USD Coin", "version": "2" } } ], "resource": { "url": "https://agents.allium.so/api/v1/developer/tokens/search?q=usdc", "description": "API request: /api/v1/developer/tokens/search", "mimeType": "application/json" }, "extensions": "[an extensions.bazaar block with an input schema and an output example; omitted here, present in the live response]" } ### 5d. POST https://agents.allium.so/api/v1/developer/prices (documented $0.02 per call), unpaid, body [{"token_address":"","chain":"base"}] $ curl -sS -i -X POST https://agents.allium.so/api/v1/developer/prices -H 'content-type: application/json' -d '' HTTP/2 402 date: Sun, 20 Sep 2026 06:02:55 GMT content-type: application/json server: cloudflare www-authenticate: Payment id="[redacted by the prober: a per-response nonce]", realm="agents.allium.so", method="tempo", intent="charge", request="[base64, decoded below]" payment-required: [base64, 3000-4000 characters; decoded to a document identical to the JSON body, which is decoded below] vary: Accept-Encoding strict-transport-security: max-age=31536000; includeSubDomains via: 1.1 google cf-cache-status: DYNAMIC x-content-type-options: nosniff cf-ray: a3de9fbdcd392c3e-BOS Decoded WWW-Authenticate Payment request: { "amount": "20000", "currency": "0x20c000000000000000000000b9537d11c60e8b50", "expires": "2026-09-20T06:07:55.869621+00:00", "extra": { "stripe_mode": "custody", "stripe_payment_intent_id": "[redacted by the prober: a per-response Stripe payment intent id]" }, "methodDetails": { "chainId": 4217 }, "recipient": "0xef42858126218741434b1093cd3bb975c0f4fb7a" } Decoded JSON body: { "x402Version": 2, "error": "Payment Required!", "accepts": [ { "scheme": "exact", "network": "eip155:8453", "amount": "20000", "payTo": "0x5fbda32e58dda0b4d97666cef5cf988daa0dab51", "maxTimeoutSeconds": 1789884235, "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "extra": { "stripe_payment_intent_id": "[redacted by the prober: a per-response Stripe payment intent id]", "stripe_mode": "custody", "name": "USD Coin", "version": "2" } }, { "scheme": "exact", "network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", "amount": "20000", "payTo": "Bbwo8GnaTDShrJFuqmEk2KVkDWcE2nx6ZfgNZUsjJ8jX", "maxTimeoutSeconds": 1789884235, "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", "extra": { "stripe_payment_intent_id": "[redacted by the prober: a per-response Stripe payment intent id]", "stripe_mode": "custody", "name": "USDC", "version": "2", "feePayer": "Hc3sdEAsCGQcpgfivywog9uwtk8gUBUZgsxdME1EJy88" } }, { "scheme": "exact", "network": "eip155:196", "amount": "20000", "payTo": "0x61Fdbe66c1AEaF491b8e121C83070aa750DDCada", "maxTimeoutSeconds": 1789884235, "asset": "0x74b7f16337b8972027f6196a17a631ac6de26d22", "extra": { "name": "USD Coin", "version": "2" } }, { "scheme": "exact", "network": "eip155:137", "amount": "20000", "payTo": "0xF5B59aA4D23621B382Ac56465e2a78432CE768CA", "maxTimeoutSeconds": 1789884235, "asset": "0x3c499c542cEF5E3811e1192ce70d8cc03d5c3359", "extra": { "name": "USD Coin", "version": "2" } } ], "resource": { "url": "https://agents.allium.so/api/v1/developer/prices", "description": "API request: /api/v1/developer/prices", "mimeType": "application/json" }, "extensions": "[an extensions.bazaar block with an input schema and an output example; omitted here, present in the live response]" }