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

  1. Search the repository for "dataplex-discover-metadata" and delete or rename the duplicate declaration.
  2. Ensure every tool package has a unique kebab-case resourceType.
  3. Remove duplicate module/vendor copies that could double-link the package.
  4. 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

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


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