googleapis/mcp-toolbox · critical
tool type %q already registered
Error message
tool type %q already registered
What it means
This panic comes from init() in internal/tools/dataplex/dataplexdiscovermetadata because tools.Register("dataplex-discover-metadata", newConfig) returned false: the tool registry already contains that key. The library panics during startup so duplicate tool definitions can never silently replace one another. The fix is to ensure the resourceType is declared and registered exactly once.
Source
Thrown at internal/tools/dataplex/dataplexdiscovermetadata/dataplexdiscovermetadata.go:34
import (
"context"
"fmt"
"net/http"
"github.com/goccy/go-yaml"
"github.com/googleapis/mcp-toolbox/internal/sources"
"github.com/googleapis/mcp-toolbox/internal/tools"
"github.com/googleapis/mcp-toolbox/internal/tools/dataplex/dataplexcommon"
"github.com/googleapis/mcp-toolbox/internal/util"
"github.com/googleapis/mcp-toolbox/internal/util/parameters"
)
const resourceType string = "dataplex-discover-metadata"
func init() {
if !tools.Register(resourceType, newConfig) {
panic(fmt.Sprintf("tool type %q already registered", resourceType))
}
}
func newConfig(ctx context.Context, name string, decoder *yaml.Decoder) (tools.ToolConfig, error) {
actual := Config{ConfigBase: tools.ConfigBase{Name: name}}
if err := decoder.DecodeContext(ctx, &actual); err != nil {
return nil, err
}
return actual, nil
}
type compatibleSource interface {
ProjectID() string
GenerateDataDiscovery(ctx context.Context, location, resourcePath string) (string, error)
}
type Config struct {
tools.ConfigBase `yaml:",inline"`View on GitHub (pinned to 8cc6e09de2)
Solutions
- Search the repository for "dataplex-discover-metadata" and delete or rename the duplicate declaration.
- Ensure every tool package has a unique kebab-case resourceType.
- Remove duplicate module/vendor copies that could double-link the package.
- Avoid manual tools.Register calls for types already registered by init().
Example fix
// before const resourceType string = "dataplex-discover-metadata" // registered twice // after const resourceType string = "dataplex-discover-metadata" // single declaration retained; duplicate deleted
Defensive patterns
Strategy: validation
Validate before calling
const want = "dataplex-discover-metadata" // pre-change uniqueness check: // git grep -n 'dataplex-discover-metadata' -- '*.go' // exactly one const declaration keeps registration safe.
Try / catch
defer func() {
if r := recover(); r != nil {
log.Fatalf("cannot start: %v", r) // surfaces "tool type already registered" at boot
}
}() Prevention
- Declare resourceType once per tool package only.
- Grep for the intended key before creating a new dataplex tool.
- Leave all registration to package init().
- Keep a single copy of the module in the build graph.
- Add CI checks that fail on duplicate registry keys or startup panics.
When it happens
Trigger: Duplicate const "dataplex-discover-metadata" elsewhere in the build whose init() also registers it; or an explicit second tools.Register call from test/bootstrap code after package init.
Common situations: Copy-pasted dataplex tool package with unchanged const; merges reintroducing duplicates; duplicate module copies under different import paths; tests exercising registration manually.
Related errors
- tool type %q already registered
- tool type %q already registered
- tool type %q already registered
- tool type %q already registered
- tool type %q already registered
AI-assisted analysis of googleapis/mcp-toolbox@8cc6e09de2 (2026-09-05).
Data as JSON: /api/errors/af08cbe96704d348.
Report an issue: GitHub.