SkillAgentSearch skills...

lse-data-mcp

Unofficial MCP server for the London Strategic Edge market data API

Install / Use

claude mcp add OlegDyukel -- npx -y github:OlegDyukel/lse-data-mcp

If the server publishes to npm under a different name, use that package instead — check the repo README.

About this skill
🔌

MCP Server

Model Context Protocol server

Quality Score

80/100

Supported Platforms

Claude Code
Claude Desktop
<div align="center"> <h1>lse-data-mcp</h1> <p> <b>An unofficial, read-only Model Context Protocol (MCP) server for the <a href="https://londonstrategicedge.com/">London Strategic Edge</a> market-data API.</b> </p> <div>15 tools</div> </div> <div align="center">

PyPI Python License CI MCP

Add to Cursor Install in VS Code Install in Claude Desktop

</div>

Versioning: While the version is 0.x, tool names and arguments may still change between releases. Pin one — uvx lse-data-mcp==0.1.6 — if you need the surface to stay put.

The server lets an MCP client query London Strategic Edge data through the official lse-data Python SDK. It runs locally over standard input/output, uses the API key supplied by the user, returns the upstream JSON-compatible rows, and does not cache or persist responses.

Supported tools

All tools are declared read-only, non-destructive, and idempotent in their MCP metadata.

Every tool returns the same envelope, so a caller can always tell whether it saw the full result:

{
  "rows": [{ "timestamp": "2026-01-02T00:00:00Z", "close": 187.4, "volume": 41230100 }],
  "row_count": 1,
  "truncated": false
}

When the rows would exceed the response budget the server returns the leading rows it can fit, sets "truncated": true, and adds a note explaining how to narrow the request. Rows are never silently dropped.

| Tool | What it returns | Main filters | | --- | --- | --- | | get_candles | OHLCV candles for an instrument | symbol, timeframe, start, end, limit, order | | get_company_profile | Company reference and listing information | symbol, limit | | get_fundamentals | Snapshot company fundamentals | symbol, limit | | get_insider_transactions | Reported insider transactions | symbol, transaction_type, start, end, limit, order | | get_dividends | Dividend events | symbol, start, end, limit, order | | get_splits | Stock split events | symbol, start, end, limit, order | | get_cot | CFTC Commitments of Traders positioning | symbol, start, end, limit, order | | get_bond_yields | Government bond yield history per tenor | symbol, start, end, limit, order | | get_financial_reports | Income, balance sheet and cash flow statements | symbol, report_type, period, start, end, limit, order | | get_options | Current option chain for an underlying | underlying, option_type, expiry, strike, strike_min, strike_max, min_dte, max_dte, limit | | get_option_candles | One-minute premium OHLC for one contract | contract, strike, expiry, option_type, start, end, limit, order | | get_options_flow | Option prints (time and sales), trailing week | underlying, option_type, min_premium, expiry, max_dte, start, end, limit, order | | get_series | One (date, value) series: economics, bond tenors | symbol, dataset, start, end, limit, order | | get_economic_calendar | Scheduled or released economic events | region, event, start, end, released_only, limit, order | | get_reference | Vault discovery: instruments, datasets, timeframes | resource, category, dataset |

get_reference groups five discovery endpoints — catalog, datasets, reference, vault_meta, options_underlyings — behind one resource argument, because they take almost no arguments between them. category applies only to catalog and dataset only to datasets; passing either to a resource that ignores it is an error, not a silent no-op, so a grouped tool can never quietly drop a filter you meant. Data tools stay one-to-one with their SDK method, where every argument is always meaningful.

get_reference("catalog") covers 22,000+ instruments, so expect truncated: true unless you filter by category.

Each call defaults to at most 200 rows. The upstream API caps a single interactive call at 5,000 rows; use start and end to request narrower windows.

get_financial_reports defaults to 20 instead, because each row carries a whole statement in its data field and is far larger than a candle or a dividend. Twenty rows is five years of quarterly reports, or twenty years of annual ones.

start and end accept an ISO 8601 date or timestamp (2026-01-01, 2026-01-01T14:30:00Z). Anything else is rejected locally, so a malformed date costs no API call and no quota. On get_candles the upstream API accepts the date part only; an intraday start or end is rejected there, so narrow a 1s or 1m window by filtering the rows that come back.

Data caveats

Some upstream conventions are worth knowing before you quote a number. The first two were measured by comparing this API against other market-data sources, and both are open questions with the provider. Every caveat below is also carried in the relevant tool's description, so the model reads it on each call rather than only here.

  • Daily candles cover the extended session, 08:00–23:00 UTC (04:00–19:00 ET), not the regular session. A daily close is the last post-market print rather than the 16:00 ET closing auction, so it differs from the close quoted by most retail sources — usually by a few cents, in either direction depending on post-market drift. Intraday highs and lows matched Financial Modeling Prep's over the same sessions (measured Aug 2026). The prices are not wrong; the session boundary is different.
  • Volume is indicative only. Measured Aug 2026: across fifteen sessions of IBM, daily volume ranged from 45% to 106% of what Financial Modeling Prep reported for the same sessions, with no stable relationship to date, volume level, or bar age. The closing auction appears in some sessions and not others. That is two vendors disagreeing rather than proof either is wrong — but it is reason enough not to use this field for liquidity, participation, or turnover conclusions.
  • Fundamentals are a dated snapshot, not a live quote. get_fundamentals returns one row per symbol, stamped updated_at. Its current_price is that snapshot's price, and market_cap, pe_ratio and dividend_yield derive from it, so all four age together and can disagree with the latest close. Take a current price from get_candles.
  • Dividend rows carry four different dates. start and end filter effective_date, the ex-date, while declaration_date, record_date and payment_date sit in the row and fall in other months. dividend_type and frequency are not a controlled vocabulary — the same quarterly dividend appears as both CD and Regular, and its frequency as both 4 and Quarterly — so neither is safe to filter or group on.
  • Insider rows are filing legs, not trades. transaction_type takes SEC codes (P-Purchase, S-Sale, M-Exempt, F-InKind); an unrecognised value returns zero rows rather than an error, so a wrong code looks like a quiet period. Direction is acquisition_or_disposition, not transaction_type. price is 0 on exercises and grants, and a single vest expands into several rows, so both value and count are easy to misread.

Obtain an API key

  1. Visit the official London Strategic Edge data page.
  2. Follow the site's prompts to obtain your own API key.
  3. Store it with uvx lse-data-mcp login, which prompts without echoing and saves the key to the operating system's own credential store.

Never commit the key to this repository or put a real key in an issue, test, example, or log.

Requirements

  • A London Strategic Edge API key
  • Either uv, or Python 3.11 or newer

Installation

The buttons above configure Cursor and VS Code in one click; both still need a stored API key, below. The third installs a bundle into Claude Desktop, which collects the key itself — see Claude Desktop. For any other client, or to run the server by hand, install it yourself.

With uv there is nothing to install: uvx fetches the published package, runs it in a cached environment of its own, and brings its own Python. Store your key, then check it:

uvx lse-data-mcp login
uvx lse-data-mcp status

Whichever command you use here, use the same one in your MCP client below. Mixing uvx with a virtual environment means two different interpreters touch the credential store, which on macOS raises an extra Keychain prompt — see When the server cannot find your key.

Without uv, install the same release from PyPI with pip. Check your interpreter first: macOS ships an older python3 than this project supports, so that command often reports 3.9. Install a supported one with brew install python@3.13 and use it by name; on Windows, use py -3.13.

python3 --version               # must be 3.11 or newer
python3 -m venv .venv           # or python3.13 -m venv .venv
source .venv/bin/activate       # Windows: .venv\Scripts\activate
python -m pip install lse-data-mcp

Activating that environment is what puts lse-data-mcp on your PATH, and a client will need its absolute path rather than the bare uvx command.

Claude Desktop

The Install in Claude Desktop button above downloads a bundle that installs in one step, with no configuration file to edit. Two things it will not do for you:

  • Install uv first. Claude Desktop runs the bundle through uv and resolves it from your PATH rather than shipping its own copy. If the extension fails to start, this is the first thing to check.
  • Switch it on — and check it again after saving the key. The extension arrives disabled, and saving the API key can switch it off a second time. While it is off, Claude reports that no such connector is installed, or that it has disconnected; both look like a broken install and neither is. The toggle is under Settings → Extensions.

Claude Desktop prompts for your API key during installation and stores it itself, encrypted. A bundle install therefore never touches the operating system credential store and needs no login command.

The bundle is deliberately small — a manifest, a dependency pin, and a launcher that does nothing but call the installed package, around 2 KB packed. It contains no server code of its own: it pins one exact published version and in

Truncated for display — read the full file on GitHub.

Related Skills

View on GitHub
GitHub Stars3
CategoryFinance
Updated7d ago
Forks0

Languages

Python

Security Score

87/100

Audited on Aug 29, 2026

2 low