Skip to content

eurostat mcp server changelog

io.github.cyanheads/eurostat-mcp-server

11 changes recorded. MCP Harbor re-reads this listing from the official registry every six hours and asks the live server what it exposes, and keeps what changed between one look and the next.

  • server.json 1 field changed
    version
    0.11.2 0.11.3

  • AGENTS.md +12 −4

    https://raw.githubusercontent.com/cyanheads/eurostat-mcp-server/HEAD/AGENTS.md

    − **Version:** 0.10.1− **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.15`− **MCP SDK:** `@modelcontextprotocol/server` `^2.3.1`− Skills are modular instructions in `framework-skills/` at the project root. Read them directly when a task matches — e.g., `framework-skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry. The directory is deliberately not `skills/`: Claude Code and Codex auto-load a plugin's root `skills/`, so a server that ships `.claude-plugin/` or `.codex-plugin/` would hand these development skills to every agent that installs it. Keep `skills/` free for skills meant f+ **Version:** 0.11.2+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.18`+ **MCP SDK:** `@modelcontextprotocol/server` `^2.4.0`+ Two skill trees live at the project root, written for different readers:+ | Tree | For | Written by |+ |:-----|:----|:-----------|+ | `framework-skills/` | The agent developing this server — framework skills (`metadata.audience: external`) plus any development-time skills of the server's own | `init` and the `maintenance` sync (framework skills); you (your own) |+ | `skills/` | The agents that install the server and call its tools — tool chains, identifier sources, gates | You, deliberately, with the `add-skill` skill. Absent by default; usually none is needed |+ Development skills are modular instructions. Read them directly when a task matches — e.g., `framework-skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry. Their directory is deliberately not `skills/`: Claude Code and Codex auto-load a plugin's root `skills/`, so a server that ships `.claude-plugin/` or `.codex-plugin/` would hand them to every agent that installs it.+ A published skill in root `skills/` reaches plugin installs and the `.mcpb` bundle as-is, ships in the npm package and the Docker image, and reaches MCP clients when the server opts in with `createApp({ skills: 'skills' })`. `lint:packaging` validates the tree.+ | `add-skill` | Author a skill the server publishes in root `skills/` for the agents that use it — when one earns its place, structure, validation, delivery |+ - [ ] `plugin.json` + `mcp.json` (Agent Plugins 1.0.0) populated — unscoped server name, package metadata, and one stdio server running `npx -y <full package name>`. Root `mcp.json` carries only fixed env values; user-supplied variables remain in `.codex-plugin/mcp.json` `env_vars`, forwarded through `.codex-plugin/plugin.json` `"mcpServers": "./.codex-plugin/mcp.json"`.

  • Resources +1
    • + eurostat-guide
  • server.json 1 field changed
    version
    0.11.0 0.11.2

  • server.json 1 field changed
    version
    0.10.1 0.11.0

  • server.json 2 fields changed
    env_vars
    MCP_LOG_LEVEL, EUROSTAT_BASE_URL, EUROSTAT_COMEXT_BASE_URL, EUROSTAT_REQUEST_TIMEOUT_MS, EUROSTAT_METADATA_TIMEOUT_MS, EUROSTAT_TOC_CACHE_TTL_MS, EUROSTAT_BULK_TIMEOUT_MS, EUROSTAT_BULK_MAX_BYTES, CANVAS_PROVIDER_TYPE, CANVAS_TEMP_PATH, CANVAS_TTL_MS, CANVAS_DEFAULT_ROW_LIMIT, EUROSTAT_DATAFRAME_DROP_ENABLED EUROSTAT_CLAMP_LIMITS, MCP_LOG_LEVEL, EUROSTAT_BASE_URL, EUROSTAT_COMEXT_BASE_URL, EUROSTAT_REQUEST_TIMEOUT_MS, EUROSTAT_METADATA_TIMEOUT_MS, EUROSTAT_TOC_CACHE_TTL_MS, EUROSTAT_BULK_TIMEOUT_MS, EUROSTAT_BULK_MAX_BYTES, CANVAS_PROVIDER_TYPE, CANVAS_TEMP_PATH, CANVAS_TTL_MS, CANVAS_DEFAULT_ROW_LIMIT, EUROSTAT_DATAFRAME_DROP_ENABLED
    version
    0.10.0 0.10.1

  • AGENTS.md +5 −5

    https://raw.githubusercontent.com/cyanheads/eurostat-mcp-server/HEAD/AGENTS.md

    − **Version:** 0.9.0− **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.11`− **MCP SDK:** `@modelcontextprotocol/server` `^2.2.0`− **Zod:** `^4.6.5`− **Every release goes through a gated release PR** — `git-wrapup`'s "Release PR mode", mode `gated`. Three separate runs, never one: `git-wrapup` lands the commit stack on `release/<version>`, pushes it, and opens the PR (title = the release commit subject, body = the changelog entry plus a gates section); `release-pr-review` reviews and fixes on that branch (each fix an ordinary commit on top of the stack, pushed plainly — nothing already pushed is ever rewritten, so `main` keeps the record of w+ **Version:** 0.10.0+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.15`+ **MCP SDK:** `@modelcontextprotocol/server` `^2.3.1`+ **Zod:** `^4.6.6`+ **Every release goes through a gated release PR** — `git-wrapup`'s "Release PR mode", mode `gated`. Three separate runs, never one: `git-wrapup` lands the commit stack on `release/<version>`, pushes it, and opens the PR (title = the release commit subject, body = the release digest: theme line, `## Changes`, `## Gates`, changelog link last); `release-pr-review` reviews and fixes on that branch (each fix an ordinary commit on top of the stack, pushed plainly — nothing already pushed is ever rewri

  • server.json 1 field changed
    version
    0.9.0 0.10.0

  • AGENTS.md +23 −19

    https://raw.githubusercontent.com/cyanheads/eurostat-mcp-server/HEAD/AGENTS.md

    − **Version:** 0.8.1− **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.6`− **MCP SDK:** `@modelcontextprotocol/server` `^2.0.0`−     limit: z.number().default(10).describe('Max results'),− For env booleans use `z.stringbool()`, never `z.coerce.boolean()` — `Boolean("false")` is `true`, so a coerced flag can't be disabled through the environment. `z.stringbool()` parses `true/false/1/0/yes/no/on/off` and rejects anything else.− | `ctx.log` | Request-scoped logger — `.debug()`, `.info()`, `.notice()`, `.warning()`, `.error()`. Auto-correlates requestId, traceId, tenantId. Dual-sink: Pino and client `notifications/message`, so treat it as client-visible. |− | `ctx.state` | Tenant-scoped KV — `.get(key)`, `.set(key, value, { ttl? })`, `.delete(key)`, `.getMany(keys)`, `.list(prefix, { cursor, limit })`. Accepts any serializable value. |− | `ctx.requestInput` | Suspend and ask the caller for more input — `return ctx.requestInput({ inputRequests: { key: inputRequired.elicit({ message, requestedSchema }) } })`. Never returns; the handler is re-entered with the answers. |− | `ctx.inputs` | Reader over a retried request's responses — `.accepted(key, schema)`, `.view(key)`, `.state()`, `.dropped`. Empty on the first round. |− | `ctx.requestId` | Unique request ID. |− **Recommended: typed error contract.** Declare `errors: [{ reason, code, when, recovery, retryable?, severity?, thrownBy? }]` on `tool()` / `resource()` to receive `ctx.fail(reason, …)` typed against the reason union. TypeScript catches typos at compile time, `data.reason` is auto-populated for observability, linter enforces conformance against the handler body. `recovery` is required (≥ 5 words, lint-validated) — the single source of truth for the agent's next move. Pass `ctx.recoveryFor('reaso−   if (!item) throw ctx.fail('no_match', `No item ${input.id}`, ctx.recoveryFor('no_match'));− throw new McpError(JsonRpcErrorCode.DatabaseError, 'Connection failed', { pool: 'primary' });− | `bun run format` | Auto-fix formatting |− | `bun run format:unsafe` | Apply behavior-changing Biome fixes for manual review |− | `bun run test` | Run tests |− | `bun run lint:mcp` | Validate MCP definitions against spec |− | `bun run lint:packaging` | Validate env var alignment between `manifest.json` and `server.json` (skipped cleanly when `manifest.json` is absent) |− | `bun run changelog:check` | Verify `CHANGELOG.md` is in sync with `changelog/` |+ **Version:** 0.9.0+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.11`+ **MCP SDK:** `@modelcontextprotocol/server` `^2.2.0`+ - **Cut noise.** Add only what earns its place: no speculative generality, no guards for states the framework already prevents (Zod-validated params, classified errors), no abstraction until a third caller proves it, no option nothing sets.+     limit: z.number().int().min(1).max(100).default(10).describe('Max results (1–100)'),+ For env booleans use `z.stringbool()`, never `z.coerce.boolean()` — `Boolean("false")` is `true`, so a coerced flag can't be disabled through the environment. `z.stringbool()` parses `true/false/1/0/yes/no/on/off` and rejects anything else, so `=false` actually disables.+ | `ctx.log` | Request-scoped logger — `.debug()`, `.info()`, `.notice()`, `.warning()`, `.error()`. Auto-correlates requestId, traceId, tenantId. Dual-sink: Pino **and** `notifications/message` to the client, so treat it as client-visible. |+ | `ctx.state` | Tenant-scoped KV — `.get(key)`, `.set(key, value, { ttl? })`, `.delete(key)`, `.getMany(keys)`, `.list(prefix, { cursor, limit })`. Accepts any JSON-serializable value; reads return its JSON form (a `Date` comes back as an ISO string). |+ | `ctx.requestInput` | Suspend and ask the caller for more input — `return ctx.requestInput({ inputRequests: { key: inputRequired.elicit({ message, requestedSchema }) } })`. Never returns; the handler is re-entered with the answers. Always present. |+ | `ctx.inputs` | The request's responses — `.accepted(key, schema)`, `.view(key)`, `.state()`, `.dropped` — limited to what the client declared (`elicitation` and its form/url modes, `sampling`, `roots`). Client-supplied: a consent gate trusts only a `ctx.state` record it stored when it asked, bound to the operation, caller, and target (see the `api-context` skill). |+ | `ctx.clientCapabilities` | What the client declared for this request, `undefined` when no view exists. Decides whether to ask for optional context (e.g. roots); never a reason to skip a consent prompt. |+ | `ctx.requestId` | Request ID — the one every log record of the call carries and its error envelope returns as `data.requestId`. |+ **Recommended: typed error contract.** Declare `errors: [{ reason, code, when, recovery, retryable?, severity?, thrownBy? }]` on `tool()` / `resource()` to receive `ctx.fail(reason, …)` typed against the reason union. TypeScript catches typos at compile time, `data.reason` is auto-populated for observability, linter enforces conformance against the handler body. `recovery` is required (≥ 5 words, lint-validated) — the single source of truth for the agent's next move. The framework puts it on the+   if (!item) throw ctx.fail('no_match', `No item ${input.id}`);+ throw new McpError(JsonRpcErrorCode.InitializationFailed, 'Connection failed', { pool: 'primary' });+ **Chaining skills into pipelines.** When the user wants a multi-phase effort — build this server out, QA-and-fix the surface, update-and-ship — *and you can spawn sub-agents*, `framework-skills/orchestrations/SKILL.md` sequences the task skills above into a gated pipeline with verification at each step. Read it to drive the run. Optional: skip it if you can't orchestrate sub-agents, and ignore it entirely if you were *spawned* as one — you've already been scoped to a single phase.+ **Runtime:** Scripts use Bun's native TypeScript execution — `bun run <cmd>` is the standard invocation. `npm run <cmd>` also works (npm delegates to bun).+ | `bun run format` | Auto-fix formatting (safe fixes only) |+ | `bun run format:unsafe` | Also apply Biome's unsafe autofixes — review the diff; they can change behavior |+ | `bun run test` | Run tests (Vitest — use `bun run test`, not `bun test`) |+ | `bun run lint:mcp` | Run the MCP definition linter standalone (rule catalog: `api-linter` skill) |+ | `bun run lint:packaging` | Packaging surface checks — `server.json`/`manifest.json` env-var parity (run by devcheck) |+ | `bun run changelog:check` | Verify `CHANGELOG.md` is in sync (used by devcheck) |

  • server.json 2 fields changed
    env_vars
    MCP_LOG_LEVEL, EUROSTAT_BASE_URL, EUROSTAT_COMEXT_BASE_URL, EUROSTAT_REQUEST_TIMEOUT_MS, EUROSTAT_METADATA_TIMEOUT_MS, EUROSTAT_TOC_CACHE_TTL_MS, EUROSTAT_BULK_TIMEOUT_MS, EUROSTAT_BULK_MAX_BYTES, CANVAS_PROVIDER_TYPE, CANVAS_TEMP_PATH, CANVAS_TTL_MS, CANVAS_DEFAULT_ROW_LIMIT MCP_LOG_LEVEL, EUROSTAT_BASE_URL, EUROSTAT_COMEXT_BASE_URL, EUROSTAT_REQUEST_TIMEOUT_MS, EUROSTAT_METADATA_TIMEOUT_MS, EUROSTAT_TOC_CACHE_TTL_MS, EUROSTAT_BULK_TIMEOUT_MS, EUROSTAT_BULK_MAX_BYTES, CANVAS_PROVIDER_TYPE, CANVAS_TEMP_PATH, CANVAS_TTL_MS, CANVAS_DEFAULT_ROW_LIMIT, EUROSTAT_DATAFRAME_DROP_ENABLED
    version
    0.8.1 0.9.0