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
- Check the wrapped cause for the tool's underlying Manifest failure
- Verify the tool's `source:` points to a source of the correct kind (e.g. a Trino tool on a Trino source)
- Fix invalid parameter or template parameter definitions in the tool config
- 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
- Pair each tool kind with its matching engine source
- Validate parameter definitions before deployment
- Run the server once locally against the config as a smoke test
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
- toolset %q not found
- INTERNAL_ERROR
- unable to retrieve %s source for tool %q
- invalid toolset name: %s
- tool does not exist: %s
AI-assisted analysis of googleapis/mcp-toolbox@8cc6e09de2 (2026-09-05).
Data as JSON: /api/errors/f5c6d9a32890a245.
Report an issue: GitHub.