AStockEvent
by astockevent.com · remote · no sign-in to list tools · v0.1.0 · published by com.astockevent
A-share filings: reductions, penalties, regulatory letters and stock halts. Source-linked facts.
8 tools: 4 change things and 4 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things4Claude Code: ask: see these tools
- Only reads4Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http astockevent https://astockevent.com/mcp/Findings
Matches of fixed checks, with the text they matched.
The description is 2,337 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...n_` to get_filing_parsed for text, and note that step does have a recency window."
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
8 tools
Changes things 4Claude Code: ask
get_entity_stateReturn what is true RIGHT NOW about one A-share listed company or one shareholder entity, folded from its regulatory filings: pending and executed share-reduction plans, administra…No findings
Why it is in this group
- The name "get_entity_state" says "get": a word for reading.
- The input takes a statement or command to run (input.code), which can change anything it can reach.
Description, as the server wrote it Return what is true RIGHT NOW about one A-share listed company or one shareholder entity, folded from its regulatory filings: pending and executed share-reduction plans, administrative-penalty proceedings, and exchange inquiry letters. Call this when you need the current situation of a specific subject — for example 'is this shareholder still selling', 'is this company under investigation', 'has it replied to the inquiry letter'. Do NOT call this to find out what happened across the market recently — use scan_recent_events or whats_new for that. Do NOT pass both (code, market) and aent_; pick one addressing mode. Read the response in this order and stop at the first match: (1) found=false -> we do not cover this security/entity, do not retry; (2) visibility='hidden_unverified' -> the entity exists but its identity is not human-verified, so its name is withheld; query by code+market instead; (3) resolved_as='listed_company' -> your aent_ denoted the company itself and the request was redirected, use the returned code/market; (4) has_events=false -> the security EXISTS but had no covered filings in the covered period (this is the common case, ~85% of valid lookups) — report 'no filings in period', never 'company not found'; (5) companies=[...] -> a shareholder active across one or more companies, read each entry; (6) otherwise the state machines apply to that one company. Fields that separate 'did not happen' from 'we do not know' are load-bearing: current_holding_reason, window_status ('expired_no_closure' = the plan window lapsed with no closing filing), entity_link, entities_status, plan_pairing ('unresolved' = several open plans and we refuse to guess the pairing), and unclassified_count. Never collapse them into 'nothing there'. Values are objective extractions with a source PDF link; we never rate, score or attribute.
list_company_filingsList the most recent filings of ONE listed company: title, date, a direct link to the source PDF, and — where we have it — the structured extraction that filing produced.No findings
Why it is in this group
- The name "list_company_filings" says "list": a word for reading.
- The input takes a statement or command to run (input.code), which can change anything it can reach.
Description, as the server wrote it List the most recent filings of ONE listed company: title, date, a direct link to the source PDF, and — where we have it — the structured extraction that filing produced. Call this to answer 'what has this company filed lately' and 'give me the original document', which is what most callers actually want before any analysis. This is the widest view we offer: it covers EVERY filing we hold for the company, not just the ones we extract. Do NOT use it to ask what a case or a plan currently amounts to — it returns documents in date order, not folded state; get_entity_state does that. Do NOT use it to sweep the market for one filing type across companies (scan_recent_events), and do NOT page through it for bulk export: it has no cursor and stops at 50 rows per call. Read with_extraction: most filings have none, because we extract a focused set of filing types — call list_coverage for the ones we support today. `extraction: null` means we have not extracted that filing — it never means the filing is unimportant. When extraction is present, pass its aevt_ to get_event_with_context for the full case timeline. Titles are returned in the original Chinese, unchanged — translating a filing title would be rewriting the fact. There is no cursor: this is a recent-filings view, not a bulk export. `published_at` is null for most filings: it is present only when the source itself supplied a timestamp, and we do not substitute our own collection time for it. Use ann_date, which is always present, for the filing date.
scan_recent_eventsDiscover one filing event type across companies using linked filing dates within the last seven Beijing calendar days including today.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Discover one filing event type across companies using linked filing dates within the last seven Beijing calendar days including today. Dates omitted use this whole window; one omitted end uses the corresponding allowed boundary. Partial overlap is clamped; reversed or wholly outside dates are errors. effective_since/effective_until report the actual dates. A new filing mentioning an old case qualifies without claiming new case progress. Call this for market-wide recent filings. Do NOT use it for a full company state. Each event appears once, newest matching filing date first. matched_filing contains the qualifying filing id, date and its own PDF link; root source_pdf_url and phase describe current event context, not historical state at the selected date. phase filters current stage. At most 100 events per page. Pass cursor to continue; only non-null cursor means another page. Omit dates/phase on continuation or repeat their effective values; changing filters requires a fresh call. event_type must remain the same; limit/locale may change. matched_count counts the whole frozen window, so truncated can remain true on the last page. Windows that move outside the allowed dates fail with cursor_expired; restart without cursor. Results are a dynamic view, not a snapshot: new filings, stage changes or merges can move events between pages. Poll from the first page and deduplicate by aevt_. Empty results mean no matches after this position, not an empty database. coverage_since is data coverage, not permission to scan history. For a known company/entity use get_entity_state; for a known event use get_event_with_context.
whats_newDiscover events with a linked filing dated within the last seven Beijing calendar days including today, and updated in the last seven days.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Discover events with a linked filing dated within the last seven Beijing calendar days including today, and updated in the last seven days. A new filing may mention an old case; this does not imply new case progress. matched_filing gives the filing date and PDF that qualified the event; root source_pdf_url, phase and payload describe current event context. announce_ts remains the original first disclosure. Call this to follow recent disclosures. Do NOT use it for unrestricted history. Poll from the top and deduplicate event ids. To page backwards pass both cursor and cursor_aevt verbatim; these use processing time, not filing dates. Old cursors restart at the current window with clamped=true. Concurrent updates can move results between pages. end_of_window=true means no further results, including an empty first call; empty results are successful and do not prove the database is empty or ingestion is healthy. fallback_recent is always false: history never fills an empty window. Use a known company, entity or event for historical context.
Only reads 4Claude Code: allow
get_event_with_contextReturn one specific filing event together with its full timeline (every stage the case went through, each with its own source PDF) and which subject's state it changed.No findings
Why it is in this group
- The name "get_event_with_context" says "get": a word for reading.
Description, as the server wrote it Return one specific filing event together with its full timeline (every stage the case went through, each with its own source PDF) and which subject's state it changed. Call this after another tool handed you an event id and you need the whole thread rather than a one-line summary — for example to see how a penalty case progressed from filing to decision. Do NOT call this without an event id from a previous response: ids are opaque and cannot be guessed or constructed. Internal database identifiers are rejected. affects_state lets you jump back to get_entity_state. Its subjects[].aent_ may be null when entity resolution has not run yet or does not apply — in that case use the code and market from the same affects_state, which never depends on entity resolution. If the id is unknown you get found=false, which is an answer, not an error: do not retry.
get_filing_parsedReturn ONE filing already parsed for you: its available normalised text and its tables as structured cells.No findings
Why it is in this group
- The name "get_filing_parsed" says "get": a word for reading.
Description, as the server wrote it Return ONE filing already parsed for you: its available normalised text and its tables as structured cells. Call it after list_company_filings, with the `aann_` id that tool returned, when you need what a filing actually says rather than just its title and PDF link. This is the step your own pipeline would otherwise have to do: a filing PDF is a layout format, not a data format, so pulling clean text and real table cells out of it is where ad-hoc extraction usually goes wrong. Tables come back as rows of cells you can read directly, not as an image or a flattened blob. It serves ONE filing per call, whose date is at most seven days before the database current date (eight calendar dates including today). Older filings are not gone — the filing itself and its source PDF link stay available from list_company_filings for the company's whole history; only the parsed text is recent-only. When that is why you got nothing, `reason` says outside_parsed_window, which is a different answer from unknown_filing. Source coverage is limited: PDFs over 150 pages are parsed only through the first 30 pages; table coverage is limited above 50 pages. Use source links for the complete original. text_chars measures stored text, not source completeness. text_truncated=false or next_text_offset=null does not mean every PDF page was parsed. Stored text arrives in slices: read `text_chars` for the stored total and call again with `next_text_offset` until it is null. Do NOT use this to sweep a company or the market — it takes a single filing id and has no cursor. Read `text_unavailable` before trusting the text. Two of its values are properties of the source file — a scan with no text layer, or a font we cannot map to Unicode — and retrying those will not help. A third, parse_failed, means the failure is ours rather than the document's, and asking again later may well work. Either way the source links are still worth opening.
list_coverageReturn exactly what this server covers and the limits it enforces.No findings
Why it is in this group
- The name "list_coverage" says "list": a word for reading.
Description, as the server wrote it Return exactly what this server covers and the limits it enforces. Call this first, or whenever a query comes back empty and you want to know whether the filing type is even in scope, before concluding the data is incomplete. It takes no arguments and does not touch the database, so it works even when everything else is degraded. Coverage is deliberately narrow and expanding over time; the `event_types` list in the response is the authoritative answer, and stating it plainly is preferable to letting you discover the boundary by trial and error. Read `limits` instead of probing for the caps.
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 0.1.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http astockevent https://astockevent.com/mcp/Run in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__astockevent__get_event_with_context",
"mcp__astockevent__get_filing_parsed",
"mcp__astockevent__get_related_filings",
"mcp__astockevent__list_coverage"
],
"ask": [
"mcp__astockevent__get_entity_state",
"mcp__astockevent__whats_new",
"mcp__astockevent__scan_recent_events",
"mcp__astockevent__list_company_filings"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as astockevent. Review it before you use it.