Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
d5092b1
Configure rate limits on VirtualMCPServer PR B 2 (#5522)
Sanskarzz Jun 30, 2026
ae9fb30
Fix stale pre-pulled image tag causing flaky E2E tests (#5693)
reyortiz3 Jul 1, 2026
f49526f
Add XAA auth strategy CRD support (#5691)
jhrozek Jul 1, 2026
99e233d
Update go.starlark.net digest to 529d8e8 (#5520)
renovate[bot] Jul 1, 2026
2aca563
Release v0.33.0 (#5698)
toolhive-release-app[bot] Jul 1, 2026
879865d
Unify token-endpoint URL validation, fix insecure-mode gap (#5706)
jhrozek Jul 2, 2026
71ed00c
Allow custom HTTP headers on the OpenAI embedding client (#5704)
gabrielcosi Jul 2, 2026
8010cd0
Sort aggregated tools by name for deterministic embedding order (#5709)
gabrielcosi Jul 2, 2026
72da2e8
Fix documentation link rot across the repo (#5711)
JAORMX Jul 3, 2026
01d4c9a
Add plugin install/list/info/uninstall + MaterializationAdapter (Phas…
JAORMX Jul 3, 2026
06a5674
Make --allow-docker-gateway grant host access, not just unblock it (#…
eleftherias Jul 3, 2026
d70cc41
Support nested map claims in Cedar authorization for act claim (#5713)
jhrozek Jul 3, 2026
a935334
Document that --allow-docker-gateway ignores allowed ports (#5714)
eleftherias Jul 3, 2026
c46b038
Replace opaque Step A/B labels in XAA CRD comments (#5703)
jhrozek Jul 3, 2026
7d08e2e
Unify subject provider defaulting, hard-error xaa (#5708)
jhrozek Jul 3, 2026
fb69e00
Update auth and security libraries (#5670)
renovate[bot] Jul 3, 2026
953f5b9
Update anthropics/claude-code-action action to v1.0.165 (#5721)
renovate[bot] Jul 6, 2026
f64f9a1
Update anthropics/claude-code-action digest to 558b1d6 (#5718)
renovate[bot] Jul 6, 2026
f6d67b4
Update aws-sdk-go-v2 monorepo (#5722)
renovate[bot] Jul 6, 2026
fdca599
Update module github.com/getsentry/sentry-go to v0.47.0 (#5726)
renovate[bot] Jul 6, 2026
95941cc
Update goreleaser/goreleaser-action digest to f06c13b (#5720)
renovate[bot] Jul 6, 2026
69826e9
Update github/codeql-action digest to 54f647b (#5719)
renovate[bot] Jul 6, 2026
d27d85a
Update module github.com/stacklok/toolhive-catalog to v0.20260706.0 (…
renovate[bot] Jul 6, 2026
609c0ad
Filter upstream auth chain via callback hook (#5725)
tgrunnagle Jul 6, 2026
8ba812e
Preserve external annotations on operator Services (#5731)
blkt Jul 7, 2026
7c383d6
Drop unconditional ACL password guard from auth server Redis storage …
JAORMX Jul 7, 2026
ba88b46
Remove Amp editor extension clients (#5717)
ecgang Jul 7, 2026
61655d1
Expose UpstreamFilter through authserver.New facade (#5733)
tgrunnagle Jul 7, 2026
5e3e742
Add Claude Desktop as an LLM gateway client (#5712)
jerm-dro Jul 7, 2026
ab02cae
Fix TOOLHIVE_DEV plain HTTP breaking real OCI registry pulls (#5735)
samuv Jul 7, 2026
b084be4
Release v0.34.0 (#5737)
toolhive-release-app[bot] Jul 7, 2026
9662681
Update module github.com/stacklok/toolhive-core to v0.0.27 (#5736)
renovate[bot] Jul 7, 2026
34a2169
Improve documentation discoverability and cross-linking (#5739)
JAORMX Jul 8, 2026
709c918
Add ListBackends/LookupBackend to the vMCP core interface (#5763)
ChrisJBurns Jul 8, 2026
3cbfbae
Rate limiting observability (metrics and tracing) PR A (#5701)
Sanskarzz Jul 10, 2026
687ce42
Suppress GO-2026-5932 (x/crypto/openpgp deprecated-by-design, no fix …
JAORMX Jul 13, 2026
8e45112
Allow HTTP upstream OIDC issuers for in-cluster dev environments (#5787)
ChrisJBurns Jul 13, 2026
d2f6812
Release v0.35.0 (#5788)
toolhive-release-app[bot] Jul 13, 2026
e9473d5
Add Codex CLI direct-mode support to thv llm setup (#5789)
jerm-dro Jul 14, 2026
76f76bd
Use llmgateway mode constants for direct/proxy modes (#5790)
JAORMX Jul 14, 2026
75b3ed7
Update anthropics/claude-code-action digest to f1bd27c (#5777)
renovate[bot] Jul 14, 2026
f58dbd5
Release v0.36.0 (#5795)
toolhive-release-app[bot] Jul 14, 2026
c3a2da2
Document operator phase conventions (#5766)
buyicoder Jul 14, 2026
3a55fad
Add runtime-stage environment variables to protocol Dockerfiles (#5801)
danbarr Jul 14, 2026
794bcb4
Add MCP conformance CI job for thv run proxy (#5806)
jhrozek Jul 15, 2026
f4632d8
Prefer context7 for MCP spec lookups, drop hardcoded version (#5805)
jhrozek Jul 15, 2026
59d8466
Expose --allow-docker-gateway in workload API (#5799)
kantord Jul 15, 2026
52f82ed
Added spec.podTemplateSpec support to MCPRemoteProxy (#5531)
Sanskarzz Jul 15, 2026
24cbd8e
Stop SSE filter from leaking tools/list on undecodable lines (#5304)
saivedant169 Jul 15, 2026
9e50934
Validate aud and resource claims in returned ID-JAG JWT (#5716)
jhrozek Jul 15, 2026
1ec7352
Flush tool-filter buffer after handler returns (#5809)
aponcedeleonch Jul 15, 2026
90539bb
Release v0.37.0 (#5811)
toolhive-release-app[bot] Jul 15, 2026
30ecff0
Fix tool-filter terminal drain dropping error bodies (#5816)
aponcedeleonch Jul 15, 2026
b80f1c3
Add Codex App LLM setup support (#5810)
JAORMX Jul 15, 2026
1164212
Release v0.38.0 (#5820)
toolhive-release-app[bot] Jul 15, 2026
2894cac
Stop VirtualMCPServer hot-reconcile on cleared imagePullSecrets (#5821)
jhrozek Jul 16, 2026
e4c7c1c
Update module github.com/stacklok/toolhive-core to v0.0.28 (#5798)
renovate[bot] Jul 16, 2026
30fb5d2
Add Bedrock compatibility flag to thv llm setup (#5832)
aponcedeleonch Jul 16, 2026
4ebb610
Release v0.39.0 (#5833)
toolhive-release-app[bot] Jul 16, 2026
75ba8d1
Merge upstream v0.39.0 into dp-stable
carlos-lopez-vecino Oct 14, 2026
3aaef18
Update FORK.md for the v0.39.0 merge
carlos-lopez-vecino Oct 14, 2026
0789f48
Merge dp-stable into the v0.39.0 merge
carlos-lopez-vecino Oct 15, 2026
89cea41
Reword GET comments flagged by codespell
carlos-lopez-vecino Oct 15, 2026
afc71f8
Replace partial reflect.Kind switch in exposure
carlos-lopez-vecino Oct 15, 2026
f663afc
Fix revive findings in fork-owned code
carlos-lopez-vecino Oct 15, 2026
8166011
Fix test lint findings in runner and mcp tests
carlos-lopez-vecino Oct 15, 2026
08d687a
Test token error log attrs without global slog
carlos-lopez-vecino Oct 15, 2026
7bf5e9d
Fix remaining fork lint findings
carlos-lopez-vecino Oct 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 20 additions & 23 deletions .claude/agents/mcp-protocol-expert.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
name: mcp-protocol-expert
description: "PROACTIVELY use for MCP protocol questions, transport implementations, JSON-RPC debugging, and spec compliance verification. Expert in MCP 2025-11-25 specification."
tools: [Read, Write, Edit, Glob, Grep, WebFetch]
description: "PROACTIVELY use for MCP protocol questions, transport implementations, JSON-RPC debugging, and spec compliance verification. Expert in the current stable MCP specification."
tools: [Read, Write, Edit, Glob, Grep, WebFetch, mcp__context7__resolve-library-id, mcp__context7__get-library-docs]
model: inherit
---

Expand All @@ -22,35 +22,32 @@ Defer to: oauth-expert (OAuth/OIDC), kubernetes-expert (K8s operator), toolhive-

## Critical: Always Fetch Latest Spec

**Before providing MCP protocol guidance, ALWAYS use WebFetch to retrieve the relevant spec page.** MCP is actively evolving — the spec is the single source of truth.
**Before providing MCP protocol guidance, ALWAYS retrieve the relevant spec page — never answer from pre-training knowledge alone.** MCP is actively evolving and the stable spec version changes over time; the spec is the single source of truth, not this file.

### Spec URLs (2025-11-25)
- Main: https://modelcontextprotocol.io/specification/2025-11-25
- Transports: https://modelcontextprotocol.io/specification/2025-11-25/basic/transports
- Lifecycle: https://modelcontextprotocol.io/specification/2025-11-25/basic/lifecycle
- Authorization: https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization
- Security: https://modelcontextprotocol.io/specification/2025-11-25/basic/security_best_practices
- Tasks: https://modelcontextprotocol.io/specification/2025-11-25/basic/utilities/tasks
- Tools: https://modelcontextprotocol.io/specification/2025-11-25/server/tools
- Elicitation: https://modelcontextprotocol.io/specification/2025-11-25/client/elicitation
- MCP Auth Extensions: https://modelcontextprotocol.io/extensions/auth/overview
- Schema: https://modelcontextprotocol.io/specification/2025-11-25/schema

Check for newer spec versions — the date in the URL indicates version.
**Prefer context7. Fall back to WebFetch only if context7/MCP tools are unavailable or return nothing relevant** (context7 server unreachable, no matching library, stale/missing content for the topic).

### Workflow
1. Use WebFetch to retrieve the relevant spec page
2. Cross-reference fetched spec with ToolHive's implementation
3. Provide guidance based on the latest spec
4. Explicitly note any discrepancies between spec and implementation

1. **Try context7 first**:
- Call `mcp__context7__resolve-library-id` fresh every time (do not hardcode or reuse a library ID across sessions) with a query like "Model Context Protocol specification". Context7 mints a new pinned library per stable release (e.g. `/websites/modelcontextprotocol_io_specification_2025-11-25`, `_2025-06-18`), so a fresh resolve naturally surfaces whichever dated snapshot is current — don't assume any specific date.
- Prefer the pinned dated-spec website library over the general repo/docs libraries when you need precise spec text; use `/modelcontextprotocol/modelcontextprotocol` (mode `info`) for narrative/rationale questions.
- Call `mcp__context7__get-library-docs` with a topic scoped to the question (e.g. "authorization discovery", "streamable http transport").
2. **Fall back to WebFetch** if context7 didn't resolve a library, the MCP tools aren't available in this environment, or the returned snippets don't answer the question:
- First resolve the current version: fetch the unversioned index `https://modelcontextprotocol.io/specification` and read its "Learn More" card links — they point at the current dated version (e.g. `/specification/2025-11-25/...`). Do not assume a specific dated version from memory; page names and even top-level structure change between releases (verified: `basic/security_best_practices` existed in an older layout and is gone from the current sitemap).
- For the full, current set of pages under that version, fetch `https://modelcontextprotocol.io/sitemap.xml` and filter for the resolved version string — this is self-correcting as pages are added, renamed, or removed, unlike a hand-maintained list.
- Common pages to expect (verify against the sitemap, don't assume the exact path): architecture, basic, basic/authorization, basic/lifecycle, basic/transports, basic/utilities/{cancellation,ping,progress,tasks}, client/{elicitation,roots,sampling}, server, server/{tools,resources,prompts}, server/utilities/{completion,logging,pagination}, schema, changelog.
- Also check `https://modelcontextprotocol.io/extensions/auth/overview` for MCP auth extensions, which live outside the versioned spec tree.
3. Cross-reference whichever source answered with ToolHive's implementation.
4. Provide guidance based on the latest spec.
5. Explicitly note any discrepancies between spec and implementation, and note which source (context7 vs. WebFetch) backed the answer if it's non-obvious.

## Your Expertise

- **MCP Specification**: Authoritative protocol definition and compliance
- **Transport protocols**: stdio (preferred), Streamable HTTP, SSE (deprecated)
- **JSON-RPC 2.0**: Message format, request/response/notification patterns
- **Protocol lifecycle**: Initialization, capability negotiation, operation, shutdown
- **Tasks & Elicitation**: Long-running operations and user input collection (new in 2025-11-25)
- **Tasks & Elicitation**: Long-running operations and user input collection
- **Authorization**: OAuth 2.1, RFC 9728, RFC 8707, Client ID Metadata Documents

## Key ToolHive Files
Expand All @@ -71,8 +68,8 @@ Check for newer spec versions — the date in the URL indicates version.
5. **Protocol debugging**: Analyze JSON-RPC exchanges against spec requirements

<critical_behaviors>
1. Fetch before answering — always use WebFetch for relevant spec pages
1. Fetch before answering — try context7 first, fall back to WebFetch, never answer from memory alone
2. Spec is authoritative — if conflict with this doc, the fetched spec wins
3. Check for newer versions — look for dates newer than 2025-11-25
3. Never hardcode a version — resolve the current stable version fresh each time (context7 resolve-library-id, or the unversioned spec index for WebFetch)
4. Call out discrepancies explicitly when ToolHive differs from spec
</critical_behaviors>
24 changes: 24 additions & 0 deletions .claude/rules/operator.md
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,30 @@ write-path mechanics.)

See `cmd/thv-operator/DESIGN.md` for detailed decision guidelines.

## Phase and Conditions

**Conditions** are the primary status mechanism. Each condition represents one
aspect of readiness, validity, or external dependency state, and controllers
should set conditions with specific reason constants and actionable messages.
Use specific condition types such as `ConfigurationValid` or `RemoteAvailable`
when the condition is scoped to one CRD; reserve truly shared types for
cross-CRD conventions.

**Phase** is a human-readable lifecycle summary for `kubectl get` output. It
must be derived from the current conditions and observed state, never set as an
independent source of truth.

Rules:

- Never set `Phase` directly from a separate code path; derive it from the
current condition states.
- `Ready` means all readiness conditions are `True`.
- `Failed` means at least one condition is `False` with a terminal reason.
- `Pending` means required conditions are not all satisfied yet, and no terminal
failure has been observed.
- Condition `Type` names should be specific and have meaningful `Reason`
constants.

## CRD Type Conventions

- Use `metav1.Duration` for duration fields in CRD types, not `string` or
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/claude.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ jobs:

- name: Run Claude Code
id: claude
uses: anthropics/claude-code-action@a92e7c70a4da9793dc164451d829089dc057a464 # v1
uses: anthropics/claude-code-action@f1bd27ca5b54584506e40e17884d90bdaaa1a9b3 # v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
# Security: Restrict tools to prevent arbitrary code execution.
Expand Down
42 changes: 41 additions & 1 deletion .github/workflows/e2e-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ jobs:
run: |
# Pre-pull images used by E2E tests so that workload creation
# does not pay the image-pull cost inside the 60s API timeout.
docker pull ghcr.io/stackloklabs/osv-mcp/server:0.1.0 &
docker pull ghcr.io/stackloklabs/osv-mcp/server:0.1.3 &
docker pull ghcr.io/stackloklabs/gofetch/server:1.0.2 &
docker pull ghcr.io/stacklok/toolhive/egress-proxy:latest &
# yardstick is only needed for the vmcp test suite
Expand Down Expand Up @@ -154,3 +154,43 @@ jobs:
path: |
test/e2e/junit-report.xml
retention-days: 7

conformance:
name: MCP Conformance
runs-on: ubuntu-8cores-32gb
needs: build-binary
timeout-minutes: 20
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6

- name: Set up Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: '22'

- name: Download ToolHive binary
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
with:
name: toolhive-binary
path: ./bin/

- name: Set binary permissions
run: chmod +x ./bin/thv

- name: Set up container runtime (Docker)
run: |
docker --version
sudo systemctl start docker

- name: Run MCP conformance suite
env:
THV_BINARY: ${{ github.workspace }}/bin/thv
run: ./test/conformance/run-conformance.sh

- name: Upload conformance results
if: always()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: conformance-results
path: test/conformance/results
retention-days: 7
2 changes: 1 addition & 1 deletion .github/workflows/issue-triage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
fetch-depth: 0

- name: Run Claude Code for Issue Triage
uses: anthropics/claude-code-action@a92e7c70a4da9793dc164451d829089dc057a464 # v1.0.159
uses: anthropics/claude-code-action@558b1d6cab4085c7753fe402c10bef0fbb92ac7a # v1.0.165
with:
prompt: |
You are an issue triage assistant. Analyze issue #${{ github.event.issue.number }} in ${{ github.repository }} and apply appropriate labels.
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-notes.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ jobs:

- name: Generate release notes with Claude
id: claude
uses: anthropics/claude-code-action@a92e7c70a4da9793dc164451d829089dc057a464 # v1
uses: anthropics/claude-code-action@f1bd27ca5b54584506e40e17884d90bdaaa1a9b3 # v1
env:
# gh CLI used by the skill (read-only PR/issue lookups) authenticates
# via GH_TOKEN. Read access is sufficient — publishing happens in a
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/releaser.yml
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ jobs:

- name: Run GoReleaser
id: run-goreleaser
uses: goreleaser/goreleaser-action@5daf1e915a5f0af01ddbcd89a43b8061ff4f1a89 # v7
uses: goreleaser/goreleaser-action@f06c13b6b1a9625abc9e6e439d9c05a8f2190e94 # v7
with:
distribution: goreleaser
version: "~> v2"
Expand Down
9 changes: 8 additions & 1 deletion .github/workflows/security-scan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:
fail-build: false

- name: Upload Grype scan results to GitHub Security tab
uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/upload-sarif@54f647b7e1bb85c95cddabcd46b0c578ec92bc1a # v4
if: always()
with:
sarif_file: ${{ steps.grype-scan.outputs.sarif }}
Expand Down Expand Up @@ -80,6 +80,13 @@ jobs:
# CI's `setup-go: stable` still resolves to go1.26.3 because the
# actions/go-versions manifest lags the Go release. Temporary
# exclusion; remove once CI builds on go1.26.4 or later.
#
# GO-2026-5932: golang.org/x/crypto/openpgp is deprecated-by-design
# ("unsafe, not maintained, should not be used"). No fixed version
# exists and none is planned. ToolHive does not import openpgp
# directly; it is pulled transitively via sigstore (rekor/sigstore-go)
# for backward-compatible OpenPGP verification. Remove when sigstore
# drops the openpgp dependency.
IGNORED_VULNS="GO-2026-4514 GO-2026-4883 GO-2026-4887 GO-2026-5617 GO-2026-5668 GO-2026-5746 GO-2026-5932 GO-2026-5037 GO-2026-5038 GO-2026-5039"

# Show the raw output for debugging
Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
4 changes: 3 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ This file provides guidance to Claude Code when working with this repository.

ToolHive is a lightweight, secure manager for MCP (Model Context Protocol: https://modelcontextprotocol.io) servers written in Go. It provides a CLI (`thv`), a Kubernetes operator (`thv-operator`), and a proxy runner (`thv-proxyrunner`) for container-based MCP server isolation.

**To understand the system, start with the [Architecture Documentation](docs/arch/README.md).** Begin at the [Architecture Overview](docs/arch/00-overview.md) and [Core Concepts](docs/arch/02-core-concepts.md), then read the component deep-dives relevant to your task — [Deployment Modes](docs/arch/01-deployment-modes.md), [Transport Architecture](docs/arch/03-transport-architecture.md), [Kubernetes Operator](docs/arch/09-operator-architecture.md), [Virtual MCP](docs/arch/10-virtual-mcp-architecture.md), and more. The [architecture index](docs/arch/README.md) has a full map and by-topic navigation.

## Build and Development Commands

```bash
Expand Down Expand Up @@ -84,7 +86,7 @@ Detailed rules are in `.claude/rules/` (loaded automatically when matching files

## Architecture Documentation

When making changes that affect architecture, update relevant docs in `docs/arch/`. See `docs/arch/README.md` for structure.
When making changes that affect architecture, update relevant docs in `docs/arch/`. See the [architecture documentation index](docs/arch/README.md) for structure and the per-component documents.

## Things That Will Bite You

Expand Down
15 changes: 14 additions & 1 deletion FORK.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
fork patches we carry. Upstream releases are brought in with a merge commit
(`Merge upstream vX.Y.Z into dp-stable`), never a rebase.

Merge base: upstream **v0.32.0** (`ecb9a8d84`), merged in `38edac4e3` (PAIINFRA-228).
Merge base: upstream **v0.39.0** (`4ebb610f2`), merged in `75ba8d1d5` (PAIINFRA-233).

## Changes that live only in a merge commit

Expand Down Expand Up @@ -56,6 +56,17 @@ merge, see below):
`VMCP_SESSION_HMAC_SECRET` is no longer used (upstream logs and ignores it). Sessions stored with the
old token-hash key are invalidated on read, so clients re-initialize once after the upgrade.

### `75ba8d1d5` — Merge upstream v0.39.0

Fork behaviour kept while resolving:

| Behaviour | Where it lives now | Original commit |
|---|---|---|
| The MCPServer Service is updated before the Deployment, so Deployment drift cannot starve a port fix; labels and annotations are now merged, as upstream #5731 does | `cmd/thv-operator/controllers/mcpserver_controller.go` (`Reconcile`) | `5df636980`, `e88959899` |
| Explicit `spec.config.backends` (hub remote backends) are merged with the discovered backends, an explicit backend winning on the same name; upstream's `excludedBackends` filters only the discovered ones | `cmd/thv-operator/controllers/virtualmcpserver_vmcpconfig.go` (`mergeStaticBackends`) | `8e474c8b2` |

`PodTemplateSpecBuilder.SchedulingSpec()` stays: MCPServer and the vMCP drift check still use it.

## Fork behaviour re-ported after the v0.32.0 merge

In v0.32.0 every vMCP caller goes through `server.Serve`: tool, resource and prompt calls go
Expand Down Expand Up @@ -132,3 +143,5 @@ They stay in history; don't re-apply them on a replay.
| `7a6c9a2f3` | Restore with the owner's live identity (`ownsStoredSession`) | Upstream #5650 restores with the request identity; `enforceSessionBinding` rejects other callers. Dropped in the v0.32.0 merge. |
| `c2cb472a2` (status map) | Upstream-token status map (`UpstreamCredentialStatus`, `UpstreamTokenStatuses`) | Upstream #5651 returns 401 when a refresh fails; the missing-token case is `44b70f6a5`. No Cedar policy read the status. Dropped in the v0.32.0 merge. |
| `8d09330f5` (alias) | Redis `address` alias of `addr` on `MCPExternalAuthConfig` (CRD, `EffectiveAddr`) and `LegacyAddress` in the auth-server RunConfig | All values and live objects use `addr` (PAIINFRA-219). Dropped in the v0.32.0 merge. |
| `5b6448a0d` (remote proxy part) | `MCPRemoteProxy.spec.podTemplateSpec`, applying only nodeSelector, tolerations and affinity | Upstream #5531 (v0.37.0) adds the same field with a full strategic-merge patch, a `PodTemplateValid` condition and drift detection by hash. No live MCPRemoteProxy exists. Dropped in the v0.39.0 merge. |
| `8e474c8b2` (env sort) | `sortEnvVarsByName` on the vMCP env, plus sorted workload and backend loops | Upstream already sorts each discovered and inline secret env group; the rest of the list has a fixed order. Dropping it changes the env order once, inside the rollout the new image causes anyway. Dropped in the v0.39.0 merge. |
8 changes: 8 additions & 0 deletions Taskfile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,14 @@ tasks:
- task: test-integration-windows
platforms: [windows]

conformance:
desc: Run the MCP conformance suite against a `thv run` deployment (requires Docker + Node)
deps: [build]
env:
THV_BINARY: "{{.PWD}}/bin/thv"
cmds:
- ./test/conformance/run-conformance.sh

test-all:
desc: Run all tests (unit, integration, and e2e)
deps: [test, test-integration, test-e2e]
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.32.0
0.39.0
4 changes: 4 additions & 0 deletions cmd/thv-operator/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,10 @@ helm upgrade -i toolhive-operator-crds oci://ghcr.io/stacklok/toolhive/toolhive-
helm upgrade -i <release_name> oci://ghcr.io/stacklok/toolhive/toolhive-operator --version=<version> -n toolhive-system --create-namespace
```

For the full list of configurable values, see the
[operator chart](../../deploy/charts/operator/README.md) and
[operator CRDs chart](../../deploy/charts/operator-crds/README.md) documentation.

## Usage

### Creating an MCP Server
Expand Down
Loading
Loading