googleapis/mcp-toolbox · error

tool type %q already registered

Error message

tool type %q already registered

What it means

The package's init() registers the 'postgres-list-publication-tables' tool type in the global registry and panics if tools.Register returns false, meaning the type string was already claimed. This is a duplicate-registration guard for programming errors (e.g. a vendored or duplicated package copy linked into the binary), not a user config issue.

Source

Thrown at internal/tools/postgres/postgreslistpublicationtables/postgreslistpublicationtables.go:64

            pg_catalog.pg_get_userbyid(p.pubowner) AS publication_owner
        FROM pg_catalog.pg_publication_tables pt
        JOIN pg_catalog.pg_publication p
            ON pt.pubname = p.pubname
    )
    SELECT *
    FROM publication_details
    WHERE
        (NULLIF(TRIM($1::text), '') IS NULL OR table_name = ANY(regexp_split_to_array(TRIM($1::text), '\s*,\s*')))
        AND (NULLIF(TRIM($2::text), '') IS NULL OR publication_name = ANY(regexp_split_to_array(TRIM($2::text), '\s*,\s*')))
        AND (NULLIF(TRIM($3::text), '') IS NULL OR schema_name = ANY(regexp_split_to_array(TRIM($3::text), '\s*,\s*')))
    ORDER BY
        publication_name, schema_name, table_name
    LIMIT COALESCE($4::int, 50);
`

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 {
	PostgresPool() *pgxpool.Pool
	RunSQL(context.Context, string, []any) (any, error)
}

type Config struct {
	tools.ConfigBase `yaml:",inline"`

View on GitHub (pinned to 8cc6e09de2)

Solutions

  1. Ensure the package is not imported twice under different paths (e.g. vendored and module copies)
  2. Rename the conflicting resourceType constant if two distinct tools share it
  3. Clean go.mod/go.sum and rebuild to eliminate stale duplicate dependencies
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at internal/tools/postgres/postgreslistpublicationtables/postgreslistpublicationtables.go:64 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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