Tool: get_tool
Gets details of the specified tool.
The following sample demonstrate how to use curl to invoke the get_tool MCP tool.
| Curl Request |
|---|
curl --location 'https://ces.[REGION].rep.googleapis.com/mcp' \ --header 'content-type: application/json' \ --header 'accept: application/json, text/event-stream' \ --data '{ "method": "tools/call", "params": { "name": "get_tool", "arguments": { // provide these details according to the tool's MCP specification } }, "jsonrpc": "2.0", "id": 1 }' |
Input Schema
Request message for AgentService.GetTool.
GetToolRequest
| JSON representation |
|---|
{ "name": string } |
| Fields | |
|---|---|
name |
Required. The resource name of the tool to retrieve. |
Output Schema
A tool represents an action that the CES agent can take to achieve certain goals.
Tool
| JSON representation |
|---|
{ "name": string, "displayName": string, "executionType": enum ( |
| Fields | |
|---|---|
name |
Identifier. The unique identifier of the tool. Format: -
|
displayName |
Output only. The display name of the tool, derived based on the tool's type. For example, display name of a [ClientFunction][Tool.ClientFunction] is derived from its |
executionType |
Optional. The execution type of the tool. |
createTime |
Output only. Timestamp when the tool was created. Uses RFC 3339, where generated output will always be Z-normalized and use 0, 3, 6 or 9 fractional digits. Offsets other than "Z" are also accepted. Examples: |
updateTime |
Output only. Timestamp when the tool was last updated. Uses RFC 3339, where generated output will always be Z-normalized and use 0, 3, 6 or 9 fractional digits. Offsets other than "Z" are also accepted. Examples: |
etag |
Etag used to ensure the object hasn't changed during a read-modify-write operation. If the etag is empty, the update will overwrite any concurrent changes. |
generatedSummary |
Output only. If the tool is generated by the LLM assistant, this field contains a descriptive summary of the generation. |
toolFakeConfig |
Optional. Configuration for tool behavior in fake mode. |
Union field tool_type. The type of the tool. tool_type can be only one of the following: |
|
clientFunction |
Optional. The client function. |
openApiTool |
Optional. The open API tool. |
googleSearchTool |
Optional. The google search tool. |
connectorTool |
Optional. The Integration Connector tool. |
dataStoreTool |
Optional. The data store tool. |
pythonFunction |
Optional. The python function tool. |
mcpTool |
Optional. The MCP tool. An MCP tool cannot be created or updated directly and is managed by the MCP toolset. |
fileSearchTool |
Optional. The file search tool. |
systemTool |
Optional. The system tool. |
widgetTool |
Optional. The widget tool. |
ClientFunction
| JSON representation |
|---|
{ "name": string, "description": string, "parameters": { object ( |
| Fields | |
|---|---|
name |
Required. The function name. |
description |
Optional. The function description. |
parameters |
Optional. The schema of the function parameters. |
response |
Optional. The schema of the function response. |
Schema
| JSON representation |
|---|
{ "type": enum ( |
| Fields | |
|---|---|
type |
Required. The type of the data. |
properties |
Optional. Properties of Type.OBJECT. An object containing a list of |
required[] |
Optional. Required properties of Type.OBJECT. |
description |
Optional. The description of the data. |
items |
Optional. Schema of the elements of Type.ARRAY. |
nullable |
Optional. Indicates if the value may be null. |
uniqueItems |
Optional. Indicate the items in the array must be unique. Only applies to TYPE.ARRAY. |
prefixItems[] |
Optional. Schemas of initial elements of Type.ARRAY. |
additionalProperties |
Optional. Can either be a boolean or an object, controls the presence of additional properties. |
anyOf[] |
Optional. The value should be validated against any (one or more) of the subschemas in the list. |
enum[] |
Optional. Possible values of the element of primitive type with enum format. Examples: 1. We can define direction as : {type:STRING, format:enum, enum:["EAST", NORTH", "SOUTH", "WEST"]} 2. We can define apartment number as : {type:INTEGER, format:enum, enum:["101", "201", "301"]} |
default |
Optional. Default value of the data. |
ref |
Optional. Allows indirect references between schema nodes. The value should be a valid reference to a child of the root For example, the following schema defines a reference to a schema node named "Pet": The value of the "pet" property is a reference to the schema node named "Pet". See details in https://json-schema.org/understanding-json-schema/structuring. |
defs |
Optional. A map of definitions for use by An object containing a list of |
title |
Optional. The title of the schema. |
minItems |
Optional. Minimum number of the elements for Type.ARRAY. |
maxItems |
Optional. Maximum number of the elements for Type.ARRAY. |
Union field
|
|
minimum |
Optional. Minimum value for Type.INTEGER and Type.NUMBER. |
Union field
|
|
maximum |
Optional. Maximum value for Type.INTEGER and Type.NUMBER. |
PropertiesEntry
| JSON representation |
|---|
{
"key": string,
"value": {
object ( |
| Fields | |
|---|---|
key |
|
value |
|
Value
| JSON representation |
|---|
{ // Union field |
| Fields | |
|---|---|
Union field kind. The kind of value. kind can be only one of the following: |
|
nullValue |
Represents a null value. |
numberValue |
Represents a double value. |
stringValue |
Represents a string value. |
boolValue |
Represents a boolean value. |
structValue |
Represents a structured value. |
listValue |
Represents a repeated |
Struct
| JSON representation |
|---|
{ "fields": { string: value, ... } } |
| Fields | |
|---|---|
fields |
Unordered map of dynamically typed values. An object containing a list of |
FieldsEntry
| JSON representation |
|---|
{ "key": string, "value": value } |
| Fields | |
|---|---|
key |
|
value |
|
ListValue
| JSON representation |
|---|
{ "values": [ value ] } |
| Fields | |
|---|---|
values[] |
Repeated field of dynamically typed values. |
DefsEntry
| JSON representation |
|---|
{
"key": string,
"value": {
object ( |
| Fields | |
|---|---|
key |
|
value |
|
OpenApiTool
| JSON representation |
|---|
{ "openApiSchema": string, "name": string, "description": string, "apiAuthentication": { object ( |
| Fields | |
|---|---|
openApiSchema |
Required. The OpenAPI schema in JSON or YAML format. |
name |
Optional. The name of the tool. If not provided, the name of the tool will be derived from the OpenAPI schema, from |
description |
Optional. The description of the tool. If not provided, the description of the tool will be derived from the OpenAPI schema, from |
apiAuthentication |
Optional. Authentication information required by the API. |
tlsConfig |
Optional. The TLS configuration. Includes the custom server certificates that the client will trust. |
serviceDirectoryConfig |
Optional. Service Directory configuration. |
ignoreUnknownFields |
Optional. If true, the agent will ignore unknown fields in the API response. |
url |
Optional. The server URL of the Open API schema. This field is only set in tools in the environment dependencies during the export process if the schema contains a server url. During the import process, if this url is present in the environment dependencies and the schema has the $env_var placeholder, it will replace the placeholder in the schema. |
ApiAuthentication
| JSON representation |
|---|
{ // Union field |
| Fields | |
|---|---|
Union field auth_config. The auth configuration. auth_config can be only one of the following: |
|
apiKeyConfig |
Optional. Config for API key auth. |
oauthConfig |
Optional. Config for OAuth. |
serviceAgentIdTokenAuthConfig |
Optional. Config for ID token auth generated from CES service agent. |
serviceAccountAuthConfig |
Optional. Config for service account authentication. |
bearerTokenConfig |
Optional. Config for bearer token auth. |
ApiKeyConfig
| JSON representation |
|---|
{
"keyName": string,
"apiKeySecretVersion": string,
"requestLocation": enum ( |
| Fields | |
|---|---|
keyName |
Required. The parameter name or the header name of the API key. E.g., If the API request is "https://example.com/act?X-Api-Key= |
apiKeySecretVersion |
Required. The name of the SecretManager secret version resource storing the API key. Format: Note: You should grant |
requestLocation |
Required. Key location in the request. |
OAuthConfig
| JSON representation |
|---|
{
"oauthGrantType": enum ( |
| Fields | |
|---|---|
oauthGrantType |
Required. OAuth grant types. |
clientId |
Required. The client ID from the OAuth provider. |
clientSecretVersion |
Required. The name of the SecretManager secret version resource storing the client secret. Format: Note: You should grant |
tokenEndpoint |
Required. The token endpoint in the OAuth provider to exchange for an access token. |
scopes[] |
Optional. The OAuth scopes to grant. |
ServiceAccountAuthConfig
| JSON representation |
|---|
{ "serviceAccount": string, "scopes": [ string ] } |
| Fields | |
|---|---|
serviceAccount |
Required. The email address of the service account used for authentication. CES uses this service account to exchange an access token and the access token is then sent in the The service account must have the |
scopes[] |
Optional. The OAuth scopes to grant. If not specified, the default scope |
BearerTokenConfig
| JSON representation |
|---|
{ "token": string } |
| Fields | |
|---|---|
token |
Required. The bearer token. Must be in the format |
TlsConfig
| JSON representation |
|---|
{
"caCerts": [
{
object ( |
| Fields | |
|---|---|
caCerts[] |
Required. Specifies a list of allowed custom CA certificates for HTTPS verification. |
CaCert
| JSON representation |
|---|
{ "displayName": string, "cert": string } |
| Fields | |
|---|---|
displayName |
Required. The name of the allowed custom CA certificates. This can be used to disambiguate the custom CA certificates. |
cert |
Required. The allowed custom CA certificates (in DER format) for HTTPS verification. This overrides the default SSL trust store. If this is empty or unspecified, CES will use Google's default trust store to verify certificates. N.B. Make sure the HTTPS server certificates are signed with "subject alt name". For instance a certificate can be self-signed using the following command, openssl x509 -req -days 200 -in example.com.csr \ -signkey example.com.key \ -out example.com.crt \ -extfile <(printf "\nsubjectAltName='DNS:www.example.com'") A base64-encoded string. |
ServiceDirectoryConfig
| JSON representation |
|---|
{ "service": string } |
| Fields | |
|---|---|
service |
Required. The name of Service Directory service. Format: |
GoogleSearchTool
| JSON representation |
|---|
{
"name": string,
"description": string,
"contextUrls": [
string
],
"preferredDomains": [
string
],
"excludeDomains": [
string
],
"promptConfig": {
object ( |
| Fields | |
|---|---|
name |
Required. The name of the tool. |
description |
Optional. Description of the tool's purpose. |
contextUrls[] |
Optional. Content will be fetched directly from these URLs for context and grounding. Example: "https://example.com/path.html". A maximum of 20 URLs are allowed. |
preferredDomains[] |
Optional. Specifies domains to restrict search results to. Example: "example.com", "another.site". A maximum of 20 domains can be specified. |
excludeDomains[] |
Optional. List of domains to be excluded from the search results. Example: "example.com". A maximum of 2000 domains can be excluded. |
promptConfig |
Optional. Prompt instructions passed to planner on how the search results should be processed for text and voice. |
PromptConfig
| JSON representation |
|---|
{ "textPrompt": string, "voicePrompt": string } |
| Fields | |
|---|---|
textPrompt |
Optional. Defines the prompt used for the system instructions when interacting with the agent in chat conversations. If not set, default prompt will be used. |
voicePrompt |
Optional. Defines the prompt used for the system instructions when interacting with the agent in voice conversations. If not set, default prompt will be used. |
ConnectorTool
| JSON representation |
|---|
{ "connection": string, "action": { object ( |
| Fields | |
|---|---|
connection |
Required. The full resource name of the referenced Integration Connectors Connection. Format: |
action |
Required. Action for the tool to use. |
authConfig |
Optional. Configures how authentication is handled in Integration Connectors. By default, an admin authentication is passed in the Integration Connectors API requests. You can override it with a different end-user authentication config. Note: The Connection must have authentication override enabled in order to specify an EUC configuration here - otherwise, the ConnectorTool creation will fail. See https://cloud.google.com/application-integration/docs/configure-connectors-task#configure-authentication-override for details. |
name |
Optional. The name of the tool that can be used by the Agent to decide whether to call this ConnectorTool. |
description |
Optional. The description of the tool that can be used by the Agent to decide whether to call this ConnectorTool. |
Action
| JSON representation |
|---|
{ "inputFields": [ string ], "outputFields": [ string ], // Union field |
| Fields | |
|---|---|
inputFields[] |
Optional. Entity fields to use as inputs for the operation. If no fields are specified, all fields of the Entity will be used. |
outputFields[] |
Optional. Entity fields to return from the operation. If no fields are specified, all fields of the Entity will be returned. |
Union field action_spec. Specification for an action to configure for the tool to use. action_spec can be only one of the following: |
|
connectionActionId |
ID of a Connection action for the tool to use. |
entityOperation |
Entity operation configuration for the tool to use. |
EntityOperation
| JSON representation |
|---|
{
"entityId": string,
"operation": enum ( |
| Fields | |
|---|---|
entityId |
Required. ID of the entity. |
operation |
Required. Operation to perform on the entity. |
EndUserAuthConfig
| JSON representation |
|---|
{ // Union field |
| Fields | |
|---|---|
Union field auth_config. The auth configuration. auth_config can be only one of the following: |
|
oauth2AuthCodeConfig |
Oauth 2.0 Authorization Code authentication. |
oauth2JwtBearerConfig |
JWT Profile Oauth 2.0 Authorization Grant authentication. |
Oauth2AuthCodeConfig
| JSON representation |
|---|
{ "oauthToken": string } |
| Fields | |
|---|---|
oauthToken |
Required. Oauth token parameter name to pass through. Must be in the format |
Oauth2JwtBearerConfig
| JSON representation |
|---|
{ "issuer": string, "subject": string, "clientKey": string } |
| Fields | |
|---|---|
issuer |
Required. Issuer parameter name to pass through. Must be in the format |
subject |
Required. Subject parameter name to pass through. Must be in the format |
clientKey |
Required. Client parameter name to pass through. Must be in the format |
DataStoreTool
| JSON representation |
|---|
{ "name": string, "description": string, "boostSpecs": [ { object ( |
| Fields | |
|---|---|
name |
Required. The data store tool name. |
description |
Optional. The tool description. |
boostSpecs[] |
Optional. Boost specification to boost certain documents. |
modalityConfigs[] |
Optional. The modality configs for the data store. |
filterParameterBehavior |
Optional. The filter parameter behavior. |
Union field search_source. Defines the search source, either a single DataStore or an Engine. search_source can be only one of the following: |
|
dataStoreSource |
Optional. Search within a single specific DataStore. |
engineSource |
Optional. Search within an Engine (potentially across multiple DataStores). |
DataStoreSource
| JSON representation |
|---|
{
"filter": string,
"dataStore": {
object ( |
| Fields | |
|---|---|
filter |
Optional. Filter specification for the DataStore. See: https://cloud.google.com/generative-ai-app-builder/docs/filter-search-metadata |
dataStore |
Optional. The data store. |
DataStore
| JSON representation |
|---|
{ "name": string, "type": enum ( |
| Fields | |
|---|---|
name |
Required. Full resource name of the DataStore. Format: |
type |
Output only. The type of the data store. This field is readonly and populated by the server. |
documentProcessingMode |
Output only. The document processing mode for the data store connection. Only set for PUBLIC_WEB and UNSTRUCTURED data stores. |
displayName |
Output only. The display name of the data store. |
createTime |
Output only. Timestamp when the data store was created. Uses RFC 3339, where generated output will always be Z-normalized and use 0, 3, 6 or 9 fractional digits. Offsets other than "Z" are also accepted. Examples: |
connectorConfig |
Output only. The connector config for the data store connection. |
Timestamp
| JSON representation |
|---|
{ "seconds": string, "nanos": integer } |
| Fields | |
|---|---|
seconds |
Represents seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. Must be between -62135596800 and 253402300799 inclusive (which corresponds to 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z). |
nanos |
Non-negative fractions of a second at nanosecond resolution. This field is the nanosecond portion of the duration, not an alternative to seconds. Negative second values with fractions must still have non-negative nanos values that count forward in time. Must be between 0 and 999,999,999 inclusive. |
ConnectorConfig
| JSON representation |
|---|
{ "collection": string, "collectionDisplayName": string, "dataSource": string } |
| Fields | |
|---|---|
collection |
Resource name of the collection the data store belongs to. |
collectionDisplayName |
Display name of the collection the data store belongs to. |
dataSource |
The name of the data source. Example: |
EngineSource
| JSON representation |
|---|
{
"engine": string,
"dataStoreSources": [
{
object ( |
| Fields | |
|---|---|
engine |
Required. Full resource name of the Engine. Format: |
dataStoreSources[] |
Optional. Use to target specific DataStores within the Engine. If empty, the search applies to all DataStores associated with the Engine. |
filter |
Optional. A filter applied to the search across the Engine. Not relevant and not used if 'data_store_sources' is provided. See: https://cloud.google.com/generative-ai-app-builder/docs/filter-search-metadata |
BoostSpecs
| JSON representation |
|---|
{
"dataStores": [
string
],
"spec": [
{
object ( |
| Fields | |
|---|---|
dataStores[] |
Required. The Data Store where the boosting configuration is applied. Full resource name of DataStore, such as projects/{project}/locations/{location}/collections/{collection}/dataStores/{dataStore}. |
spec[] |
Required. A list of boosting specifications. |
BoostSpec
| JSON representation |
|---|
{
"conditionBoostSpecs": [
{
object ( |
| Fields | |
|---|---|
conditionBoostSpecs[] |
Required. A list of boosting specifications. |
ConditionBoostSpec
| JSON representation |
|---|
{
"condition": string,
"boost": number,
"boostControlSpec": {
object ( |
| Fields | |
|---|---|
condition |
Required. An expression which specifies a boost condition. The syntax is the same as filter expression syntax. Currently, the only supported condition is a list of BCP-47 lang codes. Example: To boost suggestions in languages en or fr: (lang_code: ANY("en", "fr")) |
boost |
Optional. Strength of the boost, which should be in [-1, 1]. Negative boost means demotion. Default is 0.0. Setting to 1.0 gives the suggestions a big promotion. However, it does not necessarily mean that the top result will be a boosted suggestion. Setting to -1.0 gives the suggestions a big demotion. However, other suggestions that are relevant might still be shown. Setting to 0.0 means no boost applied. The boosting condition is ignored. |
boostControlSpec |
Optional. Complex specification for custom ranking based on customer defined attribute value. |
BoostControlSpec
| JSON representation |
|---|
{ "fieldName": string, "attributeType": enum ( |
| Fields | |
|---|---|
fieldName |
Optional. The name of the field whose value will be used to determine the boost amount. |
attributeType |
Optional. The attribute type to be used to determine the boost amount. The attribute value can be derived from the field value of the specified field_name. In the case of numerical it is straightforward i.e. attribute_value = numerical_field_value. In the case of freshness however, attribute_value = (time.now() - datetime_field_value). |
interpolationType |
Optional. The interpolation type to be applied to connect the control points listed below. |
controlPoints[] |
Optional. The control points used to define the curve. The monotonic function (defined through the interpolation_type above) passes through the control points listed here. |
ControlPoint
| JSON representation |
|---|
{ "attributeValue": string, "boostAmount": number } |
| Fields | |
|---|---|
attributeValue |
Optional. Can be one of: 1. The numerical field value. 2. The duration spec for freshness: The value must be formatted as an XSD |
boostAmount |
Optional. The value between -1 to 1 by which to boost the score if the attribute_value evaluates to the value specified above. |
ModalityConfig
| JSON representation |
|---|
{ "modalityType": enum ( |
| Fields | |
|---|---|
modalityType |
Required. The modality type. |
rewriterConfig |
Optional. The rewriter config. |
summarizationConfig |
Optional. The summarization config. |
groundingConfig |
Optional. The grounding configuration. |
RewriterConfig
| JSON representation |
|---|
{
"modelSettings": {
object ( |
| Fields | |
|---|---|
modelSettings |
Required. Configurations for the LLM model. |
prompt |
Optional. The prompt definition. If not set, default prompt will be used. |
disabled |
Optional. Whether the rewriter is disabled. |
ModelSettings
| JSON representation |
|---|
{ "model": string, // Union field |
| Fields | |
|---|---|
model |
Optional. The LLM model that the agent should use. If not set, the agent will inherit the model from its parent agent. |
Union field
|
|
temperature |
Optional. If set, this temperature will be used for the LLM model. Temperature controls the randomness of the model's responses. Lower temperatures produce responses that are more predictable. Higher temperatures produce responses that are more creative. |
SummarizationConfig
| JSON representation |
|---|
{
"modelSettings": {
object ( |
| Fields | |
|---|---|
modelSettings |
Optional. Configurations for the LLM model. |
prompt |
Optional. The prompt definition. If not set, default prompt will be used. |
disabled |
Optional. Whether summarization is disabled. |
GroundingConfig
| JSON representation |
|---|
{ "groundingLevel": number, "disabled": boolean } |
| Fields | |
|---|---|
groundingLevel |
Optional. The groundedness threshold of the answer based on the retrieved sources. The value has a configurable range of [1, 5]. The level is used to threshold the groundedness of the answer, meaning that all responses with a groundedness score below the threshold will fall back to returning relevant snippets only. For example, a level of 3 means that the groundedness score must be 3 or higher for the response to be returned. |
disabled |
Optional. Whether grounding is disabled. |
PythonFunction
| JSON representation |
|---|
{ "name": string, "pythonCode": string, "description": string } |
| Fields | |
|---|---|
name |
Optional. The name of the Python function to execute. Must match a Python function name defined in the python code. Case sensitive. If the name is not provided, the first function defined in the python code will be used. |
pythonCode |
Optional. The Python code to execute for the tool. |
description |
Output only. The description of the Python function, parsed from the python code's docstring. |
McpTool
| JSON representation |
|---|
{ "name": string, "description": string, "inputSchema": { object ( |
| Fields | |
|---|---|
name |
Required. The name of the MCP tool. |
description |
Optional. The description of the MCP tool. |
inputSchema |
Optional. The schema of the input arguments of the MCP tool. |
outputSchema |
Optional. The schema of the output arguments of the MCP tool. |
serverAddress |
Required. The server address of the MCP server, e.g., "https://example.com/mcp/". If the server is built with the MCP SDK, the url should be suffixed with "/mcp/". Only Streamable HTTP transport based servers are supported. This is the same as the server_address in the McpToolset. See https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http for more details. |
apiAuthentication |
Optional. Authentication information required to execute the tool against the MCP server. For bearer token authentication, the token applies only to tool execution, not to listing tools. This requires that tools can be listed without authentication. |
tlsConfig |
Optional. The TLS configuration. Includes the custom server certificates that the client should trust. |
serviceDirectoryConfig |
Optional. Service Directory configuration for VPC-SC, used to resolve service names within a perimeter. |
FileSearchTool
| JSON representation |
|---|
{
"corpusType": enum ( |
| Fields | |
|---|---|
corpusType |
Optional. The type of the corpus. Default is FULLY_MANAGED. |
name |
Required. The tool name. |
description |
Optional. The tool description. |
fileCorpus |
Optional. The corpus where files are stored. Format: projects/{project}/locations/{location}/ragCorpora/{rag_corpus} |
SystemTool
| JSON representation |
|---|
{ "name": string, "description": string } |
| Fields | |
|---|---|
name |
Required. The name of the system tool. |
description |
Output only. The description of the system tool. |
WidgetTool
| JSON representation |
|---|
{ "name": string, "description": string, "widgetType": enum ( |
| Fields | |
|---|---|
name |
Required. The display name of the widget tool. |
description |
Optional. The description of the widget tool. |
widgetType |
Optional. The type of the widget tool. If not specified, the default type will be CUSTOMIZED. |
Union field input. The input of the widget tool. input can be only one of the following: |
|
parameters |
Optional. The input parameters of the widget tool. |
ToolFakeConfig
| JSON representation |
|---|
{ "enableFakeMode": boolean, // Union field |
| Fields | |
|---|---|
enableFakeMode |
Optional. Whether the tool is using fake mode. |
Union field tool_response. The response is either static or it is provided by a python function. tool_response can be only one of the following: |
|
codeBlock |
Optional. Code block which will be executed instead of a real tool call. |
CodeBlock
| JSON representation |
|---|
{ "pythonCode": string } |
| Fields | |
|---|---|
pythonCode |
Required. Python code which will be invoked in tool fake mode. Expected Python function signature - To catch all tool calls: def fake_tool_call(tool: Tool, input: dict[str, Any], callback_context: CallbackContext) -> Optional[dict[str, Any]]: To catch a specific tool call: def fake_{tool_id}(tool: Tool, input: dict[str, Any], callback_context: CallbackContext) -> Optional[dict[str, Any]]: If the function returns None, the real tool will be invoked instead. |
Tool Annotations
Destructive Hint: ❌ | Idempotent Hint: ✅ | Read Only Hint: ✅ | Open World Hint: ❌