googleapis/mcp-toolbox · error
INTERNAL_ERROR
INTERNAL_ERROR
Error message
error generating manifest: %w
What it means
After parsing the tools/list request, the server calls GenerateListToolsResult to build the tool manifest (converting registered tool configs into MCP tool descriptors). If that generation fails for any tool, the whole listing fails with JSON-RPC INTERNAL_ERROR 'error generating manifest'.
Source
Thrown at internal/server/mcp/v20250618/method.go:124
func pingHandler(id jsonrpc.RequestId) (any, error) {
return jsonrpc.JSONRPCResponse{
Jsonrpc: jsonrpc.JSONRPC_VERSION,
Id: id,
Result: struct{}{},
}, nil
}
func toolsListHandler(ctx context.Context, id jsonrpc.RequestId, primitiveMgr *primitives.PrimitiveManager, g group.Group, body []byte) (any, error) {
var req ListToolsRequest
if err := json.Unmarshal(body, &req); err != nil {
err = fmt.Errorf("invalid mcp tools list request: %w", err)
return jsonrpc.NewError(id, jsonrpc.INVALID_REQUEST, err.Error(), nil), err
}
urlParams, _ := util.UrlParamsFromContext(ctx)
listToolsResult, err := GenerateListToolsResult(primitiveMgr, g, urlParams)
if err != nil {
err = fmt.Errorf("error generating manifest: %w", err)
return jsonrpc.NewError(id, jsonrpc.INTERNAL_ERROR, err.Error(), nil), err
}
return jsonrpc.JSONRPCResponse{
Jsonrpc: jsonrpc.JSONRPC_VERSION,
Id: id,
Result: listToolsResult,
}, nil
}
// toolsCallHandler generate a response for tools call.
func toolsCallHandler(ctx context.Context, id jsonrpc.RequestId, g group.Group, primitiveMgr *primitives.PrimitiveManager, body []byte, header http.Header) (any, error) {
if header != nil {
if clientIP := util.ExtractClientIP(header); clientIP != "" {
ctx = util.WithClientIP(ctx, clientIP)
}
}
authServices := primitiveMgr.AuthServices()View on GitHub (pinned to 8cc6e09de2)
Solutions
- Inspect the wrapped cause (%w) in the response — it points at the specific tool/config that failed
- Validate your tools YAML (tool name, description, parameters schema) against the documented schema
- Run the toolbox with --prebuilt or your config and check startup logs for tool parse warnings
- Bisect by removing tools/groups from the config until the listing succeeds, then fix the offending tool
Example fix
// before
tools:
my_tool:
kind: postgres-sql
description: ""
source: my-pg
statement: SELECT 1
// after
tools:
my_tool:
kind: postgres-sql
description: "Runs a health check query"
source: my-pg
statement: SELECT 1 Defensive patterns
Strategy: try-catch
Try / catch
try { const res = await listTools(); } catch (e) { if (e.code === -32603 && /manifest/.test(e.message)) { console.error("server failed to build tool manifest:", e.message); } else throw e; } Prevention
- Validate tool YAML (description, parameters schema) before deploying
- Check startup logs for tool config parse warnings
- Bisect configs by removing tools until the failing one is isolated
When it happens
Trigger: A registered tool whose Config cannot be converted to its manifest form — e.g. a tool definition with an invalid parameter schema, missing description, or a failing ToConfig/Manifest conversion inside a custom or misconfigured tool.
Common situations: Custom tool YAML configs with malformed parameter definitions; a newly added source/tool package whose manifest generation has a bug; group filters (via URL params) that produce an inconsistent tool set.
Related errors
- INTERNAL_ERROR
- tool does not exist: %s
- unable to retrieve %s source for tool %q
- tool does not exist: %s
- unable to retrieve %s source for tool %q
AI-assisted analysis of googleapis/mcp-toolbox@8cc6e09de2 (2026-09-05).
Data as JSON: /api/errors/965e50d9370f6c09.
Report an issue: GitHub.