Skip to content

Add tool descriptions so Amazon Q / kiro-cli load all tools#1

Open
igorsf wants to merge 1 commit into
connerkward:mainfrom
igorsf:fix/tool-descriptions
Open

Add tool descriptions so Amazon Q / kiro-cli load all tools#1
igorsf wants to merge 1 commit into
connerkward:mainfrom
igorsf:fix/tool-descriptions

Conversation

@igorsf

@igorsf igorsf commented Jun 29, 2026

Copy link
Copy Markdown

Summary

All tools except index-notes were registered without a description.
On Amazon Q CLI / kiro-cli this silently drops 22 of the 23 tools before
they ever reach the model. This PR adds a one-line description to every
tool registration.

The bug

Bare server.tool(name, schema, handler) produces a tools/list entry
with no description field. Amazon Q CLI / kiro-cli — and likely
other clients that route MCP tools through Bedrock's Converse
toolConfig API — filter out tools that lack a description, without
erroring
. (Bedrock's ToolSpecification.description is technically
optional, but has a min length of 1 when present; these clients choose
to drop tools that omit it.)

Result: only index-notes (the lone tool with a description, via
registerAppTool) was exposed. The model could start the background
indexer but had no index-notes-status, index-notes-blocking,
search-notes, find-notes, get-note, etc. So indexing "started and
never completed," and nothing was searchable.

A spec-compliant MCP client (the reference Inspector, a raw stdio probe)
keeps description-less tools, which is why this doesn't reproduce
everywhere.

Fix

Switch all 22 affected server.tool(...) calls to the 4-arg overload
server.tool(name, description, schema, handler). Descriptions only; no
logic, schema, or handler changes.

Verification

Wire-tapped the JSON-RPC stream between kiro-cli and the server:

Before After
Tools sent in tools/list 23 23
Tools with description 1 23
Tools reaching the model 1 23

After the change the model calls previously-invisible tools —
index-notes-blocking returns Indexed N chunks… in one step, and
search-notes returns results. bun build clean.

Scope / risk

Additive metadata only. No effect on spec-compliant clients (they
already loaded every tool); fixes Amazon Q / kiro-cli and similar.

Every tool except `index-notes` was registered via the 3-arg
`server.tool(name, schema, handler)` overload, which emits no
`description` field in `tools/list`. Amazon Q CLI / kiro-cli (and likely
other clients that route MCP tools through Bedrock's Converse toolConfig
API) silently drop description-less tools at load time — no error, they
just never reach the model. (Bedrock's ToolSpecification.description is
technically optional, but min-length 1 when present, and these clients
choose to filter tools that omit it.)

Net effect on those clients: 22 of 23 tools vanish. Only `index-notes`
survived (it has a description via registerAppTool), so the model could
ONLY start the fire-and-forget background indexer — and never poll it,
since `index-notes-status` was also dropped. Indexing appeared to
"start and never finish." search-notes, find-notes, get-note,
index-notes-blocking, etc. were all invisible.

Switch all 22 affected registrations to the 4-arg
`server.tool(name, description, schema, handler)` overload. Descriptions
only — no schema, handler, or behavior changes; strictly additive
metadata that spec-compliant clients already tolerated.

Verified by wire-tapping a kiro-cli session: tools/list now exposes
23/23 tools with descriptions (was 1/23 reaching the model), and the
model can call search-notes and index-notes-blocking successfully.
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.

1 participant