kubesearch-mcp
An MCP server for searching kubesearch.dev’s public home-ops Kubernetes index and reviewing real repo manifests.
Search Flux HelmReleases/Argo Applications by chart name, ranked by popularity and paginated.
Inspect one chart’s deployments, community value settings, examples, and full per-repo
spec.values.Search container image repositories and tags seen across clusters.
Full-text grep real-world Helm values for configuration examples.
Check cached dataset freshness and row counts.
Temporarily clone public Git repos in a sandbox to list, read, grep, and clean up files.
Grep an always-warm pool of top indexed repos across all resource kinds without cloning.
Use workflow prompts for tasks like comparing deployments, adopting charts, finding examples, picking images, and reviewing repos.
Provides search and review capabilities for Argo Applications, including application search, deployment inspection, and image and values grep across hundreds of public home-ops Kubernetes Git repositories.
Provides search and review capabilities for Flux HelmReleases, including chart search, deployment inspection, and image and values grep across hundreds of public home-ops Kubernetes Git repositories.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@kubesearch-mcpsearch for cert-manager HelmReleases"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
kubesearch-mcp
An MCP server that lets an LLM search kubesearch.dev — a search engine over Flux HelmReleases and Argo Applications across hundreds of public "home-ops" Kubernetes Git repositories.
It reproduces all of kubesearch.dev's search modes as tools, and can temporarily clone a repo so the model can review its actual manifests.
Search tools
Tool | kubesearch.dev equivalent | What it does |
|
| Find charts by name; see who deploys them, ranked by popularity. |
|
| One chart's deployments. |
|
| Container image repositories and the tags used in the wild. |
|
| Full-text grep across real-world Helm values for config examples. |
| — | Report the cached data's release date and row counts. |
All search tools are annotated read-only and return a typed structuredContent
payload alongside the equivalent text. They page with limit/offset and report
has_more, and their result ordering is global (matches are ranked across the whole
result set before the page is cut), so paging never repeats or skips an entry.
In the values view, value_paths accepts the paths printed in the summary view's
common_settings verbatim, array forms like route.hostnames[] included. A single
deployment whose config is too large for one response is always returned when it is
first on the page, so { repo, limit: 1 } reaches any deployment; larger ones later in
a page are reported individually via values_omitted and omitted_count.
Repository review tools (enabled by default; set KUBESEARCH_ENABLE_CLONE=false to disable)
Tool | What it does |
| Temporarily clone a repo (indexed |
| List files in a clone (optional sub-path + glob). |
| Read a text file from a clone (binary refused, large files truncated). |
| Substring-search a clone's text files; returns |
| Substring-search the always-warm pool of top repos in one call, no clone step (see below). |
| Delete a clone early (clones also auto-expire; pool members are refused). |
Clones are sandboxed: shallow (--depth 1, blob-size filtered), run with git via
execFile (no shell) and a scrubbed environment, size/TTL/concurrency-capped, confined to
a per-clone temp dir, with path-traversal and symlink-escape protection. By default any
public host is allowed but private/loopback/link-local/metadata addresses are blocked (see
env vars below).
Lifecycle: a clone is kept while it's being used and auto-deleted after
KUBESEARCH_CLONE_TTL_MINUTES of inactivity (the timer resets on every access). Repeat
repo_clone calls for the same repo+branch are deduplicated to a single working copy and
(by default) refreshed with a shallow git fetch + hard reset to the latest commit, so a
long-lived clone never goes stale — set KUBESEARCH_CLONE_REFRESH_ON_CLONE=false to reuse
without pulling. Reads (repo_read_file/repo_grep/repo_list_files) are served from the
snapshot and do not pull, so an in-progress review stays stable; re-run repo_clone to pull.
Concurrent repo_clone calls for the same repo share a single git invocation, at most
KUBESEARCH_CLONE_MAX_CONCURRENT git subprocesses run at once, and clone directories
stranded by an ungraceful restart are reaped at startup.
Always-warm pool (repo_grep_all). grep_values only sees Helm spec.values
— that is all the upstream dataset contains. To grep across every resource kind
(Kustomizations, HTTPRoutes, ExternalSecrets, Talos configs, …) the server keeps the
KUBESEARCH_POOL_SIZE (default 15) most-starred indexed repos permanently cloned and
repo_grep_all searches them in one call. Ranking by raw stars alone would fill the pool with
CLI tools and Argo-only repos that have nothing greppable, so only repos with at least
KUBESEARCH_POOL_MIN_RELEASES (default 20) indexed HelmReleases are considered; set
KUBESEARCH_POOL_REPOS=onedr0p/home-ops,bjw-s-labs/home-ops,… to pick the membership
yourself. Pool clones live under <cloneDir>/pool/<owner>__<repo>, use the indexed repo name
as their handle (so repo_read_file can follow a hit directly, and repo_clone of a pool
member reuses it), never expire, don't count toward KUBESEARCH_CLONE_MAX_REPOS, and survive
shutdown so the next start adopts them with a shallow git fetch instead of re-cloning
(~4 MB per repo on disk). Membership is recomputed whenever a new dataset release lands and
the copies are refreshed on the KUBESEARCH_REFRESH_HOURS cadence. Warm-up runs in the
background and never blocks startup; while it's in progress repo_grep_all reports
pool.syncing: true and searches whatever is ready. KUBESEARCH_POOL_SIZE=0 disables the
pool and hides the tool.
Prompts (workflow shortcuts)
Server-provided MCP prompts that chain the tools: kubesearch_compare_deployments,
kubesearch_adopt_chart, kubesearch_find_config_examples, kubesearch_pick_image, and
(when cloning is enabled) kubesearch_review_repo.
How it works
kubesearch.dev has no live API; it publishes its index as SQLite databases on the
whazor/k8s-at-home-search GitHub
releases (a new date-tagged release daily). This server downloads and caches those
databases locally and queries them with SQL — fast, offline-capable, and identical to
what the website shows. Two complementary databases are used and joined on the YAML
file URL:
repos.db(~7 MB) — chart/release/repo metadata.repos-extended.db(~37 MB) — thespec.valuesJSON (powers grep and image search).
Data is refreshed automatically when a newer daily release appears (see
KUBESEARCH_REFRESH_HOURS).
Related MCP server: mcp-helm
Quick start (local, stdio)
npm install
npm run buildAdd it to Claude Code:
claude mcp add kubesearch -- node /absolute/path/to/kubesearch-mcp/dist/index.jsOr in a Claude Desktop / MCP client config:
{
"mcpServers": {
"kubesearch": {
"command": "node",
"args": ["/absolute/path/to/kubesearch-mcp/dist/index.js"]
}
}
}The first call downloads the databases into the cache dir (a few seconds); subsequent runs reuse the cache.
Docker deployment (HTTP)
The image defaults to the Streamable HTTP transport, which is what you want for a long-running server that MCP clients connect to over the network.
docker run -d --name kubesearch-mcp \
-p 3000:3000 \
-v kubesearch-data:/data \
-e GITHUB_TOKEN=ghp_xxx \
ghcr.io/perfectra1n/kubesearch-mcp:latestPublished tags: latest (default branch), vX.Y.Z and X.Y (releases), and
sha-<short> for a specific commit. To build it yourself instead, use
docker build -t kubesearch-mcp . and substitute that image name.
Mount /data as shown: it holds the cached databases, so without it every restart
re-downloads ~44 MB.
Or with Compose:
docker compose up -dThe container runs as the unprivileged
nodeuser (uid 1000) and writes cached databases and clones under/data. The named volume indocker-compose.ymlis writable out of the box. If you bind-mount a host directory instead, make it writable by uid 1000 (e.g.chown -R 1000:1000 ./data), orrepo_cloneand refreshes will fail with "Permission denied".
The MCP endpoint is http://<host>:3000/mcp. Two health endpoints are exposed:
GET /healthz— liveness. Always 200 while the process is up. This is what the image'sHEALTHCHECKuses, so a slow initial download can't get the container restarted mid-download.GET /readyz— readiness. 503 until a release is loaded, then 200. Use this for Kubernetes readiness probes and load-balancer checks, so traffic isn't sent to a pod whose first queries would fail.
Point an MCP client at it:
{
"mcpServers": {
"kubesearch": {
"type": "http",
"url": "http://localhost:3000/mcp",
"headers": { "Authorization": "Bearer <MCP_AUTH_TOKEN>" }
}
}
}(The Authorization header is only required when MCP_AUTH_TOKEN is set.)
Securing the HTTP transport
The HTTP transport ships open. Out of the box there is no authentication, CORS is
*, and the image binds 0.0.0.0. That is fine on a trusted network or behind a
reverse proxy that authenticates for you; it is not fine on a public interface. Before
exposing the port beyond a network you control:
Variable | Default | What it does |
| (unset — auth off) | Require |
| (unset — any origin) | Comma-separated |
| (unset — any host) | Comma-separated |
|
| Refuse new sessions past this many concurrent ones. |
|
| Reject larger request bodies with 413. |
The server logs a warning at startup if it binds a non-loopback address with authentication disabled. Terminate TLS at a proxy; the server speaks plain HTTP.
Running the container over stdio instead
If you prefer to have a client spawn the container per session:
docker run -i --rm -v kubesearch-data:/data -e MCP_TRANSPORT=stdio kubesearch-mcpConfiguration
All configuration is via environment variables:
Variable | Default | Description |
|
|
|
|
| HTTP bind host (http transport). |
|
| HTTP listen port. |
| (unset — auth off) | If set, every HTTP request must send |
| (unset — any) |
|
| (unset — any) |
|
|
| Max HTTP request body size; larger bodies get 413. |
|
| Max concurrent HTTP sessions; further |
|
| Close an HTTP session after this long with no requests. |
|
| Minimum log severity to emit: |
|
| Where the SQLite databases are cached. |
|
| How often to check for a newer daily release. |
|
| Wall-clock limit for downloading one database. Downloads also abort after 30s with no data received. |
|
| Reject a database download larger than this. |
| (unset) | Lifts the GitHub API rate limit (60→5000/hr) used to resolve the latest release. Recommended. |
|
| Source repo for the databases (override only for forks/testing). |
|
| Enable the |
| (any) | Comma-separated host allowlist, e.g. |
|
| Permit cloning from private/loopback/link-local/metadata addresses (SSRF guard off). |
|
| Where ephemeral clones live. |
|
| Auto-delete a clone after this much inactivity (timer resets on each access). |
|
| On a repeat clone of the same repo, |
|
| Max concurrent cached clones (LRU-evicted). |
|
| Max |
|
| Reject/clean a clone whose tree exceeds this size. |
|
| Hard timeout for the |
|
| How many top repos to keep permanently cloned for |
|
| Only repos with at least this many indexed HelmReleases are eligible for the star ranking. |
| (unset) | Comma-separated indexed repo names that replace the star ranking entirely (e.g. |
Development
mise pins the toolchain and owns the dev/release lifecycle, so every command below is the same one CI runs. One-time setup:
mise install # installs Node, lefthook, shellcheck; also installs the git hooksThen:
mise tasks # list every task with a description
mise run dev # run from source via tsx
mise run test # vitest (unit + offline integration against a fixture DB)
mise run lint # typecheck + prettier --check + shellcheck
mise run fmt # format in place with prettier
mise run build # bundle to dist/ with tsup
mise run ci # the full local gate: fmt-check, typecheck, test, build
mise run smoke # end-to-end against live upstream data (needs network)
mise run image # build the container image locallyThe underlying npm run <script> commands still work if you'd rather not use mise; mise
is a thin wrapper plus a pinned toolchain. Exact tool versions live in
.mise/config.toml with per-platform checksums in .mise/mise.lock, which CI enforces
via mise install --locked; package.json's engines.node records the minimum
supported runtime.
A lefthook pre-commit hook formats staged files with prettier
and re-stages them, and runs shellcheck on shell scripts. It deliberately doesn't run
tests or the typechecker — that's CI's job, so committing stays fast. mise install
wires the hook; lefthook install re-syncs it if needed.
Tests run fully offline against a small fixture database that mirrors the real schema.
They cover the domain logic, the download/refresh paths (with a stubbed fetch), the
HTTP transport end to end, and the tools themselves through an in-memory MCP client —
which means the SDK validates every response against its declared outputSchema. The
releaseKey/mergeHelmURL slug logic is ported verbatim from upstream and locked with
test vectors so generated /hr/<id> links match the real site.
typecheck and test run on every push and pull request, and the container image is
only published if they pass.
Renovate keeps dependencies current: .github/workflows/renovate.yml
runs it every 12 hours (and on dependency-dashboard or PR checkbox edits) with the policy in
.renovaterc.json5, which extends the shared
home-operations/renovate-config preset.
It authenticates as a GitHub App so that CI runs on the PRs it opens.
Credits
All data comes from kubesearch.dev /
whazor/k8s-at-home-search. To include
your own cluster, make the repo public and add the k8s-at-home or kubesearch GitHub
topic.
License
MIT
Available Tools
11 toolsget_releaseGet HelmRelease detailsARead-onlyIdempotent
Get details for one chart by its kubesearch.dev release id (the id from search_releases, e.g. 'ghcr.io-home-operations-charts-mirror-cert-manager'). Three views, controlled by view:
summary(default): a compact digest of how the community configures the chart — the most commonly-setspec.valuespaths with their typical values, plus a couple of full example configs. Start here.deployments: the paginated list of every repo deploying the chart (no values) — use it to find a repo to drill into.values: the full parsedspec.valuesfor selected deployments — narrow withrepoand/orvalue_pathsto fetch just the config (or subtree) you care about. This is the drill-down; prefersummaryfirst. Note:chart_source_urlis the normalized kubesearch.dev grouping key, not necessarily the pullable chart. ForchartRef/OCIRepository releases the real chart is insource_urls(group) and each deployment'ssource_url+source_tag;resolved_chartsurfaces the true chart name when it differs fromchart. Confirm by cloning the deployment's repo (repo_clone) and reading its OCIRepository source.yaml.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The release id / slug, e.g. 'ghcr.io-home-operations-charts-mirror-cert-manager'. | |
| top | No | `summary` view: number of common value paths to return. | |
| repo | No | `values` view: restrict to one repo (e.g. 'onedr0p/home-ops'). | |
| view | No | summary = community config digest (default); deployments = paginated repo list; values = full config drill-down. | summary |
| limit | No | Page size for `deployments`/`values` views. | |
| offset | No | Pagination offset for `deployments`/`values` views. | |
| examples | No | `summary` view: number of full example configs to include. | |
| value_paths | No | `values` view: only return these value-path subtrees, e.g. ['server.persistentVolume','server.retentionPeriod']. Paths from the summary view's common_settings work as-is, including array forms like 'route.hostnames[]'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| view | Yes | |
| chart | Yes | |
| shown | No | |
| offset | No | |
| has_more | No | |
| next_step | No | |
| top_repos | No | |
| deployments | No | |
| source_urls | Yes | |
| matched_repos | No | |
| omitted_count | No | |
| kubesearch_url | Yes | |
| resolved_chart | Yes | |
| values_summary | No | |
| chart_source_url | Yes | |
| deployment_count | Yes | |
| chart_source_ambiguous | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With read-only, idempotent, closed-world annotations already covering the safety profile, the description adds substantial behavioral context: the three view modes, pagination in `deployments`/`values`, and the distinction between `chart_source_url`, `source_urls`, `source_url`/`source_tag`, and `resolved_chart`. The caveat about confirming OCIRepository charts via `repo_clone` is unusually useful for correct invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then structured around the `view` options and a targeted caveat. It is dense but largely purposeful; the final note is valuable, though the description is longer than strictly minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the presence of an output schema, full schema coverage, and strong annotations, the description is complete enough for an agent to call it correctly. It covers the main view modes, pagination behavior, drill-down guidance, and the important chart-reference caveat.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is already 100%, the description adds real meaning beyond the schema by explaining what `view` modes do, how `repo` and `value_paths` narrow the `values` view, and that summary paths can be reused as `value_paths` including array forms. This helps the agent choose parameters correctly rather than merely restating field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: get details for one chart using a kubesearch.dev release id. It immediately disambiguates the id source by naming `search_releases` and gives an example id, so the agent can distinguish this from sibling search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly defines the three view modes, their defaults, and when to use each: start with `summary`, use `deployments` to find a repo, and use `values` as the drill-down. It also warns to prefer `summary` first, which is direct usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grep_valuesGrep HelmRelease valuesARead-onlyIdempotent
Full-text grep across the Helm spec.values of every indexed HelmRelease/Application (substring match). Great for finding real-world examples of a config key or value, e.g. 'cert-manager.io', 'nodeSelector', 'gatus'. Returns the matched key path, a snippet, and the source file. Mirrors the kubesearch.dev /grep search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max number of matching files to return. | |
| query | Yes | Substring to grep for in values (keys or values), e.g. 'cert-manager.io'. | |
| offset | No | Skip this many matches (results are ranked by repo stars). | |
| case_sensitive | No | Match case-sensitively. |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| shown | Yes | |
| offset | Yes | |
| results | Yes | |
| grep_url | Yes | |
| has_more | Yes | |
| total_files | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/closed-world, so the bar is lower; the description adds that matching is substring-based and scoped only to indexed releases' values, plus what comes back (key path, snippet, source file). It notes the kubesearch.dev /grep equivalence, useful for predicting result shape, though ranking/pagination behavior is left to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: what it greps, what it's good for with examples, what it returns. Nothing redundant and the core operation is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with full schema documentation, complete annotations, and an output schema covering return values, the description supplies everything else an agent needs: scope, match semantics, and intended use case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so `query`, `limit`, `offset`, and `case_sensitive` are all documented in-schema; the description's only added semantics is example query terms. Baseline 3 applies since the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — full-text grep across the Helm `spec.values` of indexed HelmReleases/Applications — and pins the matching mode (substring). The scope is precise enough to separate it from search_releases and repo_grep without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use guidance: finding real-world examples of a config key or value, with concrete query examples ('cert-manager.io', 'nodeSelector'). It does not name an alternative or exclusion (e.g. when to prefer search_releases or repo_grep), so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repo_cleanupDelete a cloned repositoryAIdempotent
Delete a temporary clone created by repo_clone (frees disk before its TTL). Clones are also auto-deleted after inactivity, so this is optional but polite.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | The clone handle from repo_clone. |
Output Schema
| Name | Required | Description |
|---|---|---|
| handle | Yes | |
| removed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint=true and readOnlyHint=false. The description adds valuable lifecycle context: clones are temporary, have a TTL, and are auto-deleted. This goes beyond annotations to explain why the tool is optional, and does not contradict destructiveHint=false since the clone is temporary.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the action ('Delete a temporary clone'), and both sentences serve a purpose: the first states the action and rationale, the second clarifies optionality. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with an output schema and strong annotations, the description covers the purpose, usage context, and lifecycle behavior (TTL, auto-deletion). It is fully sufficient for an agent to decide when and why to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with the parameter 'handle' described as 'The clone handle from repo_clone.' The tool description merely references this relationship without adding new meaning, so the schema carries the full semantic burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the verb 'Delete' with a specific resource ('temporary clone created by repo_clone') and clearly distinguishes this from sibling tools like repo_clone, which creates clones. The qualifier 'temporary' adds necessary scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use it (to free disk before TTL) and when not to (since clones auto-delete after inactivity, making it optional). The alternative is effectively doing nothing, which the description implies by calling it 'polite'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repo_cloneClone a repository (temporary)A
Temporarily clone a public Git repository so you can review its actual files. Accepts an indexed home-ops repo name (e.g. 'onedr0p/home-ops' — resolved to its real clone URL and branch) or a full https Git URL. The clone is shallow, sandboxed, size/time-limited, and auto-deleted after a TTL. Returns a handle to use with repo_list_files, repo_read_file, and repo_grep, plus a curated file tree to get you started. Call repo_cleanup when done.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | Yes | An indexed repo name like 'onedr0p/home-ops', or a full https:// Git URL. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tree | Yes | |
| branch | Yes | |
| handle | Yes | |
| pinned | Yes | |
| reused | Yes | |
| size_mb | Yes | |
| updated | Yes | |
| file_count | Yes | |
| resolved_url | Yes | |
| expires_in_minutes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses substantial behavioral details beyond the annotations: the clone is shallow, sandboxed, size/time-limited, auto-deleted after a TTL, resolves indexed names to real clone URLs and branches, and requires eventual cleanup. This is exactly the kind of context an agent needs for a stateful, non-read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then adds precise operational details in compact sentences. Every sentence earns its place, covering input format, clone behavior, return value, companion functions, and cleanup without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a tool with one parameter, meaningful annotations, and an output schema. It explains what the caller receives, how the temporary resource is governed, and what follow-up actions are expected. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the schema already documents the `repo` parameter, and the description adds meaningful extra context: it gives an example, explains that indexed names are resolved to the real clone URL and branch, and states which URL forms are accepted. This goes beyond the schema without being redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: temporarily clone a public Git repository to review actual files. It clearly distinguishes itself from siblings by explaining that it returns a handle consumed by repo_list_files, repo_read_file, and repo_grep, and that repo_cleanup should be called afterward.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly conveys when to use the tool: when actual repository files need to be inspected, rather than relying only on metadata. It also names the companion tools and cleanup routine, but it does not explicitly state when not to use it or contrast it directly with the kubesearch_* alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repo_grepGrep a cloned repositoryARead-onlyIdempotent
Search the text contents of a previously cloned repository (by handle) for a substring. Optionally restrict to files matching a glob. Returns file paths, line numbers, and matching lines. If truncated is set, narrow the search with a longer query or a glob rather than paging.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | Optional glob filter, e.g. '**/*.yaml'. | |
| limit | No | Max number of matching lines to return. | |
| query | Yes | Substring to search for across the repo's text files. | |
| handle | Yes | The clone handle from repo_clone. | |
| case_sensitive | No | Match case-sensitively. |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| handle | Yes | |
| matches | Yes | |
| truncated | Yes | |
| total_matches | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal readOnly, idempotent, and closed-world behavior. The description adds valuable behavioral details: search scope ('text contents'), optional glob filtering, return format ('file paths, line numbers, and matching lines'), and truncation handling. This goes beyond annotation basics and helps the agent predict tool output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all informative. The first sentence captures the core action, the second adds an optional parameter, and the third provides practical usage advice. No filler or repetition; front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with output schema and rich annotations, the description covers key contextual aspects: prerequisite (cloned repository), optional filter, return format, and behavior on truncation. It doesn't mention case_sensitive or limit explicitly, but the schema fully documents those, and the truncation guidance substitutes for deeper pagination details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with each parameter including a description, so the baseline is 3. The description does not significantly expand on parameter meaning beyond what the schema provides—it only restates 'by handle' and 'glob' in narrative form. No new parameter-level insight is added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search') and a specific resource ('text contents of a previously cloned repository'), immediately distinguishing it from sibling tools like repo_list_files (list files) and repo_read_file (read one file). It also specifies the output (file paths, line numbers, matching lines), making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the prerequisite of a prior repo_clone operation via 'previously cloned repository (by handle)', and offers explicit guidance for handling truncated results: 'narrow the search with a longer query or a glob rather than paging.' It does not explicitly mention when to use this over kubesearch_grep_values, but given sibling list and context, the usage is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repo_grep_allGrep the always-warm pool of top reposARead-onlyIdempotent
Substring-search the actual files of the most popular indexed home-ops repositories at once — no clone step needed. The server keeps these repos permanently cloned, so this covers every resource kind (Kustomizations, Ingress/HTTPRoute, ExternalSecrets, Talos configs, …), not just Helm values like grep_values. Hits are grouped by repo, most-starred first, and each group carries a handle you can pass straight to repo_read_file / repo_list_files / repo_grep for the follow-up. pool reports which repos were searchable: while pool.syncing is true and ready is below size the pool is still warming up, so an empty result is not final — retry after a short pause.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | Optional path glob, e.g. '**/*.yaml' or 'kubernetes/apps/**'. | |
| limit | No | Max matching lines returned overall. | |
| query | Yes | Substring to search for, e.g. 'gatus.io/enabled' or 'kind: HTTPRoute'. | |
| max_per_repo | No | Max matching lines returned per repo. | |
| case_sensitive | No | Match case-sensitively. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pool | Yes | |
| query | Yes | |
| repos | Yes | |
| truncated | Yes | |
| total_matches | Yes | |
| repos_searched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, idempotent and closed-world; the description adds behavior annotations can't capture — hits grouped by repo with most-starred first, per-group `handle` for follow-ups, and the crucial caveat that while `pool.syncing` is true an empty result is not final and should be retried.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then result shaping, then the sync caveat in priority order. The first sentence is long with an em-dash aside, but every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers scope, result grouping, follow-up handles, and the warm-up/retry condition — the main failure mode an agent would otherwise misread as 'no matches'. Return-value detail is covered by the output schema, so nothing required for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so query/glob/limit/max_per_repo/case_sensitive are already documented in the schema. The description adds no per-parameter syntax or defaults beyond that; the only extra detail is about the `pool` output field, not the inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: substring-search the files of top indexed home-ops repos without cloning. It explicitly distinguishes itself from `grep_values` by scope ('every resource kind ... not just Helm values'), so an agent can pick between the two without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context ('no clone step needed', all resource kinds) and names the follow-up tools `repo_read_file` / `repo_list_files` / `repo_grep` for drilling into a hit. It does not explicitly state when to prefer the single-repo `repo_grep` sibling over this pool-wide search, leaving one routing decision implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repo_list_filesList files in a cloned repositoryARead-onlyIdempotent
List files in a previously cloned repository (by handle). Optionally scope to a sub-path and/or filter with a glob (e.g. '/*.yaml', 'kubernetes/'). Use the handle returned by repo_clone.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | Optional glob filter applied to file paths, e.g. '**/*.yaml'. | |
| path | No | Sub-path within the repo to list (default: repo root). | . |
| handle | Yes | The clone handle from repo_clone. |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| handle | Yes | |
| entries | Yes | |
| truncated | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, covering the safety profile. The description adds useful behavioral context beyond annotations: the handle must come from repo_clone, and listing can be scoped via sub-path and glob. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose, followed by optional parameters and a necessary prerequisite. Every phrase earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list files tool with an output schema, the description covers the prerequisite (handle from repo_clone) and options (path, glob). It does not explicitly state whether the listing is recursive, but the glob pattern '**/*.yaml' implies recursive behavior, and the output schema likely clarifies return structure. No major gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter (handle, path, glob) fully described in the input schema. The description restates these options but adds no new semantic detail beyond examples already present in the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action and resource: 'List files in a previously cloned repository (by handle)'. This distinguishes it from sibling tools like repo_read_file and repo_grep, which operate on file contents. The optional path and glob filters are additional specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear prerequisite via 'Use the handle returned by repo_clone' and explains optional scoping/filtering with path and glob. It does not explicitly name alternatives or when-not-to-use conditions, but the context is strong enough for an agent to understand when this tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repo_read_fileRead a file from a cloned repositoryARead-onlyIdempotent
Read a text file from a previously cloned repository (by handle and relative path). Binary files are refused and large files are truncated. Use the handle returned by repo_clone.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Relative path to the file within the repo, e.g. 'kubernetes/apps/cert-manager/helmrelease.yaml'. | |
| handle | Yes | The clone handle from repo_clone. | |
| max_bytes | No | Max bytes to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| bytes | Yes | |
| handle | Yes | |
| content | Yes | |
| truncated | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent hints. The description adds behavioral details about binary files being refused and large files being truncated, which goes beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action, and each sentence earns its place without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema and good annotations, the description covers the key prerequisites and constraints (prerequisite handle, binary refusal, truncation) sufficiently for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters with descriptions. The description reinforces the handle's origin but doesn't add significant new semantic information beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads a text file from a cloned repository using a handle and relative path. It also mentions binary refusal and truncation, which distinguishes it from sibling tools like repo_list_files and repo_grep.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it works on previously cloned repos and instructs to use the handle from repo_clone. It doesn't explicitly name alternatives, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_imagesSearch container imagesARead-onlyIdempotent
Search kubesearch.dev for container image repositories used across public home-ops clusters (substring match on the image repository, case-insensitive). Returns each matching image repository, the tags seen in the wild, how many deployments use it, and a few sample repos. Equivalent to the kubesearch.dev /image search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max number of image repositories to return. | |
| query | Yes | Image repository substring, e.g. 'cert-manager', 'ghcr.io/home-operations', 'postgres'. | |
| offset | No | Skip this many results (ranked by usage count). |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| shown | Yes | |
| offset | Yes | |
| results | Yes | |
| has_more | Yes | |
| image_url | Yes | |
| total_matches | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds genuinely new behavior: case-insensitive substring matching, the upstream data source (public home-ops clusters), the ranked-by-usage result ordering, and what each result row contains, which is more than the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the verb and resource, then the matching semantics and return shape. Nothing is padded and no sentence restates the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, yet it does so briefly and accurately. For a three-parameter read-only search it covers everything an agent needs to invoke it; only sibling routing is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented, giving a baseline of 3. The description only adds the case-insensitivity of the substring match and the fact that results are ranked by usage count, which is marginal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (Search) and a precise resource (container image repositories on kubesearch.dev), plus the matching rule (case-insensitive substring on repository). It clearly reads as a distinct resource domain from the sibling repo_* and search_releases tools, though it never names an alternative to route against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by "used across public home-ops clusters" and the note that it is equivalent to the kubesearch.dev /image search. However, there is no explicit when-to-use / when-not guidance and no mention of how this differs from search_releases or repo_grep_all for an agent choosing between them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_releasesSearch HelmReleasesARead-onlyIdempotent
Search kubesearch.dev for Flux HelmReleases / Argo Applications by chart name (substring, case-insensitive). Mirrors the kubesearch.dev homepage search (e.g. 'cert-manager'). Results are grouped by chart source and ranked by how many public home-ops repos deploy them. Each result includes an id you can pass to get_release for full details, plus a kubesearch.dev link.
Note: chart_source_url is a NORMALIZED grouping key (it matches kubesearch.dev's /hr/<id> grouping and intentionally collapses related registries, e.g. all bjw-s variants into 'oci://ghcr.io/bjw-s-labs/charts/'). For chartRef/OCIRepository releases the actual pullable chart is in source_urls (group) and each repo's source_url (+ source_tag); resolved_chart flags when the real chart name differs from chart.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max number of chart groups to return. | |
| query | Yes | Chart name or substring to search for, e.g. 'cert-manager', 'authentik', 'plex'. | |
| offset | No | Pagination offset into the ranked results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| shown | Yes | |
| offset | Yes | |
| results | Yes | |
| has_more | Yes | |
| search_url | Yes | |
| total_matches | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses result ordering (grouped by chart source, ranked by repo deployment counts), the identity/pagination contract via `id`, and an important normalization caveat about chart_source_url collapsing registries with source_urls and resolved_chart for the real chart. That is substantial behavioral context an agent could not infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and routing to get_release are front-loaded in sentence one, and the grouped/ranked behavior follows logically. The second paragraph is dense and clause-heavy, but each clause carries real information about normalization that would otherwise mislead.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter read-only search with a full output schema, the description adds everything an agent needs: matching semantics, result grouping and ranking, the id-to-get_release handoff, and the normalization traps in chart_source_url/source_urls. No material gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so limit and offset are already documented, and the description largely reinforces query semantics rather than extending them. It adds the useful note that the returned `id` feeds get_release, but does not clarify pagination behavior or substring edge cases beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
First sentence gives a specific verb (search), a concrete resource (kubesearch.dev Flux HelmReleases / Argo Applications), and matching semantics (substring, case-insensitive) that distinguish it from siblings like get_release and search_images. It also names the follow-up tool for full details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the tool mirrors the kubesearch.dev homepage search, gives a concrete example query ('cert-manager'), and routes the agent to get_release for full details. It stops short of explicit when-not-to-use guidance against sibling search tools, but usage conditions are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusKubesearch data statusARead-onlyIdempotent
Report the freshness and size of the locally cached kubesearch.dev data: the release tag (date), when it was loaded, the cache directory, and row counts. Useful to confirm how current the search data is.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| tag | Yes | |
| cacheDir | Yes | |
| loadedAt | Yes | |
| helmReleases | Yes | |
| releaseFiles | Yes | |
| reposIndexed | Yes | |
| valueDocuments | Yes | |
| ociRepositories | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false. The description adds useful behavioral context by specifying that the data is locally cached and by enumerating the freshness and size details reported, though it does not discuss auth or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and followed by a clear usage cue. Every phrase adds information about the report contents or purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-argument status tool with an output schema and annotations covering safety, the description is complete enough: it says what is reported and why an agent would call it. Return values are handled by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline rule the schema cannot be improved by parameter description. The description appropriately focuses on the reported output rather than input parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reporting freshness and size of locally cached kubesearch.dev data. It enumerates the exact fields returned, making the tool's purpose clear, though it does not explicitly differentiate itself from the sibling search/repo tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use case: confirming how current the search data is. It does not list when not to use it or name alternatives, but the context is sufficient for a status tool with no obvious sibling alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v1.3.0- Added
get_release - Added
grep_values - Removed
kubesearch_get_release - Removed
kubesearch_grep_values - Removed
kubesearch_search_images - Removed
kubesearch_search_releases - Removed
kubesearch_status - Added
search_images - Added
search_releases - Added
status
5 tool updates
v1.2.0- Changed
kubesearch_get_release28 fields changed- removed
Output schema / properties / deployments / items / properties / chart_version / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / deployments / items / properties / chart_version / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / deployments / items / properties / namespace / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / deployments / items / properties / namespace / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / deployments / items / properties / repo_url / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / deployments / items / properties / repo_url / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / deployments / items / properties / resolved_chart / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / deployments / items / properties / resolved_chart / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / deployments / items / properties / source_kind / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / deployments / items / properties / source_kind / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / deployments / items / properties / source_tag / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / deployments / items / properties / source_tag / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / resolved_chart / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / resolved_chart / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / top_repos / items / properties / chart_version / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / top_repos / items / properties / chart_version / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / top_repos / items / properties / namespace / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / top_repos / items / properties / namespace / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / top_repos / items / properties / repo_url / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / top_repos / items / properties / repo_url / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / top_repos / items / properties / resolved_chart / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / top_repos / items / properties / resolved_chart / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / top_repos / items / properties / source_kind / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / top_repos / items / properties / source_kind / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / top_repos / items / properties / source_tag / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / top_repos / items / properties / source_tag / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / values_summary / properties / examples / items / properties / chart_version / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / values_summary / properties / examples / items / properties / chart_version / typeAdded value: +[ + "string", + "null" +]
- Changed
kubesearch_grep_values8 fields changed- removed
Output schema / properties / results / items / properties / chart / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / chart / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / matched_key / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / matched_key / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / repo / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / repo / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / stars / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / stars / typeAdded value: +[ + "number", + "null" +]
- Changed
kubesearch_search_releases12 fields changed- removed
Output schema / properties / results / items / properties / resolved_chart / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / resolved_chart / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / top_repos / items / properties / chart_version / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / top_repos / items / properties / chart_version / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / top_repos / items / properties / namespace / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / top_repos / items / properties / namespace / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / top_repos / items / properties / resolved_chart / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / top_repos / items / properties / resolved_chart / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / top_repos / items / properties / source_kind / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / top_repos / items / properties / source_kind / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / top_repos / items / properties / source_tag / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / top_repos / items / properties / source_tag / typeAdded value: +[ + "string", + "null" +]
- Changed
repo_clone2 fields changed- added
Output schema / properties / pinnedAdded value: +{ + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "handle", - "resolved_url", - "branch", - "file_count", - "size_mb", - "expires_in_minutes", - "reused", - "updated", - "tree" -]New value: +[ + "handle", + "resolved_url", + "branch", + "file_count", + "size_mb", + "expires_in_minutes", + "reused", + "updated", + "pinned", + "tree" +]
- Added
repo_grep_all
10 tool updates
v0.1.0- First observed
kubesearch_get_release - First observed
kubesearch_grep_values - First observed
kubesearch_search_images - First observed
kubesearch_search_releases - First observed
kubesearch_status - First observed
repo_cleanup - First observed
repo_clone - First observed
repo_grep - First observed
repo_list_files - First observed
repo_read_file
TDQS
Scored across 11 tools
Most tools have crisp, distinct purposes: clone/list/read/grep/cleanup on a handle vs. index-wide searches (search_releases, search_images, get_release, grep_values). The only soft overlaps are grep_values vs repo_grep_all (both full-text across many repos, differing only in scope: Helm values vs all files) and repo_grep vs repo_grep_all (handle vs pool); the descriptions do call these out, so an attentive agent can separate them.
Everything is snake_case and grouped by prefix family (repo_* for clone operations, search_* for index lookups), which is readable and predictable. Minor deviations: repo_clone is prefix+verb while search_releases/get_release are verb_noun, and 'status' is a bare noun with no verb.
11 tools is well within a healthy range for a search-plus-repo-inspection server. Each tool earns its place: discovery (1), drill-down (1), index greps (2), clone lifecycle (4), and a diagnostics call.
The surface covers the full workflow — discover charts/images, inspect values, clone a repo, list/read/grep files, and clean up — with no dead ends. The main gap is that there is no way to browse or search the list of indexed home-ops repos directly; repo discovery is only implicit through search_releases or repo_grep_all's pool.
Maintenance
Related MCP Connectors
Code intelligence for LLMs. Analyze, search, and retrieve code from any public git repository.
Read and write KukGit repositories, files, issues and pull requests from an AI assistant.
Operate GitHub from your AI assistant: repos, PRs, issues, Actions. Previews and read-only mode.
Give your AI assistant access to real Helm chart data. No more hallucinated values.yaml files.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables LLMs like Claude to securely execute Kubernetes CLI tools (kubectl, helm, istioctl, argocd) across multiple clusters through dynamic kubeconfig support, allowing natural language Kubernetes management and operations.5MIT
- AlicenseNot gradedqualityBmaintenanceProvides AI assistants with real Helm chart data from repositories, enabling accurate queries of chart values, versions, dependencies, and search without hallucination.MIT
- FlicenseNot gradedqualityCmaintenanceExposes Kubernetes cluster management tools to LLMs, enabling querying pods, deployments, logs, metrics, and managing port forwards via natural language.1-
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to interact with Argo CD applications, managing clusters, applications, and resources through natural language.Apache 2.0