HKEx Filings

com.ascent-partners由 ascent-partners.com 發布官方發布者v2.4.3更新於 Nov 4, 2026

Live HKEx (Hong Kong Stock Exchange) regulatory filings for AI agents.

發布方自己的服務:Coso Mcp

已驗證Streamable HTTP可網頁執行網頁搜尋與抓取金融知識與記憶

概覽

AI 產生的概覽

以唯讀方式存取港交所即時申報文件:依日期區間搜尋、瀏覽分類統計,並下載文件擷取內文與表格。

可以做什麼
  • 在最多 31 天的日期區間內搜尋港交所即時申報文件,可依股票代號、標題、類別或公司名稱篩選
  • 不下載文件即可瀏覽某個日期區間內的內容,回傳類別、文件類型與股票代號的數量統計
  • 依連結下載單一港交所文件,讀取、翻頁或搜尋擷取出的內文,並包含最多 30 個擷取表格
  • 回報閘道的版本、傳輸方式與硬性限制
適用情境
適合需要取得香港上市公司最新公告、中期或年度報告等監管文件的場合,用於研究、法遵查核或摘要,而不必自行撰寫爬蟲程式。
執行需求
可使用免 API 金鑰的遠端 Streamable HTTP 端點,或以 uvx 執行 PyPI 套件 hkex-filing-scraper 的本機 stdio 程序。需要能連線至港交所網路;本機擷取流程另需設定資料庫目標(例如 SQLite)。
安裝前請注意
工具被描述為唯讀,但 get_filing 會從港交所下載文件並擷取內文,取得內容來自第三方,應視為不可信。本機擷取程式會把文件寫入所設定的資料庫,並可執行全歷史流程;託管閘道不儲存資料。擷取資料的商業再散布受限,轉載前請查閱專案的法律條款。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 HKEx Filings,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/com.ascent-partners%2Fhkex-filings/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "hkex-filings": {
      "type": "http",
      "url": "https://hkex-listco-updates.ascent-partners.com/api/mcp"
    }
  }
}

README

HKEx Filing Scraper

An open-source scraper for 25+ years of HKEx regulatory filings — into any of nine databases, with full-text extraction, graph linking, and a read-only MCP server for AI agents.

[HKEx Filing Scraper — one scraper, many databases]

[CI] [MCP Registry] [Glama MCP] [GitHub Release] [PyPI] [Python 3.10+] [Docs] [MCP] [Ruff] [License: MIT]

Overview

The US has EDGAR full-text search. Japan has EDINET. Hong Kong has a search form that returns one page at a time. There is no bulk, machine-readable, full-text corpus of HKEx filings. This builds one.

An open-source Python tool that scrapes 25+ years of Hong Kong Stock Exchange (HKEx) regulatory filings and ingests them into any combination of nine databases — with full-text and table extraction, chunk-level coverage, optional graph linking, and a read-only MCP server so AI agents can query the corpus or the live site.

It speaks the undocumented HKEx JSON API directly, which is faster and more resilient than driving a browser.

Vendors & Integrations

Databases — nine first-class destinations, in documented popularity order (see the support matrix):

  • PostgreSQL — production-grade open-source relational
  • MySQL / MariaDB — GPL relational servers, one driver
  • SQLite — zero-server file database, no install needed
  • MongoDB — document database
  • Neo4j — property-graph database
  • ClickHouse — columnar analytics engine
  • DuckDB — in-process analytical engine
  • SurrealDB — multi-model graph + document database

AI clients — any MCP-capable agent; ready-made configuration for Claude, ChatGPT, Cursor, VS Code/Copilot, Gemini CLI, opencode, Manus, and Perplexity.

Available on — PyPI · Glama · MCP Registry · hosted gateway.

Two Ways to Use It

Hosted MCP gatewayLocal pipeline
WhatA public endpoint you point an AI agent atThe hkex-scraper CLI
SetupNone — paste a URLpip install + one environment variable
DataLive from HKEx, nothing storedStored in your database(s)
DocsLive MCP gateway · AI agent supportGetting started

[Example: install, scrape filings into SQLite, then query the hosted MCP gateway from an AI agent]

Use the Hosted MCP Gateway

POST, Streamable HTTP, no API key:

text
https://hkex-listco-updates.ascent-partners.com/api/mcp

Four read-only tools: get_server_info, search_filings (a window of at most 31 days, with optional stock-code, title, document-type, category, and stock-name filters), list_filing_facets (browse what a window contains), and get_filing (downloads one document and extracts its text and tables).

[Two ways to reach HKEx filings from an AI agent: the hosted MCP gateway or the local stdio server]

Point a client at it — for example opencode:

json
{  "$schema": "https://opencode.ai/config.json",  "mcp": {    "hkex-live": {      "type": "remote",      "url": "https://hkex-listco-updates.ascent-partners.com/api/mcp"    }  }}

Then ask:

text
Use hkex-live to list the filings published between 2026-09-01 and 2026-09-18,then summarise the interim report.

Ready-made configuration for Claude, ChatGPT, Cursor, VS Code/Copilot, Gemini CLI, opencode, Manus, and Perplexity is in AI agent support — and for a stored corpus, the stdio MCP server exposes a wider tool catalog and is published on Glama. The gateway is listed in the official MCP Registry as com.ascent-partners/hkex-filings.

Featured on Glama — the read-only stdio MCP server is also published on Glama, where Glama scans the built server and scores tool-definition quality (currently 4.7/5).

Quick Start (≤ 5 minutes)

Fastest path: no install — use the hosted gateway at https://hkex-listco-updates.ascent-partners.com/api/mcp (Streamable HTTP), or install and run locally:

bash
pip install hkex-filing-scraper        # core; SQLite needs no serverpip install "hkex-filing-scraper[all]" # Excel + dotenv + every driver + the MCP servercp .env.example .env                   # then set DATABASE_TARGET (below)hkex-scraper --metadata-only --limit 100

Optional extras: excel, postgres, mysql, duckdb, mongodb, clickhouse, neo4j, mcp, pdf, all, dev.

DATABASE_TARGET is an ordered, comma-separated list of sink ids; the order decides which sink serves reads. To start with no server:

ini
DATABASE_TARGET=sqliteSQLITE_PATH=hkex.db

hkex-scraper runs the full pipeline (metadata + documents + graph); hkex-scraper --full-history covers everything since April 1999. The schema is created automatically. Full install options and per-sink settings are in Getting started.

Database Support

Every sink is a first-class destination; rows are in documented popularity order. The full matrix — licenses, capability differences, per-engine notes — is in Database sinks.

SinkModelLicenseExtraIdempotent upsert
postgresrelationalPostgreSQL LicensepostgresON CONFLICT DO UPDATE
mysql / mariadbrelationalGPLv2mysqlON DUPLICATE KEY UPDATE
sqliterelationalPublic domain—ON CONFLICT DO UPDATE
mongodbdocumentSSPL¹mongodbupdate_one(upsert=True)
neo4jgraphGPLv3 (Community)neo4jMERGE
clickhousecolumnarApache-2.0clickhouseReplacingMergeTree + read-merge
duckdbrelationalMITduckdbON CONFLICT DO UPDATE
surrealdbgraph + documentBSL 1.1¹—UPSERT / RELATE

¹ Source-available, not OSI-approved — labeled exceptions per ADR 0003.

Valid sink ids, in documented order: postgres, mysql, sqlite, mongodb, mariadb, neo4j, clickhouse, duckdb, surrealdb. Set one variable and the same run feeds every sink:

ini
# Order sets read precedence.DATABASE_TARGET=postgres,sqlitePOSTGRES_DSN=postgresql://user:password@localhost:5432/hkexSQLITE_PATH=hkex.db

How This Compares

Four ways to get HKEx filings, and what each one costs you.

This projectHKEXnews web searchBrowser automation you writeLicensed HKEx feed
Bulk exportYesNo — page-at-a-timeYesYes
History to April 1999YesYes, manuallyDepends on your codeYes
Full text of documentsExtracted from PDF/HTML/ExcelNo — you open each fileYou build the extractorVaries by contract
Structured tablesExtracted to MarkdownNoYou build itVaries
Coverage verificationPer-chunk, auditableNot applicableYou build itVendor SLA
Lands in your engine9 engines, any combinationNoWhatever you wire upUsually one format
SpeedJSON API, no browserManualSlower — renders pagesFast
CostFree, MITFreeYour timeSubscription
Commercial redistributionSee docs/legal.mdRestrictedRestrictedLicensed

If you need licensed, redistributable, SLA-backed data, buy the feed. If you need a complete local corpus for research, compliance, or RAG, this replaces the pipeline you would otherwise write yourself.

How It Works

mermaid
flowchart LR    A[HKEx JSON API] --> B[Phase 1: metadata]    B --> C[Canonical record]    C --> D{DATABASE_TARGET}    D --> E[(PostgreSQL)]    D --> F[(MySQL / MariaDB)]    D --> G[(SQLite)]    D --> H[(MongoDB)]    D --> I[(Neo4j)]    D --> J[(ClickHouse)]    D --> K[(DuckDB)]    D --> L[(SurrealDB)]    B --> M[Graph linking]    M --> D    B --> N[Phase 2: download and extract]    N --> C
  • Phase 1 scrapes filing metadata through a JSF session, splitting the range into monthly chunks and deduplicating on a 16-character MD5 filingId.
  • Phase 2 downloads each filing's PDF/HTML/Excel document, extracts text and tables to Markdown, and writes the payload.
  • Graph linking (optional) writes has_filing and references_filing edges when COMPANY_TABLE is set.
  • Failure isolation — a failure on one sink is logged and counted but never blocks another; the run exits non-zero if any configured sink failed.

Deeper detail: Architecture · ADR 0002.

HKEx API session

mermaid
sequenceDiagram    autonumber    participant C as hkex-scraper    participant J as HKEx site (JSF)    participant A as HKEx JSON servlet    C->>J: GET /search/titlesearch.xhtml    J-->>C: HTML + javax.faces.ViewState    C->>J: POST form (from/to dates + ViewState)    C->>A: GET /search/titleSearchServlet.do (rowRange paging)    A-->>C: JSON page of filings    Note over C: generate_monthly_chunks() splits ranges > 1 month    C->>C: dedupe on 16-char MD5 filingId

Data model

mermaid
erDiagram    COMPANY ||--o{ EXCHANGE_FILING : has_filing    EXCHANGE_FILING ||--o{ DOCUMENT : has_document    EXCHANGE_FILING ||--o{ EXCHANGE_FILING : references_filing    EXCHANGE_FILING ||--o{ SCRAPE_COVERAGE : chunk_of    EXCHANGE_FILING {        string filingId "16-char MD5"        string stockCode        string title        datetime dateTime    }    DOCUMENT {        text documentText        array documentTables    }    SCRAPE_COVERAGE {        int apiCount        int ingestedCount        int uniqueCount        string runId    }

exchange_filing and scrape_coverage are SCHEMAFULL; has_filing / references_filing are the graph edges written by graph.py.

Sink contract and read routing

mermaid
flowchart LR    CANON["canonical record<br/>per filing / document / coverage / edge"] --> DISPATCH["dispatch to every configured sink"]    DISPATCH --> S1["sink A"]    DISPATCH --> S2["sink B"]    DISPATCH --> SN["sink N"]    S1 -.->|error| LOG["logged + counted<br/>never blocks the others"]    READ["reads: pending filings · tickers · titles · coverage"] --> FIRST["first configured sink<br/>whose capabilities include reads"]    DISPATCH --> EXIT["sink_exit_code()<br/>non-zero if any sink failed"]

Features

  • Fast API scraping — direct HKEx JSON API; no browser or Selenium.
  • Full history — every filing from April 1999 to today, with chunk-level coverage checks.
  • Document processing — PDF/HTML/Excel text and structured tables, extracted to Markdown.
  • Multi-sink — any ordered combination of nine databases, each with native idempotent upserts.
  • AI-ready — a hosted live MCP gateway plus a local stdio MCP server.
  • Resumable and observable — batching, parallel downloads, stalled-job detection, per-sink counters, and --coverage-report / --parity-report / --verify.
  • Optional dependencies — the core is requests + beautifulsoup4; drivers and document extraction are extras with graceful fallbacks.

Documentation

Development

bash
pip install -e ".[dev,all]"ruff check           # lint (py310, line-length 100)ruff format --check  # formattingpytest               # unit tests (no DB or network required)

Tests are pure unit tests; SQLite and DuckDB contract tests run in-process, and integration tests that need a server are skipped unless that sink is configured. See Testing.

CI and deployment run through the APG workbench pipeline.

The deploy smoke check probes the public hostname through the balancer, not a local port.

Contributing

See CONTRIBUTING.md; report security issues per SECURITY.md. Ideas and questions are welcome in Discussions.

Built by Ascent Partners.

If this saves you time, a ⭐ on GitHub helps others find it.

Use with Context7

Up-to-date HKEx Filing Scraper documentation is indexed on Context7, so coding agents can pull it into context on demand. With the Context7 MCP server or ctx7 CLI installed, name the library in your prompt:

text
use library /simonmak-ascent/hkex-filing-scraper for API and docs

License

MIT — see LICENSE. That covers this project's code only; optional dependencies carry their own licenses, notably the pdf extra (PyMuPDF / pymupdf4llm), which is AGPL-3.0 and deliberately excluded from .[all]. See docs/legal.md.

Data & Terms of Use: this is a research tool for the undocumented HKEx JSON API, and it is not affiliated with or endorsed by HKEx. Commercial redistribution of HKEx data may require a licensed HKEx feed; see docs/legal.md.

來源:README.md,提交 75b7d61

工具

4

get_server_info

Gateway Info

Report this live gateway's version, transport, and hard limits. Reads nothing.

無需輸入參數。

search_filings

Search HKEx Filings

Search live HKEx filings in a date window (at most 31 days). ``from_date``/``to_date`` accept YYYY-MM-DD or DD/MM/YYYY. All filters are optional and combine with AND semantics: ``stock_code`` matches exactly (e.g. ``01461`` or ``1461``); ``title_query``, ``category`` and ``stock_name`` are case-insensitive substrings (e.g. category ``Dividend``); ``document_type`` matches the file type exactly (e.g. ``PDF`` or ``HTML``). Filters are applied to the fetched window, so widen ``max_results`` to catch rarer matches. ``max_results`` caps the number of filings fetched and returned (hard cap 200). Returns the matching filings — each carrying ``fileType``, ``sizeText``, ``category`` and ``newsId`` metadata — plus the HKEx-reported total for the window. Use list_filing_facets first to see which categories, types and codes exist in a window.

輸入參數to_date必填categoryfrom_date必填stock_codestock_namemax_resultstitle_querydocument_type

list_filing_facets

Browse Filing Facets

Browse what filings exist in a date window (at most 31 days) without downloading. ``from_date``/``to_date`` accept YYYY-MM-DD or DD/MM/YYYY. Returns counts of the categories (headline categories), document types, and stock codes present in the window, each sorted by frequency and capped at 50 values, plus the distinct counts. Optionally narrow to one ``stock_code``. Use this to discover valid filter values before calling search_filings; it fetches the window once and extracts no document text.

輸入參數to_date必填from_date必填stock_codemax_results

get_filing

Read HKEx Filing

Download one HKEx document by its URL and read, page through, or search its text. ``link`` must be an HKEx document URL from search_filings (host ``www1.hkexnews.hk``); any other host is rejected. With ``extract=True`` (default) the response includes up to 30 ``tables`` and a window of extracted ``document_text``: ``max_chars`` characters starting at ``offset``. Long reports return ``next_offset``; call again with it to read the next window. Pass ``query`` to search the whole document instead: the response then lists up to 20 case-insensitive matches with their offsets and surrounding text, plus ``match_count`` — use a match offset to read that part. Set ``extract=False`` for size and content type only.

輸入參數link必填queryoffsetextractmax_chars

版本歷史

1
  1. v2.4.3最新Oct 14, 2026

評分

已滿足適用檢查項的 100%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

其他 Ascent-Partners 整合