Saved screens · click to load
Saved screens · click to load
This page is a frozen snapshot. Its source is public on GitHub. Paste the prompt below into Claude: it fetches that source and republishes it reading live FocusAlpha data through your connector — your universe, your filters, your account.
Build me a live ETF screening dashboard from the FocusAlpha sample at https://app.focusalpha.ai/etf-screener-dashboard, on my own filters.
The page is open source. Fetch this ONE file and use it verbatim as the page:
https://raw.githubusercontent.com/focusAlpha/dashboards/main/etf-screener-dashboard/live.html
It is a single self-contained HTML file, about 60 KB, no build step, no dependencies. Download it
exactly as it is, with curl or your fetch tool. Do not summarise it, retype it, or rebuild it from
memory. The sample on focusalpha.ai is this same page with a data snapshot frozen on 2026-09-23
baked in; live.html is the same page reading through the FocusAlpha connector instead.
Then, in this order:
1. Publish the file as an artifact, declaring the connector:
capabilities: { mcp: { servers: [{ server: "FocusAlpha", tools: ["screen_etfs"] }] } }
If the connector is listed in your tools as "focusalpha", use that spelling for server.
Without this declaration window.claude.use('mcp') resolves null and the page can never fetch.
2. Open it and check that the status line says live and the table has rows. If the page says the
connector is not available, I have to connect FocusAlpha first: https://focusalpha.ai/start
3. Now change it for me. The default screen is PRESETS[0] near the top of the script, and its
parameters are the ones the API takes (min_aum, max_expense_ratio, segment, tier,
taxonomy_prefix, min_flow_20d, max_premium, min_top10_share, sort, ...). Put my conditions below
in as the first preset, republish, and send me the link.
Rules for any change:
- Keep the data layer exactly as it is: every read goes through MCP.callTool(SERVER, TOOL, params).
Never paste rows into the page. The point of this page is that it fetches its own data.
- Before adding a label filter, call screen_etfs({ list_facets: true }) once. It is free and it gives
the exact spelling of every tier, asset class, category, segment and exchange, with counts. Label
codes are dotted paths (equity.sector.health_care); a misspelled code returns an empty page, not
an error. get_etf_taxonomy (also free) lists the L4 specializations.
- Units: expense ratios are DECIMALS (0.002 = 20 bp); holdings shares are FRACTIONS (0.5 = 50%);
aum and flows are USD; premium_discount is a percent as published.
- The wrapper tier (what kind of thing the fund is) and the four-level classification (what its
holdings show) are two different questions. The page keeps them in separate controls; keep it so.
- AUM is the class-level figure. A pool-level net-assets number is never a fund's size.
- No fee row is not a zero fee: unit investment trusts (SPY, GLD) file no fee table and drop out of
any sort by expense ratio.
My conditions (edit these):
taxonomy_prefix: "equity.sector"
max_expense_ratio: 0.002
min_aum: 1000000000
sort: "flow_20d"