Edit author-editable metadata on a single tool (response_field_map, is_enabled, input_defaults — defaults + pinned)
Update author-editable tool metadata.
Three mutable fields:
response_field_map— the customer-owned field map ({"field_mappings": [...]}) selecting which response fields the agent receives. Narrows the agent-facing payload and drives the AOP compiler’skind=llm→kind=actionpromotion (ENG-631). Omit the field to no-op; pass an explicitnullto clear. The response shape (response_schema) is sync-owned and read-only over this API (D2), so it is rejected by the request schema’sextra="forbid".is_enabled— turn the individual tool on/off (the PRD’s per-tool toggle). A disabled tool is excluded from resolution, so the agent can no longer call it. Omit to no-op.input_defaults— operator input-arg config for input fields ({field_name: {"value": ..., "type": "default"|"pinned"}}, ENG-590). Adefaultis a suggestion the agent may overwrite; apinnedvalue the caller cannot overwrite. Validated against the tool’s currentinput_schema: an unknown field or wrong-type value is rejected with a 422 listing each offending field. Omit to no-op; pass an explicitnullto clear. Surfaced on every tool read (default_count/pinned_count/stale_input_fields/merged_input_preview); neither kind is injected into a tool call in this scope (runtime enforcement is a follow-on).
Only the fields the caller actually set are written. Verifies parent-connection org ownership before the tool update so a correctly-org’d tool id under a foreign-org connection still 404s.
Authorizations
Body
Author-editable fields on a single IntegrationConnectionTool.
Three mutable fields: response_field_map (the customer-owned field map
{"field_mappings": [...]} that narrows the agent-facing response and
drives the AOP compiler's kind=llm → kind=action promotion),
is_enabled (turn the individual tool on/off for the agent), and
input_defaults (operator input-arg config,
{field_name: {"value": ..., "type": "default"|"pinned"}} — ENG-590; a
default may be overwritten by the agent, a pinned value cannot).
input_defaults is validated at the service layer against the row's current
input_schema (it needs the row, which a Pydantic validator can't see), so a
wrong-type value or unknown field is rejected there with a 422. The response
shape (response_schema) is sync-owned and read-only over the API
(ENG-631 D2), so it is deliberately NOT accepted here — extra="forbid"
rejects it with a 422.
Pydantic's model_fields_set is used at the service layer to distinguish
"omit this field" (no-op) from "explicit None" (clear the field).
Response
Successful Response
Stable identifier for each supported integration.
The string value must match the vendor's per-provider identifier
(for Nango: provider_config_key). Persisted on
integration_connections.integration_key and
integration_connection_tools.integration_key.
Adding a new integration: append a member here, add an
IntegrationSpec to INTEGRATIONS, register the provider in the
vendor cloud via src/integrations/bootstrap.py (Step 3).
slack, custom_mcp, notion, google_drive, calcom, twilio, email Saved field-map paths no longer present in the shape (ENG-631 D4).
How many input fields carry an operator default (ENG-590 / PRD 7.7).
How many input fields are operator-pinned (ENG-590).
Configured input fields removed/renamed/retyped by a re-sync (PRD 7.6).
input_schema with each operator value injected (PRD 7.8).