DataSinking

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

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
90%
Naming quality
100%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,648Tokens (tool definitions)
~950 BTypical response size
Moderate attention impact (1.29% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "datasinking": {
      "command": "uvx",
      "args": [
        "datasinking"
      ]
    }
  }
}

Runnable packages

pypidatasinking0.2.17stdio
npmdatasinking-mcp0.2.17stdio

Remote endpoints

https://api.datasink.ing/mcpstreamable-http

What it can do

Tool inventory

Tools (8)

๐ŸŸข Read-only๐ŸŸก Write๐Ÿ”ด Deleteโšช Unknown
๐ŸŸข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, Europe = filings.xbrl.org (ESEF), Nepal = NEPSE, Brazil = CVM, Belarus = ะ•ะŸะคะ , Sri Lanka = CSE, Pakistan = PSX, Serbia = SEC register.

Input Schema

{
  "type": "object",
  "properties": {}
}
๐ŸŸขlist_stocks(exchange, limit)

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

Input Schema

{
  "type": "object",
  "properties": {
    "exchange": {
      "type": "string",
      "description": "Exchange code, e.g. bj / br / by / jpx / koe / ksc / lk / lse / nasdaq / np / nyse / otc / pk / rs / sse / szse / tpex / twse"
    },
    "limit": {
      "type": "integer",
      "description": "Return only the first N companies (default 20) to keep the response short.",
      "default": 20
    }
  },
  "required": [
    "exchange"
  ]
}
๐ŸŸขlist_reports(symbol, exchange, stock_code, doc_type, size)

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').

Input Schema

{
  "type": "object",
  "properties": {
    "symbol": {
      "type": "string",
      "description": "FMP-style symbol, e.g. AAPL / 600519.SS / 7203.T / 005930.KS / 2330.TW / NABIL.NP"
    },
    "exchange": {
      "type": "string",
      "description": "Exchange code (from list_exchanges). Use with stock_code when the code isn't ticker-shaped."
    },
    "stock_code": {
      "type": "string",
      "description": "Exact stock_code from list_stocks. Use with exchange."
    },
    "doc_type": {
      "type": "string",
      "enum": [
        "annual",
        "semiannual",
        "q1",
        "q3"
      ],
      "description": "Report type to filter on: annual / semiannual / q1 / q3. Defaults to annual. Pass semiannual for half-year reports, q1 / q3 for the quarterly reports.",
      "default": "annual"
    },
    "size": {
      "type": "integer",
      "description": "Number of reports to return (default 10).",
      "default": 10
    }
  }
}
๐ŸŸขget_report(document_id)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "document_id": {
      "type": "integer",
      "description": "Report id, from list_reports items[].id"
    }
  },
  "required": [
    "document_id"
  ]
}
๐ŸŸขlist_sections(document_id)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "document_id": {
      "type": "integer",
      "description": "Report id, from list_reports items[].id"
    }
  },
  "required": [
    "document_id"
  ]
}
๐ŸŸขget_section(document_id, 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.

Input Schema

{
  "type": "object",
  "properties": {
    "document_id": {
      "type": "integer",
      "description": "Report id, from list_reports items[].id"
    },
    "section": {
      "type": "string",
      "description": "Heading keyword. Matches the report's own headings, and also understands cross-market concepts โ€” MD&A / financial statements / notes / audit report / risk / governance (or their Chinese/Japanese/Korean equivalents) resolve to the right section in any market. Otherwise pass a heading in the report's language (A-share: ็ฎก็†ๅฑ‚่ฎจ่ฎบไธŽๅˆ†ๆž / ่ดขๅŠกๆŠฅๅ‘Š; English filings: \"MD&A\" / \"financial statements\" / \"notes\"). If nothing matches, the API returns 404 with the real headings โ€” retry with one of those, or call list_sections first."
    }
  },
  "required": [
    "document_id",
    "section"
  ]
}
๐ŸŸกsubmit_feedback(exchange, stock_code)

Request a full backfill of a stock whose reports look missing or broken, and return its current status. Idempotent โ€” if the stock was already submitted recently (within the last 127 feedback records), it returns that existing status instead of queueing a duplicate; otherwise it queues a re-fetch from the IPO prospectus onward and returns status 'pending' plus the new id (poll get_feedback_status). Free keys: once per 3 seconds, 31 stocks per 7 days per key. Yearly keys: 3 per second, 8,191 stocks per 7 days per key.

Input Schema

{
  "type": "object",
  "properties": {
    "exchange": {
      "type": "string",
      "description": "Exchange code from list_exchanges."
    },
    "stock_code": {
      "type": "string",
      "description": "Stock code from list_stocks."
    }
  },
  "required": [
    "exchange",
    "stock_code"
  ]
}
๐ŸŸขget_feedback_status(feedback_id)

Check the progress of a submitted feedback request. status is one of pending / processing / done / failed.

Input Schema

{
  "type": "object",
  "properties": {
    "feedback_id": {
      "type": "integer",
      "description": "Feedback id returned by submit_feedback."
    }
  },
  "required": [
    "feedback_id"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded8 tools
verifiedversion not recorded6 tools
auth requiredversion not recordedโ€”
auth requiredversion not recordedโ€”
auth requiredversion not recordedโ€”
auth requiredversion not recordedโ€”