@pipeworx/mcp-emarket-storage 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,7 +5,7 @@ Italian regulated company disclosures direct from eMarket Storage (Teleborsa)
5
5
  built to fix the months-long lag in the community ESEF index for current-year
6
6
  Italian filings.
7
7
 
8
- Part of [Pipeworx](https://pipeworx.io) — an MCP gateway connecting AI agents to 1678+ live data sources.
8
+ Part of [Pipeworx](https://pipeworx.io) — an MCP gateway connecting AI agents to 1683+ live data sources.
9
9
 
10
10
  ## Tools
11
11
 
@@ -32,12 +32,13 @@ day as the query), with its PDF confirmed reachable (HTTP 200).
32
32
 
33
33
  1. **eMarket-covered issuers only — this is not the full Italian market.**
34
34
  Italy has a SECOND, separate OAM, **1INFO** (a different keyless JSON API
35
- covering roughly 314 issuers). An issuer discloses through exactly one of
36
- the two. Some well-known names are 1INFO issuers and will NOT be found
37
- here — confirmed 2026-09-23 by checking eMarket Storage's own ~480-company
38
- issuer picklist: neither **IREN** nor **SOMEC** appear in it. A company
39
- search that matches nothing returns an explanatory `note`, not a bare
40
- error, saying the issuer may be a 1INFO issuer instead. This pack does not
35
+ covering roughly 314 issuers — see `@pipeworx/oneinfo-storage`). An issuer
36
+ discloses through exactly one of the two. Some well-known names are 1INFO
37
+ issuers and will NOT be found here — confirmed 2026-09-23 by checking
38
+ eMarket Storage's own ~480-company issuer picklist: neither **IREN** nor
39
+ **SOMEC** appear in it. A company search that matches nothing returns an
40
+ explanatory `note`, not a bare error, pointing at `oneinfo-storage`'s
41
+ `oneinfo_search_disclosures` instead. This pack does not
41
42
  merge 1INFO data.
42
43
  2. **This is a document index, not an XBRL-facts API.** Every row is a
43
44
  disclosure EVENT: a title, an issuer, a publication timestamp, and a link
@@ -154,7 +155,7 @@ directly, instead of just this one's:
154
155
  }
155
156
  ```
156
157
 
157
- Both URLs reach the same gateway and the same 1678+ data sources. The
158
+ Both URLs reach the same gateway and the same 1683+ data sources. The
158
159
  only difference is which pack's tools are listed **directly**; `ask_pipeworx`
159
160
  reaches all of them from either one.
160
161
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pipeworx/mcp-emarket-storage",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Italian regulated disclosures direct from eMarket Storage (Teleborsa) — keyless, same-day-fresh.",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -24,5 +24,9 @@
24
24
  "devDependencies": {
25
25
  "typescript": "^5.9.3",
26
26
  "@cloudflare/workers-types": "^4.20260405.1"
27
+ },
28
+ "pipeworx": {
29
+ "sourceHash": "v1-9cd08b3a66a7a0a1867ef8c2c5b349e0c79c2b94745ba7a7bc75b30a3d0ca3a2",
30
+ "sourceCommit": "4fa4c64448be06f4a2ee4cee19f756f3558a7cad"
27
31
  }
28
32
  }
package/server.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.pipeworx-io/emarket-storage",
4
4
  "title": "Emarket Storage",
5
5
  "description": "Italian regulated disclosures direct from eMarket Storage (Teleborsa) — keyless, same-day-fresh.",
6
- "version": "0.1.0",
6
+ "version": "0.1.2",
7
7
  "websiteUrl": "https://pipeworx.io/packs/emarket-storage",
8
8
  "repository": {
9
9
  "url": "https://github.com/pipeworx-io/mcp-emarket-storage",
package/src/index.ts CHANGED
@@ -452,7 +452,42 @@ async function fetchWithTimeout(
452
452
  ),
453
453
  );
454
454
  }
455
- throw err;
455
+ // Fleet #2382. Everything that isn't a timeout/abort here is a genuine
456
+ // NETWORK-LEVEL failure — DNS resolution, connection refused, TLS handshake,
457
+ // Cloudflare's own "Network connection lost." — meaning `fetch()` itself
458
+ // threw and no HTTP response of any kind was ever received. Until this fix
459
+ // that raw exception was rethrown VERBATIM: a bare `TypeError: fetch failed`
460
+ // (or the Workers-runtime equivalent) names no upstream, carries no class
461
+ // token, and reads exactly like a defect in OUR code — because it says
462
+ // nothing about the call at all. It landed in `error`, the tier that means
463
+ // "Pipeworx has a defect", for every one of the (at the time of writing)
464
+ // ~470 packs that call this helper directly with no wrapper of their own.
465
+ //
466
+ // `dexscreener` hit this independently (fleet #1579) and fixed it with a
467
+ // bespoke per-pack try/catch around `fetchWithTimeout`. That fix is correct
468
+ // but only covers one pack; every other caller of this shared helper still
469
+ // leaked the raw exception. Moving the same fix HERE — the one place that
470
+ // already carries the timeout case — covers every pack that uses
471
+ // `fetchWithTimeout` without a wrapper, for free, and without widening
472
+ // `classifyToolError`'s regex list: the fix is giving the message a proper
473
+ // `upstream_down:` token at the point the two facts (no response was ever
474
+ // received, and which host we were trying to reach) are actually in hand,
475
+ // not teaching the classifier to guess from prose after the fact.
476
+ //
477
+ // Safe on the same grounds as the timeout branch above: no argument a
478
+ // caller passes can make `fetch()` itself throw a connection-level error,
479
+ // so this is always an availability failure, never a caller mistake. Same
480
+ // `markInternalOrigin` treatment — an origin we run that never answered is
481
+ // still ours, not a third party's outage.
482
+ const raw = err instanceof Error ? err.message : String(err);
483
+ throw new Error(
484
+ markInternalOrigin(
485
+ `upstream_down: could not reach ${name} at all (${raw.slice(0, 160)}). ` +
486
+ `No request reached ${name}, so this says NOTHING about whether the arguments you passed ` +
487
+ 'are valid — do not re-check them on the strength of this error. Retry shortly.',
488
+ url,
489
+ ),
490
+ );
456
491
  }
457
492
  }
458
493
 
@@ -809,11 +844,13 @@ function significantNameTokens(name: string): string[] {
809
844
  *
810
845
  * ⚠️ eMARKET-COVERED ISSUERS ONLY — NOT EVERY ITALIAN LISTED COMPANY. Italy
811
846
  * has a SECOND OAM, 1INFO (a separate, keyless JSON API covering ~314
812
- * issuers), and an issuer discloses through exactly one of the two. Some
813
- * well-known names (e.g. IREN, SOMEC) are 1INFO issuers and will NOT be
814
- * found here — confirmed 2026-09-23 by their absence from eMarket Storage's
815
- * own ~480-company issuer list. This pack does not merge 1INFO; a company
816
- * not found is reported as such, with that explanation, not as an error.
847
+ * issuers — see the sibling pack @pipeworx/oneinfo-storage), and an issuer
848
+ * discloses through exactly one of the two. Some well-known names (e.g.
849
+ * IREN, SOMEC) are 1INFO issuers and will NOT be found here — confirmed
850
+ * 2026-09-23 by their absence from eMarket Storage's own ~480-company issuer
851
+ * list. This pack does not merge 1INFO; a company not found is reported as
852
+ * such, pointing at oneinfo-storage's oneinfo_search_disclosures, not as an
853
+ * error.
817
854
  *
818
855
  * ⚠️ NO ISIN/LEI. Unlike amf-filings, eMarket Storage's listing and its
819
856
  * issuer picklist expose only a company NAME and an internal Teleborsa
@@ -875,7 +912,7 @@ const tools: McpToolExport['tools'] = [
875
912
  {
876
913
  name: 'emarket_search_disclosures',
877
914
  description:
878
- `Search Italian regulated company disclosures from eMarket Storage (Teleborsa), one of Italy's two EU Transparency Directive Officially Appointed Mechanisms. PREFER OVER esef_filing_search FOR ITALIAN ISSUERS COVERED HERE — this source is updated same-day, unlike the community ESEF index which runs months behind. Identify the issuer with company (free-text name, resolved against eMarket's own ~480-issuer list) or azienda_id (Teleborsa's internal numeric id, from a prior result) — there is no ISIN/LEI field on this source. date_to IS INCLUSIVE (the last day you want included) — this tool handles the underlying source's own date_to being EXCLUSIVE by always querying one calendar day past it, so date_from="2026-09-21", date_to="2026-09-22" correctly returns rows from BOTH the 21st and the 22nd; a single date_from with no date_to searches just that one day. COVERAGE: only issuers that disclose through eMarket Storage — a second Italian mechanism, 1INFO, covers a separate set of issuers (e.g. IREN, SOMEC) and is NOT included; an unmatched company name is reported as "not an eMarket Storage issuer", not as an error. Category codes: ${CATEGORY_HINT}. Returns disclosure EVENTS (title, company, timestamp, PDF link) — NOT extracted XBRL facts.`,
915
+ `Search Italian regulated company disclosures from eMarket Storage (Teleborsa), one of Italy's two EU Transparency Directive Officially Appointed Mechanisms. PREFER OVER esef_filing_search FOR ITALIAN ISSUERS COVERED HERE — this source is updated same-day, unlike the community ESEF index which runs months behind. Identify the issuer with company (free-text name, resolved against eMarket's own ~480-issuer list) or azienda_id (Teleborsa's internal numeric id, from a prior result) — there is no ISIN/LEI field on this source. date_to IS INCLUSIVE (the last day you want included) — this tool handles the underlying source's own date_to being EXCLUSIVE by always querying one calendar day past it, so date_from="2026-09-21", date_to="2026-09-22" correctly returns rows from BOTH the 21st and the 22nd; a single date_from with no date_to searches just that one day. COVERAGE: only issuers that disclose through eMarket Storage — a second Italian mechanism, 1INFO, covers a separate set of issuers (e.g. IREN, SOMEC) and is NOT included; use oneinfo-storage's oneinfo_search_disclosures for those. An unmatched company name is reported as "not an eMarket Storage issuer", not as an error. Category codes: ${CATEGORY_HINT}. Returns disclosure EVENTS (title, company, timestamp, PDF link) — NOT extracted XBRL facts.`,
879
916
  inputSchema: {
880
917
  type: 'object',
881
918
  properties: {
@@ -1102,7 +1139,7 @@ async function searchDisclosures(args: Record<string, unknown>): Promise<unknown
1102
1139
  if (ranked.length === 0) {
1103
1140
  return {
1104
1141
  error: `"${companyQuery}" does not match any eMarket Storage issuer.`,
1105
- note: 'This pack only covers issuers that disclose through eMarket Storage. A separate mechanism, 1INFO, covers a different set of Italian issuers (e.g. IREN, SOMEC) and is not included here — the company may be a 1INFO issuer instead.',
1142
+ note: "This pack only covers issuers that disclose through eMarket Storage. A separate mechanism, 1INFO, covers a different set of Italian issuers (e.g. IREN, SOMEC) and is not included here — try oneinfo-storage's oneinfo_search_disclosures instead.",
1106
1143
  };
1107
1144
  }
1108
1145
  const top = ranked[0];
package/src/server.ts CHANGED
@@ -9,7 +9,7 @@ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprot
9
9
  import pack from './index.js';
10
10
 
11
11
  const server = new Server(
12
- { name: '@pipeworx/mcp-emarket-storage', version: '0.1.0' },
12
+ { name: '@pipeworx/mcp-emarket-storage', version: '0.1.2' },
13
13
  { capabilities: { tools: {} } },
14
14
  );
15
15
 
@@ -1,6 +0,0 @@
1
- {
2
- "staged_at": "2026-09-24T16:29:16.941Z",
3
- "publisher_blob": "da6994091dc9dcc6a7433084251ca4bbd58b4bed",
4
- "publisher_commit": "1c417b2cfcdac06e2d9210e869265722ef013f20",
5
- "note": "Written by scripts/publish-pack.sh as its LAST step. Its presence is the ONLY thing that lets stage-unpublished-packs.sh skip this pack. Deleting this dir is the correct way to force a rebuild."
6
- }