Update module github.com/stacklok/toolhive to v0.49.0 - #235
Open
renovate[bot] wants to merge 1 commit into
Open
Conversation
Contributor
Author
ℹ️ Artifact update noticeFile name: go.modIn order to perform the update(s) described in the table above, Renovate ran the
Details:
|
renovate
Bot
force-pushed
the
renovate/github.com-stacklok-toolhive-0.x
branch
from
August 10, 2026 13:29
5af15b3 to
53f4f72
Compare
renovate
Bot
force-pushed
the
renovate/github.com-stacklok-toolhive-0.x
branch
from
August 14, 2026 17:45
53f4f72 to
162a713
Compare
renovate
Bot
force-pushed
the
renovate/github.com-stacklok-toolhive-0.x
branch
from
August 18, 2026 17:46
162a713 to
39f565c
Compare
renovate
Bot
force-pushed
the
renovate/github.com-stacklok-toolhive-0.x
branch
from
August 26, 2026 19:58
39f565c to
800744f
Compare
renovate
Bot
force-pushed
the
renovate/github.com-stacklok-toolhive-0.x
branch
from
August 27, 2026 20:03
800744f to
a893bd8
Compare
renovate
Bot
force-pushed
the
renovate/github.com-stacklok-toolhive-0.x
branch
from
September 8, 2026 12:29
a893bd8 to
a8eed49
Compare
renovate
Bot
force-pushed
the
renovate/github.com-stacklok-toolhive-0.x
branch
from
September 8, 2026 22:17
a8eed49 to
76ac97f
Compare
renovate
Bot
force-pushed
the
renovate/github.com-stacklok-toolhive-0.x
branch
from
September 10, 2026 21:52
76ac97f to
4608efd
Compare
renovate
Bot
force-pushed
the
renovate/github.com-stacklok-toolhive-0.x
branch
from
September 11, 2026 21:17
4608efd to
29d4f6f
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
v0.41.0→v0.49.0Release Notes
stacklok/toolhive (github.com/stacklok/toolhive)
v0.49.0Compare Source
🚀 Toolhive v0.49.0 is live!
A security- and auth-correctness release: a signer-pin bypass in
thv skill upgradeis closed, the embedded auth server's documented zero-downtime key rotation finally works, and AWS STS role claims now fail closed instead of silently handing out the fallback role. This release also ships a dependency-light generated Go client for the management API, and moves the project to Go 1.27.pkg/vmcp/session.WithDialControlremoved — vMCP embedders who set a dial-control hook on the session factory get a compile error; wrap the hook in the newWithDialControlResolver(migration guide below).oauth2upstreams with a client secret and no explicittokenEndpointAuthMethodgo back to sending credentials in the POST body instead of HTTP Basic; setclient_secret_basicexplicitly if your IdP requires it (migration guide below).go://workloads default togolang:1.27-alpine— builds pinned to Go 1.26 withGOTOOLCHAIN=localfail, andgo://servers that do not compile under Go 1.27 need an explicit image pin (migration guide below).Migration guide:
session.WithDialControl→session.WithDialControlResolverAffects Go embedders of vMCP that called
session.WithDialControl— the option added in v0.48.0 by #6547. The option was address-blind, so every backend received the samenet.Dialer.Controlhook and a per-backend dial policy could not be expressed. It is replaced in place rather than deprecated alongside a second option.On v0.49.0 the old call fails to compile with
undefined: session.WithDialControl.pkg/vmcp/client.WithDialControlis unchanged. Only thepkg/vmcp/sessionoption was renamed — do not migrateclient.WithDialControlcall sites.Before
After
Per-backend policy — the capability this unlocks. Returning
nilfor a workload leaves that backend onhttp.DefaultTransport, byte-for-byte identical to the no-hook path:Migration steps
session.WithDialControl(call site in thepkg/vmcp/sessionpackage — notpkg/vmcp/client, whose identically-named option is unchanged.session.WithDialControlResolver.func(workloadID string) func(network, address string, c syscall.RawConn) error { return hook }to preserve v0.48.0 semantics exactly.workloadIDto vary policy per backend; returnnilto leave a backend untouched.address— deciding allow/deny fromworkloadIDalone provides no network-level protection.PR: #6567
Migration guide: OAuth2 upstream
tokenEndpointAuthMethoddefaultAffects anyone on v0.48.0 with a pure
oauth2-type upstream provider that uses a pre-registeredclientIdplus a client secret and leavestokenEndpointAuthMethodunset.#6543 (shipped in v0.48.0, and only in v0.48.0) added the
token_endpoint_auth_methodfield, but also made an unset field silently default toclient_secret_basicwhenever a secret was configured — flipping every existing pre-registered upstream from POST-body credentials to HTTP Basic with no opt-in. v0.49.0 restores the historical default while keeping the new field.The auth style is strict, not probing: an unset method sends credentials in the token-request POST body and does not retry with Basic. Against a Basic-only IdP the exchange fails with
invalid_client— on both initial login and token refresh.OIDC-type upstreams and Dynamic Client Registration upstreams are unaffected.
Before
After
Raw auth-server run config:
Migration steps
oauth2upstream with a client secret.token_endpoint_auth_methods_supportedin its discovery document, or its client registration. If onlyclient_secret_basicis accepted, act.tokenEndpointAuthMethod: client_secret_basicon every affectedupstreamProviders[].oauth2Config(spec.embeddedAuthServer.upstreamProviders[]forMCPExternalAuthConfig,spec.authServerConfig.upstreamProviders[]forVirtualMCPServer), ortoken_endpoint_auth_methodunderupstreams[].oauth2_configin a raw run config.The CRD schema is unchanged apart from doc text, so there is no CRD upgrade ordering concern.
PR: #6648
Migration guide: AWS STS role claim shapes now fail closed
Affects deployments using an
awsStsexternal auth config with claim-basedroleMappings. Matcher-expression-only configurations are unaffected.Role mappings are evaluated with the CEL expression
claim_value in claims[role_claim_key], and CEL'sinonly has list and map overloads. Two bugs followed: a string role claim raised a swallowed "no such overload" error and silently produced the fallback role even on an exact match, and an object role claim madeintest map-key membership, matching spuriously. Both are now corrected, and unsupported shapes fail closed rather than quietly granting a role.Two behavior changes, both deliberate:
claimnow selects its mapped role instead offallbackRoleArn. Strings that merely contain the value still do not match.Failed to determine IAM rolefrom theaws_stsmiddleware, or a failed backend call withfailed to select IAM rolein vMCP outbound auth.A missing role claim still falls back exactly as before.
Before
{ "sub": "user1", "groups": { "admins": true } } { "sub": "user2", "groups": 7 }After
{ "sub": "user1", "groups": ["admins"] } { "sub": "user1", "groups": "admins" }Migration steps
awsStsconfig and inspect the claim named byawsSts.roleClaim(defaultgroups).fallbackRoleArn. Verify the mapped role's IAM trust policy accepts these subjects and that its permissions suit that population.realm_access.rolesto a top-level key —roleClaimis a flat lookup, not a dot path). Alternatively pointroleClaimat a correctly-shaped claim, or convert those mappings tomatcherCEL expressions, which are evaluated against the raw claims and are unaffected.role claim has unsupported shape, failing closedandclaim-based role mapping evaluation failed, failing closed— they name the offendingrole_arn. Note thatCEL expression evaluation failed, skipping mappingwas promoted from Debug to Warn, so pre-existing matcher-expression bugs will now appear at default log level.PR: #6306 — Closes #6305
Migration guide: Go 1.27 toolchain and
go://builder imageTwo separate audiences.
go://workload users. The default builder image forgo://workloads moved fromgolang:1.26-alpinetogolang:1.27-alpine. Only freshly builtgo://workloads with no override are affected. Go's compatibility promise makes a failure unlikely, but a server relying on a removed deprecated API will not compile.Downstream Go importers of the root module.
github.com/stacklok/toolhivenow declaresgo 1.27.0with notoolchaindirective. Under the defaultGOTOOLCHAIN=autoGo downloads 1.27 transparently; underGOTOOLCHAIN=local, a pinned-toolchain CI, an air-gapped build, or a distro-packaged Go, the build fails hard withgo: go.mod requires go >= 1.27. The nestedgithub.com/stacklok/toolhive/sdk/gomodule deliberately keeps itsgo 1.26.0floor and is not affected.Before
After
Migration steps
go://run, pin per invocation:thv run go://github.com/example/server --runtime-image golang:1.26-alpine.runtime_configs.go.builder_imagein~/.toolhive/config.yamlas above.additional_packagesreplaces rather than appends to the built-in["ca-certificates", "git"], so list them explicitly. Only the builder stage is customizable for Go workloads; the runtime stage is alwaysalpine:3.23.GOTOOLCHAIN=autoand allow Go to fetch the toolchain on demand.github.com/stacklok/toolhive/sdk/goinstead — it retains thego 1.26.0floor.setup-goat the rootgo-version-file: go.modrather than pinning a version.PR: #6639
🆕 New Features
github.com/stacklok/toolhive/sdk/gomodule provides a typed, generated client covering all 77 documented management API operations, with safe default timeout and response-size handling, without pulling in ToolHive's full application dependency graph (#6637).skills/getmaps toAction::"get_skill"on the skill's exact URI, andskills/listresponses are filtered to the skills the caller may get — previously both methods were refused outright by default-deny, andskills/listwithout aget_skillpermit now returns an empty list instead of a 403 (#6512).thv ai-plugin push --key <cosign.key>is available again for publishers using automatic local server discovery, now that key-signed plugins can be verified at install time withthv ai-plugin install --public-keyand pinned intoolhive.lock.yamlfor latersync/upgrade; remote or manually configured API URLs must still sign keylessly (#6528).WARNthat names the store so an unintended downgrade stays visible (#6551).🐛 Bug Fixes
thv skill upgrade --allow-signer-changeno longer doubles as unsigned consent — it previously succeeded against an unsigned candidate, silently dropping a signer-pinned skill's recorded identity and rewriting the lock entry asunsigned: true; boththv skill upgradeandthv ai-plugin upgradenow reportfailed [unsigned-rejected]and name theuninstall … --scope projecttheninstall … --scope project --allow-unsignedsequence that records the exception explicitly (#6629)./.well-known/jwks.jsonnow publishes configured fallback keys alongside the signing key (primary first, de-duplicated bykid), making the documented three-step zero-downtime signing-key rotation actually work instead of a hard cutover that invalidated every outstanding JWT (#6638 — Closes #6451).notifications/progressframes are flushed to the SSE stream, in backend order, before the response closes it (#6491 — Closes #6349).spec.podTemplateSpecno longer get ametadata.generationbump and a spuriousDeploymentUpdatedevent on everystatusReportingIntervaltick, including the 30s default — pod-template drift detection was comparing user-merged label maps for exact equality (#6377 — Fixes #6340).invalid_client,invalid_grant, …) where a wrapped error could previously degrade to a genericserver_error(#6639).🧹 Misc
miniredisimport that broke typecheck — and therefore every test — inpkg/authserver/runneronmain(#6636).📦 Dependencies
github.com/stacklok/toolhive-coreAlso migrates all Redis call sites from the now-deprecated
toolhive-core/rediscompatibility facade toredisconndirectly (#6646).👋 Welcome to our newest contributor: @isaacgao4396 🎉
Full commit log
What's Changed
New Contributors
Full Changelog: stacklok/toolhive@v0.48.0...v0.49.0
🔗 Full changelog: stacklok/toolhive@v0.48.0...v0.49.0
v0.48.0Compare Source
What's Changed
89a6a09by @renovate[bot] in #577985c1c22by @renovate[bot] in #6172Full Changelog: stacklok/toolhive@v0.47.1...v0.48.0
v0.47.1Compare Source
What's Changed
Full Changelog: stacklok/toolhive@v0.47.0...v0.47.1
v0.47.0Compare Source
What's Changed
New Contributors
Full Changelog: stacklok/toolhive@v0.46.0...v0.47.0
v0.46.0Compare Source
🚀 Toolhive v0.46.0 is live!
An authentication and supply-chain hardening release: embedded auth servers can now trust private CAs for upstream identity providers, plugin upgrades refuse silent signer rotations, and three OAuth flows return the right answer instead of a misleading one.
🆕 New Features
caBundleRefon an OIDC or OAuth2 upstream, which adds that CA to the system trust roots for discovery, token, user-info, and dynamic client registration calls to that upstream only (#6428).operator-crds0.46.0 chart before (or together with) the operator chart — a stale CRD silently prunescaBundleReffrom applied resources instead of rejecting it. Existing manifests that do not setcaBundleRefreconcile identically and are not restarted by this upgrade.thv ai-plugin upgradenow refuses to install a plugin update whose signature identity differs from the one recorded in the project lock file — or that is unsigned — reportingsigner-change-blockedand exiting 4 until you confirm the rotation with the new--allow-signer-changeflag, which re-records the new identity in the lock (#6401).TOOLHIVE_PLUGINS_LOCK_ENABLED; lock entries with no recorded provenance are unaffected.🐛 Bug Fixes
thv llm setupnow fails fast with an actionable "callback port already in use" message instead of silently switching to a random port that your identity provider would reject — free the port or pass--callback-port <port>with a redirect URI registered with your IdP (#6432).access_deniedOAuth error, so clients stop treating a deliberate denial as a retryable server failure (#6441).🧹 Misc
👋 Welcome to our newest contributor: @alex-feel 🎉
Full commit log
What's Changed
New Contributors
Full Changelog: stacklok/toolhive@v0.45.0...v0.46.0
🔗 Full changelog: stacklok/toolhive@v0.45.0...v0.46.0
v0.45.0Compare Source
🚀 Toolhive v0.45.0 is live!
A security-and-supply-chain release: two coordinated fixes harden the
thv servemanagement API and the container build path, plugin artifacts gain end-to-end Sigstore verification, and skill pushes are now signed keylessly by default. Alongside that, Prometheus metrics move to a dedicated diagnostics port behind a migration switch, the embedded auth server gains two new RFC 7523 flows, and Virtual MCP finally honours configured backend timeouts and propagates backend health changes to live sessions.🔐 Security
thv servemanagement API are now rejected — the management API creates workloads with caller-named host bind mounts, registers MCP servers into on-disk agent configs, and installs skill artifacts, all as unauthenticated state-changing routes in the default configuration, and a cross-origin web page could drive it with a CORS "simple" POST that never triggers a preflight. This is GHSA-xv9h-79wp-q9w6. Two independent barriers are added for TCP listeners only (migration guide below).npx://,uvx://andgo://references were interpolated intoRUNinstructions unvalidated; they are now constrained to a character class that excludes shell metacharacters, and the two remaining bare interpolations in the templates are quoted (migration guide below).tools/list/prompts/list/resources/listresponse failed every decode and sniff and passed through unfiltered, leaking entries the Cedar policy or tool filter was supposed to remove (#6304).Flush()committed an implicitWriteHeader(200), so a backend 500 reached the client as a 200 carrying the full unfiltered list (#6335).thv servenow requiresContent-Type: application/jsonon state-changing requests that carry a body, and validatesOriginon loopback TCP binds — non-JSON callers get415 Unsupported Media Type(migration guide below)[A-Za-z0-9@/:._+=~[]-]— anpx:///uvx:///go://reference containing anything else now fails at build time instead of being interpolated into the Dockerfile (migration guide below)thv skill syncwithout--clientsnow targets every skill-supporting client — combined with the newqoderclient, every locked skill reports as drifted on the first sync after upgrading, andthv skill sync --checkexits non-zero in CI (migration guide below)runtime_config.build_withonnpx:///go://images is now a 400, andruntime_config.runtime_envis now actually applied to the built image — both were silently discarded by the workload REST API (migration guide below)thv skill pushrequires exactly one of--key,--identity-token, or--no-sign—key+no_signwas previously accepted and pushed an unsigned artifact; it is now a 400 (migration guide below)operational.timeouts— a configured value below 30 s will now actually cut backend calls that previously got the silent 30 s default (migration guide below)plugins.MaterializationAdapter,state.Storewriters,storage.UpstreamTokenStorage, and six function signatures. No effect on the CLI, the operator, the wire protocol, or persisted state (migration guide below)thv llmlocal proxy returns401 token_requiredinstead of502 server_errorwhen the stored credential has been rejected by the IdP ([#6389](https://redirect.github.coConfiguration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.