Skip to content

Releases: blen-labs/fedreg-mcp-server

v2.0.5

Choose a tag to compare

@github-actions github-actions released this 06 Aug 23:36

Changed

  • move to Node 24 action runtimes and document the branch-only policy

v2.0.4

Choose a tag to compare

@github-actions github-actions released this 06 Aug 23:23

Changed

  • enforce conventional commit subjects

v2.0.3

Choose a tag to compare

@github-actions github-actions released this 06 Aug 23:19

Changed

  • pin the npm CLI version in the publish step

v2.0.2

Choose a tag to compare

@github-actions github-actions released this 06 Aug 23:17

Changed

  • publish with npm CLI >= 11.5 for OIDC trusted publishing

v2.0.1

Choose a tag to compare

@github-actions github-actions released this 06 Aug 23:13

Fixed

  • produce a valid, self-contained MCPB bundle (mcpb)
  • validate Origin on /mcp per the MCP spec MUST (http)

Changed

  • release on every merge to main (continuous releases)
  • remove all emoji from release notes and README
  • switch npm publishing to tokenless trusted publishing (OIDC)

v2.0.0

Choose a tag to compare

@mikeendale mikeendale released this 06 Aug 19:10

fedreg-mcp-server v2.0.0

Two headline changes: a third data source and a stateless protocol core.

regulations.gov support (regs.*)

The model can now reach public comments, dockets, and live comment-period
status alongside the Federal Register and eCFR:

// Find the comments on a specific FR rule (the fr → regs bridge):
const fr1 = await fr.documents.search({ conditions: { term: 'methane', type: ['RULE'] }, per_page: 1, order: 'newest' });
const rd  = await regs.documents.search({ filter: { searchTerm: fr1.results[0].document_number } });
const comments = await regs.comments.search({ filter: { commentOnId: rd.data[0].attributes.objectId }, page: { size: 250 } });

Bring a free API key (FEDREG_REGS_API_KEY, from api.data.gov). The key stays
host-side — sandboxed code can never see it. Without a key, regs.* degrades
gracefully to SourceUnavailable while fr/ecfr keep working. Four layered
rate guardrails protect the shared key: a per-execute call budget, a
per-subject hourly quota, a process-wide hourly token bucket, and no-retry on
upstream 429s.

Under the hood, sources are now a pluggable registry — adding a fourth
source is one factory, one registry line, and one corpus file.

Stateless MCP 2026-07-28

The HTTP transport now speaks the stateless protocol revision on MCP SDK v2:

  • No sessions. No initialize handshake, no Mcp-Session-Id, nothing to
    replay or steal. Every request is self-contained and re-authenticated, so
    per-tenant quota integrity holds by construction.
  • Load-balancer friendly. Replicas are interchangeable — no sticky
    routing, no shared session store.
  • server/discover, required routing headers (Mcp-Method/Mcp-Name)
    with mismatch rejection, and cache metadata (ttlMs/cacheScope) on list
    results.
  • Old clients keep working. Pre-2026 MCP clients are answered by a
    per-request stateless legacy fallback.

Validated end-to-end with MCP Inspector (legacy leg) and the official
@modelcontextprotocol/client@2 SDK (modern leg), including live sandboxed
calls against the real government APIs.

Breaking changes

  • Unknown tool-argument keys are now rejected (additionalProperties: false) instead of silently stripped.
  • Unknown tool names return a JSON-RPC error (-32602), not an
    isError tool result.
  • GET/DELETE /mcp405; the standalone SSE stream is gone.
  • FEDREG_MAX_SESSIONS is removed (ignored if set).

stdio users (Claude Desktop): the transport and protocol changes above do
not apply — but the two tool-layer changes do. Unknown argument keys are now
rejected with isError: true, and an unknown tool name now returns JSON-RPC
-32602 instead of an isError result, on stdio as well as HTTP. Full
details and upgrade steps:
docs/migration-v2.md.

Verification

tsc --noEmit clean · eslint clean · 71 tests across 12 files (including a
conformance spec driving the server with the official v2 client SDK) · live
round-trips on both protocol legs against real upstream APIs.

v1.0.0

Choose a tag to compare

@mikeendale mikeendale released this 06 Aug 19:10

Initial public release.

Added

  • Three-tool code-mode MCP surfacesearch_api, describe_schema,
    execute (the same pattern as clinicaltrials-mcp-server).
  • SDK bindingsfr.* for FederalRegister.gov v1 (documents,
    publicInspection, agencies, issues, suggestedSearches, images)
    and ecfr.* for the Electronic Code of Federal Regulations (titles,
    admin.agencies, structure, ancestry, versions, full, search.*).
  • BM25 search over a curated endpoint + field dictionary
    (schema/field-dictionary.json).
  • Sandboxisolated-vm (primary) and Deno subprocess (fallback) with
    shared AST preflight via acorn, wall-clock timeout, and heap cap.
  • stdio transport for Claude Desktop and MCPB.
  • Streamable HTTP transport built on @modelcontextprotocol/sdk 1.29:
    per-session StreamableHTTPServerTransport, SSE streaming, graceful
    SIGTERM/SIGINT drain.
  • OAuth 2.0 Protected Resource Metadata per RFC 9728 at
    /.well-known/oauth-protected-resource/mcp, WWW-Authenticate header
    pointing at it on 401.
  • Bearer token verification via jose against any JWKS endpoint
    (presets: clerk, workos, auth0, generic-oidc; embedded HS256
    for dev).
  • Hardening — per-IP token-bucket rate limiting, per-subject daily
    quotas, Host-header allowlist for DNS-rebinding protection.
  • Deploy — multi-stage Dockerfile (deploy/Dockerfile) that builds
    isolated-vm and slims to a node:22-bookworm-slim runtime, plus a
    Railway walkthrough in deploy/RAILWAY.md.
  • 27 tests across BM25, sandbox policy, both SDK clients (vs undici
    MockAgent), HTTP rate limiter, and an end-to-end MCP flow (initialize
    → notifications/initialized → tools/list → tools/call → sandbox → SDK
    → mocked upstream).