@pipeworx/amf-filings
Connect: https://pipeworx.io/mcp — every tool in the catalog, including @pipeworx/amf-filings’s. Install: one-click buttons
Connect to just the @pipeworx/amf-filings pack
https://gateway.pipeworx.io/amf-filings/mcp — only @pipeworx/amf-filings’s own tools, nothing else in the catalog.
No MCP client? Skip the connection: POST https://gateway.pipeworx.io/v1/tools/search_packs {"query":"..."} to find a tool below, GET /v1/tools/<name> for its schema, POST the same URL with arguments for the data — see For AI agents.
Tools: 2
French AMF-regulated company disclosures (résultats, franchissements de seuils, information privilégiée, rachats d’actions, etc.) from Info-financière, the French Officially Appointed Mechanism (OAM) — updated as the AMF publishes, not months behind like the community ESEF index.
Tools
amf_search_filings(company?, isin?, lei?, date_from?, date_to?, language?, limit?, offset?)— search disclosures by issuer (ISIN preferred, LEI often null, or free-text name) and/or a publication date window.date_tois INCLUSIVE (the last day you want included) — setdate_fromanddate_toto the SAME date for a single-day check. Returns the newest first.amf_get_filing(id)— fetch one disclosure by its Info-financière record id (uin_idt_uin), as returned byamf_search_filings.
Why this pack exists
esef-filings proxies filings.xbrl.org, a community index whose current-year
coverage for French issuers is effectively absent — a named external developer
(evaluating us for a weekly equity-analysis pipeline) hit this directly and
rejected the pack over it. Measured live 2026-09-23, before this pack existed:
France, ESEF index (filings.xbrl.org): 2023: ~ok 2024: ~ok 2025: near-zero
This pack goes to the primary source instead of the aggregator. Measured
freshness, 2026-09-23: the newest record in the dataset was timestamped
~1 minute before the query that found it. A date_from/date_to window of
“yesterday to today” reliably returns same-day filings — verified with a live
call against the deployed gateway (see workers/gateway/src/tool-examples.json
for the exact arguments used).
One call per day, not one call per issuer
company, isin, and lei are all optional. Omit them entirely and pass
only date_from/date_to to get every issuer’s filings for that window in
ONE call (paginate with limit/offset only if a single day’s market-wide
volume exceeds the 100-row cap) — verified live 2026-10-19. A design partner
doing a daily check across ~155 issuers was instead calling once per issuer
and exhausting a 50-credit-per-call allowance in ~35 calls (fleet #3300); the
date-window call is the cheap way to do that check.
⚠️ Six things a caller must know
- This is a document index, not an XBRL-facts API. Every row is a
disclosure EVENT: a title, an issuer, a publication timestamp, and a link
to the underlying PDF (occasionally an ESEF/XBRL package). There is no
per-fact extraction — no “give me net income for FY2025” lookup. Whether
filings.xbrl.org-shaped structured facts are reachable for these same issuers via this OAM was not verified while building this pack; treat it as a separate, open question, not a promise this pack makes. - LEI is frequently null.
identificationsociete_iso_cd_leiis populated on many but not all rows. ISIN (identificationsociete_iso_cd_isi) is far more reliable — prefer it as the join key. Do not build an LEI-only pipeline against this pack; a miss on LEI does not mean “no filings.” - Not scoped to France-domiciled issuers. The feed carries any issuer
that discloses through a French disseminator — this includes non-French
subsidiaries of French groups (e.g. Gabon-domiciled TotalEnergies EP
Gabon).
countryreflects the issuer’s own registered country in the AMF’s record, not “France” by default. companymatches the LEGAL name, not the trade name — with an automatic fallback. The AMF stores issuers under their registered legal name (e.g. “TELEVISION FRANCAISE 1”), andsearch()is token-based, not substring, so a trade-name query likecompany: "TF1"matches zero rows there even though 38 genuinely exist in the same window (verified live 2026-10-19, fleet #3300).amf_search_filingsnow retries against the disclosure TITLE when the legal-name search comes back empty, and the response carriesmatched_via: "title"pluscompany_resolved(the real legal name) when that is what found it — passisinwhen you have it to skip the fallback entirely.subtype_of_informationis normalised to a realnull. Some disseminators (307 in particular, 9,519 rows at last check) send the literal STRING"NULL"rather than an actual null. This pack converts any case-insensitive"null"string to a real null before returning it.date_tois INCLUSIVE of that whole UTC day. A one-day check setsdate_fromanddate_toto the SAME date; this pack handles the upstream’s own exclusive bound internally (querying one calendar day past it) and echoes the actual bound sent asupstream_date_to_exclusive. This used to not be true: a same-day window (date_from=date_to="2026-10-16") silently returned zero rows where 61 existed, because the upstream bound was passed straight through as an exclusive one — fixed 2026-10-20 (a paying customer running one-day ESEF checks across every issuer hit it directly). Adate_fromafterdate_tonow returnsempty_reason: "empty_window"with an explanatorymessageinstead of a bare zero.
Bilingual issuers file the same disclosure in French and English as two
separate rows (each with its own id) within the same minute —
amf_search_filings does not merge these; pass language to pick one
edition, or group results client-side on the returned language_pair_key
(company + type/subtype + publication minute).
Auth
Keyless. No account, no API key.
Data sources
- https://www.info-financiere.gouv.fr/api/explore/v2.1/catalog/datasets/flux-amf-new-prod/records
— Opendatasoft Explore v2.1 records API,
flux-amf-new-proddataset (500,000+ records at time of writing). This is the primary AMF disclosure flux, not a mirror or cache of it — Pipeworx queries it live on every call.
Gotchas
- The historic host
www.info-financiere.fr301-redirects every request towww.info-financiere.gouv.fr— this pack calls the.gouv.frhost directly to save the round trip. limitis capped at 100 by the upstream API (-1 <= limit <= 100); a higher value 400s rather than silently clamping. This pack clamps to 100 before the request goes out and reports the original value aslimit_clamped_fromin the response when it does, so the clamp is never silent.- ODSQL
whereclauses onuin_dat_amf(the filing timestamp) genuinely bind — verified live with a same-day-exclusion test — unlike the siblingesef-filingsdate-filter bug this pack was written to not repeat. search()on the company-name field is a loose token match (per ODSQL semantics), not an exact-name filter — a query for one issuer can surface a related entity with a similar name (e.g. a subsidiary). Preferisinwhen you have it.
Tools
- amf_search_filings — Search French AMF-regulated company disclosures (résultats, franchissements de seuils, information privilégiée, rachats d’actions, and similar) from Info-financière, the French Officially Appointed Me
- amf_get_filing — Fetch a single French AMF-regulated disclosure by its Info-financière record id (uin_idt_uin, e.g. “008731_20260923”) from amf_search_filings results. Returns the full shaped record — title, issuer, I
Tools
amf_get_filing— Fetch a single French AMF-regulated disclosure by its Info-financière record id (uin_idt_uin, e.g. 008731_20260923 ) from amf_search_filings results. Returns the full shaped record — title, issuer, ISamf_search_filings— Search French AMF-regulated company disclosures (résultats, franchissements de seuils, information privilégiée, rachats d'actions, and similar) from Info-financière, the French Officially Appointed Me