DataSinking

io.github.heubme2020Published by GitHub account heubme2020v0.2.17Updated Oct 24, 2026

Full-text financial reports (US, China, Japan, Korea, Taiwan, UK) as clean Markdown for RAG agents.

VerifiedStreamable HTTPWeb executableFinanceKnowledge & Memory

Overview

AI-generated overview

DataSinking gives an assistant full-text financial reports from the US, UK, China, Japan, Korea and Taiwan as clean Markdown, with section-level retrieval for…

What you can do
  • Discover coverage and companies: list exchanges with report counts, then list stocks on an exchange
  • List a company's reports by symbol or exchange plus stock code, with metadata and source attribution
  • Fetch a report's full Markdown text, or list its sections with size and estimated token counts
  • Pull a single section by keyword to save tokens, with block markers for citing paragraphs and tables
When to use it
Useful when an assistant needs to read or cite annual, semi-annual and quarterly filings from US and Asian markets, for example to extract figures, summarize MD&A or risk sections, or feed report text into a RAG pipeline.
Requirements
A DataSinking API key, sent as the Authorization bearer header or the DATASINK_API_KEY environment variable. Either the hosted endpoint at api.datasink.ing (HTTP, POST-only, stateless) or a local process via npx with Node 18+ or uvx/pip with Python 3.8+. Network access to the service.
Before you install
The API key is a secret; putting it in the URL query string instead of a header exposes it in logs and screen shares. Usage is metered in documents over a rolling 7-day window, and free keys share a pool, so bulk downloads such as a whole exchange need a paid key. Report text is fetched from third-party disclosure platforms and should keep its source attribution.

Installation

In SourceWeft

  1. Open DataSinking in the dashboard and add it to a workspace.
  2. Connect Authorization token credentials. They are stored privately and never shown on public pages.
  3. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.heubme2020%2Fdatasinking/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "datasinking": {
      "type": "http",
      "url": "https://api.datasink.ing/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_TOKEN>"
      }
    }
  }
}

README

DataSinking

[PyPI version] [MCP server]

Full-text financial reports across the US, Europe and Asia, as clean Markdown.

DataSinking serves full-text financial reports — annual, semi-annual and quarterly — from the US, China, Europe, Japan, Korea and Taiwan as clean Markdown, ready for LLM reading and RAG. Query by FMP-style symbol (AAPL, 600519.SS, 7203.T, 005930.KS, 2330.TW) or filter by exchange, report period, or section — pull just the MD&A / risk section instead of the whole filing, saving tokens. Every figure is traceable to its source disclosure and block. Reports are sourced from official disclosure platforms and parsed into structured Markdown with YAML frontmatter, preserved headings, paragraphs and tables.


MCP server

Ship DataSinking to any AI agent (Claude / Cursor / Codex / Devin Desktop / n8n) as an MCP server — 8 tools: list exchanges, list stocks, list reports, fetch a report, list sections, fetch one section (token-friendly for RAG), request a full backfill of a stock (idempotent — returns the current status if already queued), check a backfill's progress.

Hosted — nothing to install

One URL, no package, no Python, no local server. Most clients take this shape:

json
{  "mcpServers": {    "datasinking": {      "type": "http",      "url": "https://api.datasink.ing/mcp",      "headers": { "Authorization": "Bearer YOUR_KEY" }    }  }}

Claude Code, in one line:

bash
claude mcp add --transport http datasinking https://api.datasink.ing/mcp \  --header "Authorization: Bearer YOUR_KEY"

A client that can't set a header can put the key in the URL instead — https://api.datasink.ing/mcp?apikey=YOUR_KEY — but only do that when you must: a key in a URL ends up in logs and screen shares, and no client can redact it.

Two clients don't fit the shape above: Codex's config is TOML, and Devin Desktop's remote field is serverUrl, not url. Per-client files: docs/mcp/.

Local — run it yourself

If you'd rather keep everything on your own machine, there are two identical builds — pick whichever runtime you already have:

Node 18+ (no Python needed):

json
{  "mcpServers": {    "datasinking": {      "command": "npx",      "args": ["-y", "datasinking-mcp"],      "env": { "DATASINK_API_KEY": "YOUR_KEY" }    }  }}

Python 3.8+:

bash
pip install "datasinking[mcp]"datasinking-mcp          # requires DATASINK_API_KEY (free at https://datasink.ing)

Then use command: datasinking-mcp in your client.

Both run the same eight tools with the same schemas — npm/ and datasinking/mcp_server.py are kept in lockstep by check_mcp_parity.py.

Full per-client setup: mcp-server.md (overview) · docs/mcp/ (one guide per client).

The hosted endpoint is POST-only and stateless — GET /mcp returns 405, and no session id is issued. Most clients read MCP config at launch, so restart one after changing its config.

[DataSinking MCP in Claude]

What this repo is

Examples, research and tutorials showing how to work with financial report data, including reproducing the presentation styles found in financial-report research papers.

datasinking/├── examples/     # Example scripts: pull data from the API and analyze it├── research/     # Research notes / blog posts (reproducing paper-style presentation)├── datasinking/  # Python client + MCP server — pip install "datasinking[mcp]"├── npm/          # The same MCP server on npm — npx -y datasinking-mcp (Node 18+)├── r-datasinking/  # R client — remotes::install_github("heubme2020/datasinking", subdir="r-datasinking")├── docs/mcp/     # Per-client MCP setup — Claude Code, Desktop, Cursor, Codex, WorkBuddy, Devin…├── mcp-server.md # MCP server overview — endpoint, per-client table, tools, troubleshooting├── llm-examples.md  # Ask an LLM — no code needed (10 end-to-end examples)├── api-examples.md  # 8 examples × 3 interfaces (curl / Python / LLM)└── README.md

Per-client MCP guides — one file each, with the exact config path, both scopes, verification and the errors that client actually produces:

ClientGuide
Claude Codedocs/mcp/claude-code.md
Claude Desktopdocs/mcp/claude-desktop.md
OpenAI Codex CLIdocs/mcp/codex.md
WorkBuddy / CodeBuddydocs/mcp/workbuddy.md
Doubao Work / 豆包工作docs/mcp/doubao.md
Cursordocs/mcp/cursor.md
DeepSeek Harness (dsh)docs/mcp/deepseek.md
Devin Desktopdocs/mcp/windsurf.md
OpenCodedocs/mcp/opencode.md
Qoderdocs/mcp/qoder.md
Reasonixdocs/mcp/reasonix.md

Quick start

  1. Get an API key at datasink.ing
  2. One line (FMP-style ?apikey=):
bash
curl "https://api.datasink.ing/documents?symbol=600519.SS&with_content=1&apikey=YOUR_KEY"

Or in Python:

bash
pip install datasinking
python
from datasinking import DataSinking
ds = DataSinking("YOUR_KEY")for r in ds.get_stock_reports("600519.SS", limit=3):    print(r["report_period"], r["title"], len(r["content"]), "chars")

The full reference (curl / Python / LLM): api-examples.md.

Ask an LLM (no code)

Don't want to write code? Point any LLM at datasink.ing, give it your API key, and ask in plain language. See llm-examples.md for ten end-to-end examples — explore coverage, list a company's reports, and extract a figure with correct units.

RAG frameworks

Official integrations load reports straight into LlamaIndex, LangChain, or Haystack — one import, one call:

python
from datasinking.llama_index import DataSinkingReaderdocs = DataSinkingReader(api_key="YOUR_KEY").load_data("AAPL", doc_type="annual")
from datasinking.langchain import DataSinkingLoaderdocs = DataSinkingLoader(api_key="YOUR_KEY", symbol="AAPL").load()
from datasinking.haystack import DataSinkingFetcherdocs = DataSinkingFetcher(api_key="YOUR_KEY", symbol="AAPL").run()["documents"]

Pass split_by_section=True to load one Document per section (token-friendly for RAG). Each Document's metadata keeps the official disclosure source. Install the client with pip install -U datasinking; each framework is an optional dependency you install separately.

Examples (examples/)

FileWhat it does
01_quickstart.pyThe core functions: list exchanges / stocks / reports / fetch a report / fetch a stock's reports
02_download_company.pyDownload a company's full reports to local Markdown files
03_download_exchange.pyDownload an entire exchange's reports (all stocks) to local Markdown files
rag_ingest.pySlice reports into RAG chunks (on the <!-- ds:block:N --> anchors, with source traceability) and ingest into a vector store

Every example pulls from the live API and runs as-is.

03_download_exchange.py fetches every report on an exchange (e.g. all of Shenzhen — 150k+ documents). Quotas count documents, not requests, over a rolling 7-day window: a free key gets 3 req/s and 8,191 documents per 7 days, inside a pool of 524,287 per 7 days shared by all free users and website visitors. A whole exchange will therefore take well over a week on a free key — a paid (yearly) key (31 req/s, 524,287 documents per 7 days) is strongly recommended.

Research (research/)

research/ hosts research notes and blog posts, each based on DataSinking data with the source cited. You can reproduce charts and presentations found in financial-report research papers, e.g.:

  • Long-term revenue / profit trends
  • Industry comparison and distribution
  • Time series of financial metrics

Start from research/TEMPLATE.md.

Data overview

CoverageUS (NYSE / NASDAQ / OTC) · China (SSE / SZSE / BSE) · Europe (ESEF) · Japan (TSE) · Korea (KOSPI / KOSDAQ) · Taiwan (TWSE / TPEx)
Document typesannual / semiannual / q1 / q3 / amendment
Update frequencyDaily — US/Korea/Japan via official SEC EDGAR / DART / EDINET APIs (new filings within ~24h of publication)
FormatFull-text Markdown (with YAML frontmatter)
APIREST — GET /documents, batch download, with_content=1 for full text, ?section= + /sections for chapter-level access, POST /feedback for full backfill of a stock's filings
SymbolsFMP style: AAPL / 600519.SS / 7203.T / 005930.KS
Auth?apikey= query parameter (FMP style)

Data source

Reports are sourced from the official regulatory disclosure platform of each market and converted in-house to clean Markdown:

MarketSourcePlatform
US (bare ticker, e.g. AAPL)SEC EDGARUS Securities and Exchange Commission — sec.gov/edgar
China A-shares (.SS .SZ .BJ)巨潮资讯网 cninfoCSRC-designated disclosure platform
EuropeESEFEuropean Single Electronic Format — filings.xbrl.org
Korea (.KS .KQ .KN)DARTFinancial Supervisory Service — opendart.fss.or.kr
Japan (.T)EDINETFinancial Services Agency — disclosure2.edinet-fsa.go.jp
Taiwan (.TW .TWO)公開資訊觀測站 MOPSTaiwan Stock Exchange — mops.twse.com.tw

Every document also carries a source field in the API response, so the attribution travels with the data. Please keep it when you redistribute.

How to cite

If you use DataSinking in a paper, add a data-availability note (and, optionally, an acknowledgment).

Data availability:

Full-text financial reports (annual, semi-annual, and quarterly filings across the US, China, Europe, Japan, Korea, and Taiwan) were obtained from DataSinking (https://datasink.ing) in Markdown format.

BibTeX:

bibtex
@misc{datasinking2026,  author       = {{DataSinking}},  title        = {{DataSinking: Full-text financial reports as Markdown}},  year         = {2026},  howpublished = {https://datasink.ing},  note         = {Accessed: 2026-10-27}}

DataSinking provides report text, not investment advice.

Affiliate

Earn $7 every purchase for every customer you refer — recurring, PayPal, $31 minimum withdrawal: datasink.ing/affiliate

License

MIT

Source: README.md at commit 8b5663c

Tools

6

list_exchanges

List exchanges

List the exchanges DataSinking covers. Returns exchange codes (bj / br / by / jpx / koe / ksc / lk / lse / nasdaq / np / nyse / otc / pk / rs / sse / szse / tpex / twse) with the number of reports available per exchange. Call this first to discover coverage. Sources: US = SEC EDGAR, A-shares = cninfo.com.cn, Japan = EDINET, Korea = DART, Taiwan = MOPS, UK = FCA NSM, Nepal = NEPSE, Brazil = CVM, Belarus = ЕПФР, Sri Lanka = CSE, Pakistan = PSX, Serbia = SEC register.

Takes no parameters.

list_stocks

List stocks

List the stocks on one exchange, including the report count per company.

Parameterslimitexchangerequired

list_reports

List reports

List a company's reports — metadata only (id, title, period), no body text. Each item carries a `source` field naming the official disclosure platform; keep that attribution when you cite it. Look up by `symbol` (FMP-style, e.g. AAPL / 600519.SS / NABIL.NP) or by `exchange` + `stock_code` (from list_stocks) for markets whose codes aren't ticker-shaped (e.g. Brazil CNPJ, Sri Lanka 'AAA.N0000').

Parameterssizesymboldoc_typeexchangestock_code

get_report

Get report

Fetch one report's full text (metadata + Markdown body). The `source` field names the official disclosure platform; keep that attribution when you cite it. Expensive in tokens — prefer get_section when you only need one chapter. Content is annotated with block markers (`<!-- ds:block:N -->`) so you can cite a specific paragraph or table.

Parametersdocument_idrequired

list_sections

List sections

List every section of a report with its size, before you decide what to pull. Returns `sections` (titles, in order) plus `section_details` — same order, one entry per section with `title`, `has_tables`, `chars` and `estimated_tokens`. Use `estimated_tokens` to avoid pulling a chapter that would blow your context, and `has_tables` to know whether the chapter needs special handling (tables are the part RAG pipelines usually get wrong). Then call get_section with a heading keyword — the headings are in the report's own language.

Parametersdocument_idrequired

get_section

Get section

Fetch only one section of a report by keyword — much cheaper than get_report, best for RAG. Content is annotated with block markers (`<!-- ds:block:N -->`) so you can cite a specific paragraph or table.

Parameterssectionrequireddocument_idrequired

Version history

6
  1. v0.2.17LatestOct 13, 2026
  2. v0.2.14Oct 4, 2026
  3. v0.2.13Sep 27, 2026
  4. v0.2.10Sep 22, 2026
  5. v0.2.8Sep 22, 2026
  6. v0.2.2Sep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts