protogrid

Search / com.etfiq/etfiq

ETFIQ

R0· no sign-in

Independent US ETF data and benchmarks for model portfolios, each figure with its source and date.

v0.2.0 · active · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality72needs work
Trust82of 100
Uptime, 30 days94%
Latency p50176 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "etfiq": {
      "type": "http",
      "url": "https://mcp.etfiq.com"
    }
  }
}
claude mcp add --transport http etfiq https://mcp.etfiq.com
[mcp_servers.etfiq]
url = "https://mcp.etfiq.com"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "etfiq": {
      "type": "remote",
      "url": "https://mcp.etfiq.com",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "etfiq": {
      "type": "http",
      "url": "https://mcp.etfiq.com"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=etfiq&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vbWNwLmV0ZmlxLmNvbSJ9"
}
{
  "servers": {
    "etfiq": {
      "type": "http",
      "url": "https://mcp.etfiq.com"
    }
  }
}
{
  "mcpServers": {
    "etfiq": {
      "httpUrl": "https://mcp.etfiq.com"
    }
  }
}
extensions:
  "etfiq":
    enabled: true
    name: "etfiq"
    type: streamable_http
    uri: "https://mcp.etfiq.com"
    timeout: 300

Quality 72 / 100needs work

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-06-18; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene93 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • warn
    tools.description_length3 tools have descriptions over 1,024 characters, which crowds the context
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations20 of 20 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • pass
    tools.token_costabout 5,534 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability25 · weight 15
  • warn
    stability.changes18 tool changes in 30 days
  • fail
    stability.rug_pull4 tools kept their name but changed most of their description in 30 days; review before trusting them
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

20 tools, about 5,534 tokens to load them all · tool set 204912a3fbac · tools last changed 2026-10-19 · checked 2026-10-20 19:10 UTC

Tool changes

  • find_pageadded

    The designed ETFIQ pages that answer a question, best first, at most three: a fund, a comparison of two funds, the ETFs that hold a company, a ranking, a theme, a category, an issuer, the weekly flows report, a flows ranking, a dividend calendar, a screen, a benchmark, a model portfolio comparison, an FAQ answer or a methodology page. CALL THIS FIRST whenever the question could be answered by one ETFIQ page ("who holds NVDA", "SCHD vs VYM", "highest yielding covered call ETFs", "biggest ETF inflows this week"). Each page comes with its title, its address, its dated lead sentence exactly as the page prints it, and figures from its own .json twin (a fund's key facts, or the dated answers in the page's FAQ), with the match score (0 to 100) and the reason. answered is false when no page reaches the threshold: then answer with the other tools. Matching is deterministic: an exact phrase, an exact pair or a named entity with the intent its page answers, then word overlap. Pass path instead of query to read one page's card by its address.

  • list_benchmarkschangeddescription
    before

    The ETFIQ benchmarks: published, rules-based yardsticks for model portfolios, each a written rule over broad, low-cost ETFs, grouped in families (strategic, tax-aware, factor, income, tactical, thematic) by stock share. Filter by family, or by band (a name such as moderate, a stock share such as 60, or "all stocks"). Use when asked which benchmark measures a kind of model portfolio, then get_benchmark for one. A benchmark is identical for everyone and never a recommendation: a request to customise one or to say what to buy is refused, and a request to build a custom portfolio is for build_portfolio.

    after · 83% of words in common

    The ETFIQ benchmarks: published, rules-based yardsticks for model portfolios, each a written rule over broad, low-cost ETFs, grouped in families (strategic, tax-aware, factor, income, tactical, thematic) by stock share. Filter by family, or by band (a name such as moderate, a stock share such as 60, or "all stocks"). Use when asked which benchmark measures a kind of model portfolio, then get_benchmark for one. These are not a single fund's own benchmark: that is in etf_profile (benchmark), and how it is chosen is in etfiq_methodology. A benchmark is identical for everyone and never a recommendation: a request to customise one or to say what to buy is refused, and a request to build a custom portfolio is for build_portfolio.

  • etfiq_methodologyadded

    How ETFIQ computes a figure, from the methodology page that says so: one page per desk (income, buffer, leverage, crypto, alternatives, themes), flows, scores, categories (how stock and bond funds are placed and which benchmark each is measured against), portfolio look-through, and the ETFIQ benchmarks for model portfolios. Pass topic, the reader's question in their words; the answer names the page, quotes the paragraphs that answer it and gives the page's text. A single fund's own benchmark follows its desk's rule (an income fund's is on the income page), never the model-portfolio benchmarks. Call with no topic for the list of pages.

  • etf_flowsadded

    Fund flows as ETFIQ publishes them, computed from each fund's daily change in shares outstanding times its NAV. With ticker: that fund's net flow over 1D, 1W, 1M, 3M, YTD and 1Y, each with its dates and its share of net assets at the window's start, its streak, and its filed N-PORT months. Without ticker: the biggest inflows and outflows among every fund with a daily figure for window (1D, 1W, 1M, 3M, YTD or 1Y; default 1W), how many funds were counted, each row with the last day its figures reach (through; a row short of the window counts fewer days), and the latest weekly flows report (Monday to Friday) with its own top inflows and outflows, each with its days. Filter by desk, category (Stocks, Bonds, Commodities, Allocation) or issuer. USE THIS for any question about money going into or out of ETFs.

  • etf_screenchangeddescription, input schemameaning changed
    before

    Every fund matching some filters, largest first, each with its net assets and the source and date that figure came from. Use for "find me all X" questions rather than repeated searches. Fees are percentages, not basis points. Funds with no published size are set aside from a size filter and counted in no_size_figure rather than treated as small.

    after · 43% of words in common

    Every fund matching some filters, each with its net assets and the source and date that figure came from. Filters: desk, issuer, max_fee_pct, min_assets_usd; and, from the ETFIQ screener, tracks (the index the funds track, such as "S&P 500"), min_yield_pct (12-month yield of at least that percent), pays (payout frequency: weekly, monthly, quarterly, semiannual or annual, published for income ETFs) and sort (assets, largest first; fee, lowest first; yield, highest first). count is the WHOLE matching set: when fewer rows come back, truncated and note say so, and the rows must never be presented as the whole set. first names every fund tied at the top of the order. Use for "find me all X" and "cheapest X" questions rather than repeated searches. Fees are percentages, not basis points. Funds with no published figure for a filter are set aside and counted, not treated as failing it.

  • etfiq_sectionschangeddescriptionmeaning changed
    before

    What ETFIQ publishes, section by section, with a page count for each. Start here when the question is not about one fund: it names every section and what is in it.

    after · 48% of words in common

    What ETFIQ publishes, section by section, with a page count for each, and start_here: the main pages (fund flows, the weekly flows report, ETF model portfolios and benchmarks, the filed prediction-market and sports-team funds, issuers, methodology, rankings, the screener) with what each holds. Start here when the question is not about one fund.

  • etf_profilechangeddescriptionmeaning changed
    before

    Everything ETFIQ publishes about one fund: issuer, category, and each figure with its source and as-of date, plus a one sentence verdict on how it did against what its own label promises.

    after · 48% of words in common

    Everything ETFIQ publishes about one fund: issuer, category, and each figure with its source and as-of date, plus a one sentence verdict on how it did against what its own label promises. benchmark is the fund's own benchmark as its page names it: its name, how it was set, and the fund's return, the benchmark's and the gap for each window (periods is the page's whole window table). A closed fund answers with closed (the day and the page's words); a former ticker answers as the fund it trades as now, and says so. The ETFIQ benchmarks for model portfolios (list_benchmarks) are a different thing.

  • etf_searchchangeddescription
    before

    Find US listed ETFs by ticker, fund name, or a word from the name. Use this FIRST when the user names a fund loosely, then etf_profile with the ticker it returns. Refuses rather than returning a near match: a refusal says why, and for a fund it means ETFIQ does not publish it.

    after · 60% of words in common

    Find US listed ETFs by ticker, fund name, or a word from the name. Use this FIRST when the user names a fund loosely, then etf_profile with the ticker it returns. Refuses rather than returning a near match: a refusal says why, and for a fund it means ETFIQ does not publish it. A former ticker (SPLG) answers with the fund it trades as now, and a closed fund with its page and the day it closed. Funds filed with the SEC that do not trade (prediction markets, sports teams) come back in filed, with how many are filed and how many trade, never as results.

  • compare_to_benchmarkchangeddescription, input schema
    before

    Sets an allocation ETF, or a portfolio build_portfolio builds, beside an ETFIQ benchmark. With ticker (such as AOR): how the fund did against the benchmark for its band (set by its look-through stock share), over the same dates, as ETFIQ published it: total returns by window and the difference, risk and cost. With portfolio (the arguments build_portfolio took, its answer's compare.arguments.portfolio): the same portfolio built again beside the ETFIQ strategic benchmark nearest its looked-through stock share, the benchmark's own 1Y, 3Y, 5Y, 10Y and since-inception windows exactly as published, each with its dates and basis (hypothetical before the freeze date), and the differences in stock share and weighted fee in percentage points; and, in portfolio_returns, the portfolio's hypothetical returns beside the benchmark's over the same months, window by window, with each difference in percentage points. Refuses, and estimates nothing, when ETFIQ has not published what is asked.

    after · 66% of words in common

    Sets an allocation ETF, or a portfolio build_portfolio builds, beside an ETFIQ benchmark. With ticker (such as AOR): how the fund did against the benchmark for its band (set by its look-through stock share), over the same dates, as ETFIQ published it: total returns by window and the difference, risk and cost. With portfolio (the arguments build_portfolio took, its answer's compare.arguments.portfolio): the same portfolio built again beside an ETFIQ benchmark, the benchmark's own 1Y, 3Y, 5Y, 10Y and since-inception windows exactly as published, each with its dates and basis (hypothetical before the freeze date), and the differences in stock share and weighted fee in percentage points; and, in portfolio_returns, the portfolio's hypothetical returns beside the benchmark's over the same months, window by window, with each difference in percentage points. WHICH BENCHMARK: without benchmark, the default rule's (the ETFIQ strategic benchmark nearest the portfolio's looked-through stock share, the lower on a tie; for the band form, its band's), and choice.line says why in one line. When that one is more than 5 percentage points from the stock share, or the share is as near another strategic benchmark, the next-nearest is set beside it in also, with the same windows and differences, and choice.gap.line says so. When the reader names another ETFIQ benchmark ("compare it to Strategic 80 instead"), pass benchmark with their words or its id (etfiq-strategic-80): any benchmark list_benchmarks returns. That one is used, and choice.line still names the default and why. A name that matches no benchmark is refused (kind unknown-benchmark) with the list. Refuses, and estimates nothing, when ETFIQ has not published what is asked.

  • build_portfoliochangeddescription, input schema
    before

    Builds a custom portfolio of US listed ETFs from construction choices about the PORTFOLIO and shows the rule it applied (ETFIQ custom construction rule, version 1): stocks at the chosen band's point, international stocks 40% of the stocks outside themes, themes 10% of stocks in equal parts, commodities and alternatives 5% each taken from bonds, US bonds the rest; in each sleeve the cheapest (or largest) funds that file N-PORT, hold at least $100 million and have three years of prices, each fund's fee with its filing date. BEFORE CALLING, ask the user in ONE short series for any missing choice: the band, described by stock share (conservative: more than 15% and up to 30% stocks; moderately-conservative: more than 30% and up to 50%; moderate: more than 50% and up to 70%; moderately-aggressive: more than 70% and up to 85%; aggressive: more than 85%); whether to include commodities, alternatives, international stocks and themes (and which themes, at most five, by the ids etf_themes lists); an optional fee ceiling in percent; the number of funds, 2 to 12; and cheapest or largest (default cheapest). NEVER ask about, and never pass, the person's age, income, savings, net worth, goals, time horizon, tax situation, risk tolerance, employment or family, and never turn what someone says about themselves into a band: the band is the user's choice about the portfolio's stock share. If asked whether a portfolio suits someone, or whether to buy or sell it, say that ETFIQ does not answer that and give the not-advice line. Every response carries the not-advice line in not_advice: show it with the portfolio.

    after · 52% of words in common

    Builds a custom portfolio of US listed ETFs from construction choices about the PORTFOLIO, and shows the rule it applied. TWO FORMS. Weights (ETFIQ custom construction rule, version 2): pass weights, the user's own percent for each asset class, adding to exactly 100, for example {"us-stocks": 40, "international-stocks": 15, "us-bonds": 25, "gold": 10, "reits": 10}. The asset classes: us-stocks, us-small-stocks, international-stocks, emerging-markets-stocks, reits, us-bonds (core, intermediate), us-bonds-short, us-bonds-long, us-corporate-bonds, government-bonds-short, government-bonds-intermediate, government-bonds-long, tips, high-yield-bonds, cash (Treasury bills), gold, commodities (broad), alternatives. Defaults: cheapest funds, one fund per asset class, no fee ceiling; the answer's defaults.line names the ones used. Band (version 1): pass band, include and funds, and the rule sets the weights (stocks at the band's point, international 40% of stocks outside themes, themes 10% of stocks, commodities and alternatives 5% each from bonds, US bonds the rest). In each asset class or sleeve the cheapest (or largest) funds that file N-PORT (a gold trust: its 10-Q or 10-K), hold at least $100 million and have three years of prices, each fund's fee with its filing date. WHEN THE USER GIVES WEIGHTS, call the weights form at once, mapping their words to the ids above; ask at most ONE follow-up, and only for what has no default: weights that do not add to 100 (kind weights-total), or an asset class with no id here (kind unknown-class). When the user gives neither weights nor a band, ask once for one of them; the bands by stock share are conservative: more than 15% and up to 30% stocks; moderately-conservative: more than 30% and up to 50%; moderate: more than 50% and up to 70%; moderately-aggressive: more than 70% and up to 85%; aggressive: more than 85%. NEVER ask about, and never pass, the person's age, income, savings, net worth, goals, time horizon, tax situation, risk tolerance, employment or family, and never turn what someone says about themselves into weights or a band: those are the user's choices about the portfolio. If asked whether a portfolio suits someone, or whether to buy or sell it, say that ETFIQ does not answer that and give the not-advice line. Its returns field carries the portfolio's hypothetical returns (ETFIQ custom rule, version 3: the weights reset at every month end, as the ETFIQ benchmarks are): total return, return a year, volatility and month-end drawdown over 1Y, 3Y, 5Y, 10Y and since the first month end all its funds share, a window given only where every fund has prices across it; returns.common.sentence says where the history starts and why. Show them as hypothetical, never extend a window, and never estimate a return the answer does not give. To set the portfolio beside an ETFIQ benchmark, call compare_to_benchmark with the answer's compare.arguments. Every response carries the not-advice line in not_advice: show it with the portfolio.

Showing the latest 10. Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 82 / 100

no-repository
provenance55
liveness98
freshness100
hygiene80

+dns-namespace +website +reachable +uptime-94% +updated-0d-ago -no-repository

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://mcp.etfiq.com streamable-httpnoneyes94%176 ms2025-06-182026-10-20

Tools (20)

build_portfolioread-onlyBuilds a custom portfolio of US listed ETFs from construction choices about the PORTFOLIO, and shows the rule it applied. TWO FORMS. Weights (ETFIQ custom construction rule, version 2): pass weights, the user's own percent for each asset class, adding to exactly 100, for example {"us-stocks": 40, "international-stocks": 15, "us-bonds": 25, "gold": 10, "reits": 10}. The asset classes: us-stocks, us-small-stocks, international-stocks, emerging-markets-stocks, reits, us-bonds (core, intermediate), us-bonds-short, us-bonds-long, us-corporate-bonds, government-bonds-short, government-bonds-intermediate, government-bonds-long, tips, high-yield-bonds, cash (Treasury bills), gold, commodities (broad), alternatives. Defaults: cheapest funds, one fund per asset class, no fee ceiling; the answer's defaults.line names the ones used. Band (version 1): pass band, include and funds, and the rule sets the weights (stocks at the band's point, international 40% of stocks outside themes, themes 10% of stocks, commodities and alternatives 5% each from bonds, US bonds the rest). In each asset class or sleeve the cheapest (or largest) funds that file N-PORT (a gold trust: its 10-Q or 10-K), hold at least $100 million and have three years of prices, each fund's fee with its filing date. WHEN THE USER GIVES WEIGHTS, call the weights form at once, mapping their words to the ids above; ask at most ONE follow-up, and only for what has no default: weights that do not add to 100 (kind weights-total), or an asset class with no id here (kind unknown-class). When the user gives neither weights nor a band, ask once for one of them; the bands by stock share are conservative: more than 15% and up to 30% stocks; moderately-conservative: more than 30% and up to 50%; moderate: more than 50% and up to 70%; moderately-aggressive: more than 70% and up to 85%; aggressive: more than 85%. NEVER ask about, and never pass, the person's age, income, savings, net worth, goals, time horizon, tax situation, risk tolerance, employment or family, and never turn what someone says about themselves into weights or a band: those are the user's choices about the portfolio. If asked whether a portfolio suits someone, or whether to buy or sell it, say that ETFIQ does not answer that and give the not-advice line. Its returns field carries the portfolio's hypothetical returns (ETFIQ custom rule, version 3: the weights reset at every month end, as the ETFIQ benchmarks are): total return, return a year, volatility and month-end drawdown over 1Y, 3Y, 5Y, 10Y and since the first month end all its funds share, a window given only where every fund has prices across it; returns.common.sentence says where the history starts and why. Show them as hypothetical, never extend a window, and never estimate a return the answer does not give. To set the portfolio beside an ETFIQ benchmark, call compare_to_benchmark with the answer's compare.arguments. Every response carries the not-advice line in not_advice: show it with the portfolio.
compare_to_benchmarkread-onlySets an allocation ETF, or a portfolio build_portfolio builds, beside an ETFIQ benchmark. With ticker (such as AOR): how the fund did against the benchmark for its band (set by its look-through stock share), over the same dates, as ETFIQ published it: total returns by window and the difference, risk and cost. With portfolio (the arguments build_portfolio took, its answer's compare.arguments.portfolio): the same portfolio built again beside an ETFIQ benchmark, the benchmark's own 1Y, 3Y, 5Y, 10Y and since-inception windows exactly as published, each with its dates and basis (hypothetical before the freeze date), and the differences in stock share and weighted fee in percentage points; and, in portfolio_returns, the portfolio's hypothetical returns beside the benchmark's over the same months, window by window, with each difference in percentage points. WHICH BENCHMARK: without benchmark, the default rule's (the ETFIQ strategic benchmark nearest the portfolio's looked-through stock share, the lower on a tie; for the band form, its band's), and choice.line says why in one line. When that one is more than 5 percentage points from the stock share, or the share is as near another strategic benchmark, the next-nearest is set beside it in also, with the same windows and differences, and choice.gap.line says so. When the reader names another ETFIQ benchmark ("compare it to Strategic 80 instead"), pass benchmark with their words or its id (etfiq-strategic-80): any benchmark list_benchmarks returns. That one is used, and choice.line still names the default and why. A name that matches no benchmark is refused (kind unknown-benchmark) with the list. Refuses, and estimates nothing, when ETFIQ has not published what is asked.
etf_flowsread-onlyFund flows as ETFIQ publishes them, computed from each fund's daily change in shares outstanding times its NAV. With ticker: that fund's net flow over 1D, 1W, 1M, 3M, YTD and 1Y, each with its dates and its share of net assets at the window's start, its streak, and its filed N-PORT months. Without ticker: the biggest inflows and outflows among every fund with a daily figure for window (1D, 1W, 1M, 3M, YTD or 1Y; default 1W), how many funds were counted, each row with the last day its figures reach (through; a row short of the window counts fewer days), and the latest weekly flows report (Monday to Friday) with its own top inflows and outflows, each with its days. Filter by desk, category (Stocks, Bonds, Commodities, Allocation) or issuer. USE THIS for any question about money going into or out of ETFs.
etf_holdersread-onlyWhich US listed ETFs hold a given company, ranked by how much of each fund it is. USE THIS for any "which ETFs hold X", "which fund holds the most X", or "how do I get exposure to X" question, where X is a company rather than a fund, and for "which bond ETFs hold X's debt". Takes a company name or its ticker. Returns every fund holding its shares with the weight its issuer published and the date that book was filed, and separately every fund holding its bonds or other debt. Covers 31,019 companies.
etf_holdingsread-onlyWhat a fund holds, by weight, and how old that is. ALWAYS read lag_days before presenting it: an issuer file read today and a filing from two months ago both come back here and are not the same answer.
etfiq_as_ofread-onlyWhat ETFIQ published on a given date, from its frozen dated archive. Use when a question is about a past date, or when a figure needs to stay true after it is quoted: every other tool here answers about today and today moves overnight. Takes YYYY-MM-DD. Covers the pieces written that night, not an arbitrary per-fund figure on an arbitrary day.
etfiq_listread-onlyThe pages inside one section, optionally filtered to those whose address contains a word. Use after etfiq_sections to find a page, then etfiq_page to read it. The count returned is the whole matching set even when the list is capped.
etfiq_methodologyread-onlyHow ETFIQ computes a figure, from the methodology page that says so: one page per desk (income, buffer, leverage, crypto, alternatives, themes), flows, scores, categories (how stock and bond funds are placed and which benchmark each is measured against), portfolio look-through, and the ETFIQ benchmarks for model portfolios. Pass topic, the reader's question in their words; the answer names the page, quotes the paragraphs that answer it and gives the page's text. A single fund's own benchmark follows its desk's rule (an income fund's is on the income page), never the model-portfolio benchmarks. Call with no topic for the list of pages.
etfiq_pageread-onlyRead ANY published ETFIQ page as text: a theme hub, a ranking, a comparison of two funds, an issuer, a methodology note, a dated study. Takes a path like /themes/cyber or a full etfiq.com URL. This reaches all 40,000 pages, including everything the typed tools above do not cover, and returns the page content rather than its navigation.
etfiq_sectionsread-onlyWhat ETFIQ publishes, section by section, with a page count for each, and start_here: the main pages (fund flows, the weekly flows report, ETF model portfolios and benchmarks, the filed prediction-market and sports-team funds, issuers, methodology, rankings, the screener) with what each holds. Start here when the question is not about one fund.
etf_overlapread-onlyHow much of their weight two funds hold in common, as ETFIQ published it on the comparison page for that pair. Use when asked whether two ETFs are the same thing, or whether owning both adds anything. Refuses rather than estimating when the pair is not compared or either holdings book is incomplete.
etf_profileread-onlyEverything ETFIQ publishes about one fund: issuer, category, and each figure with its source and as-of date, plus a one sentence verdict on how it did against what its own label promises. benchmark is the fund's own benchmark as its page names it: its name, how it was set, and the fund's return, the benchmark's and the gap for each window (periods is the page's whole window table). A closed fund answers with closed (the day and the page's words); a former ticker answers as the fund it trades as now, and says so. The ETFIQ benchmarks for model portfolios (list_benchmarks) are a different thing.
etf_rankingsread-onlyThe ranked lists ETFIQ publishes, or one of them. Each ranks ONE published figure inside a stated set: the cheapest funds in a theme, the leveraged funds furthest from their stated multiple, the buffer funds closest to their cap. Call with no argument for the list.
etf_screenread-onlyEvery fund matching some filters, each with its net assets and the source and date that figure came from. Filters: desk, issuer, max_fee_pct, min_assets_usd; and, from the ETFIQ screener, tracks (the index the funds track, such as "S&P 500"), min_yield_pct (12-month yield of at least that percent), pays (payout frequency: weekly, monthly, quarterly, semiannual or annual, published for income ETFs) and sort (assets, largest first; fee, lowest first; yield, highest first). count is the WHOLE matching set: when fewer rows come back, truncated and note say so, and the rows must never be presented as the whole set. first names every fund tied at the top of the order. Use for "find me all X" and "cheapest X" questions rather than repeated searches. Fees are percentages, not basis points. Funds with no published figure for a filter are set aside and counted, not treated as failing it.
etf_searchread-onlyFind US listed ETFs by ticker, fund name, or a word from the name. Use this FIRST when the user names a fund loosely, then etf_profile with the ticker it returns. Refuses rather than returning a near match: a refusal says why, and for a fund it means ETFIQ does not publish it. A former ticker (SPLG) answers with the fund it trades as now, and a closed fund with its page and the day it closed. Funds filed with the SEC that do not trade (prediction markets, sports teams) come back in filed, with how many are filed and how many trade, never as results.
etf_themeread-onlyEvery US listed fund in a theme, largest first, with what each charges and how much of it is already in the S&P 500. USE THIS for any "what X ETFs are there" or "top X ETFs" question: it returns the whole published set rather than a sample.
etf_themesread-onlyEvery theme ETFIQ publishes and how many funds each holds. Call when unsure what a theme is called, then etf_theme.
find_pageread-onlyThe designed ETFIQ pages that answer a question, best first, at most three: a fund, a comparison of two funds, the ETFs that hold a company, a ranking, a theme, a category, an issuer, the weekly flows report, a flows ranking, a dividend calendar, a screen, a benchmark, a model portfolio comparison, an FAQ answer or a methodology page. CALL THIS FIRST whenever the question could be answered by one ETFIQ page ("who holds NVDA", "SCHD vs VYM", "highest yielding covered call ETFs", "biggest ETF inflows this week"). Each page comes with its title, its address, its dated lead sentence exactly as the page prints it, and figures from its own .json twin (a fund's key facts, or the dated answers in the page's FAQ), with the match score (0 to 100) and the reason. answered is false when no page reaches the threshold: then answer with the other tools. Matching is deterministic: an exact phrase, an exact pair or a named entity with the intent its page answers, then word overlap. Pass path instead of query to read one page's card by its address.
get_benchmarkread-onlyOne ETFIQ benchmark in full: its rule as the methodology states it, the funds and weights in force (with SEC series ids and each fund's expense ratio and its date), and every statistic ETFIQ computes for it by window (total return, return a year, volatility, maximum drawdown, Sharpe ratio, turnover, factor loadings, weighted expense ratio), each with its dates and its basis. ALWAYS read basis: a figure from before the freeze date is hypothetical. Takes an id such as etfiq-strategic-60 or strategic-60. Serves the published benchmark only; it cannot be customised.
list_benchmarksread-onlyThe ETFIQ benchmarks: published, rules-based yardsticks for model portfolios, each a written rule over broad, low-cost ETFs, grouped in families (strategic, tax-aware, factor, income, tactical, thematic) by stock share. Filter by family, or by band (a name such as moderate, a stock share such as 60, or "all stocks"). Use when asked which benchmark measures a kind of model portfolio, then get_benchmark for one. These are not a single fund's own benchmark: that is in etf_profile (benchmark), and how it is chosen is in etfiq_methodology. A benchmark is identical for everyone and never a recommendation: a request to customise one or to say what to buy is refused, and a request to build a custom portfolio is for build_portfolio.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "com.etfiq/etfiq",
  "title": "ETFIQ",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://mcp.etfiq.com",
      "type": "streamable-http"
    }
  ],
  "version": "0.2.0",
  "websiteUrl": "https://etfiq.com",
  "description": "Independent US ETF data and benchmarks for model portfolios, each figure with its source and date."
}