googleapis/mcp-toolbox · error

invalid entry format: must be in the form projects/{project}

Error message

invalid entry format: must be in the form projects/{project}/locations/{location}/entryGroups/{entryGroup}/entries/{entry}

What it means

dataplex-lookup-entry's `entry` parameter must be a fully-qualified Dataplex entry name. Invoke splits it on '/' and requires at least 4 segments with 'projects' at index 0 and 'locations' at index 2, since the tool derives the parent name by joining the first 4 segments. Otherwise it returns this AgentError.

Source

Thrown at internal/tools/dataplex/dataplexlookupentry/dataplexlookupentry.go:134

	}
	return nil
}

func (t Tool) Invoke(ctx context.Context, s sources.Source, params parameters.ParamValues, accessToken tools.AccessToken) (any, util.ToolboxError) {
	source, ok := s.(compatibleSource)
	if !ok {
		return nil, util.NewClientServerError("source used is not compatible with the tool", http.StatusInternalServerError, nil)
	}
	paramsMap := params.AsMap()
	entry, _ := paramsMap["entry"].(string)
	view, _ := paramsMap["view"].(int)
	aspectTypeSlice, err := parameters.ConvertAnySliceToTyped(paramsMap["aspectTypes"].([]any), "string")
	if err != nil {
		return nil, util.NewAgentError(fmt.Sprintf("can't convert aspectTypes to array of strings: %s", err), err)
	}
	parts := strings.Split(entry, "/")
	if len(parts) < 4 || parts[0] != "projects" || parts[2] != "locations" {
		err = fmt.Errorf("invalid entry format: must be in the form projects/{project}/locations/{location}/entryGroups/{entryGroup}/entries/{entry}")
		return nil, util.NewAgentError(err.Error(), err)
	}
	name := strings.Join(parts[:4], "/")
	aspectTypes := aspectTypeSlice.([]string)
	resp, err := source.LookupEntry(ctx, name, view, aspectTypes, entry)
	if err != nil {
		return nil, util.ProcessGcpError(err)
	}
	return resp, nil
}

View on GitHub (pinned to 8cc6e09de2)

Solutions

  1. Pass the full name: projects/{project}/locations/{location}/entryGroups/{entryGroup}/entries/{entry}
  2. Use the exact `name` field from dataplex-search-entries results
  3. Verify the path contains 'projects' and 'locations' segments in positions 1 and 3

Example fix

// before
{"entry": "projects/p/entryGroups/g/entries/e"}
// after
{"entry": "projects/p/locations/us-central1/entryGroups/g/entries/e"}
Defensive patterns

Strategy: validation

Validate before calling

func validEntry(s string) bool {
	parts := strings.Split(s, "/")
	return len(parts) >= 4 && parts[0] == "projects" && parts[2] == "locations"
}
if !validEntry(entry) {
	return fmt.Errorf("entry must be projects/{project}/locations/{location}/entryGroups/{entryGroup}/entries/{entry}")
}

Type guard

func isFullyQualifiedEntry(s string) bool {
	parts := strings.Split(s, "/")
	return len(parts) >= 4 && parts[0] == "projects" && parts[2] == "locations"
}

Try / catch

_, terr := tool.Invoke(ctx, src, params, token)
if terr != nil && strings.Contains(terr.Error(), "invalid entry format") {
	// resolve the full name via dataplex-search-entries, then retry
}

Prevention

When it happens

Trigger: entry is a bare id ('my-entry'), a partial path ('projects/p/entryGroups/g/entries/e' missing locations), or a malformed string.

Common situations: Agent passes the entry id from search output instead of the full resource name; user supplies a dataset/table name; path built with 'regions' instead of 'locations'.

Related errors


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