Skip to main content
Glama
p-gentili

justetf-mcp

by p-gentili

justetf-mcp

CI License: MIT Python

A local Model Context Protocol (MCP) server for read-only justETF data.

This server wraps the third-party druzsan/justetf-scraping Python scraper and exposes a compact MCP tool surface for ETF search, profiles, charts, comparisons, and live quotes.

Caveat: justETF does not publish a stable public API for these endpoints. The upstream scraper relies on justETF web-app endpoints/page structure, so tools can break if justETF changes its site. Use conservative request volumes and review justETF terms for your use case. This is not investment advice.

Tools

  • search_etfs — query the justETF screener with filters and pagination.

  • get_etf_profile — profile/details for one ISIN, including holdings and country/sector allocations.

  • get_chart — historical chart/performance series for one ISIN.

  • compare_charts — compare performance series for multiple ISINs.

  • get_live_quote — latest gettex/EUR quote via justETF's WebSocket feed.

There is also a justetf://help resource with brief usage notes.

Related MCP server: polygon-mcp

Install

uv sync

Or install as a Python package:

pip install .

Run locally

uv run justetf-mcp

The server communicates over stdio, which is the usual transport for local MCP clients.

MCP client configuration

Example configuration for a stdio MCP client:

{
  "mcpServers": {
    "justetf": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/justetf-mcp", "run", "justetf-mcp"]
    }
  }
}

If you install the package globally/in a dedicated venv, use the justetf-mcp executable directly.

Example prompts

  • "Search justETF for MSCI World accumulating ETFs and show TER and fund size."

  • "Get the profile for IE00B4L5Y983 without live quote."

  • "Compare IE00B4L5Y983 and IE00B3RBWM25 over the last 5 years."

  • "Fetch the last 30 chart rows for IE00B5BMR087."

Development

uv sync --dev      # install runtime + dev dependencies
uv run pytest -q   # run the test suite
uv run ruff check . # lint

How the underlying scraper reaches justETF

The upstream justetf-scraping package currently uses:

  • Screener: https://www.justetf.com/en/search.html with Wicket AJAX POST requests.

  • Chart data: https://www.justetf.com/api/etfs/{isin}/performance-chart.

  • Live quote: wss://api.mobile.stock-data-subscriptions.justetf.com/?subscription=trend&parameters=isins:{isin}/currency:EUR/language:en.

  • Profile pages: https://www.justetf.com/en/etf-profile.html?isin={isin} plus AJAX expansion for allocations.

Acknowledgements

Data access is provided by the third-party druzsan/justetf-scraping package, which is MIT licensed. This project is not affiliated with or endorsed by justETF.

License

MIT © Paolo Gentili. The bundled dependency justetf-scraping is also MIT licensed, so the two are license-compatible.

Available Tools

5 tools
compare_chartsA

Compare historical chart series for multiple ETFs.

Args: isins: List of ETF ISINs. currency: EUR, USD, CHF, or GBP. dates: shortest for common range, longest for union range. input_value: quote, quote_with_dividends, or quote_with_reinvested_dividends. output_value: absolute, relative, or percentage. start/end: Optional inclusive date range applied after comparison.

ParametersJSON Schema
NameRequiredDescriptionDefault
isinsYes
currencyNoEUR
datesNoshortest
input_valueNoquote_with_dividends
output_valueNopercentage
startNo
endNo
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full burden. It details inputs but omits behavioral traits such as rate limits, data frequency, or what happens with large ISIN lists. The existence of an output schema partially compensates, but more transparency is needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a clear one-liner followed by a bulleted parameter list. Every sentence serves a purpose, with no redundancy or wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, return value explanation is not needed. The description covers most inputs but omits pagination parameters and error handling. For a 9-parameter tool, it is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds significant meaning to all listed parameters (e.g., enumerations for currency, dates, input_value, output_value). However, it fails to mention limit and offset (pagination), which are present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Compare historical chart series for multiple ETFs,' specifying a distinct verb and resource, and distinguishes from sibling tools like get_chart (single ETF) and search_etfs (search only).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description covers parameter meanings but lacks explicit guidance on when to use compare_charts versus alternatives or exclusions. However, the context from sibling tools implies it is for multi-ETF comparison, making usage relatively clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_chartA

Return historical ETF performance chart data for one ISIN.

Args: isin: ETF ISIN. currency: EUR, USD, CHF, or GBP. start: Optional inclusive date YYYY-MM-DD. end: Optional inclusive date YYYY-MM-DD. unclosed: Include current day's quote if justETF provides it. columns: Optional subset of chart columns. Common columns are quote, relative, dividends, cumulative_dividends, quote_with_dividends, relative_with_dividends, quote_with_reinvested_dividends, and relative_with_reinvested_dividends. limit: Number of rows to return, capped at 5000. Defaults to roughly one year. offset: Result offset for pagination after date filtering.

ParametersJSON Schema
NameRequiredDescriptionDefault
isinYes
currencyNoEUR
startNo
endNo
unclosedNo
columnsNo
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden for behavioral disclosure. It mentions some parameter behavior (e.g., unclosed for current day, limit capped at 5000) but does not state that the tool is read-only, idempotent, or any rate limits/authentication needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose followed by parameter list. Some lines are slightly verbose (e.g., columns enumeration), but every sentence adds value. Could be tightened slightly without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters and no annotations, the description covers parameter semantics well but lacks behavioral context (e.g., read-only nature, error scenarios). Output schema exists so return details are handled elsewhere, but missing safety cues lower completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, yet the description explains all 8 parameters with format, defaults, examples (e.g., columns list, date format YYYY-MM-DD), and constraints (limit capped at 5000). This fully compensates for the schema deficit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns historical ETF performance chart data for one ISIN. This verb+resource combination distinguishes it from siblings like compare_charts (multiple ISINs) and get_etf_profile (profile data).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The purpose implies usage for a single ISIN historical data, providing clear context. However, it does not explicitly exclude when to use alternatives like compare_charts or mention conditions like required authentication.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_etf_profileB

Return comprehensive ETF profile data for one ISIN.

Includes name, description, tracked index, TER, fund size, replication, distribution policy, top holdings, country/sector allocations, and optionally a live gettex quote. include_gettex defaults to false because it uses a WebSocket and can block outside trading/network conditions.

ParametersJSON Schema
NameRequiredDescriptionDefault
isinYes
include_gettexNo
expand_allocationsNo
timeout_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that include_gettex uses a WebSocket and can block outside trading/network conditions. No annotations exist, so description carries full burden; lacks disclosure on authentication, rate limits, or read-only nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with clear front-loading of purpose, followed by contents and a behavioral note. No fluff, but could be slightly more structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Description explains main purpose and includes list of output fields, but fails to describe expand_allocations and timeout_seconds. Given 0% schema coverage and 4 parameters, this is insufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema coverage at 0%, description adds meaning for isin (required) and include_gettex (explains blocking). But expand_allocations and timeout_seconds are not mentioned, leaving gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns comprehensive ETF profile data for one ISIN, listing included fields. It distinguishes from sibling tools like search_etfs and get_chart by focusing on a single ISIN's full profile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage when detailed ETF profile is needed, and warns against using include_gettex=true unnecessarily due to blocking. However, no explicit when-to-use vs alternatives or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_live_quoteA

Return the latest live quote for an ETF from gettex in EUR.

This uses justETF's WebSocket feed. The upstream scraper currently supports gettex/EUR only. Outside trading hours, it should still usually return an initial quote, but a timeout is enforced for local MCP usability.

ParametersJSON Schema
NameRequiredDescriptionDefault
isinYes
timeout_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since no annotations are provided, the description carries full burden for behavioral disclosure. It mentions the WebSocket feed, limitation to gettex/EUR, behavior outside trading hours (initial quote possible), and enforced timeout. This is good coverage for a live quote tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is very concise: two sentences front-loading the purpose and adding behavioral context. No wasted words or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers tool source, limitation, and behavioral quirks. With an output schema present, return value details are not needed. It is almost complete; could mention data freshness or real-time nature explicitly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description needs to add meaning to the 2 parameters. It clarifies the quote is from gettex in EUR but does not explain the isin parameter or how timeout_seconds is related to the mentioned timeout. The timeout mention is vague and not explicitly linked to the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it returns the latest live quote for an ETF from gettex in EUR. The verb 'Return' and specific resource (live quote for ETF from gettex in EUR) distinguish it from sibling tools like get_chart or search_etfs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description explains the tool uses justETF's WebSocket feed, supports only gettex/EUR, and mentions behavior outside trading hours with a timeout. It provides clear context for when to use the tool, though it doesn't explicitly mention when not to use or suggest alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_etfsA

Search the justETF screener and return ETF overview rows.

Args: query: Free-text query or ISIN. If it looks like an ISIN, the scraper sends it as an ISIN query; otherwise results are post-filtered by name/ticker/wkn/isin. strategy: justETF product group: epg-longOnly, epg-activeEtfs, epg-shortAndLeveraged, or null to query all strategies. asset_class: Optional justETF asset class such as class-equity, class-bonds, class-preciousMetals, class-commodities, class-currency, class-realEstate, class-moneyMarket. region: Optional region such as World, Europe, North%2BAmerica, Emerging%2BMarkets, Asia%2BPacific. country: Optional target country name or alpha-2 code. instrument: Optional instrument type: ETF, ETC, or ETN. provider: Optional provider code/name accepted by justETF. index: Optional tracked index name, e.g. MSCI World. currency: Response currency: EUR, USD, CHF, GBP. limit: Maximum number of rows to return, capped at 5000. offset: Result offset for pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNo
strategyNoepg-longOnly
asset_classNo
regionNo
countryNo
instrumentNo
providerNo
indexNo
currencyNoEUR
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description fully covers behavioral traits: query handling logic, default strategy, pagination with limit/offset, and a 5000 row cap. This is sufficient for a read-only search tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose sentence followed by parameter list, but it is somewhat lengthy. One or two sentences could be trimmed without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 11 parameters and no annotations, the description covers every parameter's behavior and default values. An output schema exists (not shown), which would cover return format, making the description complete for this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero documentation coverage, but the description provides detailed explanations for all 11 parameters, including examples (e.g., asset_class like 'class-equity', region like 'World'). It adds significant meaning beyond the schema structure alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches the justETF screener and returns ETF overview rows. It uses a specific verb ('search') and resource ('justETF screener'), and distinguishes from sibling tools like compare_charts and get_etf_profile which serve different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains query behavior (ISIN vs free-text) and strategy options, but does not explicitly state when to use this tool vs alternatives. However, siblings are clearly separate functions, so usage context is apparent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedcompare_charts
    • First observedget_chart
    • First observedget_etf_profile
    • First observedget_live_quote
    • First observedsearch_etfs

TDQS

A4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct purpose: comparing multiple ETFs, getting single chart, profile data, live quote, and searching. No overlap or confusion.

Naming Consistency5/5

All tool names use lowercase with underscores and follow a consistent verb_noun pattern (e.g., get_chart, compare_charts, search_etfs).

Tool Count5/5

5 tools is an appropriate scope for an ETF data server, covering search, profile, chart, comparison, and live quote without being excessive.

Completeness4/5

Core ETF operations are covered, but a tool for listing available filters (e.g., regions, asset classes) could enhance discovery. Slight gap but not critical.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    Read-only MCP server for Taiwan active ETF research database, providing tools to list ETFs, track buy/sell deltas, view stock history and PnL, and find consensus buys across ETFs.
    5
    -
  • A
    license
    C
    quality
    C
    maintenance
    Enables querying real-time and historical financial market data for stocks, options, forex, and crypto, including quotes, trades, technical indicators, and reference data through a set of MCP tools.
    71
    3
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables access to financial market data including EOD, intraday, fundamentals, news, and more via 75 read-only MCP tools.
    5
    MIT