@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 +9 -8
- package/package.json +5 -1
- package/server.json +1 -1
- package/src/index.ts +45 -8
- package/src/server.ts +1 -1
- package/.pipeworx-staged-ok +0 -6
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
|
|
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
|
|
36
|
-
the two. Some well-known names are 1INFO
|
|
37
|
-
here — confirmed 2026-09-23 by checking
|
|
38
|
-
issuer picklist: neither **IREN** nor
|
|
39
|
-
search that matches nothing returns an
|
|
40
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
813
|
-
* well-known names (e.g.
|
|
814
|
-
*
|
|
815
|
-
*
|
|
816
|
-
*
|
|
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;
|
|
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:
|
|
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.
|
|
12
|
+
{ name: '@pipeworx/mcp-emarket-storage', version: '0.1.2' },
|
|
13
13
|
{ capabilities: { tools: {} } },
|
|
14
14
|
);
|
|
15
15
|
|
package/.pipeworx-staged-ok
DELETED
|
@@ -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
|
-
}
|