Cirra AI Salesforce Admin MCP Server
Server Details
Comprehensive Salesforce administration and management
The last two health checks of this connector failed. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.
If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.
- Status
- Unhealthy
- Uptime
- 0.1% over 66 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 47 tools
The descriptions do a genuinely good job of routing between parallel families (soql_query vs bulk_query vs tooling_api_query; sobject_dml vs bulk_dml vs tooling_api_dml; cms_content vs cms_delivery vs connect_rest), and metadata_create explicitly warns off CustomField. However, several boundaries remain blurred: metadata_delete can delete fields that sobject_field_update manages, profile_update redirects to sobject_dml on FieldPermissions, and connect_rest is an open-ended catch-all that shadows the purpose-built CMS and Experience tools. An agent must read carefully to avoid misrouting metadata vs sobject vs tooling calls.
The dominant convention is resource_action (sobject_dml, metadata_read, bulk_query, user_update, group_members, cms_delivery), applied to the large majority of the 47 tools. A handful of outliers break the pattern with verb_noun or bare verbs (fetch_more, run_tests, logout, cirra_ai_init), and *_describe vs *_list vs *_read are used somewhat interchangeably across families. Readable and predictable overall, with minor deviations.
47 tools is well past the heavy threshold and creates a large surface an agent must navigate before acting. Salesforce admin is a broad domain that justifies real breadth, but the count is inflated by near-parallel families (three query tools, three DML tools, four describe/read variants) that could be consolidated. The single setup/init and pagination helpers (cirra_ai_init, fetch_more, link_build, logout) further pad the count without adding core capability.
Coverage is unusually deep: records, objects, fields, record types, page layouts, profiles, permission sets, users, groups, value sets, metadata, tooling, bulk, reports, tests, and CMS authoring plus delivery all have lifecycle operations. Notable gaps remain: permission sets can be updated and assigned but not created, and reporting is read-only (report_run with no create/update/delete), with no dashboard support at all. These are workaroundable via metadata_* or connect_rest, so not blocking.
Available Tools
47 toolsbulk_dmlADestructiveInspect
Insert, update, upsert, delete, or hard-delete large Salesforce record sets via Bulk API 2.0 ingest jobs. Use this instead of sobject_dml when processing more than ~200 records. Pass records/recordIds to upload inline, or omit them to open a job so the user can upload a CSV from an in-chat control or a simple upload page (the file never goes through the chat). The tool waits up to 90 seconds; if the job is still running it returns a jobId you can pass back to wait or abort.
| Name | Required | Description | Default |
|---|---|---|---|
| abort | No | When true, abort the ingest job identified by `jobId`. Requires `jobId`. | |
| jobId | No | Existing ingest job ID or Cirra CSV upload handle (`bih_…`). Pass this to wait for a previously submitted job or to abort it. When set, `records` are ignored. If the handle is still waiting for a CSV, the response repeats the upload URL instead of creating a Salesforce job. | |
| records | No | Records to ingest. For update the records must include `Id`. For upsert they must include the external ID field. For delete/hardDelete you may pass records with `Id` instead of `recordIds`. Omit `records` and `recordIds` (with `operation` + `sObject`) to open a job so the user can upload a CSV from chat or a browser page (bypasses the LLM). | |
| sObject | No | API name of the sObject. Required to start a new job. | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| pageSize | No | (optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size. | |
| operation | No | Ingest operation. Required to start a new job. Always ask for explicit user approval before executing, and do not proceed without it. hardDelete permanently removes records (they skip the Recycle Bin) and requires the Bulk API Hard Delete permission. | |
| recordIds | No | Record IDs for delete or hardDelete. Takes precedence over `records` for those operations. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| externalIdField | No | External ID field API name. Required for upsert, ignored otherwise. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ui | No | What the in-chat control should render. `csv_upload` is the only kind that needs a file picker. |
| jobId | No | |
| state | No | |
| message | Yes | |
| results | No | |
| sObject | No | |
| success | Yes | |
| warning | No | |
| timedOut | No | |
| csvUpload | No | |
| errorCode | No | |
| operation | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| instructions | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| schemaVersion | No | |
| salesforceJobId | No | |
| artifactCategory | No | |
| awaitingCsvUpload | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive/openWorld, and the description adds real context on top: 90-second wait ceiling with a resumable jobId, the fact that CSV uploads bypass the model, that hardDelete skips the Recycle Bin and needs a specific permission, and that CSV jobs return an upload URL instead of a Salesforce job. No annotation is contradicted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Lead sentence states the operation surface, second routes away from the sibling, third explains the two upload modes, fourth explains the timeout/jobId lifecycle. Every sentence carries distinct information with no restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, zero-required, destructive job-orchestration tool this covers the essentials an agent must know to act correctly: when to use it, how to start a job, how to wait or abort, and the async failure mode. An output schema exists, so return-shape detail is not required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still earns above that by explaining the records/recordIds/jobId interaction — jobId causes records to be ignored, and recordIds take precedence for deletes. It does not touch pageSize or the connection-selection params, which is acceptable given the schema documents them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the exact verb set (insert/update/upsert/delete/hardDelete) and resource (large Salesforce record sets) plus the mechanism (Bulk API 2.0 ingest jobs). It is immediately distinguishable from the single-record siblings sobject_dml/sobject_create/sobject_update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use this instead of sobject_dml when processing more than ~200 records,' with a concrete threshold. It also disambiguates the two invocation modes — pass records/recordIds for inline upload, omit them to open a CSV job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_queryARead-onlyIdempotentInspect
Run a large Salesforce SOQL query via Bulk API 2.0 query jobs. Use this instead of soql_query when you expect thousands of rows or when a REST query times out. Does not support GROUP BY, aggregates, OFFSET, TYPEOF, or parent-to-child subqueries. The tool waits up to 90 seconds; if the job is still running it returns a jobId you can pass back to wait or abort.
| Name | Required | Description | Default |
|---|---|---|---|
| abort | No | When true, abort the query job identified by `jobId`. Requires `jobId`. | |
| jobId | No | Existing query job ID. Pass this to wait for a previously submitted job or to abort it. When set, sObject/fields are ignored. | |
| limit | No | (optional) Maximum number of records to return. Omit this for bulk extracts so Salesforce can PK-chunk the query. If you pass LIMIT and the query times out, retry without it. | |
| fields | No | Fields to retrieve. Child-to-parent relationship fields (Account.Name) are supported. Parent-to-child subqueries and aggregate functions are not. Required to start a new job. | |
| orderBy | No | (optional) ORDER BY clause. Note: ORDER BY and LIMIT disable PK chunking and can make large queries slower or time out. | |
| sObject | No | API name of the sObject to query. Required to start a new job. | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| pageSize | No | (optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size. | |
| queryAll | No | When true, include deleted and archived records (queryAll). Default is false. | |
| whereClause | No | WHERE clause. May include conditions on related objects. Do NOT include APEX snippets or variables: use only literal values. Optional — omit to query all rows of the object. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| records | No | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations (readOnly/idempotent/openWorld/destructive=false) by disclosing the 90-second wait behavior and the async escape hatch: a returned jobId can be passed back to wait or abort. This is exactly the operational trait an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences: purpose, routing rule, unsupported constructs, async behavior. Front-loaded and every sentence carries decision-relevant information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values needn't be explained, and annotations cover the safety profile; the description still adds the timeout/jobId continuation model. It is slightly thin on the multi-team connection flow (context_handle / cirra_ai_team), though the schema descriptions handle that fully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns a bump because it explains why jobId is returned (timeout) and that it can be reused to wait or abort, tying the two-phase workflow together in a way the per-parameter schema text does not. It does not cover the connection/team routing params, but those are fully documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (run a large Salesforce SOQL query) plus the underlying mechanism (Bulk API 2.0 query jobs). It explicitly contrasts with the sibling soql_query, so an agent can select between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule: use this instead of soql_query when expecting thousands of rows or when a REST query times out. It also lists when-not (no GROUP BY, aggregates, OFFSET, TYPEOF, parent-to-child subqueries), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cirra_ai_initBRead-onlyIdempotentInspect
IMPORTANT: call cirra_ai_init before calling any other tools of the Cirra AI MCP server. You MUST carefully read the instructions returned from this tool call before proceeding
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | (optional) Controls whether the provided `cirra_ai_team` and/or `sf_user` apply only to this chat (`thread`) or are saved as new defaults for future (`global`). Only use 'thread' if explicitly instructed by the user. Leave blank if not switching team or connection. Whatever the scope, pass the `context_handle` returned by this call as the `context_handle` argument on EVERY subsequent tool call: it carries the team and connection this call reported. A call made without it, and without `cirra_ai_team` + `sf_user`, is refused when the user has more than one place to work (several teams, or a team and a personal account). | global |
| sf_user | No | (optional) A Salesforce username identifying the Salesforce connection to use. Omit this to use the current default connection. | |
| cirra_ai_team | No | (optional) The Cirra AI team to use. Use the literal value `__Personal__` to select the user's personal account (not allowed for team-only users). Omit this to use the previously selected default team (if any). | |
| context_handle | No | (optional) A context_handle returned by an earlier cirra_ai_init call in this same conversation. Pass it to keep the existing conversation context; omit on the first call in a conversation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Raw response text, set only when the response could not be parsed into the fields above |
| teams | No | |
| account | No | Cirra AI account info (user name, team, role, dashboard URL, and — for admins/personal accounts — subscription and credit details), or an explanatory string when the account info is unavailable |
| context | No | General usage instructions for the Cirra AI MCP server. Read carefully before calling other tools. |
| cirraContactInfo | No | Cirra AI support contact details |
| salesforceConnections | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds one genuine behavioral fact beyond that: the call returns instructions the agent must read before proceeding. It does not mention that the tool can be refused when multiple teams/connections exist without a context_handle — a refusal behavior that lives only in the parameter schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, the imperative call-order requirement front-loaded with emphasis, and the must-read-the-response note immediately after. Nothing is wasted, though the second sentence is a meta-instruction rather than information about the tool itself.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the parameter schema is fully documented, so the description does not need to explain return values or arguments. What remains missing is a one-clause statement of what this call establishes (team + Salesforce connection context), which would make the mandatory sequencing self-explanatory rather than something the agent must infer from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the scope/sf_user/cirra_ai_team/context_handle semantics are documented in detail there, including the enum behavior and the refusal condition. The description adds nothing about parameters, which is acceptable at full coverage but earns no credit above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description establishes that this is a mandatory initialization step, and the name plus title make 'initialize session for Cirra AI' clear enough to distinguish it from every sibling (all of which are Salesforce operations). However, it never says what initialization actually establishes — the team and Salesforce connection — leaving that entirely to the schema, so the stated purpose is ordering-only rather than substantive.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call cirra_ai_init before calling any other tools of the Cirra AI MCP server' is unambiguous sequencing guidance, which for a bootstrap tool is the most important when-to-use signal. It does not need to name an alternative since none exists, but it also gives no guidance on repeat calls or when to re-initialize mid-conversation (that is only implied by the schema's context_handle text).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cms_contentADestructiveInspect
Author and manage Salesforce CMS content in enhanced CMS workspaces: search, get, create, update, clone, and delete managed content and variants, publish and unpublish content, manage taxonomy term associations, and administer content spaces (workspaces), folders, and channels. To read content that is already published to a channel or Experience Cloud site, use cms_delivery instead. For CMS resources not covered here (digital asset management providers, search indexing, folder sharing, legacy CMS workspaces) use connect_rest.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | The request body, matching the Connect REST input shape for the operation. Required for create, create_variant, update, publish, unpublish, set_taxonomy_terms, create_space, update_space, create_channel, and update_channel. Optional for clone. Field names are listed in the tool instructions; do not guess (clone has no urlName; create_channel uses type not channelType; create_variant uses the contentKeyOrId parameter, not a body field). | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| spaceId | No | The content space (workspace) ID. Required for get_space and update_space. | |
| folderId | No | The content folder ID. Required for get_folder. | |
| channelId | No | The managed content channel ID. Required for get_channel, update_channel, and delete_channel. This is an authoring channel ID; delivery operations in cms_delivery use their own channel IDs. | |
| operation | Yes | The operation to perform. All operations except search, get, get_taxonomy_terms, list_spaces, get_space, get_folder, list_channels, and get_channel modify the org. Always ask for explicit user approval before executing a modifying operation, and do not proceed without it. Publishing and unpublishing change what site visitors see, so confirm those separately even when the content change itself was already approved. | |
| variantId | No | The managed content variant ID. Required for update and delete: in enhanced CMS workspaces edits and deletions apply to a variant, not to the content record itself. Get the variant ID from the get operation. Unpublish also requires this ID in body.variantIds — contentIds works for publish but not for unpublish. Delete fails with DELETE_NOT_ALLOWED until the variant has been unpublished. | |
| queryParams | No | (optional) Query-string parameters supported by the underlying resource. For search, contentSpaceOrFolderIds and queryTerm are required, and contentTypeFQN, scope, languages, page, and pageSize are optional. For get, use version to retrieve a specific version. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| contentKeyOrId | No | The content key or ID of a piece of managed content. Required for get, clone, create_variant, get_taxonomy_terms, and set_taxonomy_terms. For create_variant this value is sent as managedContentKeyOrId in the request body — do not also put it in body, and do not use the Salesforce doc example's managedContentKeyorId (lowercase o), which v66.0 rejects. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| message | Yes | |
| records | No | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| collectionField | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true, idempotentHint=false, and readOnlyHint=false, so the safety profile is largely covered. The description still adds useful scope boundaries (enhanced workspaces only, not legacy) and the fact that authoring and delivery surfaces are split. It does not itself flag that publish/unpublish changes what site visitors see or that delete requires an unpublished variant first, though those details do appear in the parameter schemas.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose then routing, with zero filler. The long capability enumeration partially restates the operation enum already in the schema, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 21-operation, 11-parameter tool with an output schema and rich annotations, the description covers scope, sibling routing, and the enhanced-vs-legacy split. Workflow preconditions (variant-level edits, unpublish before delete, approval gating) are documented in the schema rather than the description, so the description alone is not fully self-sufficient but nothing critical is absent from the definition as a whole.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the parameter descriptions are unusually detailed (variantId lifecycle, contentKeyOrId body placement, body field caveats). The tool description adds no parameter-level meaning of its own, so the baseline of 3 applies when structured fields carry the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb set and resource (author/manage Salesforce CMS content in enhanced CMS workspaces) and enumerates the concrete capabilities: content and variants, publish/unpublish, taxonomy terms, spaces, folders, channels. It explicitly distinguishes itself from the two nearest siblings, cms_delivery for published-channel reads and connect_rest for uncovered CMS resources, so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing conditions: use cms_delivery to read content already published to a channel or Experience Cloud site, use connect_rest for digital asset management providers, search indexing, folder sharing, and legacy CMS workspaces. The exclusions cover exactly the areas an agent might wrongly assume this tool handles.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cms_deliveryARead-onlyIdempotentInspect
Read published Salesforce CMS content through delivery channels: list the delivery channels visible to the context user, list, get, and search published content in a channel, and get collection items for a channel or Experience Cloud site. This tool is read-only and returns only content that is already published to a channel — use cms_content to author and publish content, and to inspect unpublished drafts.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | JSON request body. Required for search: the enhanced-search resource is POST-only. Body fields are queryTerm (required), optional filters (taxonomyQuery, language, contentTypeFQNs), page (starts at 0), and pageSize (1-250, default 25). | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| channelId | No | The delivery channel ID. Required for every operation except list_channels. Get it from list_channels — this is a delivery channel ID and is not interchangeable with the authoring channel IDs used by cms_content. | |
| operation | Yes | The operation to perform. All operations are read-only. Start with list_channels to discover the channel IDs available to the context user. | |
| queryParams | No | (optional) Query-string parameters supported by the underlying resource. For list_contents these include contentKeys, managedContentIds, contentTypeFQN, language, includeContentBody, expandReferences, referenceDepth, showAbsoluteUrl, publishStartDate, publishEndDate, page, and pageSize. Search criteria do not go here — search is POST-only and takes its criteria in body. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| contentKeyOrId | No | The content key or ID of a published piece of content. Required for get_content. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| collectionKeyOrId | No | The collection key or ID. Required for get_collection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| message | Yes | |
| records | No | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| collectionField | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond them: it returns only content already published to a channel, so drafts are invisible, and it is channel-scoped. It does not discuss pagination ceilings or result sizes, but those are partly covered in the schema and output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the verb and resource, then the operation inventory, then the routing/exclusion sentence. No filler, and the most decision-relevant information (published-only, use cms_content for authoring) lands before the reader stops.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value documentation is unnecessary; annotations cover safety; and the schema covers all 9 params at full coverage. The description supplies the remaining pieces an agent needs — scope, published-only constraint, sibling disambiguation, and entry point via list_channels.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the search POST-only/queryTerm requirement, the list_contents query params, and the warning that delivery channel IDs differ from authoring channel IDs, so the baseline is 3. The DESCRIPTION text itself adds nothing about parameters, so no credit above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read published Salesforce CMS content through delivery channels') and then enumerates the concrete operations: list channels, list/get/search content, get collection items. It explicitly distinguishes itself from the sibling cms_content, so an agent can choose without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (cms_content) and the exact conditions that select it: authoring, publishing, and inspecting unpublished drafts. It also gives a starting point ('Start with list_channels' is echoed in the operation param) and makes the published-only restriction explicit, which is precisely the routing information an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_restADestructiveInspect
Call any Salesforce Connect REST API resource under /services/data/vXX.X/connect/. Resource families under that prefix include Core (org and user settings), CMS (managed content — prefer cms_content and cms_delivery when they cover the operation), Experience Cloud (sites, site publishing, audiences, moderation), Files and Folders, Personalization, Commerce, and DevOps Center (connect/devops). Resources under connect/devops follow the connection's DevOps access category, not metadata access. Requires the exact resource path from Salesforce's Connect REST API reference — do not guess paths. An empty path returns the Connect directory of resources available to the context user. Org-level Chatter REST lives under /chatter/, not /connect/, and is not reachable with this tool. Only Connect REST resources are reachable; use soql_query, sobject_dml, tooling_api_* or metadata_* for other APIs.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | (optional) The JSON request body for POST, PATCH, and PUT requests, matching the documented input shape for the resource. | |
| path | No | The Connect REST resource path relative to /services/data/vXX.X/connect/, for example 'communities' or 'organization'. An empty path (or the Connect root itself) returns the directory of resources available to the context user. The version prefix is added automatically; a fully qualified path beginning with /services/data/vXX.X/connect is also accepted. Put query-string values in queryParams, not in this path. | |
| method | Yes | The HTTP method. For POST, PATCH, PUT, and DELETE, always show the user the exact method, path, and body and ask for explicit approval before executing, and do not proceed without it. | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| queryParams | No | (optional) Query-string parameters for the resource. Array values are joined with commas, which is the convention Connect REST uses for list-valued parameters. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| message | Yes | |
| records | No | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| collectionField | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, so the description's added value is scope and access semantics: paths must come verbatim from the Connect REST reference and DevOps resources follow the connection's DevOps access category rather than metadata access. It does not itself restate the destructive/mutating risk or rate-limit behavior, but that is covered by annotations and the method param.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core capability, then scope, then exclusions; no filler sentences. It is dense and long-ish, but every sentence carries routing or constraint information an agent needs for a generic passthrough API tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full annotation coverage, the description supplies exactly the missing pieces: what surface is reachable, what isn't, path sourcing rules, and sibling alternatives. Nothing needed to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds real meaning beyond the schema by warning that paths must be taken from Salesforce's reference and not guessed, and that an empty path returns the Connect directory for the context user. It also implicitly constrains what belongs in path versus queryParams.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Call any Salesforce Connect REST API resource under /services/data/vXX.X/connect/') and enumerates the resource families covered (Core, CMS, Experience Cloud, Files, Personalization, Commerce, DevOps). It also explicitly disambiguates from siblings (cms_content, cms_delivery, soql_query, sobject_dml, tooling_api_*, metadata_*), so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (Connect REST resources), when-not-to-use (Chatter under /chatter/ is not reachable; use soql_query/sobject_dml/tooling_api_*/metadata_* for other APIs), and preference routing ('prefer cms_content and cms_delivery when they cover the operation'). The empty-path behavior for discovery is also spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_moreARead-onlyIdempotentInspect
Fetch the next page of a large tool response. Use the nextCursor from _pagination in a previous response. This tool loads data into the context window — prefer the artifact download URL when available.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | Yes | Pagination cursor from _pagination.nextCursor | |
| pageSize | No | (optional) Number of records to return in this page. If omitted, uses the page size from the original query. | |
| artifactId | Yes | Artifact ID from artifactAccess.artifactId | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | Human-readable summary of the result |
| success | Yes | Whether the operation succeeded |
| warning | No | Optional warning about the result |
| _pagination | No | Pagination state for the returned page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent safety, and the description adds the key behavioral trait they can't express: this call consumes context window budget, which is why the artifact URL is preferred. It doesn't mention cursor expiry or failure behavior, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what it does, then how to use it, then the caution. Every sentence carries distinct, actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists and parameters are fully described, so the description only needs to add the context-cost warning and cursor provenance, both of which it does. Minor gap: no note on what happens with an expired or invalid cursor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all four parameters, including their origins (artifactAccess.artifactId, _pagination.nextCursor, cirra_ai_init context_handle), are already documented. The description restates the cursor source but adds nothing new about parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Fetch the next page of a large tool response.' It is unambiguous and no sibling tool covers pagination, so confusion risk is low, though it doesn't name a specific alternative sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger ('Use the nextCursor from _pagination in a previous response') and points to a preferred alternative ('prefer the artifact download URL when available'). It lacks an explicit 'do not call when...' case, but the routing signal is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
group_createCInspect
Create a new public group, queue or role in Salesforce
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name for the group | |
| type | Yes | The type of group to create | |
| label | No | The label for the group. Will be generated from the name if not provided. | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| properties | No | Additional properties for the group | |
| description | No | The description for the group. Recommended, but not required -- omit it (or pass '') if the user asked for no description. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| supportedObjects | No | The objects that the queue can access |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, so safety is covered structurally. The only added behavioral detail is the word 'public', which is thin; it says nothing about failure modes, duplicate-name behavior, or what happens to a 'role' that the API may reject.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence, front-loaded with the verb and resource, with no padding. It is under-specified rather than bloated, which is the conciseness dimension's only real weakness here.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, but this is a 9-parameter mutation with a required auth/context flow that the description never mentions. An agent reading only the description would not know it must supply context_handle or cirra_ai_team+sf_user to avoid a refused call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3 and the schema already explains name, type, label, description, supportedObjects and the connection parameters. The description adds nothing about parameters and its mention of 'role' conflicts slightly with the two-value type enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (create a group/queue) in Salesforce, which is clear on its own. It doesn't differentiate from siblings like group_update or group_members, and it adds 'role' which the type enum (Regular/Queue) does not allow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus group_update, group_members, or permission-set tooling. Nothing tells the agent about prerequisites such as needing a context_handle from cirra_ai_init, which the schema says is effectively mandatory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
group_membersBDestructiveInspect
Add or remove users from public groups, queues, or roles in Salesforce.
| Name | Required | Description | Default |
|---|---|---|---|
| users | Yes | The names, usernames or IDs of the users | |
| groups | Yes | The names, labels or IDs of the public groups, queues or roles | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| operation | Yes | The operation to perform: 'add' to add users to groups, 'remove' to remove users from groups | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose destructiveHint=true, readOnlyHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds nothing beyond restating the operation: it doesn't say whether removes are reversible, whether partial failures are rolled back across multiple groups/users, or that this is a bulk membership mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the scope qualifier follows the verb/resource immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover the safety profile, so much is carried by structured data. However, for a destructive, non-idempotent bulk membership mutation, the description omits any note on multi-user/multi-group blast radius or partial-failure behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the operation enum is documented inline, so the schema carries parameter meaning. The description adds no syntax hints (e.g. how names vs IDs resolve) beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States two specific verbs (add/remove) against a precisely scoped resource set (users from public groups, queues, or roles in Salesforce). This clearly separates it from group_create and group_update, which manage the groups themselves rather than membership.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this versus permission_set_assignments, user_update, or group_update, and no stated preconditions. Usage is only inferable from the verb itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
group_updateCIdempotentInspect
Update a public group or queue in Salesforce
| Name | Required | Description | Default |
|---|---|---|---|
| group | Yes | The name or ID of the public group or queue. | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| properties | Yes | Properties to update | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true. The description adds no behavioral context beyond the resource type: it does not explain what properties are updatable, whether updates are partial, how membership is affected, or what permissions are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted text. It is concise, though that concision also leaves important update semantics unaddressed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with a nested 'properties' object that allows arbitrary keys, the description does not explain what can be updated or how updates behave. Even accounting for rich schema descriptions, annotations, and an output schema, the definition is materially incomplete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents group, sf_user, cirra_ai_team, and context_handle. The description adds no parameter-level meaning beyond the schema, which matches the baseline of 3 when the schema carries documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Update a public group or queue in Salesforce.' It lets an agent tell this apart from creation tools like group_create at a basic level, but it does not explicitly differentiate from sibling tools such as group_members or group_create.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this tool versus alternatives such as group_create or group_members. It implies usage through 'Update' but provides no prerequisites, exclusions, or routing logic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_buildBRead-onlyIdempotentInspect
Build Salesforce links for setup pages. Always use this tool when user requests a setup page link
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | The type of the link to build | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. If not provided, the default connection will be used | |
| setupConfig | No | Used with `setup` types. Describes the type of setup page to build link for | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | The built link as an object with href (the setup page URL) and label (display text), or null when no link applies (e.g. delete operations or when the link could not be built) |
| message | Yes | Human-readable summary of the result |
| success | Yes | Whether the operation succeeded |
| warning | No | Optional warning about the current connection or result |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered structurally. The description adds nothing beyond that — no indication of what a returned link looks like, whether it is a URL string or an object, or how incomplete setupConfig affects the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the purpose front-loaded and no filler. The second sentence is somewhat imperative/redundant with the first but still earns its place as a routing rule.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and rich annotations, the description needn't explain return values or safety. However, for a tool with a nested setupConfig object and connection-selection parameters, it says nothing about the fact that a useful link requires specifying an artifact type and name, leaving the agent to infer this entirely from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the nested setupConfig fields (type, sObjectNameOrId, artifactNameOrId) are individually documented, so the baseline of 3 applies. The description mentions no parameter at all, not even the required type='setup' or how setupConfig changes the output link.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Build Salesforce links for setup pages.' An agent can immediately tell this generates URLs rather than manipulating metadata. No sibling tool produces links, so differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Always use this tool when user requests a setup page link' gives a clear triggering condition. It lacks anything on when not to use it or on what happens if setupConfig is omitted, but the positive routing rule is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logoutCRead-onlyInspect
Logout from Cirra AI MCP server
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | Human-readable summary of the result |
| success | Yes | Whether the operation succeeded |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations present the bar is lower, but the description does not disclose any consequence of logging out — whether credentials are invalidated, whether subsequent tool calls fail, or whether a reconnect is required. Given idempotentHint=false and readOnlyHint=true, an agent would benefit from knowing the session state changes and that calling twice is not harmless.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single clause with no filler, front-loaded and easy to scan. However, its brevity comes at the cost of all behavioral and follow-up context, so it is under-specified rather than optimally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, but for a session-terminating operation the description omits the critical postcondition: what stops working after logout and how to reconnect (cirra_ai_init is a sibling). That gap is material to correct agent behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema is trivially empty, so there is nothing for the description to disambiguate. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Logout') and resource ('Cirra AI MCP server'), which is unambiguous and clearly distinct from every sibling tool. It stops short of 5 only because it merely restates the annotation title with no additional scope detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to call this versus simply ending the session, no mention of what must happen afterward (e.g., re-run cirra_ai_init to reconnect), and no prerequisites. The agent must infer all usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
metadata_createAInspect
Create one or more Salesforce metadata elements of a specified type, such as validation rules, custom labels, or page layouts. Do not use for CustomField -- use sobject_field_create instead so Field-Level Security is granted automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | The metadata type. | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| metadata | Yes | The array of metadata records to create. Each record must include at least a 'fullName' property | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | Non-blocking advisory about what was just created -- for example that a new FlowTest may not be runnable for a short while. The create succeeded; surface this to the user and act on it before using the new component |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| appliedMetadata | No | The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read. |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, openWorldHint=true, non-idempotent, non-destructive), so the description needn't restate safety. It adds nothing about batch semantics though — e.g. whether a failure on one element aborts the whole call, what error shape comes back, or whether created elements are validated/activated before deploy.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The positive scope comes first and the exclusion/routing constraint second, which is the right front-loading for a create tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full schema, an output schema, and mutation annotations already present, the description covers purpose and the one critical sibling disambiguation. The only remaining gap is batch/partial-failure behavior for multi-element creation, which the schema does not express.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (type, sf_user, metadata, cirra_ai_team, context_handle) are already documented, and the baseline of 3 applies. The description's examples of metadata types weakly clarify the `type` parameter but add no syntax or accepted-value detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create one or more Salesforce metadata elements') and grounds it with concrete examples (validation rules, custom labels, page layouts), so the agent knows exactly what class of objects this operates on. It also names a sibling it is not for (CustomField / sobject_field_create), sharpening the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states a when-not condition: 'Do not use for CustomField' and routes to `sobject_field_create` with the reason (Field-Level Security granted automatically). This is exactly the alternative-routing an agent needs to avoid a wrong tool pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
metadata_deleteADestructiveInspect
Delete one or more Salesforce metadata elements of a specified type, such as custom fields, validation rules, or custom labels. Maximum is 10 per batch - DO NOT EXCEED.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | The metadata type. | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| fullNames | Yes | The full name(s) of the metadata element(s) to delete. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is largely covered. The description usefully adds the hard 10-per-batch ceiling, but it never mentions that metadata deletions are irreversible, whether any dependency protection exists, or what permissions are required for a destructive operation on a live org.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and scope, then the batch ceiling in caps for emphasis. Nothing here is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and annotations cover the safety flags. However, for a destructive bulk-delete on production metadata, the omission of reversibility, failure/dependency behavior, and permission requirements leaves a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds real meaning for the 'type' parameter by naming concrete metadata types, which the schema leaves as a bare 'The metadata type.' It also reinforces the fullNames cap that the schema expresses as maxItems: 10, though it adds nothing about the connection/context_handle parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A precise verb ('Delete') plus a scoped resource ('Salesforce metadata elements of a specified type'), with concrete examples (custom fields, validation rules, custom labels). The destructive verb cleanly separates it from metadata_create, metadata_update, metadata_read, and metadata_list in the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to reach for this tool versus metadata_update or the Tooling API DML alternatives, nor does it state prerequisites or what to do when a deletion fails or is blocked by dependencies. The only guidance given is a batch-size cap, which is a constraint rather than a use-case rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
metadata_describeBRead-onlyIdempotentInspect
List all Salesforce metadata types available in the org and their properties, such as directory name, suffix, and child objects
| Name | Required | Description | Default |
|---|---|---|---|
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| verbose | Yes | If false or missing, return only the names of the metadata types. This is the default. If true, return additional properties for each type. | |
| pageSize | No | (optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| records | No | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile needs no restating. The description adds that results are scoped to the connected org and hints at what the verbose payload contains, but says nothing about paging, cost, or the very different payload sizes between verbose true and false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the resource first and illustrative properties after; no filler, no repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a fully documented 5-parameter schema, an output schema, and annotations covering safety, the description only needs to establish purpose and it does. The remaining gap is disambiguation from metadata_list, which matters here because the two names are nearly interchangeable to an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter (sf_user, verbose, pageSize, cirra_ai_team, context_handle) is well documented inline, including the required context_handle/cirra_ai_team pairing rule. The description adds no parameter meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('List') plus specific resource ('Salesforce metadata types available in the org') and even the shape of returned properties (directory name, suffix, child objects). It stops short of differentiating itself from the near-identically named sibling metadata_list, leaving the agent to guess which of the two enumerates types versus components.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus metadata_list, metadata_read, or tooling_api_describe, and no prerequisites or exclusions. The only usage-shaped information (the verbose toggle) lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
metadata_listARead-onlyIdempotentInspect
List Salesforce metadata elements of a specific type, such as flows, custom objects, or reports, optionally scoped by folder
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | The metadata type | |
| folder | No | The folder name (optional). If not provided, all folders are searched. | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| pageSize | No | (optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| records | No | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds nothing beyond that — no note on pagination behavior, result volume, or permission requirements — though the schema covers pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single well-formed sentence with the core action front-loaded and the optional scoping clause trailing. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, rich annotations, and fully documented parameters, the description covers what the tool does adequately. The only gap is the lack of routing guidance among the many metadata_* siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented in the schema, including the folder scoping and connection/context parameters. The description only echoes the type and folder semantics, adding no new meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (Salesforce metadata elements) and gives concrete examples of types (flows, custom objects, reports). It does not explicitly distinguish itself from siblings like metadata_describe or metadata_read, which an agent would need to disambiguate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'optionally scoped by folder' implies when the folder parameter applies, but there is no explicit guidance on when to choose this tool over metadata_describe, metadata_read, or tooling_api_describe. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
metadata_readCRead-onlyIdempotentInspect
Read full details for one or more Salesforce metadata elements of a specified type, such as flows, validation rules, or approval processes
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | The metadata type | |
| format | No | Response shape for the component files. `json` (default) is the current Metadata SOAP / specialized-describe result, unchanged. `xml` returns each component as Metadata API retrieve files keyed by metadata-format path (`objects/Foo__c.object`). `source` returns DX source-format files keyed by path relative to a package directory (`main/default/objects/Foo__c/fields/Bar__c.field-meta.xml`); the client prepends its own `force-app/`. `xml` and `source` come from a Metadata API retrieve plus `@salesforce/source-deploy-retrieve` conversion — they are not reconstructed from the JSON. Requesting a child (`CustomField:Obj.Fld`) yields only that child; requesting a parent (`CustomObject:Obj`) yields the object plus all children, same as `sf project retrieve start`. | json |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| pageSize | No | (optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size. | |
| fullNames | Yes | The full name(s) of the metadata elements to read. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| format | No | |
| message | Yes | |
| records | No | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| apiVersion | No | API version used for the retrieve. Match this to sourceApiVersion in sfdx-project.json. |
| components | No | Present when format is xml or source. One entry per requested fullName, with metadataXml or sourceFiles. Missing components have an empty file map and warning "not found". |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No | |
| packageDirectory | No | DX package directory name the client should prepend to source paths. Always force-app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description adds no behavior beyond that—nothing about pagination, partner/child recursion, or connection requirements (those live only in the schema's parameter descriptions).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with concrete examples and no filler. It is efficient, though the examples consume space that could have gone to sibling differentiation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema and 100% parameter coverage mean the description does not need to explain returns or inputs, and the annotations carry the safety profile. What remains missing is the routing information an agent needs to pick this over the other metadata_* tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema_description_coverage at 100%, the schema fully documents all seven parameters, including the rich format/cirra_ai_team/context_handle semantics. The description only echoes 'specified type' and 'one or more' elements, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (read full details for metadata elements of a specified type) and grounds it with concrete examples such as flows, validation rules, and approval processes. It does not, however, distinguish itself from siblings like metadata_describe or metadata_list, which read similar data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to choose this over metadata_list (listing) or metadata_describe (describing shape). The closest it comes is 'full details', leaving the agent to infer the boundary from sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
metadata_updateAIdempotentInspect
Update one or more Salesforce metadata elements of a specified type, such as flows, validation rules, or custom labels. Two modes: (1) pass metadata with the full object(s); (2) for a large single record such as a Flow, pass a small patch (JSON Patch) plus the fullName of the record to modify — the current object is fetched and patched server-side, so you do not have to resend the whole object. REPLACE SEMANTICS for composite types (ApprovalProcess, Layout, Flow, StandardValueSet, GlobalValueSet) when using metadata: the payload overwrites the entire component — omitted children (e.g. approvalStep, layoutSections, value entries) are removed, so metadata_read first, merge your change, and send the full payload. Using patch avoids this because the diff is applied to the current object.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | The metadata type. | |
| patch | No | A partial update expressed in the `JSON Patch` format (RFC 6902): an array of operations applied to the current metadata of the record named by `fullName`. Use this instead of `metadata` for large records (e.g. Flows) to avoid resending the whole object. Array elements may be addressed by their identity instead of their position: `name` where the child has one (e.g. `/decisions/My_Decision`), otherwise `fullName` (e.g. GlobalValueSet `/customValue/Gamma`, CustomObject `/fields/My_Field__c`); numeric indices always work and are safer for deeper paths. Repeating children are always arrays on read, including a single element — always include `/0/` (e.g. `/testPoints/1/assertions/0/conditions/0/rightValue/stringValue`). | |
| upsert | No | Whether to upsert the metadata. If true, the metadata will be upserted (created if it does not yet exist). If false, the metadata will be updated. For Flow updates this should be true so a new version is created. | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| fullName | No | The full name of the single record to modify. Required when using `patch`; ignored when using `metadata`. | |
| metadata | No | The array of metadata records to update, each replacing the whole object. Each record must include at least a 'fullName' property and other required fields for the type. See instructions for details. Omit when using `patch`. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| appliedMetadata | No | The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read. |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false; the description goes well beyond by disclosing REPLACE SEMANTICS for ApprovalProcess, Layout, Flow, StandardValueSet and GlobalValueSet — omitted children are removed — and by explaining that `patch` avoids that data loss. That is the single most consequential behavior for this tool and it is stated plainly rather than left to discovery.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is dense but front-loaded: purpose first, then the two modes, then the destructive replace warning. The closing clause ('Using `patch` avoids this because the diff is applied to the current object') restates a point already made earlier in the paragraph, which is the one avoidable redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutating tool with an output schema, the description covers mode selection, the destructive replace behavior for composite types, and the recovery workflow. Minor gaps remain — nothing about permissions or how partial failures across multiple `metadata` records are reported — but nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema carries the field-level detail (including the JSON Patch element structure and the identity-vs-index path rules). The description still adds decision-level semantics absent from the schema: which of `metadata` vs `patch` to supply, and that `fullName` pairs with `patch` while being ignored with `metadata`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Update one or more Salesforce metadata elements of a specified type') and immediately names concrete element types (flows, validation rules, custom labels). It also defines two distinct invocation modes, which lets an agent distinguish this tool from metadata_create/read/delete without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent between alternatives: mode (1) `metadata` for full objects, mode (2) `patch` for a large single record such as a Flow because 'you do not have to resend the whole object'. It further states a prerequisite workflow ('metadata_read first, merge your change, and send the full payload') for composite types, which is exactly the when-and-how guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
page_layout_cloneCInspect
Create a new page layout by cloning an existing layout in Salesforce
| Name | Required | Description | Default |
|---|---|---|---|
| layout | Yes | The name or ID of the existing layout to clone. ID is preferred if you have it. If using a name, you must also provide the sObject | |
| sObject | Yes | The name of the sObject to which the layout applies. Not needed if you have provided the layout ID | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| namespace | Yes | The namespace prefix of the existing layout to clone. Not needed if you have provided the layout ID or if the layout has no namespace | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| newLayoutName | Yes | Name of the new (cloned) page layout to create | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true; the description adds nothing beyond restating that it clones. It says nothing about whether the source layout is modified, what happens if newLayoutName collides, or that a new layout artifact is created in the org.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficiently written, though its brevity is also the source of the missing guidance rather than a deliberate trade-off.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full schema coverage, the description needn't explain returns or parameters. However, for a 7-parameter mutation tool with non-idempotent semantics and multiple connection-routing options, it should at least flag the create-and-name behavior and call out the sibling page_layout_update.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is documented in the schema, including the layout-ID-vs-name branching and connection/context_handle rules. The description contributes no parameter meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific verb ('Create ... by cloning') and resource ('page layout in Salesforce'), so the operation is unambiguous. It does not differentiate from the sibling page_layout_update, which an agent must infer from names alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus page_layout_update or metadata_create. The only implicit signal is 'cloning', which the agent must interpret on its own. No prerequisites or preconditions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
page_layout_updateADestructiveInspect
Update or rename a page layout in Salesforce. Supports modifying layout contents via JSON Patch, renaming a layout, or both in a single call
| Name | Required | Description | Default |
|---|---|---|---|
| patch | No | The array of modifications that need to be applied. This should be provided in the `JSON Patch` format. At least one of patch or newLayoutName must be provided | |
| layout | Yes | The name or ID of the layout. ID is preferred if you have it. If using a name, you must also provide the sObject | |
| sObject | No | The name of the sObject to which the layout applies. Not needed if you have provided the layout ID | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| namespace | No | The namespace prefix of the Page Layout. Not needed if you have provided the layout ID or if the layout has no namespace | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| newLayoutName | No | The new name for the layout. When provided, the layout will be renamed (via clone and delete). Can be combined with patch to rename and update in a single call | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| appliedMetadata | No | The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read. |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true; the description adds genuinely new context by revealing that rename is implemented 'via clone and delete', which explains the destructive flag and warns that the layout gets replaced. It says nothing about required permissions or side effects on dependent record types, but with annotations covering the safety profile this is a solid contribution.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, no filler, with the core verb and resource front-loaded in the first clause and the mode options immediately following. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations carry the behavioral profile, so the description does not need to explain return values or safety. It covers the two mutation paths adequately; only cross-tool routing and prerequisites for name-based lookup are left implicit elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the context_handle/cirra_ai_team connection selectors is already documented in the schema. The description's 'patch, newLayoutName, or both' restates the schema constraint rather than adding syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update or rename a page layout in Salesforce') and enumerates the two supported mutation modes. It does not explicitly differentiate from close siblings such as page_layout_clone or metadata_update, so an agent still has to infer which tool applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by listing the two modes (JSON Patch content edit, rename, or both), but gives no when-to-use/when-not guidance and never points to alternatives like page_layout_clone for duplicating a layout or metadata_update for other metadata. Usage must be inferred from mode capability alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
permission_set_assignmentsBDestructiveInspect
Assign or remove permission sets from users in Salesforce.
| Name | Required | Description | Default |
|---|---|---|---|
| users | Yes | The names, usernames or IDs of the users | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| operation | Yes | The operation to perform: 'add' to assign permission sets to users, 'remove' to remove assignments from users | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| permissionSets | Yes | The names, labels or IDs of the permission sets |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered elsewhere. The description adds nothing beyond that — no mention that removals can strip user access, whether batch operations are atomic, or what happens when a permission set is already assigned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with no waste and the operation front-loaded. It is not padded, though it is so short that brevity costs it useful detail rather than earning a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the schema covers connection and context parameters. Still, for a destructive write tool with duplicate-assignment and bulk-behavior questions left open, the description is only minimally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (users, permissionSets, operation, sf_user, cirra_ai_team, context_handle) are already documented in the schema. The description adds no extra semantics, which is acceptable at this coverage level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb plus resource ('assign or remove permission sets from users') and it implicitly separates the assignment concern from permission_set_update, which edits permission sets themselves. It never names that sibling, so differentiation has to be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The dual add/remove purpose is implied, but there is no guidance on when to use this versus permission_set_update, profile_update, or user_update, and no preconditions (e.g. permission set must exist) are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
permission_set_updateAIdempotentInspect
Update the properties or contents of a permission set in Salesforce, including read and edit access to objects and fields
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | The array of modifications that need to be applied. This should be provided in the `JSON Patch` format | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| namespace | No | The namespace of the permission set, if applicable | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| permissionSet | Yes | The name or ID of the permission set. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| appliedMetadata | No | The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read. |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond stating it is a write operation (covered by annotations) and specifies the *nature* of the update—modifying properties, contents, and object/field access—which is crucial behavioral context for the payload construction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a concise, single-sentence description that is highly focused and efficiently communicated front-loaded with the core function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema and helpful annotations (destructiveHint: false, idempotentHint: true), the description provides a complete high-level summary of the tool's function and its modification capabilities.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the description provides the necessary high-level summary of the operation without adding significant unique semantic value beyond what is defined in the schema's intent for the 'patch' array.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Update') and clearly defines the resource (Permission Set) and the scope of modification (properties, contents, read/edit access). This is highly distinct from related tools like permission_set_assignments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While it doesn't explicitly list when NOT to use this tool, it provides a clear scope of what the tool can modify, guiding the agent's understanding of its capabilities relative to other general update functions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
profile_cloneCInspect
Clone an existing user profile in Salesforce
| Name | Required | Description | Default |
|---|---|---|---|
| profile | Yes | The name of the new Profile | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| clonedProfileName | Yes | The name of existing Profile which will be cloned |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the agent knows this is a non-idempotent write against a live org. The description adds nothing beyond that: it does not say whether all permissions/settings are copied, whether an existing target name causes an error, or that the effect is not reversible via this tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, which is structurally sound. It is arguably too thin for a cloning mutation, but there is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, but for a mutation that creates new metadata in a Salesforce org the description omits required behavior: that a new profile is created, whether permissions and settings are copied, and how name collisions are handled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are documented and the baseline is 3. The description adds no meaning, and notably does not resolve the schema's apparently swapped semantics ('profile' described as 'the name of the new Profile' while 'clonedProfileName' is 'existing Profile which will be cloned').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Clone ... profile in Salesforce'), which is clear enough to act on. It does not distinguish this from siblings like page_layout_clone or profile_update, and 'user profile' could momentarily suggest the User object rather than the Profile metadata type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use clone versus profile_update (duplicate an existing profile vs change one) or page_layout_clone (a different object entirely). No prerequisites are stated, such as the source profile needing to exist or name-uniqueness constraints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
profile_describeCRead-onlyIdempotentInspect
Return detailed metadata for a Salesforce Profile.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | Yes | The name or ID of the Profile. | |
| sObject | Yes | Use this to return only permissions related to the a specific sObject type. | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| permissionTypes | Yes | List of specific permission types to return. Use this whenever possible (especially for standard profiles) to reduce the size of the response. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. Beyond that, the description adds nothing: no warning that omitting narrowing parameters on standard profiles can produce a very large payload, no note that a context_handle or team+user pair is required to resolve the connection, and no hint about the returned structure despite a rich output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no padding, but it is under-specified rather than tightly economical — the space available is unused rather than well-spent. Nothing is front-loaded beyond the bare purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The heavy lifting is delegated: annotations cover safety, the output schema covers return values, and all six parameters are fully documented in-schema. That makes the definition callable, but for a tool whose response size varies enormously and whose connection resolution has explicit refusal conditions, the one-line description is thinner than ideal.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including enum values for permissionTypes, so the schema carries essentially all parameter meaning. The description contributes no additional syntax or format guidance, which lands this at the baseline for fully documented schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Return detailed metadata for a Salesforce Profile"), which is clearly distinct from write-oriented siblings like profile_update, profile_clone, and permission_set_update. It does not, however, position itself against read siblings such as sobject_describe or permission_set_assignments, which also surface permission data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance. The description never tells the agent to prefer this over sobject_describe for object-level permissions, nor does it explain that permissionTypes and sObject are required and narrow the response — that guidance exists only inside the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
profile_updateAIdempotentInspect
Update settings stored on a Salesforce user profile, such as record type visibility, page layout assignments, login IP ranges, system permissions and the description. For object, field and tab access, use sobject_dml on the profile's ObjectPermissions, FieldPermissions or PermissionSetTabSetting records instead: it changes only those records.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | The array of modifications that need to be applied. This should be provided in the `JSON Patch` format | |
| profile | Yes | The name or ID of the Profile | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| confirmLoginIpRestriction | No | (optional) Required to add the first Login IP Range to a profile. Login IP Ranges are an allowlist: users with the profile are blocked from logging in from any other IP address. Set to true only after the user has explicitly confirmed they want to restrict logins for this profile. To waive identity verification for trusted addresses instead, use the org-wide Network Access trusted IP ranges. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| appliedMetadata | No | The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read. |
| artifactCategory | No | |
| verifiedChangeCount | No | Number of requested changes confirmed by re-reading the profile after the update. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=true, but the description adds real behavioral context beyond them: it identifies the concrete settings mutated and explains the login IP range semantics as an allowlist that blocks users from any other address, plus the requirement for explicit confirmation before adding the first range. It stops short of stating required permissions ('Manage Profiles') or whether a multi-element JSON Patch applies atomically.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both load-bearing: the first states scope with concrete examples, the second routes the agent away to the correct sibling. No restatement of the tool name, no filler, and the alternative-tool routing is front-loaded where the agent can act on it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with rich annotations, an output schema and 100% parameter coverage, the description covers what it changes, which sibling handles adjacent cases, and the highest-risk side effect with its confirmation gate. The gaps are minor: authentication/permission prerequisites for updating profiles and the behavior on partial patch failure are unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters, including the JSON Patch format for 'patch' and the connection-selection logic, are already documented. The description contributes only indirect guidance by enumerating which profile aspects can be patched, which helps an agent construct the patch but adds little the schema does not already contain. Baseline 3 applies when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update) and resource (Salesforce user profile) and enumerates the concrete settings in scope: record type visibility, page layout assignments, login IP ranges, system permissions, description. It also explicitly carves out the object/field/tab-permission territory to sobject_dml, so an agent can distinguish it from sibling tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative and the condition that selects it: 'For object, field and tab access, use sobject_dml on the profile's ObjectPermissions, FieldPermissions or PermissionSetTabSetting records instead.' The confirmLoginIpRestriction schema entry further states when to set the flag ('only after the user has explicitly confirmed') and points to the org-wide Network Access trusted IP ranges as the non-restrictive alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_type_createCInspect
Create a new sObject record type in Salesforce
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name of the new record type | |
| label | Yes | The label for the new record type | |
| active | No | Whether the new record type should be active | |
| sObject | Yes | The name of the object for which the record type is being created. Include a namespace prefix for custom objects if applicable | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| description | No | The description for the new record type | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| defaultLayout | Yes | The default layout to use for all profiles. If not provided, the default layout will be the standard layout for the object | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| businessProcess | Yes | The full name or ID of the business process associated with the record type | |
| existingRecordType | Yes | The name of the existing record type to use as a basis for the new record type. If not provided, the Master record type will be used | |
| defaultAvailability | Yes | The default availability settings for the new record type on all profiles. If not specified, the record type will be hidden for all profiles | |
| availabilityOverrides | Yes | An (optional) array of record type availabilities overrides for one or more profiles | |
| compactLayoutAssignment | Yes | The compact layout that is assigned to the record type. | |
| layoutAssignmentOverrides | Yes | An (optional) array of page layout assignments overrides for one or more profiles |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| appliedMetadata | No | The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read. |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds no behavioral context beyond the verb 'Create'—it does not mention permission requirements, duplicate-name handling, side effects on profiles/layouts, or what happens when required parameters conflict.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. It is efficient, though arguably too sparse for a 15-parameter creation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 15 parameters with 10 required, nested array structures, and meaningful business concepts such as business processes and profile availability overrides. Given this complexity, the one-line description is not complete enough—it omits when to use the tool, prerequisites, and any behavioral caveats, even though the annotations and output schema cover safety and return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 15 parameters, including nested availabilityOverrides and layoutAssignmentOverrides, are fully documented in the schema. The description adds no parameter semantics beyond what the schema provides, which is the baseline expectation when coverage is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Create a new sObject record type in Salesforce.' It is clearly a creation operation, but it does not explicitly differentiate itself from the sibling record_type_update, leaving the agent to infer the distinction from the verb alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus record_type_update, metadata_create, or other creation tools, and no prerequisites or exclusion conditions are stated. The usage is only implied by the name and verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_type_updateCIdempotentInspect
Update or activate/deactivate an sObject record type in Salesforce
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | The new human readable label | |
| active | Yes | Use this property to activate or deactivate a record type | |
| newName | Yes | The new API name | |
| sObject | Yes | The name of the object | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| recordType | Yes | The name or ID of the record type to update | |
| description | No | The updated description of the record type | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| defaultLayout | Yes | The default layout to use for all profiles. If not provided, the default layout will be the standard layout for the object | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| businessProcess | Yes | The name of the business process associated with the record type | |
| defaultAvailability | Yes | The default availability settings for the new record type | |
| availabilityOverrides | Yes | An (optional) array of record type availabilities overrides for one or more profiles | |
| compactLayoutAssignment | Yes | The compact layout that is assigned to the record type. | |
| layoutAssignmentOverrides | Yes | An (optional) array of page layout assignments overrides for one or more profiles |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| appliedMetadata | No | The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read. |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true and openWorldHint=true, so safety is covered. The description only adds that the tool can activate/deactivate a record type, and says nothing about the real behavioral risk: a record type change ripples into profile availability and layout assignments, and the schema marks 11 fields required even for a simple deactivate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though at 15 parameters and 11 required fields the brevity borders on under-specification rather than tight editing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter mutation with 11 required fields, the description omits the critical fact that all required fields must be supplied even when only toggling active or renaming. An output schema exists so return values need not be explained, but the calling contract for this wide required-parameter surface is not conveyed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is documented in the schema, including the context_handle and cirra_ai_team connection-selection fields. The description adds no parameter-level meaning of its own, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (update, plus activate/deactivate) and a specific resource (sObject record type in Salesforce), so the operation is unambiguous. It does not distinguish itself from close siblings such as record_type_create or metadata_update, leaving the agent to infer the boundary from names alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus record_type_create, metadata_update, or page_layout_update, and no mention of prerequisites or context requirements. The agent must infer usage entirely from the tool name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_runBRead-onlyIdempotentInspect
Execute a Salesforce report by ID and return its results, with optional filters and format overrides
| Name | Required | Description | Default |
|---|---|---|---|
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| pageSize | No | (optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size. | |
| reportId | Yes | The ID of the report to execute (15 or 18 character Salesforce ID) | |
| maxRecords | Yes | Maximum number of records to return. Defaults to 2000 | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| includeDetails | Yes | Whether to include detailed row data in the response. Defaults to true | |
| reportMetadata | Yes | Optional report metadata to override report configuration |
Output Schema
| Name | Required | Description |
|---|---|---|
| report | No | |
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds that results are returned and filters/format can be overridden, but says nothing about pagination behavior (a real concern given pageSize and maxRecords) or the connection/context selection requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that names the action, the identifier, the output, and the optional knobs. Nothing is redundant or buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained. However, for a tool with 8 parameters, nested objects, and a connection-selection rule where a call with neither context_handle nor cirra_ai_team + sf_user is refused, the description omits that prerequisite and the pagination semantics entirely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 8 parameters including the nested reportFilters and reportFormat. The description only echoes "optional filters and format overrides" and adds no syntax, defaults, or semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Execute a Salesforce report by ID and return its results," plus the scope of optional filters and format overrides. An agent can distinguish this from the query siblings (soql_query, bulk_query) by the saved-report framing, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance and no alternatives are named, even though soql_query, bulk_query, and tooling_api_query sit in the same family. The agent must infer that this is for pre-built reports rather than ad-hoc queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_testsAInspect
Run Apex tests and native Flow Tests asynchronously and return the job ID used to poll for results. Use tests to run specific classes or methods, or testLevel to run tests org-wide
| Name | Required | Description | Default |
|---|---|---|---|
| tests | No | Specific tests to run. For a native Flow Test, className is 'FlowTesting.{flowApiName}' and each test method is '{flowTestApiName}' -- the FlowTest developer name (metadata fullName), used exactly as it appears on the record. Do not prepend the flow name. Method names are sent verbatim and are verified before the run is enqueued, so a name that matches no FlowTest fails immediately with an error. Omit testMethods to run every test in the class. Cannot be combined with a testLevel of RunLocalTests or RunAllTestsInOrg | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| category | No | Limit an org-wide run to Apex tests, Flow tests, or both. Only applies when using testLevel; ignored when naming tests explicitly | |
| classids | No | Comma-separated Apex class IDs to run. Only applies when using testLevel | |
| suiteids | No | Comma-separated Apex test suite IDs to run. Only applies when using testLevel | |
| testLevel | No | Which tests to run when not naming them explicitly via tests. RunLocalTests and RunAllTestsInOrg select tests org-wide and cannot be combined with tests | |
| classNames | No | Comma-separated Apex class names to run. Only applies when using testLevel | |
| suiteNames | No | Comma-separated Apex test suite names to run. Only applies when using testLevel | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| maxFailedTests | No | Abort the run after this many failures. Use '0' to stop at the first failure or '-1' to never abort. Does not apply to Flow tests | |
| skipCodeCoverage | No | Set to 'true' to skip code coverage collection, which makes the run faster. Recommended when running Flow tests |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | No | The AsyncApexJob ID of the enqueued run (often 15-char). Poll ApexTestRunResult by AsyncApexJobId until Completed/Failed/Aborted, then ApexTestResult and FlowTestResult. Prefer the 18-char AsyncApexJobId from ApexTestRunResult when querying ApexTestResult. Status=Failed with MethodsCompleted=0 means nothing ran (bad class/method name or FlowTest discovery lag), not an assertion failure |
| message | Yes | |
| success | Yes | |
| warning | No | Non-blocking advisory about this run. Present it to the user and take it into account; it does not mean the run failed |
| errorCode | No | |
| testCount | No | Number of tests requested. When testMethods are named this is the method count (same quantity as ApexTestRunResult.MethodsEnqueued). A class listed without testMethods counts as 1 because the method count is not known until the run finishes. Omitted for org-wide testLevel runs. |
| testLevel | No | |
| artifactType | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, non-destructive, non-idempotent, open-world. The description adds the crucial behavioral facts annotations can't convey: execution is asynchronous and the call returns a job ID for polling rather than results. It falls short of naming the polling mechanism or noting prerequisites such as deployed code.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the most decision-relevant fact (async, returns a job ID) leads. The mode selection rule follows immediately and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Explains the async execution model, the returned job ID, and the two selection modes, and an output schema exists so return values need not be described. The remaining gap is what the agent should do with the job ID — the description never points to the polling path.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented, including enum values and the tests/testLevel incompatibility. The description only restates that same split at a high level without adding format or syntax detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run Apex tests and native Flow Tests'), plus the key behavioral trait (asynchronously, returns a job ID). No sibling in the list does test execution, so the tool is unambiguously distinguishable without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the two mutually exclusive modes: 'tests' to name specific classes/methods, or 'testLevel' to run org-wide. It does not name any alternative tool (e.g. which tool polls the returned job ID), but within the tool the selection guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sf_connection_manageCDestructiveInspect
Manage connections to Salesforce orgs associated with the user's Cirra AI account. Call cirra_ai_init at least once before using this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The action to perform. Options: 'list' (list all connections), 'describe' (provide details of the connection, including org info and current org limits such as data/file storage, daily API request usage, async job slots, etc.), 'add' (add a new connection), 'reauthenticate' (refresh auth for a connection), 'remove' (remove a connection) | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Action-specific payload: connection details object (describe), array of connection objects (list), array of per-environment authorization URL entries with markdown links (add), a single authorization URL entry (reauthenticate), or the removed connection (remove) |
| message | Yes | Human-readable summary of the result |
| success | Yes | Whether the operation succeeded |
| warning | No | Optional warning about the current connection or result |
| instructions | No | Follow-up instructions for the client, e.g. asking the user to open an authorization URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true and non-idempotent, so the safety profile is known. The description adds the auth/session prerequisite from cirra_ai_init, which is real value, but it never says that destructive risk is concentrated in the 'remove' action while 'list'/'describe' are harmless reads — an agent could over-apply caution or under-apply it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no filler; the prerequisite is easy to spot. It is efficient but so terse that the efficiency shades into under-specification for a five-action tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool tagged destructive with five heterogeneous actions spanning read (list/describe) and mutation (add/remove/reauthenticate), the description says almost nothing about behavior differences. An output schema exists so return values need no explanation, but the action-level behavior gap remains substantial.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the action enum carries per-value semantics, including what 'describe' returns, so the schema does the heavy lifting. The description contributes nothing about action selection, sf_user defaulting, or the context_handle vs cirra_ai_team requirement, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb is the vague umbrella "Manage" and the resource is "connections to Salesforce orgs," which is on-target but non-specific. The five distinct capabilities (list, describe, add, remove, reauthenticate) live only in the action enum, so the description itself does not let an agent distinguish scope from siblings like logout or cirra_ai_init.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance is a prerequisite: "Call cirra_ai_init at least once before using this tool," which is useful ordering information. There is no when-to-use or when-not guidance per action, and no routing away from siblings such as logout or cirra_ai_init when the intent is ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sobject_createCInspect
Create a new custom object (sObject) in Salesforce with specified sharing model, deployment status, and configuration options
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | The human readable label for the field. If it is not provided, use the sObject property after stripping any suffix, replacing underscores with spaces and capitalizing the elements | |
| sObject | Yes | The name of the object. For example, Account. | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| description | No | Provides a description of the object's purpose. Generate a value for this if it is not provided | |
| pluralLabel | Yes | The plural version of the human readable label for the field | |
| enableSearch | No | Whether to enable search for the object. Default is false | |
| sharingModel | Yes | Common options are `ReadWrite`, `Read` and `Private` | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| enableHistory | No | Whether to enable field history tracking for the object | |
| enableReports | No | Whether to enable reports for the object | |
| nameFieldType | Yes | The type of the name field. Options are `AutoNumber` or `Text` (the default) | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| nameFieldLabel | No | The label for the name field. Defaults to `<obj label> Name` | |
| deploymentStatus | Yes | Options are `Deployed` (the default) and `In Development` | |
| enableActivities | No | Whether to enable activities for the object | |
| allowInChatterGroups | No | Whether to allow the object to be used in Chatter groups | |
| nameFieldDisplayFormat | No | For `AutoNumber` name fields only: the format to use for the display of the auto-number. For example, `A-{0000}` | |
| nameFieldStartingNumber | No | For `AutoNumber` name fields only: the starting number for the auto-number. For example, `1000` |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| appliedMetadata | No | The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read. |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, idempotent=false and openWorld=true, so the safety profile is covered. The description adds nothing beyond that: it doesn't say the change is an irreversible org metadata mutation, what permissions are required, or how name-conflicts on an existing sObject behave.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficiently structured, though brevity here shades into under-specification given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter, 6-required org-mutating tool, the description omits the connection/context selection requirement, the fact that it creates metadata rather than data, and any caveats about naming or rollback. The output schema covers returns, but the call prerequisites an agent must satisfy are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 18 parameters including the tricky context_handle/cirra_ai_team interaction. The description only echoes three field groups (sharing model, deployment status, config options) without adding syntax or defaulting guidance, so it sits at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new custom object (sObject) in Salesforce') plus the main configuration axes. It is clear what the tool does, but it does not distinguish itself from nearby siblings like metadata_create or sobject_field_create, which plausibly also create org metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus metadata_create or sobject_field_create, no prerequisites (permissions, connected org), and no mention that the required context_handle/cirra_ai_team connection selection must be supplied — a call with neither is refused.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sobject_describeBRead-onlyIdempotentInspect
Return basic metadata properties for the specified sObject, as well as a list of fields, relationships and record types.
| Name | Required | Description | Default |
|---|---|---|---|
| sObject | Yes | The API name, label or ID of the sObject | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered by structured data. The description adds only a light statement of what comes back (fields, relationships, record types), which the output schema also covers; it says nothing about permissions required, depth of metadata, or whether field-level security affects results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The trailing clause enumerating fields, relationships and record types is mildly redundant with the output schema, keeping it just below a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, the schema is fully documented and an output schema exists, so the essentials are present. What is missing is disambiguation from the many sibling describe/list tools, which matters given this tool set's density.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter (sObject, sf_user, cirra_ai_team, context_handle) is documented in detail, including the connection-selection rules. The description adds no parameter meaning beyond 'the specified sObject', so the baseline 3 for high-coverage schemas applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Return) and resource (metadata for the specified sObject) plus the contents of the result: fields, relationships and record types. That is clear enough to act on, but it never differentiates itself from near-neighbours like metadata_describe, tooling_api_describe, sobjects_list or profile_describe, so an agent must infer which describe-family tool to use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance and no named alternative. With 40+ siblings including several other 'describe' tools, the description leaves the routing decision entirely to inference from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sobject_dmlADestructiveInspect
Create, update, delete, or upsert Salesforce sObject records via DML operations. For more than ~200 records use bulk_dml instead.
| Name | Required | Description | Default |
|---|---|---|---|
| records | No | Array of records to process. For an 'update' operation the records must include an `Id` property`. For 'create' or 'upsert' the records may **not** have an `Id`. Do not use this property for the 'delete' operation | |
| sObject | Yes | API name of the sObject | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| operation | Yes | Type of DML operation to perform. Always ask for explicit user permission before executing any of these operations | |
| recordIds | No | Only used for the 'delete' operation: the IDs of the record to deletes | |
| dmlOptions | No | Optional DML options to use for the operation | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| externalIdField | No | External ID field name. Required for upsert operations, ignored in other cases |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, openWorldHint=true and non-idempotency, so the safety profile is covered structurally. The description adds one genuinely useful behavioral constraint — the ~200-record threshold implying partial-failure/perf limits — but says nothing about allOrNone semantics, partial success handling, or the permission-before-execute requirement that matters for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the core capability first and the routing constraint immediately after. Nothing redundant with the name or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full annotations, and 100% schema coverage, the description only needs to cover routing and scope, which it largely does. The remaining gap is disambiguation from the dedicated sobject_create/sobject_update/tooling_api_dml siblings in a very crowded namespace.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter including records/recordIds/upsert's externalIdField and the context_handle gating is documented in-schema, so baseline is 3. The description contributes no additional parameter semantics beyond restating the operation types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb set (create, update, delete, upsert) and resource (Salesforce sObject records) via DML, which is clear and actionable. However, it never addresses the overlapping siblings sobject_create and sobject_update, so an agent cannot tell from the description alone whether to use this multi-purpose tool or the dedicated per-operation ones.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit, quantified routing rule: use bulk_dml for more than ~200 records. That is a concrete when-to-use-else condition. But it gives no guidance relative to sobject_create/sobject_update or tooling_api_dml, and no prerequisites (though the safety gate lives in the schema's operation description, not here).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sobject_field_createCInspect
Create a new custom field for an sObject in Salesforce
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | The label for the field | |
| sObject | Yes | The API name, label or ID of the sObject | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| fieldName | Yes | The API name of the new field. For example, NewField__c | |
| fieldType | Yes | The type of the field | |
| defaultFLS | No | The default Field-Level Security (FLS) setting to apply for all profiles for the new field | |
| properties | No | A map of properties used when creating the field. Some may be required, depending on the field type. See instructions for details | |
| description | No | The description for the field. Recommended, but not required -- omit it, or pass '' or null, if the user asked for no description. | |
| flsOverrides | No | An (optional) array of Field-Level Security (FLS) overrides for one or more profiles | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| inlineHelpText | No | The inline help text for the field. Recommended, but not required -- omit it, or pass '' or null, if the user asked for no help text. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| appliedMetadata | No | The CustomField metadata that was actually sent to Salesforce, including any values the server filled in (e.g. defaulted or 'length'-alias-derived precision/scale). Use this to verify the field was created exactly as intended. |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true, so the safety profile is known. The description adds nothing beyond that: no mention that this mutates org metadata, that re-running with the same fieldName will fail rather than update (non-idempotent), that changes may take time to propagate, or that FLS defaults apply org-wide. With a mutation tool of this complexity, that is a thin contribution.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, and the purpose is stated immediately. It is efficiently sized, though the brevity is partly the source of the missing context rather than a deliberate trade-off.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with nested objects, enum-constrained types, and field-type-dependent properties, one sentence is not enough — an agent has no way to know what to put in 'properties' for, say, a Picklist vs a Lookup. The output schema covers return values, but the invocation-side complexity is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 12 parameters — including the enum for fieldType and FLS settings — are already documented in structured fields. The description adds no semantics about the critical 'properties' map, whose type-dependent requirements it leaves entirely to an unspecified 'instructions'. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new custom field for an sObject in Salesforce'), which is clear on its own. It does not name the obvious sibling sobject_field_update or explain the distinction, so an agent must infer the create-vs-modify boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus sobject_field_update, metadata_create, or value_set_create, and no prerequisites (permissions, whether the sObject must exist, whether the field type dictates extra properties) are mentioned. The only usage signal comes from the name and annotations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sobject_field_updateBIdempotentInspect
Update properties of a custom sObject field (standard or custom) in Salesforce, including local picklist values
| Name | Required | Description | Default |
|---|---|---|---|
| sObject | Yes | The API name, label or ID of the sObject | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| fieldName | Yes | The API name, label or ID of the field. For example Industry, Segment__c, SomeNamespace__SomeField__c, 'Some Field' or 00NEk00000B8BYE. | |
| flsUpdates | No | An (optional) array of Field-Level Security (FLS) settings to update for one or more profiles | |
| properties | Yes | Properties to update. Omit a key to leave the stored value unchanged; pass null to clear an optional string (e.g. inlineHelpText, description); any other string is stored. Some properties are required depending on the field type. See instructions for details. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| appliedMetadata | No | The full resulting CustomField metadata (existing field merged with your updates), including any values the server filled in (e.g. defaulted or 'length'-alias-derived precision/scale). Use this to verify the field now matches what was intended. |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The mention of 'local picklist values' hints at a meaningful behavioral nuance (local vs global picklists), which goes slightly beyond the annotations. However, it is never explained, and with annotations already declaring idempotentHint=true, destructiveHint=false, and openWorldHint=true, the description adds only marginal behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. It is efficient, though the parenthetical interrupts the flow slightly and the sentence is short enough that it could have afforded more substance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, 100% parameter documentation, and annotations covering the safety profile, the description is complete enough for an agent to call the tool: the resource, the mutation intent, and picklist handling are all signalled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is documented in the schema, and the freeform 'properties' object already explains omit/null/store semantics. The description adds only the picklist-values hint and no parameter-level detail beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: update properties of an sObject field in Salesforce. The parenthetical '(standard or custom)' clarifies scope, but the phrasing is slightly ambiguous, and nothing distinguishes this from siblings like sobject_field_create or value_set_update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus sobject_field_create, value_set_update, or metadata_update, and no prerequisites or exclusions are given. The agent must infer usage entirely from the name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sobjects_listARead-onlyIdempotentInspect
Lists all the available sObject types with their API names and labels. To get more details about an sObject, use sobject_describe
| Name | Required | Description | Default |
|---|---|---|---|
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| pageSize | No | (optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| customObjectsOnly | Yes | if true, list only custom objects |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| records | No | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive behavior, so the safety profile is covered. The description adds nothing about result-set size, whether the list is org-wide or permission-filtered, or pagination behavior — relevant for a list tool in a large org.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the purpose, second sentence devoted entirely to disambiguation. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema and rich annotations relieve the description of return-value and safety disclosure. However, with a pageSize parameter and a fetch_more sibling present, the absence of any pagination or connection-selection context leaves a gap for a list tool that can return many rows.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description says 'all the available sObject types' and never mentions the required customObjectsOnly flag or how pageSize affects the response, which is the only parameter meaning an agent might misread.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists all the available sObject types') and names what is returned (API names and labels). It also explicitly contrasts with the sibling tool sobject_describe, so an agent can tell the two apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing is provided: use sobject_describe for per-object detail. There is no guidance on pagination or on the fetch_more sibling despite a pageSize parameter, so the usage picture is clear but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sobject_updateBIdempotentInspect
Update properties of a custom Salesforce object, such as label, plural label, description, sharing model, or deployment status
| Name | Required | Description | Default |
|---|---|---|---|
| sObject | Yes | The API name, label or ID of the custom sObject | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| properties | Yes | A map of properties to update on the object. For example: 'label'. At least one property must be updated | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| appliedMetadata | No | The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read. |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the description does not need to restate safety. It does add useful context by naming updatable properties, including sharing model and deployment status, but says nothing about required permissions, whether omitted properties are preserved, or the consequences of changing deployment status.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no filler, and the examples are placed after the verb+resource so the purpose lands first. It is efficient, though the example list could have been used to carry a constraint instead of just enumerating fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema and annotations are present, so return values and safety are covered elsewhere. The remaining gap is the free-form 'properties' map: an agent still lacks a definitive list of settable keys, their value formats, and whether a partial update overwrites unspecified properties.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, and the description earns above baseline because the 'properties' parameter is a free-form map with no declared keys — the description supplies the only guidance on valid entries (label, plural label, description, sharing model, deployment status). It still does not state accepted value types or formats for those keys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (custom Salesforce object properties) and enumerates the kinds of properties affected, which separates it from record-level tools like sobject_dml. It does not name the closest siblings (sobject_field_update, metadata_update) explicitly, so differentiation is by inference rather than by statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, and no mention of the adjacent tools an agent might confuse it with, such as sobject_field_update for fields or sobject_create for new objects. The only usable signal is the implicit 'this mutates object metadata' reading of the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
soql_queryARead-onlyIdempotentInspect
Run a Salesforce SOQL query to return a list of sObject records, with automatic masking of encrypted fields. For extracts of thousands of rows, or when this tool times out, use bulk_query. To read Apex debug log text, query ApexLog and include Body in fields.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | The maximum number of records to return. The default is 200. Note: LIMIT is automatically omitted for aggregate queries without GROUP BY. | |
| fields | Yes | List of fields to retrieve. May include relationship fields and aggregates. For ApexLog, include Body to retrieve the raw debug log text (Body is a blob and is fetched after the query; at most 5 logs with Body per call). | |
| groupBy | No | GROUP BY clause for aggregate queries. Required when using aggregate functions with grouping, optional otherwise | |
| orderBy | No | (optional) ORDER BY clause. May include fields from related objects | |
| sObject | Yes | The name of the Salesforce object to query | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| pageSize | No | (optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size. | |
| whereClause | Yes | WHERE clause. May include conditions on related objects. Do NOT include APEX snippets or variables: use only literal values | |
| havingClause | No | HAVING clause to filter grouped results by aggregate conditions (e.g. 'COUNT(Id) > 5'). Requires groupBy to be set | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| records | No | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds genuine non-structured context: automatic masking of encrypted fields and the behavior when the tool times out. It does not describe pagination behavior or the interaction with fetch_more, which keeps it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, followed by the alternative-routing and the special case. Nothing repeats the annotations or restates the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the schema fully documents parameters. The one remaining gap is that pagination via pageSize is documented in the schema but the description never points to fetch_more, leaving an agent to infer how to continue a paged result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 11 parameters including limit, pageSize, and context_handle are already documented at the field level. The description adds only the ApexLog/Body hint, which the schema also covers, plus the masking note. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run a Salesforce SOQL query to return a list of sObject records') plus a distinguishing scope detail (automatic masking of encrypted fields). Names the sibling it is not for large extracts (bulk_query), so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the switch condition: use bulk_query for extracts of thousands of rows or on timeout. Also gives a positive routing case for ApexLog Body retrieval, which would otherwise be non-obvious. No ambiguity left.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tooling_api_describeARead-onlyIdempotentInspect
List all objects available through the Salesforce Tooling API and their properties. Use tooling_api_query with FieldDefinition to get field details
| Name | Required | Description | Default |
|---|---|---|---|
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| verbose | Yes | If false or missing, return only the names of the objects. This is the default. If true, return additional properties for each object. | |
| pageSize | No | (optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| records | No | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is fully covered and the description does not contradict it. The description's only added behavior note is that verbose=false returns names only, which the schema already states verbatim. It adds little novel context such as scope of the listing or how the Tooling API surface differs from standard objects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action, with no filler. The second sentence earns its place by routing the agent to a companion tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required, and the rich schema covers connection and pagination context. What is missing is the boundary against sobjects_list/metadata_describe, which matters given the crowded sibling set; otherwise the definition is sufficient to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters, including the connection/context routing and pagination semantics, are already documented in the schema; baseline 3 applies. The description contributes no additional parameter meaning beyond pointing to tooling_api_query for field-level detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List all objects available through the Salesforce Tooling API and their properties.' That is far more than a restatement of the name. It does not, however, explicitly contrast itself with sibling tools like sobjects_list or metadata_describe, so an agent must infer the Tooling-vs-standard distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names one concrete alternative and the condition for it ('Use tooling_api_query with FieldDefinition to get field details'), which is genuine routing guidance. But there is no guidance on when to prefer this over sobjects_list or metadata_describe, and no statement of prerequisites. Usage is implied rather than specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tooling_api_dmlADestructiveInspect
Create, update, delete, or upsert Salesforce Tooling API records, such as Apex classes, triggers, custom metadata, and TraceFlag. For TraceFlag, prefer LogType USER_DEBUG; DEVELOPER_LOG is warned and PROFILING is rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| record | No | The record to process, with all relevant fields. For an 'update' operation the record object must include an `Id` property`. For 'create' or 'upsert' the record may **not** have an `Id`. Do not use this property for the 'delete' operation | |
| sObject | Yes | API name of the Tooling API object | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| recordId | No | Only used for the 'delete' operation: the ID of the record to delete | |
| operation | Yes | Type of DML operation to perform. Always ask for explicit user approval before executing any of these operations, and do not proceed without it | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. | |
| externalIdField | No | External ID field name. Required for upsert operations, ignored in other cases |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds one behavioral fact beyond that — the LogType validation rules for TraceFlag — but says nothing about reversibility, permission requirements, or side effects of delete/upsert on tooling artifacts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the operation scope front-loaded and the specialized TraceFlag caveat trailing. Nothing redundant with the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the schema carries the approval requirement and per-parameter rules. What remains missing is routing guidance against the many DML/query siblings, which an agent would need to pick correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including operation, record, recordId, externalIdField and the context/sf_user pairing is already documented in structured data. The description adds no parameter-level meaning beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb set (create, update, delete, upsert) against a specific resource (Salesforce Tooling API records) and gives concrete examples (Apex classes, triggers, custom metadata, TraceFlag). The 'Tooling API' qualifier implicitly separates it from sobject_dml, but the description never names that sibling to make the boundary explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The TraceFlag sentence is a genuine conditional rule (prefer USER_DEBUG, DEVELOPER_LOG warned, PROFILING rejected), which is real when-to-use guidance for one case. However there is no general guidance on when to choose this over sobject_dml or bulk_dml, and no exclusions stated for the common path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tooling_api_queryARead-onlyIdempotentInspect
Run a SOQL query against the Salesforce Tooling API to retrieve metadata objects like Apex classes, triggers, custom fields, and field definitions. To read Apex debug log text, query ApexLog and include Body in fields.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | The maximum number of records to return. The default is 200. Note: LIMIT is automatically omitted for aggregate queries without GROUP BY. | |
| fields | Yes | List of fields to retrieve. May include relationship fields and aggregates. For ApexLog, include Body to retrieve the raw debug log text (Body is a blob and is fetched after the query; at most 5 logs with Body per call). | |
| format | No | When the query selects the Metadata field, or the queried Tooling sObject is metadata-backed (CustomField, CustomObject, ApexClass, Flow, Layout, PermissionSet, …), `xml` / `source` attach Metadata API retrieve files per record as `metadataXml` or `sourceFiles`. The Tooling `Metadata` JSON is left unchanged. `json` (default) is current behavior. Same retrieve path as `metadata_read` — not a conversion of the Tooling JSON. | json |
| groupBy | No | GROUP BY clause for aggregate queries. Required when using aggregate functions with grouping, optional otherwise | |
| orderBy | No | (optional) ORDER BY clause | |
| sObject | Yes | The name of the Tooling API object to query | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| pageSize | No | (optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size. | |
| whereClause | Yes | WHERE clause. May include conditions on related objects | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| format | No | |
| message | Yes | |
| records | No | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| apiVersion | No | API version used for the retrieve. Match this to sourceApiVersion in sfdx-project.json. |
| components | No | Present when format is xml or source. Retrieved files grouped by Metadata API type and fullName. |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No | |
| packageDirectory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower; the description still adds real operational detail beyond them, notably that Body is a blob fetched after the query and capped at 5 logs with Body per call, plus what format=xml/source attaches. It omits the pagination behavior implied by pageSize/fetch_more.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero filler, with the primary capability front-loaded and the ApexLog special case as a secondary note. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The presence of an output schema removes the need to explain return values, and the schema covers the connection-selection parameters. But for an 11-parameter tool with paging (pageSize, limit) and a sibling fetch_more, the description says nothing about how continuation works or how this relates to the non-Tooling query tools — a meaningful gap for an agent choosing among 45 siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 11 parameters; baseline is 3. The description duplicates the ApexLog/Body guidance that the fields parameter schema already states, and adds no syntax or format detail for whereClause, orderBy, or the context_handle requirement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: run a SOQL query against the Salesforce Tooling API, naming concrete targets (Apex classes, triggers, custom fields). The 'Tooling API' scoping implicitly separates it from soql_query/bulk_query, but the description never names those siblings, so the differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides one concrete usage trigger ('To read Apex debug log text, query ApexLog and include Body in fields'), which is genuinely actionable. However, there is no explicit guidance on when to use this versus soql_query (data records) or tooling_api_search, and no mention of pagination/fetch_more for multi-page results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tooling_api_searchBRead-onlyIdempotentInspect
Run a SOSL search query against the Salesforce Tooling API to find matching metadata objects like Apex classes, triggers, and flows
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The SOSL query to execute against the Tooling API. Please take into account all available documentation on object types, field names and limitations for the Tooling API SOSL queries | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| pageSize | No | (optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| records | No | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds only the domain of searchable objects; it says nothing about Tooling API SOSL limitations, result caps, or pagination interaction with pageSize, which is the non-obvious behavior here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the verb and resource appear immediately. It is efficient but arguably under-informative rather than over-long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Return values are covered by the output schema and safety by annotations, and parameters are fully documented in the schema. What is missing is routing context: with tooling_api_query, soql_query and bulk_query as siblings, an agent gets no help deciding which query tool applies to a given request.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter (query, sf_user, pageSize, cirra_ai_team, context_handle) is documented in detail there. The description contributes no additional parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Run) and resource (SOSL search query against the Salesforce Tooling API) plus the target domain (Apex classes, triggers, flows). It implicitly separates itself from SOQL-based siblings by naming SOSL, but never names tooling_api_query or soql_query directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'find matching metadata objects' suggests discovery use, but there is no explicit when-to-use, when-not-to-use, or pointer to the SOQL alternatives among the many query siblings (soql_query, tooling_api_query, bulk_query).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
user_createAInspect
Create a new Salesforce user. You can clone an existing user by providing the template parameter, or create a new user from scratch by providing the profile and other parameters
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email of the user | ||
| profile | No | The name or ID of the profile to use for the new user. Not required if template is provided | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| lastName | Yes | The last name of the user | |
| template | No | The name, username, email or id of an existing user to use a a template for the new user | |
| username | Yes | The username of the user. Must be globally unique across all Salesforce organizations | |
| firstName | Yes | The first name of the user | |
| properties | No | An optional map of additional properties to set on the new user | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-readonly, non-idempotent, open-world write, so the safety profile is covered. The description adds the clone-vs-scratch behavioral split, but says nothing about whether the new user is created active or inactive, whether Salesforce emails the user, or what permissions/edition constraints apply — meaningful gaps for a user-provisioning tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, then the mode split. Nothing is wasted and no clause needs re-reading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With rich annotations, 100% schema coverage and an output schema, the description covers the essential decision an agent must make (template vs from-scratch). The remaining omission — post-creation state and prerequisites — is real but modest given how much the structured fields already carry.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (including the heavy `context_handle` / `sf_user` / `cirra_ai_team` connection trio) is already documented in the schema. The description's mention of `template` and `profile` largely restates what the schema says ("Not required if template is provided"), so it adds only framing, not new parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create a new Salesforce user") and immediately decomposes it into the two supported creation modes (clone via `template`, or build via `profile`). It is clearly distinguishable from `user_update` by verb, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real routing guidance between the two creation paths: use `template` to clone an existing user, use `profile` plus other fields to create from scratch. It stops short of when-not-to-use cases (e.g. when to prefer `user_update` on an existing user, or prerequisites such as profile/license availability).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
user_describeBRead-onlyIdempotentInspect
Return complete metadata for a Salesforce user
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | The name, username, email or ID of the user | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered. The description adds only the qualifier 'complete', which signals a full record rather than a summary, but says nothing about what metadata is included or how connection resolution affects the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler. It is arguably undersized given the connection-resolution complexity, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the schema fully documents the connection/team parameters. However, the description never signals that a context_handle or team+user pair may be mandatory, which is the main failure mode for this call — the agent only learns that by reading the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the four parameters are documented in detail, including the context_handle vs. cirra_ai_team + sf_user requirement. The description adds no parameter meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return complete metadata for a Salesforce user'), which cleanly separates it from the sibling mutators user_create/user_update and from object-level describers like sobject_describe. It stops short of explicitly naming a sibling or scope boundary, so it is clear but not maximally differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and names no alternatives. An agent must infer from the name alone that this is the lookup to run before user_update or when user details are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
user_updateCIdempotentInspect
Update a Salesforce user, including activating, deactivating, freezing, unfreezing, resetting passwords, or modifying user properties
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | The id, username, full name or email of the user to update | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| operation | Yes | The type of operation to perform. Can be one of: - `deactivate`: To deactivate a user - `activate`: To activate a user - `reset_password`: To reset password of a user. An email to reset password will be sent to the user's email - `freeze`: To freeze a user - `unfreeze`: To unfreeze a user - `unlock_password`: To unlock password for a user - `update` | |
| properties | No | The properties to update when choosing the `update` operation | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description adds nothing beyond that: it does not mention that reset_password sends an email, that deactivation affects login/ownership, or what permissions are needed — even though it claims operations at least as consequential as those hints imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that names the resource first and then the operations. No filler, though the long inline enumeration duplicates what the enum already lists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the input schema is fully documented, so return values and parameters are covered elsewhere. What the description omits is behavioral context for a multi-mode mutation tool: which modes are reversible, whether an admin profile is required, and any preconditions before freezing or resetting a password.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the enum documents each operation individually, including the email side effect of reset_password. The description only restates the operation set and gestures at 'user properties', adding no syntax or constraints beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Update a Salesforce user") and enumerates the concrete operations covered: activate, deactivate, freeze, unfreeze, reset password, modify properties. This clearly separates it from user_create and user_describe, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to choose this tool versus alternatives (e.g. sobject_update for generic objects, user_describe first to look up a user), and no prerequisites such as required admin permissions or the fact that deactivating yourself is typically blocked. The agent must infer all of this from the enum.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
value_set_createCInspect
Create a new global value set in Salesforce
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name of the value set | |
| sorted | No | Set to true if the values should be sorted | |
| values | Yes | The values for the value set | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| namespace | No | The namespace, if applicable | |
| description | No | The description (optional). Max 255 characters | |
| masterLabel | No | The label (optional). Will default to the name if not specified | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| appliedMetadata | No | The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read. |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false and destructiveHint=false, so the mutation profile is covered. The description adds only the target object type and platform; it does not disclose duplicate-name behavior (create failing vs. overwriting), auth requirements, or that the call is refused without a context handle. The single major addition is the "global" scope, which is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with zero waste — verb and resource come first. It is efficient, though its brevity leaves little room for the routing and prerequisite context a 9-parameter create tool would benefit from.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and all 9 parameters are schema-documented, which carries most of the burden. Still, for a nested-structure create tool whose connection parameters are the main failure mode, the description gives an agent no framing about required inputs or connection selection, leaving it thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the nested value fields (fullName, label, default, isActive, description) is already documented in the schema. The description adds no syntax, format, or constraint detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create a new global value set") plus the platform (Salesforce), so an agent knows exactly what it produces. The "global" qualifier meaningfully distinguishes it from a local picklist value set. It does not, however, explicitly name the sibling value_set_update it should not be confused with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusions, and no pointer to value_set_update for modifying an existing set. Nothing is said about prerequisites such as needing a resolved Salesforce connection or what happens if the name already exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
value_set_updateAIdempotentInspect
Update the values in a standard or global value set in Salesforce. REPLACE SEMANTICS: the values array overwrites the entire value list — omitted values are removed. To preserve existing values, fetch the current set first (metadata_read on StandardValueSet/GlobalValueSet) and resend the complete list with your changes merged in.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name or ID of the value set | |
| type | No | Indicate whether this is a global or standard value set. Not needed if the ID of the value set is provided | |
| values | Yes | The values for the value set | |
| sf_user | No | (optional) Salesforce username to identify the connection to use. Omit this to use the current default connection. | |
| namespace | No | The namespace for a global value set, if applicable | |
| cirra_ai_team | No | (optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'. | |
| context_handle | No | (recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| results | No | |
| success | Yes | |
| warning | No | |
| errorCode | No | |
| errorCount | No | |
| resultCount | No | |
| artifactType | No | |
| requestCount | No | |
| skippedCount | No | |
| successCount | No | |
| appliedMetadata | No | The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read. |
| artifactCategory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds critical context beyond the annotations: the `values` array is a full replacement and omitted entries are removed. That is exactly the dangerous trait an agent needs to know about a mutation, and it is stated prominently rather than left implicit. The destructiveHint=false annotation technically understates the delete-on-omission behavior, but the description surfaces that risk explicitly rather than contradicting the annotation, so no contradiction flag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero filler. The replace-semantics warning is capitalized and front-loaded, and the recovery workflow follows immediately. Every sentence carries an operational consequence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema, the description supplies the one thing structured fields don't: that the write replaces rather than merges, plus the safe procedure. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds non-obvious semantics for the `values` parameter: it overwrites the entire list. That meaning is not derivable from the schema, which merely says 'The values for the value set'. Other parameters (type, namespace, connection handles) are left to their schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update the values in a standard or global value set in Salesforce') and scopes the object type precisely. It is trivially distinguishable from the sibling value_set_create, so an agent can select it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an actionable workflow: fetch the current set via metadata_read on StandardValueSet/GlobalValueSet, merge, then resend the full list. This names an alternative tool and the condition that selects it. It stops short of explicitly stating when not to use this tool (e.g., creating a new set vs value_set_create), which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
47 tool updates
- Added
bulk_dml - Added
bulk_query - Changed
cirra_ai_init4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / context_handleAdded value: +{ + "description": "(optional) A context_handle returned by an earlier cirra_ai_init call in this same conversation. Pass it to keep the existing conversation context; omit on the first call in a conversation.", + "type": "string" +} - changed
Input schema / properties / scope / descriptionPrevious value: -"(optional) Controls whether the provided `cirra_ai_team` and/or `sf_user` apply only to this chat (`thread`) or are saved as new defaults for future (`global`). Only use 'thread' if explicitly instructed by the user. Leave blank if not switching team or connection."New value: +"(optional) Controls whether the provided `cirra_ai_team` and/or `sf_user` apply only to this chat (`thread`) or are saved as new defaults for future (`global`). Only use 'thread' if explicitly instructed by the user. Leave blank if not switching team or connection. Whatever the scope, pass the `context_handle` returned by this call as the `context_handle` argument on EVERY subsequent tool call: it carries the team and connection this call reported. A call made without it, and without `cirra_ai_team` + `sf_user`, is refused when the user has more than one place to work (several teams, or a team and a personal account)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "account": { + "description": "Cirra AI account info (user name, team, role, dashboard URL, and — for admins/personal accounts — subscription and credit details), or an explanatory string when the account info is unavailable" + }, + "cirraContactInfo": { + "additionalProperties": true, + "description": "Cirra AI support contact details", + "properties": { + "docs": { + "description": "Documentation URL", + "type": "string" + }, + "email": { + "description": "Support email address", + "type": "string" + }, + "website": { + "description": "Support website URL", + "type": "string" + } + }, + "type": "object" + }, + "context": { + "description": "General usage instructions for the Cirra AI MCP server. Read carefully before calling other tools.", + "type": "string" + }, + "salesforceConnections": { + "additionalProperties": true, + "properties": { + "available": { + "description": "All Salesforce connections available to the user", + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "current": { + "description": "Details of the currently selected Salesforce connection (username, org name/type, base URLs, capabilities), or null when none is connected" + } + }, + "type": "object" + }, + "teams": { + "additionalProperties": true, + "properties": { + "available": { + "description": "Teams the user can switch to (tree structure with id, name and optional children)", + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "current": { + "description": "The currently selected team ID, or __Personal__ for the personal account", + "type": "string" + } + }, + "type": "object" + }, + "text": { + "description": "Raw response text, set only when the response could not be parsed into the fields above", + "type": "string" + } + }, + "type": "object" +}
- Added
cms_content - Added
cms_delivery - Added
connect_rest - Changed
fetch_more4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / artifactId / descriptionPrevious value: -"Artifact ID from instructions.artifactId"New value: +"Artifact ID from artifactAccess.artifactId" - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_pagination": { + "additionalProperties": true, + "description": "Pagination state for the returned page", + "properties": { + "nextCursor": { + "description": "Cursor for the next page; absent when there are no more records", + "type": "string" + }, + "returned": { + "description": "Number of records returned in this page", + "type": "number" + }, + "total": { + "description": "Total number of records in the full result set", + "type": "number" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable summary of the result", + "type": "string" + }, + "success": { + "description": "Whether the operation succeeded", + "type": "boolean" + }, + "warning": { + "description": "Optional warning about the result", + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
group_create6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Input schema / properties / description / descriptionPrevious value: -"The description for the group"New value: +"The description for the group. Recommended, but not required -- omit it (or pass '') if the user asked for no description." - changed
Input schema / requiredPrevious value: -[ - "name", - "type", - "description" -]New value: +[ + "name", + "type" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
group_members4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
group_update4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
link_build5 fields changed- changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Input schema / properties / setupConfig / properties / artifactNameOrId / descriptionPrevious value: -"The name or ID of artifact. For example a class name, class ID, page layout name, validation rule name, value set name, trigger name, flow name, username, user ID or flow name"New value: +"The name or ID of artifact. For example a class name, class ID, page layout name, validation rule name, value set name, trigger name, flow name, username, user ID, or ApexLog Id (prefix 07L)" - changed
Input schema / properties / setupConfig / properties / type / enumPrevious value: -[ - "Object", - "Field", - "Page Layout", - "Record Type", - "Apex Trigger", - "Validation Rule", - "Value Set", - "Business Process", - "Flow Trigger", - "Permission Set", - "Profile", - "User", - "Flow", - "Class", - "Trigger", - "Group", - "Queue", - "Role", - "Email Template", - "Report", - "Dashboard", - "Workflow Rule", - "Email Alert", - "Field Update", - "Outbound Message", - "Workflow Task" -]New value: +[ + "Object", + "Field", + "Page Layout", + "Record Type", + "Apex Trigger", + "Validation Rule", + "Value Set", + "Business Process", + "Flow Trigger", + "Permission Set", + "Profile", + "User", + "Flow", + "Class", + "Apex Debug Log", + "Trigger", + "Group", + "Queue", + "Role", + "Email Template", + "Report", + "Dashboard", + "Workflow Rule", + "Email Alert", + "Field Update", + "Outbound Message", + "Workflow Task" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "message": { + "description": "Human-readable summary of the result", + "type": "string" + }, + "result": { + "description": "The built link as an object with href (the setup page URL) and label (display text), or null when no link applies (e.g. delete operations or when the link could not be built)" + }, + "success": { + "description": "Whether the operation succeeded", + "type": "boolean" + }, + "warning": { + "description": "Optional warning about the current connection or result", + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Added
logout - Changed
metadata_create4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "appliedMetadata": { + "additionalProperties": true, + "description": "The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read.", + "properties": {}, + "type": "object" + }, + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "description": "Non-blocking advisory about what was just created -- for example that a new FlowTest may not be runnable for a short while. The create succeeded; surface this to the user and act on it before using the new component", + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
metadata_delete4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
metadata_describe5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Input schema / properties / pageSize / descriptionPrevious value: -"(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically."New value: +"(optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "records": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
metadata_list5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Input schema / properties / pageSize / descriptionPrevious value: -"(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically."New value: +"(optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "records": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
metadata_read6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - added
Input schema / properties / formatAdded value: +{ + "default": "json", + "description": "Response shape for the component files. `json` (default) is the current Metadata SOAP / specialized-describe result, unchanged. `xml` returns each component as Metadata API retrieve files keyed by metadata-format path (`objects/Foo__c.object`). `source` returns DX source-format files keyed by path relative to a package directory (`main/default/objects/Foo__c/fields/Bar__c.field-meta.xml`); the client prepends its own `force-app/`. `xml` and `source` come from a Metadata API retrieve plus `@salesforce/source-deploy-retrieve` conversion — they are not reconstructed from the JSON. Requesting a child (`CustomField:Obj.Fld`) yields only that child; requesting a parent (`CustomObject:Obj`) yields the object plus all children, same as `sf project retrieve start`.", + "enum": [ + "json", + "xml", + "source" + ], + "type": "string" +} - changed
Input schema / properties / pageSize / descriptionPrevious value: -"(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically."New value: +"(optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "apiVersion": { + "description": "API version used for the retrieve. Match this to sourceApiVersion in sfdx-project.json.", + "type": "string" + }, + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "components": { + "description": "Present when format is xml or source. One entry per requested fullName, with metadataXml or sourceFiles. Missing components have an empty file map and warning \"not found\".", + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "format": { + "enum": [ + "json", + "xml", + "source" + ], + "type": "string" + }, + "message": { + "type": "string" + }, + "packageDirectory": { + "description": "DX package directory name the client should prepend to source paths. Always force-app.", + "type": "string" + }, + "records": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
metadata_update9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - added
Input schema / properties / fullNameAdded value: +{ + "description": "The full name of the single record to modify. Required when using `patch`; ignored when using `metadata`.", + "type": "string" +} - changed
Input schema / properties / metadata / descriptionPrevious value: -"The array of metadata records to update. Each record must include at least a 'fullName' property and other required fields for the type. See instructions for details."New value: +"The array of metadata records to update, each replacing the whole object. Each record must include at least a 'fullName' property and other required fields for the type. See instructions for details. Omit when using `patch`." - added
Input schema / properties / patchAdded value: +{ + "description": "A partial update expressed in the `JSON Patch` format (RFC 6902): an array of operations applied to the current metadata of the record named by `fullName`. Use this instead of `metadata` for large records (e.g. Flows) to avoid resending the whole object. Array elements may be addressed by their identity instead of their position: `name` where the child has one (e.g. `/decisions/My_Decision`), otherwise `fullName` (e.g. GlobalValueSet `/customValue/Gamma`, CustomObject `/fields/My_Field__c`); numeric indices always work and are safer for deeper paths. Repeating children are always arrays on read, including a single element — always include `/0/` (e.g. `/testPoints/1/assertions/0/conditions/0/rightValue/stringValue`).", + "items": { + "additionalProperties": false, + "properties": { + "from": { + "description": "For move and copy operations only: a JSON Pointer path specifying the source", + "type": "string" + }, + "op": { + "description": "The operation to perform", + "enum": [ + "add", + "remove", + "replace", + "move", + "copy", + "test" + ], + "type": "string" + }, + "path": { + "description": "An enhanced JSON Pointer path specifying where the change should be applied.", + "type": "string" + }, + "value": { + "description": "The value to add, replace, or test. Set to null for move and copy operations" + } + }, + "required": [ + "op", + "path" + ], + "type": "object" + }, + "type": "array" +} - changed
Input schema / properties / upsert / descriptionPrevious value: -"Whether to upsert the metadata. If true, the metadata will be upserted (created if it does not yet exist). If false, the metadata will be updated."New value: +"Whether to upsert the metadata. If true, the metadata will be upserted (created if it does not yet exist). If false, the metadata will be updated. For Flow updates this should be true so a new version is created." - changed
Input schema / requiredPrevious value: -[ - "type", - "metadata" -]New value: +[ + "type" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "appliedMetadata": { + "additionalProperties": true, + "description": "The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read.", + "properties": {}, + "type": "object" + }, + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
page_layout_clone4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
page_layout_update6 fields changed- changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - removed
Input schema / properties / patch / items / propertiesRemoved value: -{ - "from": { - "description": "For move and copy operations only: a JSON Pointer path specifying the source", - "type": "string" - }, - "op": { - "description": "The operation to perform", - "enum": [ - "add", - "remove", - "replace", - "move", - "copy", - "test" - ], - "type": "string" - }, - "path": { - "description": "A JSON Pointer path specifying where the change should be applied", - "type": "string" - }, - "value": { - "description": "The value to add, replace, or test. Not required for move and copy operations" - } -} - removed
Input schema / properties / patch / items / requiredRemoved value: -[ - "op", - "path", - "value" -] - removed
Input schema / properties / patch / items / typeRemoved value: -"object" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "appliedMetadata": { + "additionalProperties": true, + "description": "The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read.", + "properties": {}, + "type": "object" + }, + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
permission_set_assignments4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
permission_set_update7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - removed
Input schema / properties / patch / items / propertiesRemoved value: -{ - "from": { - "description": "For move and copy operations only: a JSON Pointer path specifying the source", - "type": "string" - }, - "op": { - "description": "The operation to perform", - "enum": [ - "add", - "remove", - "replace", - "move", - "copy", - "test" - ], - "type": "string" - }, - "path": { - "description": "An enhanced JSON Pointer path specifying where the change should be applied.", - "type": "string" - }, - "value": { - "description": "The value to add, replace, or test. Set to null for move and copy operations" - } -} - removed
Input schema / properties / patch / items / requiredRemoved value: -[ - "op", - "path", - "value" -] - removed
Input schema / properties / patch / items / typeRemoved value: -"object" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "appliedMetadata": { + "additionalProperties": true, + "description": "The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read.", + "properties": {}, + "type": "object" + }, + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
profile_clone4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
profile_describe4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
profile_update8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / confirmLoginIpRestrictionAdded value: +{ + "description": "(optional) Required to add the first Login IP Range to a profile. Login IP Ranges are an allowlist: users with the profile are blocked from logging in from any other IP address. Set to true only after the user has explicitly confirmed they want to restrict logins for this profile. To waive identity verification for trusted addresses instead, use the org-wide Network Access trusted IP ranges.", + "type": "boolean" +} - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - removed
Input schema / properties / patch / items / propertiesRemoved value: -{ - "from": { - "description": "For move and copy operations only: a JSON Pointer path specifying the source", - "type": "string" - }, - "op": { - "description": "The operation to perform", - "enum": [ - "add", - "remove", - "replace", - "move", - "copy", - "test" - ], - "type": "string" - }, - "path": { - "description": "An enhanced JSON Pointer path specifying where the change should be applied.", - "type": "string" - }, - "value": { - "description": "The value to add, replace, or test. Set to null for move and copy operations" - } -} - removed
Input schema / properties / patch / items / requiredRemoved value: -[ - "op", - "path", - "value" -] - removed
Input schema / properties / patch / items / typeRemoved value: -"object" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "appliedMetadata": { + "additionalProperties": true, + "description": "The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read.", + "properties": {}, + "type": "object" + }, + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "verifiedChangeCount": { + "description": "Number of requested changes confirmed by re-reading the profile after the update.", + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
record_type_create7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / availabilityOverrides / items / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - added
Input schema / properties / layoutAssignmentOverrides / items / additionalPropertiesAdded value: +false - changed
Input schema / requiredPrevious value: -[ - "sObject", - "existingRecordType", - "name", - "label", - "description", - "businessProcess", - "defaultAvailability", - "availabilityOverrides", - "defaultLayout", - "layoutAssignmentOverrides", - "compactLayoutAssignment" -]New value: +[ + "sObject", + "existingRecordType", + "name", + "label", + "businessProcess", + "defaultAvailability", + "availabilityOverrides", + "defaultLayout", + "layoutAssignmentOverrides", + "compactLayoutAssignment" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "appliedMetadata": { + "additionalProperties": true, + "description": "The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read.", + "properties": {}, + "type": "object" + }, + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
record_type_update7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / availabilityOverrides / items / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - added
Input schema / properties / layoutAssignmentOverrides / items / additionalPropertiesAdded value: +false - changed
Input schema / requiredPrevious value: -[ - "sObject", - "recordType", - "newName", - "label", - "description", - "active", - "businessProcess", - "defaultAvailability", - "availabilityOverrides", - "defaultLayout", - "layoutAssignmentOverrides", - "compactLayoutAssignment" -]New value: +[ + "sObject", + "recordType", + "newName", + "label", + "active", + "businessProcess", + "defaultAvailability", + "availabilityOverrides", + "defaultLayout", + "layoutAssignmentOverrides", + "compactLayoutAssignment" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "appliedMetadata": { + "additionalProperties": true, + "description": "The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read.", + "properties": {}, + "type": "object" + }, + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
report_run7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Input schema / properties / pageSize / descriptionPrevious value: -"(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically."New value: +"(optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size." - added
Input schema / properties / reportMetadata / additionalPropertiesAdded value: +false - added
Input schema / properties / reportMetadata / properties / reportFilters / items / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "report": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Added
run_tests - Changed
sf_connection_manage4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "instructions": { + "description": "Follow-up instructions for the client, e.g. asking the user to open an authorization URL", + "type": "string" + }, + "message": { + "description": "Human-readable summary of the result", + "type": "string" + }, + "result": { + "description": "Action-specific payload: connection details object (describe), array of connection objects (list), array of per-environment authorization URL entries with markdown links (add), a single authorization URL entry (reauthenticate), or the removed connection (remove)" + }, + "success": { + "description": "Whether the operation succeeded", + "type": "boolean" + }, + "warning": { + "description": "Optional warning about the current connection or result", + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
sobject_create4 fields changed- changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "sObject", - "label", - "pluralLabel", - "description", - "nameFieldType", - "deploymentStatus", - "sharingModel" -]New value: +[ + "sObject", + "label", + "pluralLabel", + "nameFieldType", + "deploymentStatus", + "sharingModel" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "appliedMetadata": { + "additionalProperties": true, + "description": "The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read.", + "properties": {}, + "type": "object" + }, + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
sobject_describe4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
sobject_dml3 fields changed- changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
sobject_field_create8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Input schema / properties / description / descriptionPrevious value: -"The description for the field"New value: +"The description for the field. Recommended, but not required -- omit it, or pass '' or null, if the user asked for no description." - added
Input schema / properties / flsOverrides / items / additionalPropertiesAdded value: +false - changed
Input schema / properties / inlineHelpText / descriptionPrevious value: -"The inline help text for the field"New value: +"The inline help text for the field. Recommended, but not required -- omit it, or pass '' or null, if the user asked for no help text." - changed
Input schema / requiredPrevious value: -[ - "sObject", - "fieldName", - "fieldType", - "label", - "description", - "inlineHelpText" -]New value: +[ + "sObject", + "fieldName", + "fieldType", + "label" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "appliedMetadata": { + "additionalProperties": true, + "description": "The CustomField metadata that was actually sent to Salesforce, including any values the server filled in (e.g. defaulted or 'length'-alias-derived precision/scale). Use this to verify the field was created exactly as intended.", + "properties": {}, + "type": "object" + }, + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
sobject_field_update6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - added
Input schema / properties / flsUpdates / items / additionalPropertiesAdded value: +false - changed
Input schema / properties / properties / descriptionPrevious value: -"Properties to update. Some are required, depending on the field type. See instructions for details"New value: +"Properties to update. Omit a key to leave the stored value unchanged; pass null to clear an optional string (e.g. inlineHelpText, description); any other string is stored. Some properties are required depending on the field type. See instructions for details." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "appliedMetadata": { + "additionalProperties": true, + "description": "The full resulting CustomField metadata (existing field merged with your updates), including any values the server filled in (e.g. defaulted or 'length'-alias-derived precision/scale). Use this to verify the field now matches what was intended.", + "properties": {}, + "type": "object" + }, + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
sobject_update4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "appliedMetadata": { + "additionalProperties": true, + "description": "The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read.", + "properties": {}, + "type": "object" + }, + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
sobjects_list5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Input schema / properties / pageSize / descriptionPrevious value: -"(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically."New value: +"(optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "records": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
soql_query6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Input schema / properties / fields / descriptionPrevious value: -"List of fields to retrieve. May include relationship fields and aggregates"New value: +"List of fields to retrieve. May include relationship fields and aggregates. For ApexLog, include Body to retrieve the raw debug log text (Body is a blob and is fetched after the query; at most 5 logs with Body per call)." - changed
Input schema / properties / pageSize / descriptionPrevious value: -"(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically."New value: +"(optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "records": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
tooling_api_describe5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Input schema / properties / pageSize / descriptionPrevious value: -"(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically."New value: +"(optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "records": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
tooling_api_dml4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
tooling_api_query7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Input schema / properties / fields / descriptionPrevious value: -"List of fields to retrieve. May include relationship fields and aggregates"New value: +"List of fields to retrieve. May include relationship fields and aggregates. For ApexLog, include Body to retrieve the raw debug log text (Body is a blob and is fetched after the query; at most 5 logs with Body per call)." - added
Input schema / properties / formatAdded value: +{ + "default": "json", + "description": "When the query selects the Metadata field, or the queried Tooling sObject is metadata-backed (CustomField, CustomObject, ApexClass, Flow, Layout, PermissionSet, …), `xml` / `source` attach Metadata API retrieve files per record as `metadataXml` or `sourceFiles`. The Tooling `Metadata` JSON is left unchanged. `json` (default) is current behavior. Same retrieve path as `metadata_read` — not a conversion of the Tooling JSON.", + "enum": [ + "json", + "xml", + "source" + ], + "type": "string" +} - changed
Input schema / properties / pageSize / descriptionPrevious value: -"(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically."New value: +"(optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "apiVersion": { + "description": "API version used for the retrieve. Match this to sourceApiVersion in sfdx-project.json.", + "type": "string" + }, + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "components": { + "description": "Present when format is xml or source. Retrieved files grouped by Metadata API type and fullName.", + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "format": { + "enum": [ + "json", + "xml", + "source" + ], + "type": "string" + }, + "message": { + "type": "string" + }, + "packageDirectory": { + "type": "string" + }, + "records": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
tooling_api_search5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Input schema / properties / pageSize / descriptionPrevious value: -"(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically."New value: +"(optional) Maximum number of records to return per page when the response requires pagination, including the first page. If omitted, the first page is a short preview and later pages use an automatically calculated size." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "records": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
user_create4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
user_describe4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
user_update4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
value_set_create3 fields changed- changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "appliedMetadata": { + "additionalProperties": true, + "description": "The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read.", + "properties": {}, + "type": "object" + }, + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
- Changed
value_set_update5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team."New value: +"(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit it when this call carries the context_handle from cirra_ai_init, which names the team for the conversation. A user with more than one place to work (several teams, or a team and a personal account) must pass either the context_handle or 'cirra_ai_team' + 'sf_user'." - added
Input schema / properties / context_handleAdded value: +{ + "description": "(recommended) The conversation context handle returned by cirra_ai_init in this conversation. Pass the exact context_handle value from the most recent cirra_ai_init result so this call runs against the team and Salesforce connection selected for this conversation. A user with more than one place to work (several Cirra AI teams, or a team and a personal account) must pass either this handle or 'cirra_ai_team' + 'sf_user'; a call with neither is refused.", + "type": "string" +} - added
Input schema / properties / values / items / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "appliedMetadata": { + "additionalProperties": true, + "description": "The metadata payload that was actually sent to Salesforce for this operation (post-normalization/defaulting), so you can verify it matches what was intended without a separate read.", + "properties": {}, + "type": "object" + }, + "artifactCategory": { + "type": "string" + }, + "artifactType": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "errorCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "requestCount": { + "type": "number" + }, + "resultCount": { + "type": "number" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "skippedCount": { + "type": "number" + }, + "success": { + "type": "boolean" + }, + "successCount": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ], + "type": "object" +}
38 tool updates
- Changed
group_create1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
group_members1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
group_update1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
link_build1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
metadata_create1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
metadata_delete1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
metadata_describe1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
metadata_list1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
metadata_read1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
metadata_update1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
page_layout_clone1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
page_layout_update1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
permission_set_assignments1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
permission_set_update1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
profile_clone1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
profile_describe1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
profile_update1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
record_type_create1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
record_type_update1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
report_run1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
sf_connection_manage1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
sobject_create1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
sobject_describe1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
sobject_dml1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
sobject_field_create1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
sobject_field_update1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
sobject_update1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
sobjects_list1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
soql_query1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
tooling_api_describe1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
tooling_api_dml1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
tooling_api_query1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
tooling_api_search1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
user_create1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
user_describe1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
user_update1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
value_set_create1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
- Changed
value_set_update1 field changed- added
Input schema / properties / cirra_ai_teamAdded value: +{ + "description": "(optional) Cirra team ID or name that owns the Salesforce connection to use for this call. Must be provided together with 'sf_user'. Use it to run against a specific team's connection without changing your default team — e.g. to keep separate chats on Salesforce orgs in different teams. Omit to use your current/default team.", + "type": "string" +}
1 tool update
- Removed
logout
1 tool update
- Added
logout
1 tool update
- Changed
cirra_ai_init1 field changed- changed
Input schema / properties / cirra_ai_team / descriptionPrevious value: -"(optional) The Cirra AI team to use. Use the literal value `__Personal__` to select the user's personal account. Omit this to use the previously selected default team (if any)."New value: +"(optional) The Cirra AI team to use. Use the literal value `__Personal__` to select the user's personal account (not allowed for team-only users). Omit this to use the previously selected default team (if any)."
1 tool update
- Changed
sf_connection_manage1 field changed- changed
Input schema / properties / action / descriptionPrevious value: -"The action to perform. Options: 'list' (list all connections), 'describe' (provide details of the connection), 'add' (add a new connection), 'reauthenticate' (refresh auth for a connection), 'remove' (remove a connection)"New value: +"The action to perform. Options: 'list' (list all connections), 'describe' (provide details of the connection, including org info and current org limits such as data/file storage, daily API request usage, async job slots, etc.), 'add' (add a new connection), 'reauthenticate' (refresh auth for a connection), 'remove' (remove a connection)"
41 tool updates
- Added
cirra_ai_init - Removed
cirra_ai_retry_connection - Added
fetch_more - Added
group_create - Added
group_members - Added
group_update - Added
link_build - Added
metadata_create - Added
metadata_delete - Added
metadata_describe - Added
metadata_list - Added
metadata_read - Added
metadata_update - Added
page_layout_clone - Added
page_layout_update - Added
permission_set_assignments - Added
permission_set_update - Added
profile_clone - Added
profile_describe - Added
profile_update - Added
record_type_create - Added
record_type_update - Added
report_run - Added
sf_connection_manage - Added
sobject_create - Added
sobject_describe - Added
sobject_dml - Added
sobject_field_create - Added
sobject_field_update - Added
sobject_update - Added
sobjects_list - Added
soql_query - Added
tooling_api_describe - Added
tooling_api_dml - Added
tooling_api_query - Added
tooling_api_search - Added
user_create - Added
user_describe - Added
user_update - Added
value_set_create - Added
value_set_update
41 tool updates
- Removed
cirra_ai_init - Added
cirra_ai_retry_connection - Removed
fetch_more - Removed
group_create - Removed
group_members - Removed
group_update - Removed
link_build - Removed
metadata_create - Removed
metadata_delete - Removed
metadata_describe - Removed
metadata_list - Removed
metadata_read - Removed
metadata_update - Removed
page_layout_clone - Removed
page_layout_update - Removed
permission_set_assignments - Removed
permission_set_update - Removed
profile_clone - Removed
profile_describe - Removed
profile_update - Removed
record_type_create - Removed
record_type_update - Removed
report_run - Removed
sf_connection_manage - Removed
sobject_create - Removed
sobject_describe - Removed
sobject_dml - Removed
sobject_field_create - Removed
sobject_field_update - Removed
sobject_update - Removed
sobjects_list - Removed
soql_query - Removed
tooling_api_describe - Removed
tooling_api_dml - Removed
tooling_api_query - Removed
tooling_api_search - Removed
user_create - Removed
user_describe - Removed
user_update - Removed
value_set_create - Removed
value_set_update
1 tool update
- Changed
page_layout_update3 fields changed- added
Input schema / properties / newLayoutNameAdded value: +{ + "description": "The new name for the layout. When provided, the layout will be renamed (via clone and delete). Can be combined with patch to rename and update in a single call", + "type": "string" +} - changed
Input schema / properties / patch / descriptionPrevious value: -"The array of modifications that need to be applied. This should be provided in the `JSON Patch` format"New value: +"The array of modifications that need to be applied. This should be provided in the `JSON Patch` format. At least one of patch or newLayoutName must be provided" - changed
Input schema / requiredPrevious value: -[ - "layout", - "patch" -]New value: +[ + "layout" +]
1 tool update
- Changed
permission_set_assignments1 field changed- removed
Input schema / properties / pageSizeRemoved value: -{ - "description": "(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" -}
23 tool updates
- Changed
fetch_more1 field changed- added
Input schema / properties / pageSizeAdded value: +{ + "description": "(optional) Number of records to return in this page. If omitted, uses the page size from the original query.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Added
group_members - Removed
group_members_add - Removed
group_members_list - Removed
group_members_remove - Changed
link_build1 field changed- changed
Input schema / properties / setupConfig / properties / type / enumPrevious value: -[ - "Object", - "Field", - "Page Layout", - "Lightning Record Page", - "Button Link or Action", - "Link", - "Action", - "Record Type", - "Apex Trigger", - "Validation Rule", - "Value Set", - "Business Process", - "Flow Trigger", - "Permission Set", - "Profile", - "User", - "Flow", - "Class", - "Trigger", - "Group", - "Queue", - "Role", - "Email Template" -]New value: +[ + "Object", + "Field", + "Page Layout", + "Record Type", + "Apex Trigger", + "Validation Rule", + "Value Set", + "Business Process", + "Flow Trigger", + "Permission Set", + "Profile", + "User", + "Flow", + "Class", + "Trigger", + "Group", + "Queue", + "Role", + "Email Template", + "Report", + "Dashboard", + "Workflow Rule", + "Email Alert", + "Field Update", + "Outbound Message", + "Workflow Task" +]
- Changed
metadata_describe1 field changed- added
Input schema / properties / pageSizeAdded value: +{ + "description": "(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
metadata_list1 field changed- added
Input schema / properties / pageSizeAdded value: +{ + "description": "(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
metadata_read1 field changed- added
Input schema / properties / pageSizeAdded value: +{ + "description": "(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Removed
page_layout_create - Added
permission_set_assignments - Removed
permission_set_assignments_add - Removed
permission_set_assignments_list - Removed
permission_set_assignments_remove - Removed
permission_set_create - Removed
profile_create - Changed
report_run1 field changed- added
Input schema / properties / pageSizeAdded value: +{ + "description": "(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
sobjects_list1 field changed- added
Input schema / properties / pageSizeAdded value: +{ + "description": "(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
soql_query2 fields changed- added
Input schema / properties / havingClauseAdded value: +{ + "description": "HAVING clause to filter grouped results by aggregate conditions (e.g. 'COUNT(Id) > 5'). Requires groupBy to be set", + "type": "string" +} - added
Input schema / properties / pageSizeAdded value: +{ + "description": "(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
tooling_api_describe1 field changed- added
Input schema / properties / pageSizeAdded value: +{ + "description": "(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
tooling_api_query1 field changed- added
Input schema / properties / pageSizeAdded value: +{ + "description": "(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
tooling_api_search1 field changed- added
Input schema / properties / pageSizeAdded value: +{ + "description": "(optional) Maximum number of records to return per page when the response requires pagination. If omitted, page size is calculated automatically.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
value_set_update2 fields changed- changed
Input schema / properties / values / items / requiredPrevious value: -[ - "fullName", - "default", - "label", - "isActive", - "converted", - "forecastCategory", - "probability", - "closed", - "won", - "description" -]New value: +[ + "fullName", + "default", + "label", + "isActive" +] - changed
Input schema / requiredPrevious value: -[ - "name", - "namespace", - "type", - "values" -]New value: +[ + "name", + "values" +]
2 tool updates
- Changed
soql_query2 fields changed- changed
Input schema / properties / limit / defaultPrevious value: -100New value: +200 - changed
Input schema / properties / limit / descriptionPrevious value: -"The maximum number of records to return. The default is 100. Note: LIMIT is automatically omitted for aggregate queries without GROUP BY."New value: +"The maximum number of records to return. The default is 200. Note: LIMIT is automatically omitted for aggregate queries without GROUP BY."
- Changed
tooling_api_query2 fields changed- changed
Input schema / properties / limit / defaultPrevious value: -100New value: +200 - changed
Input schema / properties / limit / descriptionPrevious value: -"The maximum number of records to return. The default is 100. Note: LIMIT is automatically omitted for aggregate queries without GROUP BY."New value: +"The maximum number of records to return. The default is 200. Note: LIMIT is automatically omitted for aggregate queries without GROUP BY."
5 tool updates
- Added
fetch_more - Changed
metadata_create1 field changed- changed
Input schema / properties / metadata / items / additionalPropertiesPrevious value: -{}New value: +true
- Changed
metadata_list1 field changed- changed
Input schema / requiredPrevious value: -[ - "type", - "folder" -]New value: +[ + "type" +]
- Changed
metadata_update1 field changed- changed
Input schema / properties / metadata / items / additionalPropertiesPrevious value: -{}New value: +true
- Changed
sobject_dml1 field changed- changed
Input schema / properties / records / items / additionalPropertiesPrevious value: -{}New value: +true
1 tool update
- Removed
logout
48 tool updates
- Added
cirra_ai_init - Removed
cirra_ai_retry_connection - Added
group_create - Added
group_members_add - Added
group_members_list - Added
group_members_remove - Added
group_update - Added
link_build - Added
logout - Added
metadata_create - Added
metadata_delete - Added
metadata_describe - Added
metadata_list - Added
metadata_read - Added
metadata_update - Added
page_layout_clone - Added
page_layout_create - Added
page_layout_update - Added
permission_set_assignments_add - Added
permission_set_assignments_list - Added
permission_set_assignments_remove - Added
permission_set_create - Added
permission_set_update - Added
profile_clone - Added
profile_create - Added
profile_describe - Added
profile_update - Added
record_type_create - Added
record_type_update - Added
report_run - Added
sf_connection_manage - Added
sobject_create - Added
sobject_describe - Added
sobject_dml - Added
sobject_field_create - Added
sobject_field_update - Added
sobject_update - Added
sobjects_list - Added
soql_query - Added
tooling_api_describe - Added
tooling_api_dml - Added
tooling_api_query - Added
tooling_api_search - Added
user_create - Added
user_describe - Added
user_update - Added
value_set_create - Added
value_set_update
48 tool updates
- Removed
cirra_ai_init - Added
cirra_ai_retry_connection - Removed
group_create - Removed
group_members_add - Removed
group_members_list - Removed
group_members_remove - Removed
group_update - Removed
link_build - Removed
logout - Removed
metadata_create - Removed
metadata_delete - Removed
metadata_describe - Removed
metadata_list - Removed
metadata_read - Removed
metadata_update - Removed
page_layout_clone - Removed
page_layout_create - Removed
page_layout_update - Removed
permission_set_assignments_add - Removed
permission_set_assignments_list - Removed
permission_set_assignments_remove - Removed
permission_set_create - Removed
permission_set_update - Removed
profile_clone - Removed
profile_create - Removed
profile_describe - Removed
profile_update - Removed
record_type_create - Removed
record_type_update - Removed
report_run - Removed
sf_connection_manage - Removed
sobject_create - Removed
sobject_describe - Removed
sobject_dml - Removed
sobject_field_create - Removed
sobject_field_update - Removed
sobject_update - Removed
sobjects_list - Removed
soql_query - Removed
tooling_api_describe - Removed
tooling_api_dml - Removed
tooling_api_query - Removed
tooling_api_search - Removed
user_create - Removed
user_describe - Removed
user_update - Removed
value_set_create - Removed
value_set_update
8 tool updates
- Changed
group_create1 field changed- changed
Input schema / properties / properties / additionalPropertiesPrevious value: -{}New value: +true
- Changed
group_update1 field changed- changed
Input schema / properties / properties / additionalPropertiesPrevious value: -{}New value: +true
- Changed
sobject_create1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +true
- Changed
sobject_field_create1 field changed- changed
Input schema / properties / properties / additionalPropertiesPrevious value: -{}New value: +true
- Changed
sobject_field_update1 field changed- changed
Input schema / properties / properties / additionalPropertiesPrevious value: -{}New value: +true
- Changed
sobject_update1 field changed- changed
Input schema / properties / properties / additionalPropertiesPrevious value: -{}New value: +true
- Changed
tooling_api_dml1 field changed- changed
Input schema / properties / record / additionalPropertiesPrevious value: -{}New value: +true
- Changed
user_update1 field changed- changed
Input schema / properties / properties / additionalPropertiesPrevious value: -{}New value: +true
Related MCP Connectors
I manage your Support Agent CRM, pipeline analytics, follow-ups, Leads Discovery, and workspace out…
Salesforce & HubSpot: dedupe, normalize, enrich, assign, job change, create, mass update, segment
Wrenk — managed Salesforce, ServiceNow & HubSpot operations from your own AI.
Manage products, orders, customers, inventory, and store configuration
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceIntegrates Claude with Salesforce to enable natural language querying, modification, and management of Salesforce records and metadata. It supports comprehensive operations including object/field management, SOSL searches, and Apex code execution.1,901 npm1MIT
- AlicenseAqualityDmaintenanceEnables natural language interactions with Salesforce data and metadata, allowing users to query records, manage custom objects, and manipulate Apex code. It provides comprehensive tools for schema exploration, aggregate queries, and field-level security management.151,901 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables natural language interactions with Salesforce, allowing users to query and modify data, manage custom objects and fields, execute Apex code, and perform SOQL/SOSL searches across Salesforce organizations.1,901 npmMIT
- AlicenseAqualityCmaintenanceEnables AI assistants to interact with Salesforce through a secure interface for performing CRUD operations, executing SOQL queries, and managing schema discovery. It features a smart learning system that analyzes custom objects and fields to provide intelligent assistance tailored to specific Salesforce configurations.1432 npm17BSD 2-Clause "Simplified"
Glama MCP Gateway
Add one secure layer between your agents and this server.