MCP App Store
by KeenEthics
Data & Analytics
Allium icon

Allium

by Allium Labs Inc.

Overview

Query and analyze blockchain data directly in ChatGPT with Allium. Discover schemas and documentation, run SQL across blockchain datasets, and turn results into shareable queries, visualizations, and dashboards. Ask questions like “Compare DEX volume across chains,” “Analyze this wallet’s holdings and P&L,” or “Chart a token’s price history.” Allium combines historical datasets with real-time market and wallet data, taking you from question to analysis in one conversation.

Tools

browse_docs

ChatGPT
Browse Allium's public documentation by path. An empty path lists the root; a directory path lists its contents; a Markdown file path returns the file. Read each directory's _index.md to choose a document. Internal paths are unavailable on MCP. Use search_docs when you do not know the path.

create_explorer_query

ChatGPT
Create and save a SQL query in the user's Allium Explorer. Call `get_skill(name="sql-optimization")` before writing or running any SQL. The DEFAULT path whenever the result will be reused — visual/dashboard data source, permalink, or an expensive query to re-run later. Visuals and dashboards reference the saved query_id, so start here; do NOT run_sql_query first and re-save, which duplicates the compute. run_on_creation=True queues the run and returns its initial_run_id; the rows are NOT ready when this call returns. Poll get_query_run_results(run_id=initial_run_id, poll_timeout_seconds=180) and wait for rows before building a visual or dashboard on the query; leaving poll_timeout_seconds off checks once and returns immediately. A visual created on a run that has not finished renders blank. Use run_sql_query instead only for throwaway one-off exploration nothing downstream consumes. Leave run_on_creation=False for templates, drafts, or saves that should not execute yet.

create_explorer_visual

ChatGPT
Create or replace a visual on an existing Allium Explorer query. Visuals are persisted to the caller's account and render on the query page; the returned url deep-links to the visual this call wrote. A query can hold several visuals, each with its own visual_id. Call get_explorer_query first to see what is already there. Two ways to call this: - Omit visual_id — adds a new visual alongside any existing ones. - Pass visual_id — replaces that one visual in place. This is how you edit a visual; omitting visual_id would add a duplicate instead. Choose spec.type based on the shape of the data: - "chart" — line, bar, or area over an x axis (typically time). - "value" — a single big number, with an optional comparison to a prior period. - "table" — tabular rows with optional per-column formatting and heatmap shading. - "pie" — share-of-total across categories (pie, donut, or donut-with-center-value). - "sankey" — directional flow between two or more entity columns. - "treemap" — nested rectangles sized by a numeric value. - "scatter" — two numeric axes with optional point size and color encodings. - "map" — country or region choropleth keyed on a location field. - "chord" — pairwise flows between two columns (alternative to sankey). Call get_skill(name='explorer-visuals') first for general advice, then get_skill(name='explorer-visuals', reference_title=<type>) for the exact JSON schema for spec of the chosen type. Editor permission on the query is required. Two things make a visual render blank, both checkable before calling: - The query has no finished run. Queueing one (create_explorer_query with run_on_creation=True, or run_explorer_query) does not wait for it — poll get_query_run_results with a non-zero poll_timeout_seconds and only build the visual once it returns rows. - Field names in spec (axes, columns, filters, aggregates) that the query's result set doesn't have. Once the visual is created, offer to share it — call share_explorer_query(query_id=..., visual_id=...) to get a public link the user can send around.

delete_dashboard

ChatGPT
Delete an entire dashboard, including every page, section, and element inside it. This is irreversible. Confirm with the user which dashboard before calling, and read_dashboard first if you are unsure what the ID points at. To remove one page, section, or element instead, call set_dashboard with spec=null and that node's ID path.

delete_explorer_query

ChatGPT
Permanently delete an Explorer query by ID. This does not cascade: any visuals saved on the query and any dashboard elements bound to it are left pointing at the deleted query_id and will fail to load.

delete_explorer_visual

ChatGPT
Delete one visual from an Allium Explorer query. The query and its other visuals are untouched. Get the visual_id from get_explorer_query's visuals. Editor permission on the query is required, and this cannot be undone — to change a visual instead of removing it, pass its visual_id to create_explorer_visual with a new spec.

get_catalog_metric

ChatGPT
Read the rows of one catalog metric. Only for metrics list_catalog_metrics names. Anything outside those subjects belongs in SQL. Call list_catalog_metrics first: it names every group/category/metric and, per metric, the dimensions you may split or filter by, the granularities allowed, and whether the metric is a snapshot. params accepts: - type: "timeseries" (default) or "latest" - granularity: "day", "week", "month" — timeseries only - from, to: ISO dates bounding the range — timeseries only - sort: "asc" or "desc"; delta_window: integer — latest only - entity: one entity id, or a list, to restrict the rows - series: a dimension id, or a list, to split the metric by - limit: how much to keep. On type=latest it is the number of ranked rows, taken from the top, or from the bottom with sort=asc. On a timeseries it is the number of most recent periods, each returned whole - any other key is a filter on a dimension, in PostgREST syntax: - {"chain": "ethereum"} or "eq.ethereum": equal to one value - "neq.base": anything but base, rows with no chain included - "in.(ethereum,solana)": any of several; quote a value holding a comma or parenthesis, in.("a,b",c) - "not.in.(base,tron)": none of several, rows with no chain included - "gte.1m-10m", plus gt, lt, lte: only on a dimension with ordered values, such as tier; the bound is one of those values - a list of expressions on one key must all hold: {"tier": ["gte.10k-100k", "lte.1m-10m"]} - a value that itself starts with an operator and a dot, such as in., is written eq.<value> - the metric's own id takes gt, gte, lt or lte and a plain number, and keeps the returned rows whose value passes: {"payment_volume_usd": "gte.1000000"}. On a timeseries each period is tested, so a series can have gaps, and limit counts only the periods kept - activity_date takes gt, gte, lt or lte and an ISO date, the same as from/to, on a timeseries only. Bounds cut days, so a week or month partly outside them covers only the days inside An unknown entity id or filter value is not an error — it matches no rows and returns an empty result, so check the spelling against list_catalog_metrics before concluding a metric has no data. Results are capped at 200 rows: a timeseries keeps its most recent rows, a type=latest ranking keeps its highest-valued rows, or its lowest with sort=asc. Ask for what you need with limit, or narrow with from/to, a coarser granularity, or an entity filter, rather than relying on the cap.

get_explorer_query

ChatGPT
Retrieve a saved Explorer query by ID. Returns the full SQL, row limit, template parameters, tags, URL, and latest result field metadata when available. Use this to inspect a query before editing or running it. visuals lists every visual saved on the query, IDs only. Pass a visual_id to create_explorer_visual to edit that visual, omit it to add one, or call get_explorer_visual for its full config.

get_explorer_visual

ChatGPT
Read one visual saved on an Allium Explorer query, including its full spec. Use this to tweak a field of an existing visual, or to match its style in a new one — get_explorer_query lists a query's visuals, and this returns the config of whichever one you name. To change what you read back, pass the same visual_id to create_explorer_visual with the edited spec. A null type means a legacy config that predates the current format: build a fresh spec for it rather than editing what you read back, which won't validate.

get_query_run_results

ChatGPT
Get status and results for an ad hoc or saved Explorer query run. Returns columns, rows, total row_count, and cost_explorer_units when complete; row_limit may return fewer rows than row_count. By default this checks once. Set poll_timeout_seconds to wait, then call again if still queued or running. While queued, queue_status shows org-wide queue counts for its compute profile. Check failures and zero-row results before answering; zero rows may itself answer the question. For useful saved-query data, create_explorer_visual can render a visual unless the user wants only raw data, SQL, or a single value.

get_realtime_crosschain_assets

ChatGPT
Get cross-chain assets by ID, slug, or chain and token address. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/assets/get-assets.md'.

get_realtime_holdings_history

ChatGPT
Get historical aggregated USD holdings for one or more addresses. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/holdings/holdings-history.md'.

get_realtime_holdings_pnl

ChatGPT
Get profit and loss for up to 20 wallet chain/address pairs. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/holdings/holdings-pnl.md'.

get_realtime_holdings_pnl_by_token

ChatGPT
Get profit and loss for up to 20 wallet-token chain/address triples. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/holdings/holdings-pnl-by-token.md'.

get_realtime_holdings_pnl_by_token_history

ChatGPT
Get historical profit and loss for up to 20 wallet-token chain/address triples over a time range. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/holdings/holdings-pnl-by-token-history.md'.

get_realtime_holdings_pnl_history

ChatGPT
Get historical profit and loss for up to 20 wallet chain/address pairs over a time range. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/holdings/holdings-pnl-history.md'.

get_realtime_hyperliquid_asset_contexts

ChatGPT
Get current or historical Hyperliquid metaAndAssetCtxs snapshots with prices, funding, and open interest. The latest snapshot lags the exchange by about 2-3 minutes. History requires both times and spans at most 30 days per call, with at most 60 snapshots without a coin filter or 2000 with one. History starts 9 May 2025; earlier windows return no rows. Oversized windows return 400 rather than truncated results. Each context carries coin, timestamp, and maxLeverage; the universe array is omitted and impactPxs is currently null. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/hyperliquid/asset-contexts.md'.

get_realtime_hyperliquid_fills

ChatGPT
Get Hyperliquid userFills, userFillsByTime, or userTwapSliceFills by wallet address. These request types match Hyperliquid; userFillsByTime has no historical lookback limit. Results are capped at 2000 fills per call. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/hyperliquid/fills.md'.

get_realtime_hyperliquid_order_history

ChatGPT
Get a wallet's Hyperliquid historicalOrders. Omit times for recent orders. Historical lookback is unrestricted, but each startTime-endTime window must span at most 30 days; paginate longer ranges with successive windows. Results are capped at 2000 orders per call. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/hyperliquid/order-history.md'.

get_realtime_hyperliquid_order_status

ChatGPT
Get a Hyperliquid order status by wallet and numeric order ID or client order ID. Unknown orders return Hyperliquid's unknownOid status. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/hyperliquid/order-status.md'.

get_realtime_hyperliquid_orderbook_snapshot

ChatGPT
Get complete orderbook snapshot for all pairs. Compression Required. This endpoint requires brotli compression for efficient data transfer. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/hyperliquid/orderbook-snapshot.md'.

get_realtime_supported_chains

ChatGPT
List supported chains by realtime API endpoint. Call once per session and reuse the endpoint-to-chains map before token, wallet, holdings, or price requests. An unsupported chain may return an empty result or an error. This check is not needed for Explorer SQL or docs tools.

get_realtime_token_latest_price

ChatGPT
Get latest prices for token chain/address pairs, optionally with liquidity data. The request body must be an array, even for a single token. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/prices/token-latest-price.md'.

get_realtime_token_price_at_timestamp

ChatGPT
Get token prices at a timestamp, using the closest earlier price within the optional staleness tolerance. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/prices/token-price-at-timestamp.md'.

get_realtime_token_price_history

ChatGPT
Get token price candles for one or more token chain/address pairs over a time range at the requested granularity. Use cursor for the next page. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/prices/token-price-history.md'.

get_realtime_token_price_stats

ChatGPT
Get price stats for token chain/address pairs, including volume, highs, lows, and price changes. The request body must be an array, even for a single token. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/prices/token-price-stats.md'.

get_realtime_tokens_by_chain_address

ChatGPT
Get token details by chain and address, including tokens without DEX trades. Those tokens retain on-chain decimals and total_supply but omit price-derived fields rather than reporting zero. A not-found error means no on-chain supply record exists for the address. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/tokens/get-tokens-by-chain-address.md'.

get_realtime_wallet_historical_token_balances

ChatGPT
Fetch paginated historical fungible token balances for wallet addresses over a requested time range. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/wallets/historical-token-balances.md'.

get_realtime_wallet_latest_token_balances

ChatGPT
Fetch the latest fungible token balances for wallet addresses across supported chains, optionally including liquidity totals. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/wallets/latest-token-balances.md'.

get_realtime_wallet_positions

ChatGPT
Retrieve DeFi positions, including LP and lending positions, for up to 5 wallet chain/address pairs. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/defi-positions/get-positions.md'.

get_realtime_wallet_transactions

ChatGPT
Get paginated transaction activity for wallet chain/address pairs, including activities, asset transfers, and labels. Deprecated chains return 410; choose a supported chain before retrying. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/wallets/transactions.md'.

get_skill

ChatGPT
Get a skill's full instructions. If the instructions list reference files, call again with reference_title set to the exact listed title to retrieve one.

get_terminal_results

ChatGPT
Fetch SQL or latest precomputed result rows for one Terminal dashboard chart. Use search_terminal first to find a dashboard id, then call get_terminal_results without chart_id for the chart manifest. Call again with chart_id and mode="queries" for SQL, mode="results" for capped latest rows, or mode="both" for SQL plus rows. When returning or citing result values, state result.queried_at when present so the user knows when the precomputed Terminal result was last generated. This never uses compute units; it only reads existing query definitions and results from Terminal.

list_catalog_metrics

ChatGPT
List every metric in the Allium metrics catalog. The catalog covers entities/bridging, entities/dexes, entities/issuers, entities/lending, entities/perpetuals, entities/prediction_markets, entities/rwas, entities/stablecoins, entities/staking, entities/trading, intents/payments, and nothing else. A question about any other subject has no catalog metric, so go straight to search_schemas and SQL rather than checking here first. Returns each category with its metrics, and per metric the label, unit, aggregation, the dimensions it can be split or filtered by, the granularities it supports, and refreshed_at — when its data was last published. A metric whose refreshed_at is null has no published data and get_catalog_metric will fail on it. These are curated, pre-computed metrics: prefer them over writing SQL when one answers the question.

list_compute_profiles

ChatGPT
List the organization's Explorer compute profiles with each profile's org-wide queued and running query counts. Each profile has its own warehouse and its own queue, shared across the org but isolated from the other profiles, so a query sent to a less contended profile starts sooner. Pass a profile's identifier as compute_profile to run_sql_query or run_explorer_query, and prefer the profile with the lowest queued. The profile with is_default=true is used when no profile is specified.

list_explorer_queries

ChatGPT
List user's saved Explorer queries with field metadata and tags. Use the tags parameter to filter queries by tag (e.g., to find all queries tagged for a specific dashboard or topic).

list_realtime_chain_tokens

ChatGPT
List chain tokens, including tokens without DEX trades. Those tokens omit price-derived fields rather than reporting zero and rank last under FDV or volume sorting. For Stellar, set chain=stellar; sort, granularity, order, and volume thresholds are unsupported. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/tokens/list-tokens.md'.

list_realtime_crosschain_assets

ChatGPT
List cross-chain assets with pagination. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/assets/list-assets.md'.

list_skills

ChatGPT
List Allium skill guides the caller can access, with descriptions. Use get_skill for full instructions.

read_dashboard

ChatGPT
Inspect a dashboard at any depth. Pass dashboard_id alone for a root summary (name, settings, list of pages). Add page_id / section_id / element_id to drill down — each level returns the targeted node plus its immediate children's summaries (never a full subtree). At element depth the full typed config is returned. Reads Explorer dashboards (URL /analyze/dashboards/{dashboard_id}), which are user-created. The id is the path segment after /analyze/dashboards/. Never use this tool for a /terminal/... URL; use get_terminal_results instead.

run_explorer_query

ChatGPT
Run an existing saved Explorer query by ID. Queues the query for execution and returns a run_id. Use get_query_run_results to wait for results or for a non-blocking status check.

run_sql_query

ChatGPT
Run an ephemeral, throwaway SQL query on Allium's blockchain data. Call `get_skill(name="sql-optimization")` before writing or running any SQL. Use ONLY when the result is not reused — inspecting sample rows, checking distinct values, answering a single ad-hoc question. The run is not saved and cannot be referenced by a chart or dashboard. If the output might feed a chart/dashboard or be re-run later, start with create_explorer_query(run_on_creation=True) instead; running here first and re-saving the same SQL duplicates the compute. Returns a run_id immediately; use get_query_run_results to poll and retrieve results. The query is sanitized and row-limited per the caller's policy. IMPORTANT: When prepare_sql is available, validate queries before running them.

search_dashboards

ChatGPT
Search the user's Explorer dashboards by name. Returns dashboard IDs, names, URLs, tags, timestamps, and whether the caller created each one, ranked by match quality then recent update. With no arguments, returns the first 25 viewable dashboards; count includes matches beyond limit. Covers Explorer dashboards only. Use search_terminal for Allium's published Terminal dashboards, and read_dashboard to open one by id.

search_docs

ChatGPT
Search Allium's public documentation by meaning. Use for questions about data schemas, APIs, and query guidance when you do not know the document path. Use browse_docs to navigate known paths.

search_realtime_chain_tokens

ChatGPT
Search tokens by name or symbol. When chain is set, tokens that have never traded on a DEX are included with price-derived fields omitted. When chain is omitted, cross-chain search only returns tokens with a nonzero price or 1d volume. To get Stellar tokens, pass chain=stellar; sort, granularity, order, and volume thresholds are currently unsupported. For chain coverage, edge cases, or response fields, use browse_docs with path 'api/developer/tokens/search-tokens.md'.

search_schemas

ChatGPT
Search schemas or fetch one schema entry by id. query runs the chosen search_mode against the prebuilt schema index. id fetches a single entry by its dotted table id (e.g. ethereum.public.transactions). Provide exactly one. Write query as a few keywords, e.g. ethereum dex trades or solana token transfers. Pass database to restrict hits to one chain. Long sentences dilute the ranking. For query searches, keep include_content=False unless full schema markdown is required. Search results are for discovery and ranking; full markdown can make result payloads too large. Keep the default limit for discovery and use limit=1-3 when include_content=True. Without database, hits are one per schema.table: the best-ranked database's copy is returned and other_databases lists the other databases (chains) that have the same table. Fetch a specific copy with id="<database>.<schema>.<table>". Each hit reports deprecated, and replacement_table when the retired table names one.

search_terminal

ChatGPT
Search Allium's published /terminal/ dashboards. Returns ranked discovery details and optionally rendered dashboard content, without SQL or result rows. Use include_content=True with a small limit when full context is needed, and provide the dashboard link for its charts and explanations. For a user's Explorer dashboards at /analyze/dashboards/, use search_dashboards.

set_dashboard

ChatGPT
Upsert or delete any node in a dashboard tree. Call get_skill(name='dashboard-design') first — it covers the build order, element catalog, layout, and design/SQL rules. For an element, config.type is one of: chart, value, table, pie, sankey, treemap, scatter, map, chord, markdown, spacer, variable-select, switch, date-range, radio-group. Fetch its full schema (query_id included for data elements) with get_skill(name='dashboard-design', reference_title=<config.type>) before building. If the user is following up on Terminal results or asks to chart/build a dashboard for a topic covered by Terminal, use search_terminal/get_terminal_results first. Use the Terminal chart manifest, context, and SQL as the baseline before creating or selecting dashboard query_ids. When editing an existing Explorer dashboard (/analyze/dashboards/{id}), use Terminal only for that SQL baseline, never to find the dashboard itself. spec.kind selects the node type. The ID path locates the target: - IDs are the parent path on create (the target's own ID is absent). - IDs are the self path on update (the target's own ID is present). Examples: - Create a new dashboard: spec={"kind": "dashboard", "name": "..."} - Rename an existing dashboard: dashboard_id="d1", spec={"kind": "dashboard", "name": "..."} - Add a page: dashboard_id="d1", spec={"kind": "page", "name": "..."} - Add a section: dashboard_id="d1", page_id="p1", spec={"kind": "section"} - Add a data element (chart/value/table/pie/scatter/sankey/treemap/map/chord): dashboard_id="d1", page_id="p1", section_id="s1", spec={"kind": "element", "config": {"type": "value", "query_id": "qry_123", "field": "..."}}, layout?={"x": 0, "y": 0, "w": 6, "h": 4} query_id is REQUIRED on data-driven configs — it binds the element to a saved Explorer query. Without it the element renders empty with "missing query ID". Use create_explorer_query to mint one, or list_explorer_queries to find an existing one. The bound query also needs a finished run — creating one with run_on_creation=True only queues it, so poll get_query_run_results with a non-zero poll_timeout_seconds before binding, or the element renders with no data. - Add a static element (markdown/spacer) — no query needed: dashboard_id="d1", page_id="p1", section_id="s1", spec={"kind": "element", "config": {"type": "markdown", "content": "## Section heading"}}, layout?={"x": 0, "y": 0, "w": 12, "h": 2} - Add an input element (variable-select/switch/date-range/radio-group) — no query_id; it writes to a named variable that bound query SQL reads via {{variable}}. Changing the input re-runs every query referencing that variable; defaults seed it so the dashboard renders on load: dashboard_id="d1", page_id="p1", section_id="s1", spec={"kind": "element", "config": {"type": "date-range", "start_variable": "start_date", "end_variable": "end_date", "default_preset": "7d"}}, layout?={"x": 0, "y": 0, "w": 6, "h": 1} - Update an element's config (layout sticky — unchanged): dashboard_id, page_id, section_id, element_id="e1", spec={"kind": "element", "config": {...}} The new config fully replaces the prior one. Resend query_id (and any other fields you want kept) — omitting them drops them. Deleting a node — pass spec=null with the self path of what to remove: - Remove one element: dashboard_id="d1", page_id="p1", section_id="s1", element_id="e1", spec=null - Remove a section (and its elements): dashboard_id="d1", page_id="p1", section_id="s1", spec=null - Remove a page (and its sections): dashboard_id="d1", page_id="p1", spec=null Sibling layouts are recomputed so the remaining nodes stay aligned. The deepest ID given names the node that goes away, so double-check the path before sending. Deleting a whole dashboard is delete_dashboard's job. Path is exact: each ID must exist under the one above it. To put a section on a different page, create it on that page. To move an element to another section, delete it from the old section (spec=null) and create it on the new one. Layout for element creates auto-stacks below existing elements when omitted (x…

share_dashboard

ChatGPT
Make a dashboard public and return its share URL. An existing share is reused; dashboards have no embed URL. To revoke public access, open the dashboard in the Allium app and turn off sharing there.

share_explorer_query

ChatGPT
Make an Explorer query public and return share and embed URLs. Without visual_id, the shared page shows the results table and saved visuals, but the embed shows only the table. Set visual_id to a visual listed by get_explorer_query to share and embed that visual alone. SQL is visible by default; set exclude_sql=True to hide it. An existing share is reused, and its SQL visibility is updated if requested. To revoke public access, open the query in the Allium app and turn off sharing there.

update_explorer_query

ChatGPT
Update an existing Explorer query. Requires query_id. Only provide fields you want to change - others will be preserved. Changing sql does not run the query - it only saves the new SQL. Any visuals or dashboard elements bound to this query keep referencing its columns by name; they pick up the new SQL's columns the next time the query runs, and a binding whose column was renamed or removed will fail to render until it's rebound.

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

App Stats

51

Tools

3

Prompts

ChatGPT

Platforms

Works with

ChatGPT

Data refreshed daily