Skip to content

Skills and MCP wording cleanup - #608

Merged
Rachael-Graham merged 3 commits into
mainfrom
feedback6
Oct 15, 2026
Merged

Rachael-Graham merged 3 commits into
mainfrom
feedback6

Conversation

@Rachael-Graham

Copy link
Copy Markdown
Contributor

No description provided.

Signed-off-by: Rachael Graham <rachael.graham@solo.io>
@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Docs preview

Link Points at
Branch preview The newest push to this branch. Updates in place.
Commit preview a600e80 only. Frozen.

Both are uploaded Worker versions and serve no production traffic.

Signed-off-by: Rachael Graham <rachael.graham@solo.io>

### Tool selection on the Claude harness

Claude's MCP configuration has no per-tool allowlist. On the Claude harness, the `tools` list does not narrow a server, and the agent reaches every tool that the server serves. kagent admits the {{< gloss "Revision" >}}revision{{< /gloss >}} either way. If the list that you wrote does not already cover every tool that the server offers, kagent also records a warning on the Agent.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should fix (accuracy). The warning condition is narrower than "does not already cover every tool". In go/core/internal/translator/claude/mcp.go (mcpSelectionWarning), kagent skips the warning only when the tools list exactly matches the tool set that kagent last discovered on the server. It also warns when the list names tools that the server does not offer, and when no current discovered tool set exists.

Suggested wording: "kagent records a warning on the Agent unless the list exactly matches the tools that kagent last discovered on the server."

| `subAgent.templateRef.name` | The AgentTemplate to bind, in the same namespace. |

A bound template compiles under the parent {{< gloss "Agent" >}}Agent{{< /gloss >}}'s Harness and runs inside the parent's {{< gloss "Actor" >}}Actor{{< /gloss >}}, so nesting does not add compute and the two agents share one sandbox. A subagent does not need an Agent of its own.
kagent compiles the bound template into the parent agent's own configuration, and both agents then run in the same place. A bound template is not an MCP server and has no endpoint of its own. A bound template also does not need an {{< gloss "Agent" >}}Agent{{< /gloss >}} resource because the parent's Agent runs it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should fix. "Run in the same place" is vaguer than the text it replaces ("runs inside the parent's Actor, so ... the two agents share one sandbox"). about/core-concepts.md:172 still uses the specific wording, so the two pages now describe the same behavior at different levels of precision. Could we keep "sandbox" here? The same applies to the stdio row in plugins.md:82.

- `mcp`: Binds tools from an MCP server.
- `agent`: Binds another AgentTemplate, so that the agent can hand work to it.
- `mcp`: Tools from a {{< gloss "Model Context Protocol" >}}Model Context Protocol{{< /gloss >}} (MCP) server.
- `subAgent`: Another agent that takes work from the agent that you are configuring.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should fix. Now that Agent is a resource kind, "Another agent" reads as an Agent resource, but line 73 says that a bound template does not need an Agent. "Another AgentTemplate that takes work from the agent that you are configuring" avoids the ambiguity. The same wording is in data/glossary.yaml:122.

kubectl get agent <name> -n <namespace> -o jsonpath='{.status.warnings}'
```

To keep an agent on the Claude harness away from a tool, limit what the server exposes rather than what the binding selects. For example, put the MCP server behind agentgateway and apply [tool access](https://agentgateway.dev/docs/kubernetes/latest/documentation/mcp/tool-access/) rules to the route. Those rules filter a disallowed tool out of the `tools/list` response, so the agent never sees it. Then point the RemoteMCPServer at that route. To put more than one MCP server behind one route, see [Virtual MCP](https://agentgateway.dev/docs/kubernetes/latest/documentation/mcp/virtual/).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should fix. The previous version offered a simpler option that this rewrite drops: give the agent its own RemoteMCPServer that serves only the tools that you intend. Now the only example requires a second product. Could we keep the dedicated RemoteMCPServer option first, and the agentgateway approach as the stronger alternative?

- **No reuse within one tree.** The same AgentTemplate cannot appear twice in the same tree.
- **Unique binding names.** Two bindings on one AgentTemplate cannot share a `name`.

When kagent rejects a tree, the Agent's `Compatible` condition becomes `False`. The condition reports the reason `UnsupportedConfiguration`, and its message identifies the rule that failed. Read both in the output of the following command.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Nit. True for rule violations. A missing subagent template is a different case: it reports ResolvedRefs with ReferenceResolutionFailed, not Compatible (go/core/internal/translator/compiler.go, subagent template lookup). One clause would cover it.

## Troubleshooting

A schema problem appears on the AgentTemplate's status, in the entry for each Harness under `status.harnesses`. `ResolvedRefs` reports a ConfigMap or key that kagent cannot find, and `Compatible` reports a schema that kagent found but cannot accept, or a Harness that does not use the `kagent` runtime.
A schema problem appears on the Agent's status conditions. `ResolvedRefs` reports a ConfigMap or key that kagent cannot find. `Compatible` reports a schema that kagent found but cannot accept, or a Harness that does not use the `kagent` harness.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should fix. "A Harness that does not use the kagent harness" defines a Harness in terms of a harness. The table row for Harness runtime "x" does not support structured output has the same wording. Suggest:

Suggested change
A schema problem appears on the Agent's status conditions. `ResolvedRefs` reports a ConfigMap or key that kagent cannot find. `Compatible` reports a schema that kagent found but cannot accept, or a Harness that does not use the `kagent` harness.
A schema problem appears on the Agent's status conditions. `ResolvedRefs` reports a ConfigMap or key that kagent cannot find. `Compatible` reports a schema that kagent found but cannot accept, or a Harness whose runtime is not `kagent`.

No error appears on either resource, because the Harness has no status to write one to and the AgentTemplate was never paired. The failure surfaces only when you try to use the template.
## A new AgentTemplate never runs

When you create an AgentTemplate directly, it never becomes ready. An AgentTemplate is not runnable by itself, and nothing prepares a template until an Agent references it. The template also has no status for a failure to appear on, so the problem surfaces only when you try to start a conversation.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Nit. The page says that an AgentTemplate has no status, so "never becomes ready" describes a state that it cannot have. Suggest:

Suggested change
When you create an AgentTemplate directly, it never becomes ready. An AgentTemplate is not runnable by itself, and nothing prepares a template until an Agent references it. The template also has no status for a failure to appear on, so the problem surfaces only when you try to start a conversation.
An AgentTemplate on its own never runs. An AgentTemplate is not runnable by itself, and nothing prepares a template until an Agent references it. The template also has no status for a failure to appear on, so the problem surfaces only when you try to start a conversation.

Pinning has a practical consequence worth planning for. Publishing a new version means updating the AgentTemplate to name the new digest, commit, or object version, which compiles a new revision. Agents that are already running keep the content that they started with.
If a source sets more than one kind, or none of them, the API server rejects the AgentTemplate with the error `exactly one of the fields in [oci git bucket] must be set`.

Keep in mind that publishing a new version means updating the AgentTemplate to reference the new digest, commit, or object version, which produces a new revision. However, agents that are already running keep the content that they started with.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Nit. Nothing contrasts with "However", and "Keep in mind that" is filler. Suggest:

Suggested change
Keep in mind that publishing a new version means updating the AgentTemplate to reference the new digest, commit, or object version, which produces a new revision. However, agents that are already running keep the content that they started with.
Publishing a new version means updating the AgentTemplate to reference the new digest, commit, or object version, which produces a new revision. Agents that are already running keep the content that they started with.

Comment thread docs-site/data/glossary.yaml Outdated

Tool binding:
short: "One entry in an AgentTemplate's spec.tools list. Each binding selects exactly one source: tools from a Model Context Protocol server, or another AgentTemplate used as a tool."
short: "One entry in an AgentTemplate's spec.tools list. Each binding connects the agent to one source: tools from a Model Context Protocol server, or another agent that takes work from it."

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should fix. Same ambiguity as about-tools.md:11: "another agent" reads as the Agent kind. Suggest "another AgentTemplate that takes work from it".

```bash
kubectl get agenttemplate <template-name> -n kagent \
-o jsonpath='{range .status.harnesses[0].conditions[?(@.type=="Ready")]}{.status} {.reason} {.message}{end}'
kubectl get agent <agent-name> -n kagent \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Nit. The example already names the Agent release-writer, so the reader does not need a placeholder here.

Suggested change
kubectl get agent <agent-name> -n kagent \
kubectl get agent release-writer -n kagent \

Signed-off-by: Rachael Graham <rachael.graham@solo.io>
@Rachael-Graham
Rachael-Graham merged commit e50ad2e into main Oct 15, 2026
4 checks passed
@Rachael-Graham
Rachael-Graham deleted the feedback6 branch October 15, 2026 17:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants