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

  1. Inspect the wrapped cause (%w) in the response — it points at the specific tool/config that failed
  2. Validate your tools YAML (tool name, description, parameters schema) against the documented schema
  3. Run the toolbox with --prebuilt or your config and check startup logs for tool parse warnings
  4. 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

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


AI-assisted analysis of googleapis/mcp-toolbox@8cc6e09de2 (2026-09-05). Data as JSON: /api/errors/965e50d9370f6c09. Report an issue: GitHub.