Skip to content
Open
Changes from all commits
Commits
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
98 changes: 98 additions & 0 deletions docs/toolhive/guides-registry/configuration.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ registries:
- `tag` (optional): Tag name to pin to a specific version
- `commit` (optional): Commit SHA to pin to a specific commit
- `path` (required): Path to the registry file within the repository
- `auth` (optional): Authentication for private repositories (see below)

:::tip

Expand All @@ -111,6 +112,103 @@ precedence over `branch`.

:::

#### Private repository authentication

To access private Git repositories, configure the `auth` section with your
credentials:

```yaml title="config-git-private.yaml"
registries:
- name: private-registry
format: toolhive
git:
repository: https://github.com/my-org/private-registry.git
branch: main
path: registry.json
# highlight-start
auth:
username: oauth2
passwordFile: /secrets/git/token
# highlight-end
syncPolicy:
interval: '30m'
```

**Authentication options:**

- `auth.username` (required with `passwordFile`): Git username for HTTP Basic
authentication. For GitHub and GitLab, use `oauth2` as the username when
authenticating with a personal access token (PAT).
- `auth.passwordFile` (required with `username`): Absolute path to a file
containing the Git password or token. Whitespace is trimmed from the file
content.

:::warning

Both `username` and `passwordFile` must be specified together. If only one is
provided, the configuration will fail validation.

:::

**Using with Kubernetes secrets:**

In Kubernetes deployments, mount a secret containing your Git token and
reference the mount path:

:::note

This is not the full `Deployment` manifest and has been shortened to display the
git credentials configuration

:::

```yaml title="registry-deployment.yaml"
apiVersion: v1
kind: Secret
metadata:
name: git-credentials
type: Opaque
stringData:
token: ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: registry-server
spec:
...
template:
spec:
containers:
- name: registry
volumeMounts:
- name: git-credentials
mountPath: /secrets/git
readOnly: true
- name: data
mountPath: /data
readOnly: false
Comment on lines +188 to +190
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Side note for future improvement: the /data path is used a bunch of times in this doc, but never actually explained.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added a note for this 👍 give it a look and let me know what you think

Copy link
Collaborator

@danbarr danbarr Feb 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, it feels kind of random there (also the grammar is off - "in order to storage").

But looking at it again, I guess this IS the first time mounting a volume as /data is done. This begs the question, why isn't it introduced above in the main "Git repository source" section? Then, having it appear again in the authenticated example would make sense without an extra note.

Is it required (must not be since I don't have it in my config)? If not, why/when use it?

volumes:
- name: git-credentials
secret:
secretName: git-credentials
items:
- key: token
path: token
- name: data
emptyDir: {}
```

:::note

The `/data` mount path is used by the registry server in order to storage cloned
Git repositories.

:::

Then reference `/secrets/git/token` as the `passwordFile` in your registry
configuration.

### API endpoint source

Sync from upstream MCP Registry APIs. Supports federation and aggregation
Expand Down