@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_to is INCLUSIVE (the last day you want included) — set date_from and date_to to 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 by amf_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

  1. 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.
  2. LEI is frequently null. identificationsociete_iso_cd_lei is 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.”
  3. 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). country reflects the issuer’s own registered country in the AMF’s record, not “France” by default.
  4. company matches 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”), and search() is token-based, not substring, so a trade-name query like company: "TF1" matches zero rows there even though 38 genuinely exist in the same window (verified live 2026-10-19, fleet #3300). amf_search_filings now retries against the disclosure TITLE when the legal-name search comes back empty, and the response carries matched_via: "title" plus company_resolved (the real legal name) when that is what found it — pass isin when you have it to skip the fallback entirely.
  5. subtype_of_information is normalised to a real null. 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.
  6. date_to is INCLUSIVE of that whole UTC day. A one-day check sets date_from and date_to to 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 as upstream_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). A date_from after date_to now returns empty_reason: "empty_window" with an explanatory message instead 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

Gotchas

  • The historic host www.info-financiere.fr 301-redirects every request to www.info-financiere.gouv.fr — this pack calls the .gouv.fr host directly to save the round trip.
  • limit is 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 as limit_clamped_from in the response when it does, so the clamp is never silent.
  • ODSQL where clauses on uin_dat_amf (the filing timestamp) genuinely bind — verified live with a same-day-exclusion test — unlike the sibling esef-filings date-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). Prefer isin when 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, IS
  • 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

Regenerated from source · build October 27, 2026