Skip to content

cameronrye/gopher-mcp

v0.5.0 Security

This release includes 2 security fixes for security teams reviewing exposed deployments.

✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →
This release patches 2 known CVEs

Topics

gemini gemini-protocol gopher gopher-protocol mcp mcp-server

ReleasePort's take

Light signal
editorial:auto 1mo

v0.5.0 fixes Gemini TLS handshake timing and sanitizes status‑44 backoff values, improving reliability and preventing hangs.

Why it matters: Security fixes bound by severity ≥ 85 (TLS close‑handshake timeout) and ≥ 90 (status‑44 validation) directly mitigate indefinite client hangs and latency abuse; address them to safeguard Gemini interactions.

Summary

AI summary

Updates SLOW_DOWN, code-block, and Version across a mixed release.

Changes in this release

Security Critical

Sanitizes Gemini status-44 backoff wait, rejecting non-finite values to prevent indefinite client hangs.

Sanitizes Gemini status-44 backoff wait, rejecting non-finite values to prevent indefinite client hangs.

Source: llm_adapter@2026-06-11

Confidence: high

Security High

Time‑bounds the Gemini TLS close handshake, preventing peers from extending request latency with missing `close_notify`.

Time‑bounds the Gemini TLS close handshake, preventing peers from extending request latency with missing `close_notify`.

Source: llm_adapter@2026-06-11

Confidence: high

Breaking High

Changes Gemini binary success responses to return only metadata, dropping base64‑inlined bodies.

Changes Gemini binary success responses to return only metadata, dropping base64‑inlined bodies.

Source: llm_adapter@2026-06-11

Confidence: high

Performance Medium

Removes per‑line metadata duplication in Gemtext preformat blocks, reducing serialized size by roughly one‑third.

Removes per‑line metadata duplication in Gemtext preformat blocks, reducing serialized size by roughly one‑third.

Source: llm_adapter@2026-06-11

Confidence: high

Performance Medium

Truncates Gopher menu parsing at `max_menu_items`, avoiding materialization of huge directories and reducing memory usage.

Truncates Gopher menu parsing at `max_menu_items`, avoiding materialization of huge directories and reducing memory usage.

Source: llm_adapter@2026-06-11

Confidence: high

Performance Low

Reuses per-certificate TLS client for Gemini requests, eliminating repeated CA bundle loads and PEM reads per fetch.

Reuses per-certificate TLS client for Gemini requests, eliminating repeated CA bundle loads and PEM reads per fetch.

Source: granite4.1:30b@2026-06-11-audit

Confidence: low

Bugfix Medium

Exposes real destination URL as `next_url` for Gopher hURL menu items, making web/gemini links followable.

Exposes real destination URL as `next_url` for Gopher hURL menu items, making web/gemini links followable.

Source: llm_adapter@2026-06-11

Confidence: high

Bugfix Medium

Applies Gopher un‑dot‑stuffing only when RFC 1436 terminator `.` is present, preserving literal leading `..` in unframed documents.

Applies Gopher un‑dot‑stuffing only when RFC 1436 terminator `.` is present, preserving literal leading `..` in unframed documents.

Source: llm_adapter@2026-06-11

Confidence: high

Bugfix Medium

Returns distinct `PROTOCOL_ERROR` for Gemini server faults instead of `INVALID_REQUEST`, correctly indicating server misbehavior.

Returns distinct `PROTOCOL_ERROR` for Gemini server faults instead of `INVALID_REQUEST`, correctly indicating server misbehavior.

Source: llm_adapter@2026-06-11

Confidence: high

Bugfix Medium

Accepts spec‑valid comma‑separated `lang` parameters (e.g., `lang=en,fr`) without rejecting the MIME type, preventing mojibake.

Accepts spec‑valid comma‑separated `lang` parameters (e.g., `lang=en,fr`) without rejecting the MIME type, preventing mojibake.

Source: llm_adapter@2026-06-11

Confidence: high

Bugfix Low

Prevents crash when stray unprefixed `GOPHER`, `GEMINI`, or `SERVER` environment variables are set by unrelated tooling.

Prevents crash when stray unprefixed `GOPHER`, `GEMINI`, or `SERVER` environment variables are set by unrelated tooling.

Source: llm_adapter@2026-06-11

Confidence: high

Full changelog

Security

  • A malicious Gemini server can no longer hang the client with an unbounded
    status-44 (SLOW_DOWN) backoff. The server-supplied wait is now sanitized and
    clamped (a non-finite value such as inf is rejected/capped), so a single
    44 inf response can no longer make every later fetch to that host sleep
    forever while holding a concurrency-semaphore slot.
  • The Gemini TLS close handshake is now time-bounded, so a peer that withholds
    close_notify can no longer tack the OS TCP timeout onto each request after
    the read deadline has already been met.

Fixed

  • Gopher menu items using the hURL web-link convention (a URL:<target>
    selector, typically on a type-h item) now expose the real destination as
    next_url instead of a gopher:// URL pointing back at the gopher host, so
    web/gemini links on real-world menus are followable.
  • Gopher text-mode un-dot-stuffing (...) is now applied only when the
    RFC 1436 . terminator is actually present. An unframed document (no
    terminator) is returned verbatim, so a literal leading .. is no longer
    corrupted to ..
  • A server-side Gemini protocol fault (missing CRLF, over-long meta, bad status
    line, empty response) now returns a distinct PROTOCOL_ERROR instead of
    INVALID_REQUEST, so the model is told the server misbehaved rather than that
    its own URL was malformed.
  • A spec-valid comma-separated lang parameter (e.g. lang=en,fr) is no longer
    rejected; rejecting it previously discarded the whole MIME type, including the
    declared charset, producing mojibake or gemtext misclassification.
  • A stray unprefixed GOPHER / GEMINI / SERVER environment variable set by
    unrelated tooling no longer crashes startup (it was misread as the nested
    config object).

Changed

  • Gemini binary success responses now return metadata only (size + detected
    MIME type) as a new binary result kind, instead of base64-inlining the full
    body into the model's context. This matches the Gopher binary path and the
    server's documented "binary bodies are returned as metadata only" contract; a
    1 MB body previously shipped ~1.4M base64 characters. Re-fetch the resource
    directly if the raw bytes are needed.
  • Gemtext preformat (code-block) content lines no longer repeat a per-line
    metadata dict (plus duplicated alt_text/language); block-level metadata is
    kept on the opening ``` toggle line only. This roughly thirded the
    serialized size of code blocks sent to the model. Attribute access is
    unchanged; only the serialized output is leaner.
  • The Gopher menu parser now stops once the item cap (max_menu_items) is
    reached instead of building the entire directory before slicing, so a 1 MB
    directory no longer materialises tens of thousands of model objects to keep a
    small slice. Truncation is still flagged on the result.
  • Client-certificate Gemini requests now reuse a per-certificate TLS client
    (and its SSL context) instead of rebuilding it on every request, so the system
    CA bundle load and cert/key PEM reads — blocking work that ran on the event
    loop — happen once per certificate rather than per fetch.
  • Release/CI hygiene: prepare-release.py now bumps the version with an anchored
    match (no longer corrupting target-version / python_version / minversion
    in pyproject.toml) and also updates server.json; GitHub release notes no
    longer drop the last line of each changelog section; all CI/release/publish
    jobs run uv sync --locked so a stale lockfile fails loudly; the
    manual-publish workflow no longer offers a no-op pypi target; Dependabot now
    covers the Docker base image; and the docs site redeploys on src/** changes
    so the mkdocstrings API reference can't drift.

Release Information:

  • Version: 0.5.0
  • Release Date: 2026-06-11
  • Commit: cd71f7f
  • Workflow: 27374295717

Installation:

pip install gopher-mcp==0.5.0

Verification:
All packages are signed and can be verified using Sigstore.

Security Fixes

  • Sanitizes and clamps Gemini SLOW_DOWN (status-44) backoff values to prevent indefinite client sleep (CVE not listed)
  • Time‑bounds Gemini TLS close handshake so a missing `close_notify` no longer adds OS TCP timeout delay per request

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track cameronrye/gopher-mcp

Get notified when new releases ship.

Sign up free

About cameronrye/gopher-mcp

Modern, cross-platform MCP server enabling AI assistants to browse and interact with both Gopher protocol and Gemini protocol resources safely and efficiently. Features dual protocol support, TLS security, and structured content extraction.

All releases →

Related context

Earlier breaking changes

  • v0.3.0 Reject `--mount-path` for transports that ignore it instead of silently dropping.
  • v0.3.0 Server settings now read under `GOPHER_MCP_` environment prefix; update any existing env vars accordingly.

Beta — feedback welcome: [email protected]