Skip to content

Releases: stacklok/toolhive

v0.59.0

Choose a tag to compare

@toolhive-release-app toolhive-release-app released this 28 Oct 20:50
1710945

What's Changed

Full Changelog: v0.58.0...v0.59.0

v0.58.0

Choose a tag to compare

@toolhive-release-app toolhive-release-app released this 27 Oct 12:03
c0b163c

What's Changed

  • Add opt-in at+jwt typ for embedded AS access tokens by @jhrozek in #6942
  • Refuse refresh grants whose upstream credential is dead by @tgrunnagle in #6930
  • Stop serving delegate clients removed from config by @jhrozek in #6945
  • Fix authserver test build on main by @jhrozek in #6950
  • Rename embedded-auth ConfigMap ref helpers by @jhrozek in #6951
  • Skip upstream identity capture when sub_id is off by @jhrozek in #6956
  • Update k8s.io/utils digest to ca04ba5 by @renovate[bot] in #6933
  • Release v0.58.0 by @toolhive-release-app[bot] in #6957

Full Changelog: v0.57.0...v0.58.0

v0.57.0

Choose a tag to compare

@toolhive-release-app toolhive-release-app released this 26 Oct 17:46
9726b3f

What's Changed

New Contributors

Full Changelog: v0.56.0...v0.57.0

v0.56.0

Choose a tag to compare

@toolhive-release-app toolhive-release-app released this 22 Oct 11:47
aed6a97

What's Changed

  • Add OSS Scanner audit configuration by @rdimitrov in #6874
  • Make unit tests pass as root and without a container runtime by @rdimitrov in #6875
  • Cover the embedded auth server in threat model by @jhrozek in #6879
  • Add native Go fuzz targets for untrusted parsers by @rdimitrov in #6877
  • Decode IPv4 in IPv4-compatible and SIIT addresses by @rdimitrov in #6878
  • Let embedders skip consent for preauthorized clients by @jhrozek in #6882
  • Cap DCR clients and expire unused ones after 24h by @tgrunnagle in #6863
  • Expose DCR client cap and register rate limit in CRD by @tgrunnagle in #6867
  • Enable Claude Code gateway model discovery by @jerm-dro in #6862
  • Answer 401 when a token session holds no upstream access token by @alex-feel in #6846
  • Verify row ownership in Redis upstream token read by @hellouz818 in #6876
  • Add coverage for -32601 under HTTP error statuses by @hellouz818 in #6873
  • Test client response posts across handlers by @jstar0 in #5885
  • Fix field names in external-auth examples by @3nesdeniz in #6330
  • Add auth server TLS listener and SPIFFE middleware by @jhrozek in #6843
  • Start auth server TLS listener in vMCP by @jhrozek in #6891
  • Explain LLM gateway model-discovery failures by @jerm-dro in #6884
  • Fix Claude Desktop paths and managed check on Linux by @jerm-dro in #6883
  • Release v0.56.0 by @toolhive-release-app[bot] in #6917

New Contributors

Full Changelog: v0.55.2...v0.56.0

v0.55.2

Choose a tag to compare

@toolhive-release-app toolhive-release-app released this 19 Oct 23:28
89b1bd2

Security

Rootless Podman host-access endpoints blocked by the egress proxy (GHSA-2x65-h9w3-h7hc, Medium)

With network isolation on rootless Podman, a workload could reach host services through the Squid or Envoy egress proxy using host.containers.internal or the address it maps to. ToolHive's protected set only covered Docker's host names and bridge gateways, and Podman's host-access address is not necessarily a bridge gateway.

On Podman, ToolHive now reads the DNS sidecar's runtime-generated /etc/hosts at deployment. It adds every address mapped to host.containers.internal, host.docker.internal, or gateway.docker.internal to the protected set, alongside all bridge gateways. Both proxies block those names and addresses unless --allow-docker-gateway is set.

What changes for operators

  • On Podman, deployment fails before the proxy or MCP container starts if host.containers.internal is missing from the runtime's hosts file (for example with no_hosts = true in containers.conf), or if the hosts data cannot be read. This applies even with --allow-docker-gateway.
  • The protected set is a deployment-time snapshot. Redeploy workloads after changing Podman's host mappings, rootless networking mode, or bridge networks.

What's Changed

  • Use postflight_steps for the thv Homebrew cask hook by @rdimitrov in #6870
  • Update go modules to v0.0.57 by @renovate[bot] in #6869
  • Release v0.55.2 by @toolhive-release-app[bot] in #6871

Full Changelog: v0.55.1...v0.55.2

v0.55.1

Choose a tag to compare

@toolhive-release-app toolhive-release-app released this 19 Oct 22:25
a36e987

What's Changed

  • Fix flaky ignore overlay tests from shared artifact dir by @rdimitrov in #6854
  • Publish thv to Homebrew as a cask by @rdimitrov in #6859
  • Fix Podman client creation with compat transport by @rdimitrov in #6860
  • Drop Go patch pin, bump toolhive-catalog, stop e2e pings by @rdimitrov in #6866
  • Release v0.55.1 by @toolhive-release-app[bot] in #6868

Full Changelog: v0.55.0...v0.55.1

v0.55.0

Choose a tag to compare

@toolhive-release-app toolhive-release-app released this 19 Oct 11:31
5c06e05

What's Changed

Full Changelog: v0.54.0...v0.55.0

v0.54.0

Choose a tag to compare

@toolhive-release-app toolhive-release-app released this 14 Oct 17:18
1ce13bb

What's Changed

  • Update module github.com/stacklok/toolhive-catalog to v0.20261013.0 by @renovate[bot] in #6816
  • Extract exact-ID decode from DecodeMessage by @jhrozek in #6820
  • Add Pi coding agent as a supported MCP client by @danbarr in #6819
  • Add SPIFFE file bundle source by @jhrozek in #6759
  • Refresh upstream tokens when the ID token expires by @tgrunnagle in #6773
  • Narrow OIDC referrer watches to ref changes by @Sriram-PR in #6706
  • Fix lint in RSA client key validation by @rdimitrov in #6824
  • Release v0.54.0 by @toolhive-release-app[bot] in #6823

New Contributors

Full Changelog: v0.53.0...v0.54.0

v0.53.0

Choose a tag to compare

@toolhive-release-app toolhive-release-app released this 13 Oct 19:32
fa7e344

🚀 Toolhive v0.53.0 is live!

This release adds group-based upstream selection to the vMCP embedded auth server, and stops the operator from acting on spec.permissionProfile as a security fix. It also makes vMCP keep a backend's valid tools when one of its items can't be decoded, and makes MCPRemoteProxy report config failures correctly.

🔄 Deprecations

  • MCPServer.spec.permissionProfile is deprecated and the Kubernetes operator now ignores it. The field still exists in the v1beta1 CRD so existing manifests keep applying, but it never restricted pods in Kubernetes. Use podTemplateSpec security contexts and NetworkPolicy resources instead. MCPServers that set the field get a PermissionProfileUnsupported Warning event. No removal version has been announced yet. (security fix, commit d5aa374)

🆕 New Features

  • vMCP operators using the embedded auth server can set an upstream filter in authserver-config.yaml. It picks which extra upstream providers each user goes through, based on group claims from the first upstream, so users skip OAuth legs for services they have no account on. The feature is opt-in and fails closed when the group claim is missing. CRD support follows in #6740. (#6739)

🐛 Bug Fixes

  • The operator no longer passes spec.permissionProfile to the runner as a profile name or file path. Before, a crafted value could make the operator read arbitrary local files. The configmap profile volume is no longer mounted, and thv export --format k8s no longer emits the field. MCPServers that set the field may roll their proxy pods once after upgrading. (d5aa374)
  • When a referenced config fails to resolve, MCPRemoteProxy now reports Ready=False with a message naming the failing handler and an up-to-date observedGeneration. Before, it could show Phase: Failed while still reporting a stale Ready=True. (#6776)
  • vMCP now skips individual tools/list, resources/list, resource-template and prompt items it cannot decode, and logs a warning naming the backend and the item. Before, one bad item hid all of that backend's capabilities. This applies to the Modern list path only; the Legacy path is tracked in #6814. (#6772)
  • Tools whose top-level schema type is a JSON Schema type array (for example ["object","null"]) are now kept, with the schema passed through unchanged, because toolhive-core is bumped to v0.0.52. (#6815)

📦 Dependencies

Module Version
github.com/stacklok/toolhive-core v0.0.52
ghcr.io/modelcontextprotocol/inspector (default thv inspector image) 2.10.1
github.com/go-chi/chi/v5 v5.4.0
github.com/aws/aws-sdk-go-v2 v1.47.3
github.com/aws/aws-sdk-go-v2/config v1.33.9
github.com/aws/aws-sdk-go-v2/service/sts v1.51.4
github.com/pressly/goose/v3 v3.29.0
github.com/prometheus/common v0.72.1
github.com/onsi/ginkgo/v2 v2.33.1
github.com/alicebob/miniredis/v2 v2.40.0
golang.org/x/crypto v0.58.0
golang.org/x/mod v0.42.0
golang.org/x/net v0.61.0
golang.org/x/sync v0.24.0
golang.org/x/sys v0.49.0
golang.org/x/term v0.47.0
golang.org/x/exp/jsonrpc2 faecfb2
oras.land/oras-go/v2 v2.6.3
python (e2e test image) 3.15-slim
GitHub Actions (create-github-app-token, download-artifact, setup-node, upload-artifact, claude-code-action, codeql-action, goreleaser-action, kind-action) latest patch/minor

👋 Welcome to our newest contributor: @feiiiiii5 🎉

Full commit log

What's Changed

New Contributors

Full Changelog: v0.52.0...v0.53.0

🔗 Full changelog: v0.52.0...v0.53.0

v0.52.0

Choose a tag to compare

@toolhive-release-app toolhive-release-app released this 12 Oct 17:37
51adbda

🚀 Toolhive v0.52.0 is live!

This release adds TLS for Redis session storage (runtime and operator), makes thv llm setup and teardown safer by default, and fixes several authorization, OAuth and operator issues.

⚠️ Breaking Changes

  • thv llm teardown now purges cached tokens by default — a full teardown deletes cached OIDC tokens and fails if cleanup fails; pass --keep-tokens to keep the old behavior (migration guide) (#6733)
  • DCRCredentialStore gained a method — out-of-tree implementations of pkg/authserver/storage.DCRCredentialStore no longer compile until they add UpdateDCRCredentialsIfUnchanged (migration guide) (#6758)
Migration guide: thv llm teardown purges cached tokens by default

Affects CLI users and scripts that run thv llm teardown. Cleanup is local only: tokens are deleted from the secrets provider, not revoked at the identity provider.

Before

# Tokens survived teardown unless you opted in
thv llm teardown
thv llm teardown --purge-tokens

After

# Full teardown (no configured tools remain) purges cached tokens
thv llm teardown
# Keep tokens for a later setup
thv llm teardown --keep-tokens
# Targeted teardown still keeps tokens; --purge-tokens deletes them even when other tools remain
thv llm teardown <tool> --purge-tokens

Migration steps

  1. If a script relied on tokens surviving a full teardown so a later thv llm setup could skip re-authentication, add --keep-tokens.
  2. Teardown now exits non-zero if the secrets provider is unavailable or token listing or deletion fails (these were warnings before). Handle the failure, or pass --keep-tokens to skip the purge.
  3. --keep-tokens and --purge-tokens are mutually exclusive.
  4. Go callers: llm.Teardown has new parameters and llm.PurgeTokens now returns an error.

PR: #6733 — Closes #6732

Migration guide: DCRCredentialStore gained a method

Affects only Go code outside this repository that implements DCRCredentialStore (including hand-written mocks). The built-in memory and Redis stores are already updated.

Before

type DCRCredentialStore interface {
    StoreDCRCredentialsIfAbsent(...)
    UpdateDCRCredentialsIfPresent(...)
    // ...
}

After

type DCRCredentialStore interface {
    // ...existing methods...
    UpdateDCRCredentialsIfUnchanged(ctx context.Context, creds *DCRCredentials, expected *DCRCredentials) error
}

Migration steps

  1. Add UpdateDCRCredentialsIfUnchanged(ctx, creds, expected) to your implementation.
  2. Overwrite the row at creds.Key only if the stored row still equals expected.
  3. Return a wrapped ErrNotFound if the row is absent and the new ErrDCRCredentialsChanged if it differs; write nothing in either case.
  4. Reject a nil expected, or one whose Key differs from creds.Key.

PR: #6758

🆕 New Features

  • Redis session storage supports TLS in the proxy runner, vMCP and their rate limiters, with system roots or a private CA bundle (#6731)
  • MCPServer, MCPRemoteProxy and VirtualMCPServer accept spec.sessionStorage.tls, including caCertSecretRef for a private CA; a startup WARN is now logged when Redis session storage runs without TLS, so log-based alerting may fire for existing plaintext setups (#6767)
  • thv llm setup now configures Claude Code for one-hour prompt caching by default; re-run setup to pick it up, or use --short-prompt-cache to opt out (#6515)

🐛 Bug Fixes

  • spec.secrets on MCPServer accepts multiple keys of the same Secret; re-apply the operator-crds chart (#6690)
  • The token-exchange issuer policy no longer rejects an omitted allowMayAct with a wildcard delegate; re-apply the operator-crds chart (#6532)
  • Config resources are deleted promptly once their last referrer goes away instead of lingering up to 30 seconds (#6768)
  • Cedar policies can use extension claims from RFC 7662 introspection (such as roles); policies that referenced these claims will now see real values, so review any that were written around them being absent (#6707)
  • Authz-filtered tools/list, prompts/list and resources/list responses keep the members the backend sent (including MCP 2026-07-28 resultType), always carry Cache-Control: private, no-store, and reject ambiguous duplicate or aliased annotation members (#6709)
  • The embedded auth server no longer cuts off slow upstream identity-provider token endpoints at 10 seconds, which could leave a revoked refresh token stored (#6755)

🧹 Misc

  • Add a shared JWT claim string-array decoder; Cedar behavior is unchanged (#6738)
  • Clarify priority-conflict documentation and strengthen regression coverage (#6716)
  • Clarify operator Helm values descriptions (#6771)
  • Reduce Podman network normalization complexity (#6809)
  • Drop the ping step from the remote MCP server e2e test (#6766)
  • Use exact version comments on artifact actions (#6761)
  • Add alex-feel to MAINTAINERS (#6808)

📦 Dependencies

Module Version
charm.land/bubbletea/v2 v2.1.0
github.com/aws/aws-sdk-go-v2 v1.47.2
github.com/aws/aws-sdk-go-v2/config v1.33.8
github.com/aws/aws-sdk-go-v2/service/sts v1.51.3
github.com/cenkalti/backoff/v7 v7.0.1
github.com/getsentry/sentry-go (+ otel, otel/otlp) v0.50.0
github.com/go-git/go-git/v5 v5.19.3
github.com/go-git/go-billy/v5 v5.9.2
github.com/Microsoft/go-winio v0.6.3
github.com/moby/moby/client v0.6.2
github.com/moby/moby/api v1.56.1
github.com/prometheus/common v0.72.0
github.com/redis/go-redis/v9 v9.23.0
github.com/shirou/gopsutil/v4 v4.26.9
github.com/spiffe/go-spiffe/v2 v2.9.0
github.com/stacklok/toolhive-catalog v0.20261005.0
github.com/stacklok/toolhive-core v0.0.51
github.com/tidwall/gjson v1.20.0
go.opentelemetry.io/otel (and SDK/exporters) v1.47.0
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.72.0
modernc.org/sqlite v1.60.1
sigs.k8s.io/controller-runtime v0.25.2
ghcr.io/modelcontextprotocol/inspector 2.9.0
anchore/sbom-action v0.24.3
anthropics/claude-code-action v1.0.241
Full commit log

What's Changed

Read more