googleapis/mcp-toolbox · error

error generating manifest for tool %q: %w

Error message

error generating manifest for tool %q: %w

What it means

After resolving the source, BuildManifest calls the tool's Manifest(src) method to produce its manifest entry. If that call returns an error, it is wrapped with this message naming the tool. The tool itself refused to build its manifest, usually because the provided source is not compatible with the tool.

Source

Thrown at internal/tools/toolsets.go:77

}

// BuildManifest resolves the manifest for every tool in the toolset against the
// provided sources, returning an error if any tool's manifest cannot be built.
func (t Toolset) BuildManifest(pMgr PrimitiveManagerI) (ToolsetManifest, error) {
	toolsManifest := make(map[string]Manifest, len(t.Tools))
	for _, tool := range t.Tools {
		srcName := (*tool).GetSourceName()
		var src sources.Source
		var ok bool
		if srcName != "" {
			src, ok = pMgr.GetSource(srcName)
			if !ok {
				return ToolsetManifest{}, fmt.Errorf("unable to retrieve %s source for tool %q", srcName, (*tool).GetName())
			}
		}
		m, err := (*tool).Manifest(src)
		if err != nil {
			return ToolsetManifest{}, fmt.Errorf("error generating manifest for tool %q: %w", (*tool).GetName(), err)
		}
		toolsManifest[(*tool).GetName()] = m
	}
	return ToolsetManifest{ServerVersion: t.Manifest.ServerVersion, ToolsManifest: toolsManifest}, nil
}

func (t ToolsetConfig) Initialize(serverVersion string, toolsMap map[string]Tool) (Toolset, error) {
	// finish toolset setup
	// Check each declared tool name exists
	toolset := Toolset{
		ToolsetConfig: t,
		Tools:         make([]*Tool, 0, len(t.ToolNames)),
		Manifest: ToolsetManifest{
			ServerVersion: serverVersion,
		},
		toolNameSet: make(map[string]struct{}, len(t.ToolNames)),
	}
	if !IsValidName(toolset.Name) {

View on GitHub (pinned to 8cc6e09de2)

Solutions

  1. Check the wrapped cause for the tool's underlying Manifest failure
  2. Verify the tool's `source:` points to a source of the correct kind (e.g. a Trino tool on a Trino source)
  3. Fix invalid parameter or template parameter definitions in the tool config
  4. Update or fix a custom tool's Manifest implementation if using custom tools

Example fix

// before (tools.yaml)
run_query:
  kind: trino-execute-sql
  source: my-postgres
// after
run_query:
  kind: trino-execute-sql
  source: my-trino
Defensive patterns

Strategy: validation

Validate before calling

// Pre-check tool/source kind pairing before building manifests
if tool.Kind == "trino-execute-sql" && sourceKindOf[tool.Source] != "trino" {
    return fmt.Errorf("tool %q requires a trino source, got %q", tool.Name, sourceKindOf[tool.Source])
}

Try / catch

m, err := toolset.Build(pMgr)
if err != nil {
    if strings.Contains(err.Error(), "error generating manifest") {
        log.Printf("fix tool/source pairing or parameters: %v", err)
    }
    return err
}

Prevention

When it happens

Trigger: Calling BuildManifest where (*tool).Manifest(src) fails — most commonly ValidateSource-style incompatibility (tool's kind paired with a wrong-kind source that slipped past config), or a tool-specific error building parameter manifests.

Common situations: A tool configured against a source of the wrong engine type; a tool whose parameter/template definitions are invalid so the manifest cannot be computed; custom tool implementations returning errors from Manifest.

Related errors


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