Skip to content

Commit 63e54e7

Browse files
renovate[bot]github-actions[bot]claude
authored
Update stacklok/toolhive to v0.56.0 (#1263)
* Update stacklok/toolhive to v0.56.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Refresh reference assets for toolhive v0.56.0 * Document DCR limits for toolhive v0.56.0 Cover the DCR client cap, registration rate limit, and unused-client expiry, and the Claude Desktop Linux managed-settings warning. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Clarify DCR limit wording in K8s auth guide Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
1 parent b71cd07 commit 63e54e7

13 files changed

Lines changed: 233 additions & 39 deletions

‎.github/upstream-projects.yaml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ projects:
6464

6565
- id: toolhive
6666
repo: stacklok/toolhive
67-
version: v0.55.2
67+
version: v0.56.0
6868
# toolhive is a monorepo covering the CLI, the Kubernetes
6969
# operator, and the vMCP gateway. It also introduces cross-
7070
# cutting features that land in concepts/, integrations/,

‎docs/toolhive/concepts/embedded-auth-server.mdx‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,8 @@ the OAuth flow.
225225
support CIMD (such as VS Code) use it automatically.
226226
- **Dynamic Client Registration (DCR):** Supports OAuth 2.0 DCR (RFC 7591) as a
227227
fallback for clients that do not support CIMD. MCP clients register
228-
automatically with no manual configuration in ToolHive.
228+
automatically with no manual configuration in ToolHive. A client cap and a
229+
rate limit on `/oauth/register` bound how many clients can register.
229230
- **Direct upstream redirect:** Redirects clients directly to the upstream
230231
provider for authentication (for example, GitHub or Atlassian).
231232
- **Configurable signing keys:** JWTs are signed with keys you provide,

‎docs/toolhive/guides-cli/client-configuration.mdx‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,12 @@ thv client connector rm --client claude-desktop github-tools
127127
Re-running `thv llm setup --client claude-desktop` keeps your connectors, and
128128
`thv llm teardown` removes them along with the rest of the gateway
129129
configuration. `thv client connector add` logs a warning when Claude Desktop
130-
won't load the connector, for example when a managed-preferences (MDM) profile
131-
overrides the local configuration or a different saved configuration is applied
132-
in the app.
130+
won't load the connector, for example when a managed configuration overrides the
131+
local configuration or a different saved configuration is applied in the app. A
132+
managed configuration is an MDM profile on macOS, or
133+
`/etc/claude-desktop/managed-settings.json` on Linux. A managed file that Claude
134+
Desktop rejects as invalid also disables the local configuration and triggers
135+
the same warning.
133136

134137
See the
135138
[`thv client connector` reference](../reference/cli/thv_client_connector.md) for

‎docs/toolhive/guides-k8s/embedded-auth-server-k8s.mdx‎

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -397,11 +397,11 @@ For a complete walkthrough including deploying Redis Sentinel from scratch, see
397397
## Configure MCP client registration
398398

399399
MCP clients must identify themselves to the embedded authorization server. The
400-
server always accepts Dynamic Client Registration (DCR) requests from MCP
401-
clients; no configuration is required. Enable CIMD for clients that support the
402-
MCP specification's preferred registration mechanism. You can also set baseline
403-
scopes for clients that need to request scopes beyond those in their
404-
registration metadata.
400+
server accepts Dynamic Client Registration (DCR) requests from MCP clients with
401+
no configuration required, subject to configurable registration limits. Enable
402+
CIMD for clients that support the MCP specification's preferred registration
403+
mechanism. You can also set baseline scopes for clients that need to request
404+
scopes beyond those in their registration metadata.
405405

406406
### Enable CIMD for zero-registration clients
407407

@@ -461,6 +461,56 @@ For the two-layer trust model behind CIMD (why the upstream IdP never sees the
461461
client's CIMD URL), see
462462
[Client ID Metadata Document (CIMD)](../concepts/embedded-auth-server.mdx#client-id-metadata-document-cimd).
463463

464+
### Limit Dynamic Client Registration
465+
466+
Because `/oauth/register` is unauthenticated, the embedded authorization server
467+
bounds how many clients it registers and how many it keeps:
468+
469+
- **Expiry:** a client that registers but never completes a token exchange
470+
expires after 24 hours. Its first successful token exchange extends the
471+
registration to 30 days, and a registration idle for more than 30 days
472+
expires. An expired client must register again.
473+
- **Client cap:** `storage.maxDCRClients` caps the number of live DCR-registered
474+
clients (default `10000`). At the cap, `/oauth/register` returns HTTP `503`
475+
with a `Retry-After` header until a client expires; no existing client is
476+
evicted. Operator-configured clients and CIMD clients don't count toward the
477+
cap. With Redis storage, every replica shares the count; with in-memory
478+
storage, each replica keeps its own.
479+
- **Rate limit:** `registrationRateLimit` is a token bucket that limits
480+
registrations per replica (default 1 per second with a burst of 5). Requests
481+
over the limit get HTTP `429` with a `Retry-After` header. Set `maxTokens` to
482+
the burst size and `refillPeriod` to the time it takes to refill the bucket
483+
from empty. For example, 10 registrations per minute with a burst of 3 is
484+
`maxTokens: 3` and `refillPeriod: 18s`.
485+
486+
The defaults suit most deployments. Raise the limits if many legitimate clients
487+
register in a short window, such as during a large client rollout:
488+
489+
```yaml title="MCPExternalAuthConfig: DCR limits"
490+
spec:
491+
embeddedAuthServer:
492+
registrationRateLimit:
493+
maxTokens: 10
494+
refillPeriod: 10s
495+
storage:
496+
type: redis
497+
maxDCRClients: 25000
498+
redis:
499+
# ...
500+
```
501+
502+
When you size the cap, keep in mind that unused clients live for 24 hours. A
503+
caller registering at the full rate can keep up to the per-second rate,
504+
multiplied by the replica count and by 86,400 (the seconds in a day), unused
505+
clients alive. At the default rate, one replica fills the default cap in about
506+
2.8 hours, and new registrations then fail with `503` until those clients
507+
expire.
508+
509+
Setting `maxDCRClients: 0` removes the cap, leaving the rate limit as the only
510+
bound on stored clients. Use it only temporarily, for example while an existing
511+
client population above the cap drains. A large finite value, such as two to
512+
three times your observed live client count, keeps some protection.
513+
464514
### Allow confidential DCR clients
465515

466516
By default, DCR only issues public clients: registrations must use
@@ -477,9 +527,9 @@ spec:
477527
478528
`/oauth/register` is unauthenticated, so enabling this lets any caller who can
479529
reach the endpoint mint a client credential. Confidential registrations are
480-
restricted to `https` non-loopback redirect URIs, and (with the Redis storage
481-
backend) any DCR registration idle for more than 30 days is evicted and must
482-
re-register.
530+
restricted to `https` non-loopback redirect URIs, and they expire like any other
531+
DCR registration (see
532+
[Limit Dynamic Client Registration](#limit-dynamic-client-registration)).
483533

484534
To let an agent register a keypair for RFC 8693 token exchange instead of
485535
receiving a shared secret, set `allowPrivateKeyJWTRegistration: true`:

‎docs/toolhive/guides-vmcp/embedded-auth-server-vmcp.mdx‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,31 @@ For an explanation of how ToolHive resolves CIMD documents and why the OAuth
398398
provider never sees the MCP client's CIMD URL, see
399399
[Client ID Metadata Document (CIMD)](../concepts/embedded-auth-server.mdx#client-id-metadata-document-cimd).
400400

401+
### Limit Dynamic Client Registration
402+
403+
The embedded authorization server caps the number of live DCR clients (default
404+
`10000`) and rate-limits `/oauth/register` (default 1 registration per second
405+
with a burst of 5, per replica). To change these limits, set
406+
`storage.maxDCRClients` and `registrationRateLimit` under
407+
`spec.authServerConfig`:
408+
409+
```yaml title="VirtualMCPServer: DCR limits"
410+
spec:
411+
authServerConfig:
412+
registrationRateLimit:
413+
maxTokens: 10
414+
refillPeriod: 10s
415+
storage:
416+
type: redis
417+
maxDCRClients: 25000
418+
redis:
419+
# ...
420+
```
421+
422+
For client expiry rules, sizing guidance, and the HTTP responses at each limit,
423+
see
424+
[Limit Dynamic Client Registration](../guides-k8s/embedded-auth-server-k8s.mdx#limit-dynamic-client-registration).
425+
401426
### Allow confidential DCR clients
402427

403428
To configure a VirtualMCPServer for confidential DCR, set

‎docs/toolhive/reference/cli/thv_client_connector_add.md‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@ must be the server's final address: Claude Desktop does not follow HTTP
2121
redirects, even one that only adds a trailing slash.
2222

2323
A warning is logged when Claude Desktop will not load the connector: when a
24-
managed-preferences (MDM) profile overrides its local configuration, or when a
25-
different saved configuration is applied in the app.
24+
managed configuration (an MDM profile on macOS, or
25+
/etc/claude-desktop/managed-settings.json on Linux) overrides its local
26+
configuration, or when a different saved configuration is applied in the app.
27+
A managed file that Claude Desktop rejects as invalid also disables the local
28+
configuration, so it triggers the same warning.
2629

2730
Example:
2831
thv client connector add --client claude-desktop stacklok-connectors https://connector-gateway.example.com/gw/mcp

‎docs/toolhive/reference/cli/thv_llm_config_set.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ thv llm config set [flags]
3131

3232
```
3333
--audience string OIDC audience (optional)
34-
--bedrock-compat Persist Bedrock compatibility for Claude Code (CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 + per-tier Bedrock model IDs). Applied by "thv llm setup". Use --bedrock-compat=false to clear.
34+
--bedrock-compat Persist Bedrock compatibility for Claude Code (CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 + per-tier Bedrock model IDs discovered from the gateway). Applied by "thv llm setup". Use --bedrock-compat=false to clear.
3535
--callback-port int OIDC callback port (omit to keep current; default: ephemeral)
3636
--client-id string OIDC client ID
3737
--enable-1m With Bedrock compat, opt into the 1M context window by appending [1m] to opus/sonnet model IDs.
3838
--gateway-url string LLM gateway base URL (must use HTTPS)
3939
-h, --help help for set
4040
--issuer string OIDC issuer URL
41-
--models strings Model IDs to persist and apply during "thv llm setup", comma-separated or by repeating the flag, e.g. --models=us.anthropic.claude-opus-4-8,us.anthropic.claude-sonnet-5. Credential-helper clients (Claude Desktop) write these as inferenceModels; with Bedrock compat, each ID is also mapped to a Claude Code tier by matching 'haiku', 'opus', or 'sonnet' in the ID.
41+
--models strings Model IDs to persist and apply during "thv llm setup", comma-separated or by repeating the flag, e.g. --models=us.anthropic.claude-opus-4-8,us.anthropic.claude-sonnet-5. Credential-helper clients (Claude Desktop) write these as inferenceModels; with Bedrock compat, each ID overrides a Claude Code tier by matching 'haiku', 'opus', 'sonnet', or 'fable' in the ID.
4242
--proxy-port int Localhost proxy listen port (omit to keep current; default: 14000)
4343
--short-prompt-cache Use Claude Code's five-minute prompt cache instead of ToolHive's one-hour default. Applied by "thv llm setup"; use --short-prompt-cache=false to restore one-hour caching.
4444
--tls-skip-verify Skip TLS certificate verification for the upstream gateway (local dev only; use --tls-skip-verify=false to clear)

‎docs/toolhive/reference/cli/thv_llm_setup.md‎

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,17 @@ run and persisted to config only after login and tool patching succeed. This
6060
lets you combine "config set" and "setup" into a single command.
6161

6262
For a gateway that forwards to AWS Bedrock, add --bedrock-compat to configure
63-
Claude Code with CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 and per-tier Bedrock
64-
model IDs (override with --models; add --enable-1m for the 1M context window on
65-
opus/sonnet). The setting is persisted and only affects Claude Code. To add it to
66-
an already-configured Claude Code, re-run:
63+
Claude Code with CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 and pin each model tier
64+
to the newest Bedrock model the gateway advertises (override a tier with --models;
65+
add --enable-1m for the 1M context window on opus/sonnet). The pins repoint Claude
66+
Code's built-in Opus/Sonnet/Haiku/Fable rows in the /model picker (via
67+
ANTHROPIC_DEFAULT_*_MODEL), so selecting a built-in row routes to Bedrock. Setup
68+
also enables Claude Code's gateway model discovery, which adds any further models
69+
the gateway serves as separate picker rows without re-running setup. If the
70+
gateway's model list cannot be fetched, or has no Bedrock model IDs, setup does
71+
not configure Claude Code (unless --models pins every tier). The setting is
72+
persisted and only affects Claude Code.
73+
To add it to an already-configured Claude Code, re-run:
6774

6875
thv llm setup --client claude-code --bedrock-compat
6976

@@ -80,7 +87,7 @@ thv llm setup [flags]
8087
```
8188
--anthropic-path-prefix string Path prefix appended to the gateway URL for Anthropic API tools (e.g. /anthropic). Also used for Pi model discovery. When omitted, the gateway is probed automatically.
8289
--audience string OIDC audience (optional)
83-
--bedrock-compat Configure Claude Code for a gateway that forwards to AWS Bedrock: write CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 (Bedrock rejects the experimental anthropic-beta headers) and pin per-tier Bedrock model IDs (override with --models). Persisted, so a later plain "thv llm setup" keeps it; clear with --bedrock-compat=false. Only affects Claude Code.
90+
--bedrock-compat Configure Claude Code for a gateway that forwards to AWS Bedrock: write CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 (Bedrock rejects the experimental anthropic-beta headers) and pin each tier to the newest Bedrock model the gateway advertises (override with --models). Persisted, so a later plain "thv llm setup" keeps it; clear with --bedrock-compat=false. Only affects Claude Code.
8491
--callback-port int OIDC callback port (omit to keep current; default: ephemeral)
8592
--client string Configure only this AI tool by name (e.g. claude-code, cursor, codex). Omit to configure all detected tools.
8693
--client-id string OIDC client ID
@@ -89,7 +96,7 @@ thv llm setup [flags]
8996
-h, --help help for setup
9097
--issuer string OIDC issuer URL
9198
--lazy Skip the interactive OIDC login and defer it until the first time a configured tool accesses the gateway. Tool config and persisted settings are written normally. Useful for unattended provisioning (e.g. an MDM profile).
92-
--models strings Model IDs to configure, comma-separated or by repeating the flag, e.g. --models=us.anthropic.claude-opus-4-8,us.anthropic.claude-sonnet-5. For Pi these filter its discovered models (Pi does not support --lazy). For credential-helper clients (Claude Desktop) these become inferenceModels. With --bedrock-compat, each ID is also mapped to a Claude Code tier by matching 'haiku', 'opus', or 'sonnet' in the ID (IDs matching no tier are ignored with a warning). Omit to use the built-in Bedrock defaults / gateway model discovery.
99+
--models strings Model IDs to configure, comma-separated or by repeating the flag, e.g. --models=us.anthropic.claude-opus-4-8,us.anthropic.claude-sonnet-5. For Pi these filter its discovered models (Pi does not support --lazy). For credential-helper clients (Claude Desktop) these become inferenceModels. With --bedrock-compat, each ID overrides a Claude Code tier by matching 'haiku', 'opus', 'sonnet', or 'fable' in the ID (IDs matching no tier are ignored with a warning). Omit to pin each tier to the newest Bedrock model discovered from the gateway.
93100
--proxy-port int Localhost proxy listen port (omit to keep current; default: 14000)
94101
--short-prompt-cache Use Claude Code's five-minute prompt cache instead of ToolHive's one-hour default. Persisted, so a later plain "thv llm setup" keeps it; use --short-prompt-cache=false to restore one-hour caching.
95102
--skip-browser Print the OIDC authorization URL instead of opening a browser, then wait for the callback. Use in headless/SSH/CI environments where no system browser is available.

‎docs/toolhive/reference/helm/operator-crds.mdx‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ Control CRD installation and preservation with these Helm values.
1111
This reference lists values declared in the chart's default `values.yaml`.
1212
Templates can also accept optional settings and inherited `global` values.
1313

14-
Chart: `toolhive-operator-crds`. Chart version: `0.55.2`. Source:
15-
[`values.yaml`](https://github.com/stacklok/toolhive/blob/v0.55.2/deploy/charts/operator-crds/values.yaml)
16-
at `v0.55.2`.
14+
Chart: `toolhive-operator-crds`. Chart version: `0.56.0`. Source:
15+
[`values.yaml`](https://github.com/stacklok/toolhive/blob/v0.56.0/deploy/charts/operator-crds/values.yaml)
16+
at `v0.56.0`.
1717

1818
## Values
1919

‎docs/toolhive/reference/helm/operator.mdx‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ Configure the ToolHive operator with these Helm values.
1010
This reference lists values declared in the chart's default `values.yaml`.
1111
Templates can also accept optional settings and inherited `global` values.
1212

13-
Chart: `toolhive-operator`. Chart version: `0.55.2`. Source:
14-
[`values.yaml`](https://github.com/stacklok/toolhive/blob/v0.55.2/deploy/charts/operator/values.yaml)
15-
at `v0.55.2`.
13+
Chart: `toolhive-operator`. Chart version: `0.56.0`. Source:
14+
[`values.yaml`](https://github.com/stacklok/toolhive/blob/v0.56.0/deploy/charts/operator/values.yaml)
15+
at `v0.56.0`.
1616

1717
## Values
1818

@@ -68,7 +68,7 @@ features:
6868
gc:
6969
gogc: 75
7070
gomemlimit: 110MiB
71-
image: ghcr.io/stacklok/toolhive/operator:v0.55.2
71+
image: ghcr.io/stacklok/toolhive/operator:v0.56.0
7272
imageDiscovery:
7373
enabled: false
7474
resources: {}
@@ -153,8 +153,8 @@ serviceAccount:
153153
labels: {}
154154
name: toolhive-operator
155155
tolerations: []
156-
toolhiveRunnerImage: ghcr.io/stacklok/toolhive/proxyrunner:v0.55.2
157-
vmcpImage: ghcr.io/stacklok/toolhive/vmcp:v0.55.2
156+
toolhiveRunnerImage: ghcr.io/stacklok/toolhive/proxyrunner:v0.56.0
157+
vmcpImage: ghcr.io/stacklok/toolhive/vmcp:v0.56.0
158158
volumeMounts: []
159159
volumes: []
160160
```
@@ -255,7 +255,7 @@ Key containing the password in `existingSecret`. When empty, uses
255255

256256
**Type:** `string`
257257

258-
**Default:** `"ghcr.io/stacklok/toolhive/operator:v0.55.2"`
258+
**Default:** `"ghcr.io/stacklok/toolhive/operator:v0.56.0"`
259259

260260
Container image for the operator.
261261

@@ -271,15 +271,15 @@ Image pull policy for the operator container and image-discovery containers.
271271

272272
**Type:** `string`
273273

274-
**Default:** `"ghcr.io/stacklok/toolhive/proxyrunner:v0.55.2"`
274+
**Default:** `"ghcr.io/stacklok/toolhive/proxyrunner:v0.56.0"`
275275

276276
Container image for ToolHive proxy runners created by the operator.
277277

278278
### `operator.vmcpImage`
279279

280280
**Type:** `string`
281281

282-
**Default:** `"ghcr.io/stacklok/toolhive/vmcp:v0.55.2"`
282+
**Default:** `"ghcr.io/stacklok/toolhive/vmcp:v0.56.0"`
283283

284284
Container image for Virtual MCP Server (vMCP) deployments created by the
285285
operator.

0 commit comments

Comments
 (0)