@cyanheads/eurostat-mcp-server 0.1.2 → 0.1.4

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/CLAUDE.md CHANGED
@@ -1,11 +1,9 @@
1
- # Developer Protocol
1
+ # Agent Protocol
2
2
 
3
- **Server:** eurostat-mcp-server
4
- **Version:** 0.1.2
3
+ **Server:** @cyanheads/eurostat-mcp-server
4
+ **Version:** 0.1.4
5
5
  **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.9.7`
6
- **Engines:** Bun ≥1.3.0, Node ≥24.0.0
7
- **MCP SDK:** `@modelcontextprotocol/sdk` ^1.29.0
8
- **Zod:** ^4.4.3
6
+ **Engines:** Bun ≥1.3.2, Node ≥24.0.0
9
7
 
10
8
  > **Read the framework docs first:** `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` contains the full API reference — builders, Context, error codes, exports, patterns. This file covers server-specific conventions only.
11
9
 
@@ -13,7 +11,7 @@
13
11
 
14
12
  ## What's Next?
15
13
 
16
- When the user asks what's next or needs direction, suggest options based on the current project state. Common next steps:
14
+ When the user asks what to do next, what's left, or needs direction, suggest relevant options based on the current project state:
17
15
 
18
16
  1. **Re-run the `setup` skill** — ensures CLAUDE.md, skills, structure, and metadata are populated and up to date with the current codebase
19
17
  2. **Run the `design-mcp-server` skill** — if the tool/resource surface hasn't been mapped yet, work through domain design
@@ -236,7 +234,7 @@ src/
236
234
 
237
235
  Skills are modular instructions in `skills/` at the project root. Read them directly when a task matches — e.g., `skills/add-tool/SKILL.md` when adding a tool.
238
236
 
239
- **Agent skill directory:** Copy skills into the directory your agent discovers (Claude Code: `.claude/skills/`, others: equivalent). Skills then load as context without referencing `skills/` paths. After framework updates, run the `maintenance` skill — Phase B re-syncs the agent directory.
237
+ **Agent skill directory:** Copy skills into the directory your agent discovers (Claude Code: `.claude/skills/`, others: equivalent). This makes skills available as context without needing to reference `skills/` paths manually. After framework updates, run the `maintenance` skill — it re-syncs the agent directory automatically (Phase B).
240
238
 
241
239
  Available skills:
242
240
 
@@ -251,22 +249,25 @@ Available skills:
251
249
  | `add-service` | Scaffold a new service integration |
252
250
  | `add-test` | Scaffold test file for a tool, resource, or service |
253
251
  | `field-test` | Exercise tools/resources/prompts with real inputs, verify behavior, report issues |
252
+ | `tool-defs-analysis` | Read-only audit of definition language: voice, leaks, defaults, recovery hints, examples |
254
253
  | `security-pass` | Audit server for MCP-flavored security gaps: output injection, scope blast radius, input sinks, tenant isolation |
255
254
  | `devcheck` | Lint, format, typecheck, audit |
256
255
  | `polish-docs-meta` | Finalize docs, README, metadata, and agent protocol for shipping |
257
- | `maintenance` | Investigate changelogs, adopt upstream changes, sync skills to agent dirs |
258
- | `report-issue-framework` | File a bug or feature request against `@cyanheads/mcp-ts-core` via `gh` CLI |
259
- | `report-issue-local` | File a bug or feature request against this server's own repo via `gh` CLI |
256
+ | `maintenance` | Investigate changelogs, adopt upstream changes, and sync skills after `bun update --latest` |
257
+ | `release-and-publish` | Ship a release: verification gate, push commits+tags, publish to npm / MCP Registry / GHCR / `.mcpb` bundle on GitHub Releases |
260
258
  | `api-auth` | Auth modes, scopes, JWT/OAuth |
261
259
  | `api-canvas` | DataCanvas: register tabular data, run SQL, export, plus the `spillover()` helper for big result sets — Tier 3 opt-in |
262
260
  | `api-config` | AppConfig, parseConfig, env vars |
263
261
  | `api-context` | Context interface, logger, state, progress |
264
262
  | `api-errors` | McpError, JsonRpcErrorCode, error patterns |
263
+ | `api-linter` | Definition lint rules reference (`format-parity`, `schema-*`, `server-json-*`, …) |
265
264
  | `api-services` | LLM, Speech, Graph services |
265
+ | `api-telemetry` | OTel catalog: spans, metrics, completion logs, env config, cardinality rules |
266
266
  | `api-testing` | createMockContext, test patterns |
267
267
  | `api-utils` | Formatting, parsing, security, pagination, scheduling, telemetry helpers |
268
- | `api-telemetry` | OTel catalog: spans, metrics, completion logs, env config, cardinality rules |
269
268
  | `api-workers` | Cloudflare Workers runtime |
269
+ | `report-issue-framework` | File bug/feature request against @cyanheads/mcp-ts-core |
270
+ | `report-issue-local` | File bug/feature request against this server's repo |
270
271
 
271
272
  When you complete a skill's checklist, check the boxes and add a completion timestamp at the end (e.g., `Completed: 2026-03-11`).
272
273
 
@@ -274,92 +275,48 @@ When you complete a skill's checklist, check the boxes and add a completion time
274
275
 
275
276
  ## Commands
276
277
 
277
- **Runtime:** Scripts use `tsx` — both `npm run <cmd>` and `bun run <cmd>` work. `bun` is slightly faster for script invocation but not required.
278
-
279
278
  | Command | Purpose |
280
279
  |:--------|:--------|
281
- | `npm run build` | Compile TypeScript |
282
- | `npm run rebuild` | Clean + build |
283
- | `npm run clean` | Remove build artifacts |
284
- | `npm run devcheck` | Lint + format + typecheck + security + changelog sync |
285
- | `bun run audit:refresh` | Delete `bun.lock`, reinstall, re-audit. Use when `devcheck` flags a transitive advisory — stale lockfile can mask already-patched deps. If advisory survives, it's real. |
286
- | `npm run tree` | Generate directory structure doc |
287
- | `npm run format` | Auto-fix formatting |
288
- | `npm test` | Run tests |
289
- | `npm run start:stdio` | Production mode (stdio) |
290
- | `npm run start:http` | Production mode (HTTP) |
291
- | `npm run changelog:build` | Regenerate `CHANGELOG.md` from `changelog/*.md` |
292
- | `npm run changelog:check` | Verify `CHANGELOG.md` is in sync (used by devcheck) |
293
- | `npm run bundle` | Build and pack as `.mcpb` for one-click Claude Desktop install |
280
+ | `bun run build` | Compile TypeScript |
281
+ | `bun run rebuild` | Clean + build |
282
+ | `bun run clean` | Remove build artifacts |
283
+ | `bun run devcheck` | Lint + format + typecheck + security + packaging alignment |
284
+ | `bun run audit:refresh` | Delete `bun.lock`, reinstall, and re-run `bun audit`. Use when `devcheck` flags a transitive advisory — `bun update` is sticky on transitive resolutions, so the advisory may be a stale-lockfile false positive. If it survives the refresh, it's real. |
285
+ | `bun run tree` | Generate directory structure doc |
286
+ | `bun run format` | Auto-fix formatting |
287
+ | `bun run test` | Run tests |
288
+ | `bun run lint:mcp` | Validate MCP definitions against spec |
289
+ | `bun run lint:packaging` | Validate env var alignment between `manifest.json` and `server.json` (skipped cleanly when `manifest.json` is absent) |
290
+ | `bun run list-skills` | List skills in `skills/` with name + description |
291
+ | `bun run bundle` | Build and pack as `dist/eurostat-mcp-server.mcpb` for one-click Claude Desktop install |
292
+ | `bun run start:stdio` | Production mode (stdio) |
293
+ | `bun run start:http` | Production mode (HTTP) |
294
294
 
295
295
  ---
296
296
 
297
297
  ## Bundling
298
298
 
299
- `npm run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. MCPB is stdio-only — HTTP and Cloudflare Workers deployments are unaffected. Consumers who don't need it can delete `manifest.json` and `.mcpbignore`; `lint:packaging` skips cleanly.
300
-
301
- **Adding an env var requires both files:** `server.json` (registry discovery, `environmentVariables[]`) and `manifest.json` (bundle install UX, `mcp_config.env` + `user_config`). `lint:packaging` (run by `devcheck`) verifies the env var names match.
302
-
303
- **README install badges.** Drop these into the project README to give users one-click install paths. Fill in `<OWNER>` / `<REPO>` / `<PACKAGE_NAME>` and encode the per-server config. Cursor + VS Code badges assume the server is published to npm; Claude Desktop downloads the `.mcpb` directly so npm publishing isn't required.
304
-
305
- | Client | Mechanism |
306
- |:-------|:----------|
307
- | Claude Desktop | Browser downloads the `.mcpb` from the latest GitHub Release; OS file handler routes it to Claude Desktop, which opens the install dialog. No deep-link URL scheme yet — this is the canonical path. |
308
- | Cursor | Official `https://cursor.com/en/install-mcp` endpoint with base64 JSON config. |
309
- | VS Code / Insiders | Official `vscode:mcp/install?...` deep link, wrapped in `https://vscode.dev/redirect?url=` so GitHub-rendered markdown doesn't strip the non-HTTP scheme. |
310
- | Claude Code / Codex | CLI only (`claude mcp add` / `codex mcp add`); no URL scheme. |
311
-
312
- ```markdown
313
- [![Install in Claude Desktop](https://img.shields.io/badge/Install_in-Claude_Desktop-D97757?style=for-the-badge&logo=anthropic&logoColor=white)](https://github.com/<OWNER>/<REPO>/releases/latest/download/<PACKAGE_NAME>.mcpb)
314
- [![Install in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en/install-mcp?name=<PACKAGE_NAME>&config=<BASE64_CONFIG>)
315
- [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_Server-0098FF?style=for-the-badge&logo=visualstudiocode&logoColor=white)](https://vscode.dev/redirect?url=vscode:mcp/install?<URLENCODED_JSON>)
316
- ```
317
-
318
- Both install links route through HTTPS endpoints (`cursor.com/en/install-mcp` and `vscode.dev/redirect`) — GitHub-rendered markdown strips non-HTTP URL schemes from anchors, so a raw `cursor://` or `vscode:` link won't click through from github.com.
319
-
320
- Generate the encoded configs (replace `<PACKAGE_NAME>` and add env vars for any required API keys):
299
+ `bun run bundle` produces `dist/eurostat-mcp-server.mcpb` for one-click install in Claude Desktop. MCPB is stdio-only — HTTP and Docker deployments are unaffected. The `release-and-publish` skill attaches the bundle to the GitHub Release at a stable `releases/latest/download/eurostat-mcp-server.mcpb` URL that powers the README install badge.
321
300
 
322
- ```bash
323
- # Cursor: base64-encoded JSON. Split command/args, add env when keys are needed.
324
- echo -n '{"command":"npx","args":["-y","<PACKAGE_NAME>"],"env":{"API_KEY":"your-api-key"}}' | base64
325
- # Without env (no required keys):
326
- echo -n '{"command":"npx","args":["-y","<PACKAGE_NAME>"]}' | base64
327
-
328
- # VS Code: URL-encoded JSON. Same shape plus a `name` field.
329
- node -p 'encodeURIComponent(JSON.stringify({name:"<SHORT_NAME>",command:"npx",args:["-y","<PACKAGE_NAME>"],env:{API_KEY:"your-api-key"}}))'
330
- # Without env:
331
- node -p 'encodeURIComponent(JSON.stringify({name:"<SHORT_NAME>",command:"npx",args:["-y","<PACKAGE_NAME>"]}))'
332
- ```
333
-
334
- Both clients use the same `{command, args, env}` shape (matching `mcp.json` schema). VS Code adds a top-level `name` field. Omit `env` entirely when no API keys are needed — don't include empty objects or framework-only vars like `MCP_TRANSPORT_TYPE`.
335
-
336
- The Claude Desktop badge requires the bundle to ship with a stable filename — `bun run bundle` outputs `dist/<PACKAGE_NAME>.mcpb`, and `release-and-publish` attaches that file to the GitHub Release. `releases/latest/download/<PACKAGE_NAME>.mcpb` then redirects to the most recent release.
301
+ **Adding an env var requires both files**: `server.json` stdio `environmentVariables[]` (registry discovery) and `manifest.json` `mcp_config.env` (bundle install UX, plus `user_config` if user-prompted). `bun run lint:packaging` (run by `devcheck`) verifies the env var names align.
337
302
 
338
303
  ---
339
304
 
340
- ## Changelog
305
+ ## Publishing
341
306
 
342
- Directory-based, grouped by minor series via the `.x` semver-wildcard convention. Source of truth: `changelog/<major.minor>.x/<version>.md` (e.g. `changelog/0.1.x/0.1.0.md`) — one file per release, shipped in the npm package. At release, author the per-version file with a concrete version and date, then run `npm run changelog:build` to regenerate the rollup. `changelog/template.md` is a **pristine format reference** — never edited or moved; read it for the frontmatter + section layout when scaffolding. `CHANGELOG.md` is a **navigation index** (header + link + summary per version), regenerated by `npm run changelog:build` — devcheck hard-fails on drift; never hand-edit it.
307
+ Run the `release-and-publish` skill after git wrapup — it runs the verification gate (`devcheck`, `rebuild`, `test`), pushes commits and tags, and publishes to npm, the MCP Registry, GHCR, and attaches the `.mcpb` bundle to the GitHub Release, halting on the first failure. For reference, the underlying commands are:
343
308
 
344
- Each per-version file opens with YAML frontmatter:
309
+ ```bash
310
+ bun publish --access public
345
311
 
346
- ```markdown
347
- ---
348
- summary: "One-line headline, ≤350 chars" # required — powers the rollup index
349
- breaking: false # optional — true flags breaking changes
350
- security: false # optional — true flags security fixes
351
- ---
312
+ docker buildx build --platform linux/amd64,linux/arm64 \
313
+ -t ghcr.io/cyanheads/eurostat-mcp-server:<version> \
314
+ -t ghcr.io/cyanheads/eurostat-mcp-server:latest \
315
+ --push .
352
316
 
353
- # 0.1.0 — YYYY-MM-DD
354
- ...
317
+ mcp-publisher publish
355
318
  ```
356
319
 
357
- `breaking: true` renders a `· ⚠️ Breaking` badge — use it when consumers must update code on upgrade (signature changes, removed APIs, config renames). `security: true` renders a `· 🛡️ Security` badge and pairs with a `## Security` body section. When both are set, badges render `· ⚠️ Breaking · 🛡️ Security`.
358
-
359
- **Section order** (Keep a Changelog): Added, Changed, Deprecated, Removed, Fixed, Security. Include only sections with entries — don't ship empty headers.
360
-
361
- **Tag annotations** render as GitHub Release bodies via `--notes-from-tag`. They must be structured markdown — never a flat comma-separated string. Subject omits the version number (GitHub prepends it). See `changelog/template.md` for the full format reference.
362
-
363
320
  ---
364
321
 
365
322
  ## Imports
@@ -388,4 +345,4 @@ import { getMyService } from '@/services/my-domain/my-service.js';
388
345
  - [ ] If wrapping external API: tests include at least one sparse payload case with omitted upstream fields
389
346
  - [ ] Registered in `createApp()` arrays (directly or via barrel exports)
390
347
  - [ ] Tests use `createMockContext()` from `@cyanheads/mcp-ts-core/testing`
391
- - [ ] `npm run devcheck` passes
348
+ - [ ] `bun run devcheck` passes
package/Dockerfile CHANGED
@@ -1,8 +1,5 @@
1
1
  # ==============================================================================
2
2
  # Build Stage
3
- #
4
- # This stage installs all dependencies (including dev), builds the TypeScript
5
- # source code into JavaScript, and prepares the production assets.
6
3
  # ==============================================================================
7
4
  FROM oven/bun:1.3 AS build
8
5
 
@@ -37,8 +34,8 @@ WORKDIR /usr/src/app
37
34
  ENV NODE_ENV=production
38
35
 
39
36
  # OCI image metadata (https://github.com/opencontainers/image-spec/blob/main/annotations.md)
40
- LABEL org.opencontainers.image.title="eurostat-mcp-server"
41
- LABEL org.opencontainers.image.description="MCP server for Eurostat — search and query 8,933 EU statistical datasets."
37
+ LABEL org.opencontainers.image.title="@cyanheads/eurostat-mcp-server"
38
+ LABEL org.opencontainers.image.description="Search and query 8,933 Eurostat datasets — EU economy, demography, trade, health, and NUTS regional data via MCP. STDIO or Streamable HTTP."
42
39
  LABEL org.opencontainers.image.licenses="Apache-2.0"
43
40
  LABEL org.opencontainers.image.source="https://github.com/cyanheads/eurostat-mcp-server"
44
41
 
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  <div align="center">
2
2
  <h1>@cyanheads/eurostat-mcp-server</h1>
3
- <p><b>Search and query Eurostat statistical data — 8,933 datasets covering EU economy, demography, trade, health, and regional NUTS data. STDIO or Streamable HTTP.</b>
3
+ <p><b>Search and query 8,933 Eurostat datasets — EU economy, demography, trade, health, and NUTS regional data via MCP. STDIO or Streamable HTTP.</b>
4
4
  <div>5 Tools • 1 Resource</div>
5
5
  </p>
6
6
  </div>
@@ -9,7 +9,7 @@
9
9
 
10
10
 
11
11
 
12
- [![Version](https://img.shields.io/badge/Version-0.1.2-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/eurostat-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.29.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/eurostat-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/eurostat-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^6.0.3-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.3.2-blueviolet.svg?style=flat-square)](https://bun.sh/)
12
+ [![Version](https://img.shields.io/badge/Version-0.1.4-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/eurostat-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.29.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/eurostat-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/eurostat-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^6.0.3-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.3.2-blueviolet.svg?style=flat-square)](https://bun.sh/)
13
13
 
14
14
  </div>
15
15
 
package/package.json CHANGED
@@ -1,42 +1,33 @@
1
1
  {
2
2
  "name": "@cyanheads/eurostat-mcp-server",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "mcpName": "io.github.cyanheads/eurostat-mcp-server",
5
- "description": "MCP server for Eurostat — search and query 8,933 EU statistical datasets covering economy, demography, trade, health, and NUTS regional data.",
5
+ "description": "Search and query 8,933 Eurostat datasets — EU economy, demography, trade, health, and NUTS regional data via MCP. STDIO or Streamable HTTP.",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
8
8
  "types": "dist/index.d.ts",
9
9
  "bin": {
10
10
  "eurostat-mcp-server": "dist/index.js"
11
11
  },
12
- "files": [
13
- "changelog/",
14
- "dist/",
15
- "README.md",
16
- "LICENSE",
17
- "CLAUDE.md",
18
- "AGENTS.md",
19
- "Dockerfile",
20
- "server.json"
21
- ],
12
+ "files": ["dist/", "README.md", "LICENSE", "CLAUDE.md", "Dockerfile", "server.json"],
22
13
  "scripts": {
23
- "build": "tsx scripts/build.ts",
24
- "rebuild": "tsx scripts/clean.ts && tsx scripts/build.ts",
25
- "clean": "tsx scripts/clean.ts",
26
- "devcheck": "tsx scripts/devcheck.ts",
14
+ "build": "bun run scripts/build.ts",
15
+ "rebuild": "bun run scripts/clean.ts && bun run build",
16
+ "clean": "bun run scripts/clean.ts",
17
+ "devcheck": "bun run scripts/devcheck.ts",
18
+ "tree": "bun run scripts/tree.ts",
19
+ "format": "biome check --write --unsafe",
20
+ "test": "bunx vitest run",
27
21
  "audit:refresh": "rm -f bun.lock && bun install && bun audit",
28
- "tree": "tsx scripts/tree.ts",
29
- "list-skills": "tsx scripts/list-skills.ts",
30
- "format": "biome check --write --unsafe .",
31
- "lint:mcp": "tsx scripts/lint-mcp.ts",
32
- "lint:packaging": "tsx scripts/lint-packaging.ts",
33
- "bundle": "npm run build && npx -y @anthropic-ai/mcpb pack . dist/eurostat-mcp-server.mcpb",
34
- "changelog:build": "tsx scripts/build-changelog.ts",
35
- "changelog:check": "tsx scripts/build-changelog.ts --check",
36
- "test": "vitest run",
37
- "start": "node dist/index.js",
38
- "start:stdio": "MCP_TRANSPORT_TYPE=stdio node dist/index.js",
39
- "start:http": "MCP_TRANSPORT_TYPE=http node dist/index.js"
22
+ "list-skills": "bun run scripts/list-skills.ts",
23
+ "lint:mcp": "bun run scripts/lint-mcp.ts",
24
+ "lint:packaging": "bun run scripts/lint-packaging.ts",
25
+ "bundle": "bun run build && npx -y @anthropic-ai/mcpb pack . dist/eurostat-mcp-server.mcpb",
26
+ "changelog:build": "bun run scripts/build-changelog.ts",
27
+ "changelog:check": "bun run scripts/build-changelog.ts --check",
28
+ "publish-mcp": "mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish",
29
+ "start:stdio": "MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js",
30
+ "start:http": "MCP_TRANSPORT_TYPE=http bun ./dist/index.js"
40
31
  },
41
32
  "keywords": [
42
33
  "mcp",
@@ -78,7 +69,7 @@
78
69
  "license": "Apache-2.0",
79
70
  "packageManager": "bun@1.3.2",
80
71
  "engines": {
81
- "bun": ">=1.3.0",
72
+ "bun": ">=1.3.2",
82
73
  "node": ">=24.0.0"
83
74
  },
84
75
  "publishConfig": {
package/server.json CHANGED
@@ -6,14 +6,14 @@
6
6
  "url": "https://github.com/cyanheads/eurostat-mcp-server",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.1.2",
9
+ "version": "0.1.4",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "registryBaseUrl": "https://registry.npmjs.org",
14
14
  "identifier": "@cyanheads/eurostat-mcp-server",
15
15
  "runtimeHint": "bun",
16
- "version": "0.1.2",
16
+ "version": "0.1.4",
17
17
  "packageArguments": [
18
18
  {
19
19
  "type": "positional",
@@ -56,7 +56,7 @@
56
56
  "registryBaseUrl": "https://registry.npmjs.org",
57
57
  "identifier": "@cyanheads/eurostat-mcp-server",
58
58
  "runtimeHint": "bun",
59
- "version": "0.1.2",
59
+ "version": "0.1.4",
60
60
  "packageArguments": [
61
61
  {
62
62
  "type": "positional",
@@ -89,6 +89,12 @@
89
89
  "isRequired": false,
90
90
  "default": "/mcp"
91
91
  },
92
+ {
93
+ "name": "MCP_PUBLIC_URL",
94
+ "description": "Public origin override for deployments behind a TLS-terminating reverse proxy (e.g. https://mcp.example.com).",
95
+ "format": "string",
96
+ "isRequired": false
97
+ },
92
98
  {
93
99
  "name": "MCP_AUTH_MODE",
94
100
  "description": "Authentication mode to use: 'none', 'jwt', or 'oauth'.",
@@ -1,20 +0,0 @@
1
- ---
2
- summary: "Initial release — Eurostat statistical data server with 5 tools and 1 resource"
3
- breaking: false
4
- security: false
5
- ---
6
-
7
- # 0.1.0 — 2026-05-23
8
-
9
- ## Added
10
-
11
- - **`eurostat_search_datasets`** — keyword search across 8,933 Eurostat datasets using the session-cached TOC TXT file
12
- - **`eurostat_browse_themes`** — tree navigation of the Eurostat theme hierarchy (11 root themes, hierarchical subthemes)
13
- - **`eurostat_get_dataset_info`** — dataset metadata including dimensions, valid values, time range, obs count, and last-updated date
14
- - **`eurostat_get_dimension_values`** — full list of valid values for a specific dataset dimension; supports NUTS geo-level filtering
15
- - **`eurostat_query_dataset`** — decoded JSON-stat 2.0 observations with dimension filters, NUTS geo-level, and time-range support
16
- - **`eurostat://dataset/{dataset_code}`** resource — dataset metadata accessible by URI
17
- - `EurostatCatalogueService` — fetches and parses the TOC TXT file; session-level in-memory cache for search and tree navigation
18
- - `EurostatDataService` — Statistics API HTTP client with JSON-stat 2.0 stride-based decoder, async-response detection, and retry logic
19
- - `EUROSTAT_BASE_URL` env var — override API base URL (default: `https://ec.europa.eu/eurostat/api/dissemination`)
20
- - `EUROSTAT_REQUEST_TIMEOUT_MS` env var — HTTP request timeout in ms (default: `30000`)
@@ -1,21 +0,0 @@
1
- ---
2
- summary: "First public release — 5 tools, 1 resource, full Eurostat implementation covering 8,900+ datasets and NUTS regional data"
3
- breaking: false
4
- security: false
5
- ---
6
-
7
- # 0.1.1 — 2026-05-23
8
-
9
- ## Added
10
-
11
- - **`eurostat_search_datasets`** — keyword search across 8,933 Eurostat datasets using a session-cached TOC TXT file
12
- - **`eurostat_browse_themes`** — hierarchical navigation of the Eurostat theme tree (11 root themes)
13
- - **`eurostat_get_dataset_info`** — dataset metadata: dimensions, valid values, time range, obs count, last-updated date
14
- - **`eurostat_get_dimension_values`** — full value list for a specific dataset dimension; supports NUTS geo-level filtering
15
- - **`eurostat_query_dataset`** — decoded JSON-stat 2.0 observations with dimension filters, NUTS geo-level, and time-range support
16
- - **`eurostat://dataset/{dataset_code}`** resource — dataset metadata accessible by URI
17
- - `EurostatCatalogueService` — fetches and parses the TOC TXT file with session-level in-memory cache
18
- - `EurostatDataService` — Statistics API HTTP client with JSON-stat 2.0 stride decoder, async-response polling, and retry logic
19
- - `EUROSTAT_BASE_URL` env var — override API base URL (default: `https://ec.europa.eu/eurostat/api/dissemination`)
20
- - `EUROSTAT_REQUEST_TIMEOUT_MS` env var — HTTP request timeout in ms (default: `30000`)
21
- - 37 tests across all tools and the dataset resource
@@ -1,17 +0,0 @@
1
- ---
2
- summary: "Bug fixes: depth-encoding whitespace in browse_themes, timeRange computed from observations, not_found error contract, description cleanup"
3
- breaking: false
4
- security: false
5
- ---
6
-
7
- # 0.1.2 — 2026-05-24
8
-
9
- ## Changed
10
-
11
- - **`eurostat_search_datasets`**, **`eurostat_get_dataset_info`**, **`eurostat_get_dimension_values`** — tool descriptions trimmed; removed implementation-detail sentences that don't help callers
12
-
13
- ## Fixed
14
-
15
- - **`eurostat_browse_themes`** — `unquote()` now preserves leading spaces when stripping quotes, fixing the depth-encoding whitespace that encodes NUTS hierarchy indentation
16
- - **`eurostat_get_dataset_info`**, **`eurostat_query_dataset`** — `timeRange.start/end` computed from actual time dimension codes in the response; annotation-based fallback used only when no time dimension is present
17
- - **`eurostat_get_dataset_info`**, **`eurostat_query_dataset`** — 404 responses from the Statistics API are now caught via `McpError` and re-thrown as `notFound` with an actionable message; previously surfaced as raw `FetchHttpError`
@@ -1,119 +0,0 @@
1
- ---
2
- # FORMAT REFERENCE — do not edit. Copy this file to
3
- # `changelog/<major.minor>.x/<version>.md` (e.g. `changelog/0.8.x/0.8.6.md`)
4
- # to author a new release. Set that file's H1 to `# <version> — YYYY-MM-DD`
5
- # with a concrete date.
6
-
7
- # Required. One-line GitHub Release-style headline. 350 character cap.
8
- # Default short and scannable. Don't pad, don't stitch unrelated changes with
9
- # semicolons — pick the headline. Quotes required: unquoted YAML treats `: `
10
- # inside the value as a key separator and fails GitHub's strict parser.
11
- summary: ""
12
-
13
- # Set `true` when consumers must change code to upgrade: API removals,
14
- # signature changes, config renames, behavior changes that break existing
15
- # usage. Flagged as `Breaking` in the rollup.
16
- breaking: false
17
-
18
- # Set `true` if this release contains any security fix. Pairs with the
19
- # `## Security` section below. Flagged as `Security` in the rollup so
20
- # users can triage upgrade urgency at a glance.
21
- security: false
22
- ---
23
-
24
- # <version> — YYYY-MM-DD
25
-
26
- <!--
27
- AUTHORING GUIDE — applies to the new per-version file you create from this
28
- template.
29
-
30
- Audience: someone scanning release notes to decide what affects them. Lead
31
- each bullet with the symbol or concept name in **bold** so they can skip
32
- what's irrelevant and zoom in on what's not.
33
-
34
- Tone: terse, fact-dense, not verbose. Default to one sentence per bullet —
35
- name the symbol, state what changed, stop. Use a second sentence only when
36
- it carries weight. If a bullet feels long, it is.
37
-
38
- Cut: mechanism walkthroughs (those belong in JSDoc, AGENTS.md, or the
39
- relevant skill), ceremonial framings ("This release introduces…",
40
- backwards-compat paragraphs), file-by-file test enumerations, internal
41
- implementation notes. Prefer code/symbol names over English re-explanations.
42
-
43
- Narrative intro: skip by default. Add one short sentence only when the
44
- release theme genuinely needs framing the bullets can't carry.
45
-
46
- Sections: Keep a Changelog order — Added, Changed, Deprecated, Removed,
47
- Fixed, Security. Include only sections with entries; delete the rest
48
- (including the commented-out scaffolding below). Don't ship empty headers.
49
-
50
- Include: every distinct fact a reader needs to adopt or audit the release —
51
- new exports, signatures, lint rule IDs, env vars, breaking changes, version
52
- bumps on shipped skills. Nothing more.
53
-
54
- Links: link issues, PRs, docs, or skills where they help a reader jump to
55
- context. Once per item per entry — don't re-link the same issue in summary,
56
- narrative, and bullet. Skip links for inline symbol names; code spans speak
57
- for themselves.
58
-
59
- Issue/PR URLs: use full URLs. GitHub's bare `#NN` auto-link only resolves
60
- inside its own UI, not in npm reads or local editors.
61
-
62
- [#38](https://github.com/cyanheads/mcp-ts-core/issues/38) ← issue
63
- [#42](https://github.com/cyanheads/mcp-ts-core/pull/42) ← PR
64
-
65
- Verify numbers exist before linking (`gh issue view NN`, `gh pr view NN`).
66
- Never speculate on a future number — `#42` for an upcoming PR silently
67
- resolves to whatever real item already owns 42, and timeline previews pull
68
- in that unrelated item's metadata.
69
-
70
- TAG ANNOTATIONS — the annotated tag body renders as the GitHub Release body
71
- via `gh release create --notes-from-tag`. The tag is a derivative of this
72
- changelog entry — a condensed, scannable version, not a copy. Format:
73
-
74
- <theme — omit version number, GitHub prepends it>
75
- ← blank line
76
- <1-2 sentence context: what this release does>
77
- ← blank line
78
- Dependency bumps: ← section header
79
- ← blank line
80
- - `@cyanheads/mcp-ts-core` ^0.9.1 → ^0.9.6 ← bullet
81
- ← blank line
82
- Changed: ← only sections with entries
83
- ← blank line
84
- - `format()` output includes `query` in text mode
85
- ← blank line
86
- Added:
87
- ← blank line
88
- - `manifest.json` scaffolded for MCPB bundle support
89
- - Install badges (Claude Desktop, Cursor, VS Code)
90
- ← blank line
91
- <N> tests pass; `bun run devcheck` clean. ← footer
92
-
93
- Never a flat comma-separated string. Always structured markdown with
94
- sections. The tag must scan well as a rendered GitHub Release page.
95
- -->
96
-
97
- ## Added
98
-
99
- -
100
-
101
- ## Changed
102
-
103
- -
104
-
105
- <!-- ## Deprecated
106
-
107
- - -->
108
-
109
- <!-- ## Removed
110
-
111
- - -->
112
-
113
- ## Fixed
114
-
115
- -
116
-
117
- <!-- ## Security
118
-
119
- - -->