Skip to content

Commit b2426be

Browse files
danbarrclaude
andauthored
Bug hunt: em dash removal, MCP guide cleanup, misc fixes (#732)
* Fix some small bugs Signed-off-by: Dan Barr <6922515+danbarr@users.noreply.github.com> * Update style guide TOC Signed-off-by: Dan Barr <6922515+danbarr@users.noreply.github.com> * Remove en dashes Signed-off-by: Dan Barr <6922515+danbarr@users.noreply.github.com> * Update resource list in operator index Signed-off-by: Dan Barr <6922515+danbarr@users.noreply.github.com> * Remove last_update from MCP server guides * Fix broken anchors * Rewrite Next steps and Related info as sentences Avoids Markdown sublist ambiguity when descriptions wrap to indented lines starting with a hyphen. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Signed-off-by: Dan Barr <6922515+danbarr@users.noreply.github.com> Co-authored-by: Dan Barr <6922515+danbarr@users.noreply.github.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 70acb38 commit b2426be

48 files changed

Lines changed: 203 additions & 225 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/commands/polish-toolhive-updates.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,13 @@ Every feature should answer: **"What can I now do that I couldn't before, and wh
4242

4343
**Bad**: "Added API management to Registry Server"
4444

45-
**Good**: "API-based management lets you add, update, or remove registries programmatically—useful for CI/CD pipelines and infrastructure-as-code approaches"
45+
**Good**: "API-based management lets you add, update, or remove registries programmatically, making it easier to integrate with CI/CD pipelines and infrastructure-as-code workflows"
4646

4747
### 2. Honest About Maturity
4848

4949
- Avoid claiming production-readiness prematurely
5050
- Use phrases like "adds more operational capabilities," "moves closer to production readiness," "foundational capabilities"
51-
- Don't oversell—these are incremental improvements showing project momentum
51+
- Don't oversell; most updates are incremental improvements showing project momentum
5252

5353
### 3. Accessible Language
5454

@@ -152,7 +152,7 @@ For each major feature/component:
152152

153153
**Before**: "Monitor which MCP servers behind vMCP are available and responding"
154154

155-
**After**: "**Health monitoring** tracks which MCP servers behind vMCP are available and respondingthe foundation for building alerts and dashboards"
155+
**After**: "**Health monitoring** tracks which MCP servers behind vMCP are available and responding, giving you the foundation to build alerts and dashboards"
156156

157157
### Issue: Too Much Technical Detail Too Soon
158158

.claude/skills/upstream-release-docs/SKILL.md

Lines changed: 40 additions & 40 deletions
Large diffs are not rendered by default.

DCO.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ Signed-off-by: jane marmot <jmarmot@example.org>
3232

3333
The Signed-off-by [trailer](https://git-scm.com/docs/git-interpret-trailers) can
3434
be added automatically by using the
35-
[-s or signoff command line option](https://git-scm.com/docs/git-commit/2.13.7#Documentation/git-commit.txt--s)
35+
[-s or --signoff command line option](https://git-scm.com/docs/git-commit/2.13.7#Documentation/git-commit.txt--s)
3636
when specifying your commit message:
3737

3838
```bash

STYLE-GUIDE.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ aim to deliver clear, concise, and valuable information to project users.
1717
- [Links](#links)
1818
- [Formatting](#formatting)
1919
- [Screenshots and images](#screenshots-and-images)
20+
- [Page structure](#page-structure)
21+
- [Front matter](#front-matter)
22+
- [Descriptions](#descriptions)
23+
- [Closing sections](#closing-sections)
24+
- [Introduction pages](#introduction-pages)
25+
- [Cross-references](#cross-references)
2026
- [Markdown style](#markdown-style)
2127
- [Projects](#projects)
2228
- [Word list \& glossary](#word-list--glossary)
@@ -264,7 +270,7 @@ Our preferred style elements include:
264270
Heading 2, and so on); use unique headings within a document
265271
- Unordered lists: use hyphens (`-`), not asterisks (`*`)
266272
- Ordered lists: use lazy numbering (`1.` for every item and let Markdown render
267-
the final order – this is more maintainable when inserting new items)
273+
the final order. This is more maintainable when inserting new items)
268274
- Note: this is a "soft" recommendation. It is also intended only for Markdown
269275
documents that are read through a rendering engine. If the Markdown will be
270276
consumed in raw form, use real numbering.

blog/toolhive-updates/2026-02-02-updates.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ secrets for sensitive values like API keys.
5353
## Kubernetes Operator: Custom CA support
5454

5555
**The
56-
[MCPServer CRD](/toolhive/reference/crd-spec#apiv1alpha1inlineoidcconfig)** now
57-
supports custom certificate authorities, enabling ToolHive to validate OAuth
56+
[MCPServer CRD](/toolhive/reference/crd-spec#apiv1alpha1inlineoidcsharedconfig)**
57+
now supports custom certificate authorities, enabling ToolHive to validate OAuth
5858
tokens issued by private on-premises identity provider instances, essential for
5959
organizations with internal PKI infrastructure.
6060

docs/theme-preview.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ MDX Tabs component, default theme
247247
return 'I agree, and this line is highlighted!'
248248

249249
return 'I am wrong.'
250-
```
250+
```
251251

252252
</TabItem>
253253
<TabItem value='orange' label='Orange'>

docs/toolhive/_partials/_auth-troubleshooting.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ If authenticated clients are denied access:
3232
(including case and formatting)
3333
3. Examine any conditions in your policies to ensure they're satisfied (for
3434
example, required JWT claims or tool arguments)
35-
4. Remember that Cedar uses a default deny policyif no policy explicitly
35+
4. Remember that Cedar uses a default deny policy: if no policy explicitly
3636
permits an action, it will be denied
3737

3838
**Troubleshooting tip:** If access is denied, check that your policies
39-
explicitly permit the action. Cedar uses a default deny modelif no policy
39+
explicitly permit the action. Cedar uses a default deny model: if no policy
4040
matches, the request is denied.
4141

4242
</details>

docs/toolhive/concepts/auth-framework.mdx

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ together, the reasoning behind their design, and the benefits of this approach.
1212

1313
:::info[Scope of this documentation]
1414

15-
This documentation covers **client-to-MCP-server authentication**how clients
15+
This documentation covers **client-to-MCP-server authentication**: how clients
1616
authenticate to the MCP server itself. This is about securing access to the MCP
1717
server's tools and resources.
1818

@@ -39,7 +39,7 @@ identity can do. ToolHive helps you follow this best practice by acting as a
3939
gateway in front of your MCP servers. This approach lets you use proven identity
4040
systems for authentication, while keeping your authorization policies clear,
4141
flexible, and auditable. You don't need to add custom authentication or
42-
authorization logic to every serverToolHive handles it for you, consistently
42+
authorization logic to every server. ToolHive handles it for you, consistently
4343
and securely.
4444

4545
## Why ToolHive centralizes authentication
@@ -51,9 +51,9 @@ server acts as an OAuth resource server. In practice, this model creates
5151
significant operational challenges:
5252

5353
- **OAuth client registration burden:** OAuth 2.0 requires pre-registered
54-
redirect URIs at each identity provider. Many providerssuch as Google,
55-
GitHub, and Atlassianrequire manual registration of OAuth clients to obtain a
56-
client ID and client secret. If each user client (for example, an IDE) were
54+
redirect URIs at each identity provider. Many providers (such as Google,
55+
GitHub, and Atlassian) require manual registration of OAuth clients to obtain
56+
a client ID and client secret. If each user client (for example, an IDE) were
5757
its own OAuth client, the registration burden would be impractical at scale.
5858
- **No federation with external services:** While token exchange (RFC 8693) and
5959
federated identity providers work when the upstream service is in the same
@@ -66,9 +66,9 @@ significant operational challenges:
6666

6767
ToolHive addresses the per-server implementation cost by centralizing
6868
authentication and authorization in its proxy layer. You configure ToolHive with
69-
your identity provider and write Cedar policies for fine-grained
70-
authorization—individual MCP servers don't need to implement token validation or
71-
scope management.
69+
your identity provider and write Cedar policies for fine-grained authorization.
70+
Individual MCP servers don't need to implement token validation or scope
71+
management.
7272

7373
The [embedded authorization server](#embedded-authorization-server) addresses
7474
the remaining challenges. It exposes standard OAuth endpoints and handles the
@@ -87,7 +87,7 @@ This lets you connect ToolHive to any OAuth 2.1 or OIDC-compliant identity
8787
provider (IdP), such as Google, GitHub, Microsoft Entra ID (Azure AD), Okta,
8888
Auth0, or even Kubernetes service accounts. ToolHive never handles your raw
8989
passwords or credentials; instead, it relies on access tokens issued by your
90-
trusted providereither self-contained JWT tokens or opaque tokens validated
90+
trusted provider, either self-contained JWT tokens or opaque tokens validated
9191
through token introspection.
9292

9393
### Why use OAuth-based authentication?
@@ -142,7 +142,7 @@ directly. ToolHive validates these tokens by querying the identity provider's
142142
token introspection endpoint to retrieve the associated claims.
143143

144144
ToolHive automatically detects the token type and uses the appropriate
145-
validation methodattempting JWT validation first and falling back to token
145+
validation method, attempting JWT validation first and falling back to token
146146
introspection if needed.
147147

148148
### Authentication flow
@@ -176,17 +176,17 @@ In the standard authentication flow described above, clients obtain tokens
176176
independently from an external identity provider and present them to ToolHive
177177
for validation. The embedded authorization server provides an alternative model
178178
where ToolHive itself acts as an OAuth authorization server, obtaining tokens
179-
from an upstream provider on behalf of clients—then storing those tokens and
179+
from an upstream provider on behalf of clients, storing those tokens, and
180180
issuing its own JWTs for clients to use on subsequent requests.
181181

182182
This solves two problems at once: it eliminates the client registration burden
183183
through Dynamic Client Registration (DCR), and it bridges the gap for external
184184
APIs like GitHub or Atlassian where no federation relationship exists with your
185185
identity provider.
186186

187-
For the complete conceptual descriptionincluding the OAuth flow, token storage
187+
For the complete conceptual description (including the OAuth flow, token storage
188188
and forwarding, session storage options, and differences between MCPServer and
189-
VirtualMCPServersee
189+
VirtualMCPServer), see
190190
[Embedded authorization server](./embedded-auth-server.mdx).
191191

192192
For Kubernetes setup instructions, see
@@ -222,7 +222,7 @@ identity providers:
222222
supports RFC 7662 (OAuth 2.0 Token Introspection), Google's tokeninfo API, and
223223
GitHub's token validation API.
224224

225-
ToolHive automatically detects the token type—it first attempts JWT validation,
225+
ToolHive automatically detects the token type. It first attempts JWT validation,
226226
and if that fails, it falls back to token introspection. This means you don't
227227
need to configure which validation method to use; ToolHive handles it
228228
automatically based on the token format.
@@ -232,8 +232,8 @@ automatically based on the token format.
232232
After authentication, ToolHive enforces authorization using Amazon's Cedar
233233
policy language. ToolHive acts as a gateway in front of MCP servers, handling
234234
all authorization checks before requests reach the server logic. This means MCP
235-
servers do not need to implement their own OAuth or custom authorization
236-
logic—ToolHive centralizes and standardizes access control.
235+
servers do not need to implement their own OAuth or custom authorization logic.
236+
ToolHive centralizes and standardizes access control.
237237

238238
### Why Cedar for authorization?
239239

@@ -248,7 +248,7 @@ Cedar provides several advantages for MCP server authorization:
248248
to read, write, and audit.
249249
- **Policy enforcement point:** ToolHive blocks unauthorized requests before
250250
they reach the MCP server, which reduces risk and simplifies server code.
251-
- **Secure by default:** Authorization is explicitif a request is not
251+
- **Secure by default:** Authorization is explicit: if a request is not
252252
explicitly permitted, it is denied. Deny rules take precedence over permit
253253
rules (deny overrides).
254254

@@ -296,7 +296,7 @@ benefits:
296296
- **Integration with existing systems:** Use your existing identity
297297
infrastructure (SSO, IdPs, Kubernetes, etc.).
298298
- **Centralized, flexible policy model:** Define precise, auditable access rules
299-
in a single placeno need to modify MCP server code.
299+
in a single place, with no need to modify MCP server code.
300300
- **Secure by default:** Requests are denied unless explicitly permitted by
301301
policy, with deny precedence for maximum safety.
302302
- **Auditable and versionable:** Policies are clear, declarative, and can be

docs/toolhive/concepts/backend-auth.mdx

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ development.
1313

1414
:::info[Scope of this documentation]
1515

16-
This documentation covers **MCP-server-to-backend authentication**how MCP
16+
This documentation covers **MCP-server-to-backend authentication**: how MCP
1717
servers authenticate to external services or APIs they call (for example, a
1818
GitHub MCP server authenticating to the GitHub API).
1919

@@ -51,8 +51,8 @@ ToolHive sits between clients and MCP servers, and can acquire backend
5151
credentials on behalf of the MCP server. Depending on the pattern, it might
5252
exchange the client's token, run an OAuth flow against an external provider, or
5353
inject static credentials. In each case, the MCP server receives ready-to-use
54-
credentialsvia an `Authorization: Bearer` header, another header, or
55-
environment variables, depending on the patternwithout needing to implement
54+
credentials (via an `Authorization: Bearer` header, another header, or
55+
environment variables, depending on the pattern) without needing to implement
5656
custom authentication logic or manage secrets directly.
5757

5858
## Backend authentication patterns
@@ -77,12 +77,12 @@ rotation.
7777

7878
### Token exchange
7979

80-
When the backend service trusts the same IdP as your MCP clientsor federation
81-
is configured between the two IdPsToolHive can exchange the client's token for
80+
When the backend service trusts the same IdP as your MCP clients, or federation
81+
is configured between the two IdPs, ToolHive can exchange the client's token for
8282
one scoped to the backend service using RFC 8693 token exchange. This preserves
8383
the user's identity across services and provides short-lived, narrowly scoped
8484
tokens. Because the trust relationship is pre-configured at the IdP, the
85-
exchange is transparent to the end userno consent screen required.
85+
exchange is transparent to the end user, with no consent screen required.
8686

8787
#### Same IdP with token exchange
8888

@@ -122,7 +122,7 @@ flowchart LR
122122
When the backend service trusts a different IdP, but federation is configured
123123
between the two IdPs, ToolHive can use the federated identity service to issue
124124
short-lived tokens. Examples include Google's Security Token Service (STS) for
125-
Google Cloud services and AWS STS for AWS services—both can issue tokens based
125+
Google Cloud services and AWS STS for AWS services. Both can issue tokens based
126126
on your corporate identity.
127127

128128
```mermaid
@@ -155,15 +155,15 @@ flowchart LR
155155
### Embedded authorization server
156156

157157
When the MCP server needs to call an external API where no federation
158-
relationship existssuch as GitHub, Google Workspace, or Atlassian APIsthe
158+
relationship exists (such as GitHub, Google Workspace, or Atlassian APIs), the
159159
embedded authorization server handles the full OAuth web flow against the
160160
external provider. The proxy redirects the user to authenticate directly with
161161
the external service, obtains tokens on behalf of the user, and automatically
162162
forwards the upstream token to the MCP server on each subsequent request.
163163

164-
The embedded authorization server runs in-process within the ToolHive proxy—no
165-
separate infrastructure is needed. It supports Dynamic Client Registration
166-
(DCR), so MCP clients can register automatically with ToolHive—no manual client
164+
The embedded authorization server runs in-process within the ToolHive proxy with
165+
no separate infrastructure needed. It supports Dynamic Client Registration
166+
(DCR), so MCP clients can register automatically with ToolHive. No manual client
167167
configuration in ToolHive is required.
168168

169169
For a full explanation of how the OAuth flow works, token storage and
@@ -312,17 +312,17 @@ ToolHive's token-based authentication patterns (token exchange and the embedded
312312
authorization server) provide several key advantages over static credentials:
313313

314314
- **Secure:** MCP servers receive short-lived, properly scoped access tokens
315-
instead of embedding long-lived secrets
315+
instead of embedding long-lived secrets.
316316
- **Auditable:** Each API call is attributed to the individual user identity,
317-
making audit trails clear and meaningful
317+
making audit trails clear and meaningful.
318318
- **Multi-tenant friendly:** Token scoping naturally supports tenant isolation
319-
and separation of duties
320-
- **Developer friendly:** MCP servers don't need custom authentication
321-
logic—they just use the provided token
319+
and separation of duties.
320+
- **Developer friendly:** MCP servers don't need custom authentication logic.
321+
They just use the provided token.
322322
- **Least privilege:** Tokens are narrowly scoped to specific audiences and
323-
permissions, reducing the blast radius if compromised
323+
permissions, reducing the blast radius if compromised.
324324
- **Consistent:** The same pattern works across different backend services and
325-
identity providers
325+
identity providers.
326326

327327
## Choosing the right backend authentication pattern
328328

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ description:
77

88
The embedded authorization server is an OAuth 2.0 authorization server that runs
99
in-process within the ToolHive proxy. It solves a specific problem: how to
10-
authenticate MCP server requests to external APIslike GitHub, Google Workspace,
11-
or Atlassianwhere no federation relationship exists between your identity
12-
provider and that external service.
10+
authenticate MCP server requests to external APIs (like GitHub, Google
11+
Workspace, or Atlassian) where no federation relationship exists between your
12+
identity provider and that external service.
1313

1414
Without the embedded auth server, every MCP client would need to register its
1515
own OAuth application with each external provider, manage redirect URIs, and
@@ -114,7 +114,7 @@ sequenceDiagram
114114
```
115115

116116
MCP servers receive the upstream access token in the `Authorization: Bearer`
117-
header—they don't need to implement custom authentication logic or manage
117+
header. They don't need to implement custom authentication logic or manage
118118
secrets.
119119

120120
## Automatic token refresh
@@ -131,7 +131,7 @@ the OAuth flow.
131131
## Key characteristics
132132

133133
- **In-process execution:** The authorization server runs within the ToolHive
134-
proxyno separate infrastructure or sidecar containers needed.
134+
proxy with no separate infrastructure or sidecar containers.
135135
- **Dynamic Client Registration (DCR):** Supports OAuth 2.0 DCR (RFC 7591),
136136
allowing MCP clients to register automatically. No manual client registration
137137
in ToolHive is required.
@@ -201,16 +201,16 @@ or
201201
## Next steps
202202

203203
- [Set up embedded authorization server authentication](../guides-k8s/auth-k8s.mdx#set-up-embedded-authorization-server-authentication)
204-
step-by-step setup for MCPServer resources in Kubernetes
205-
- [vMCP embedded authorization server](../guides-vmcp/authentication.mdx#embedded-authorization-server)
206-
— configuring multiple upstream providers on a VirtualMCPServer
207-
- [Redis Sentinel session storage](../guides-k8s/redis-session-storage.mdx)
208-
production session storage configuration
204+
for step-by-step setup of MCPServer resources in Kubernetes
205+
- [Configure the vMCP embedded authorization server](../guides-vmcp/authentication.mdx#embedded-authorization-server)
206+
for multiple upstream providers on a VirtualMCPServer
207+
- [Deploy Redis Sentinel](../guides-k8s/redis-session-storage.mdx) for
208+
production session storage
209209

210210
## Related information
211211

212-
- [Authentication and authorization](./auth-framework.mdx) client-to-MCP
212+
- [Authentication and authorization](./auth-framework.mdx) covers client-to-MCP
213213
authentication concepts and the overall framework
214-
- [Backend authentication](./backend-auth.mdx) all backend authentication
214+
- [Backend authentication](./backend-auth.mdx) covers all backend authentication
215215
patterns, including when to choose the embedded auth server
216-
- [Cedar policies](./cedar-policies.mdx) authorization policy configuration
216+
- [Cedar policies](./cedar-policies.mdx) for authorization policy configuration

0 commit comments

Comments
 (0)