Updates an existing Python script tool.
Replaces the Python-script tool definition at `(integration, tool)`; the script body and its input schema are validated together before the write commits, so a malformed script or schema returns 400 without modifying the stored definition. This is the script-tool counterpart to `PUT /integrations/{integration}/tools/{tool}` and must be used for tools whose execution is sandboxed Python rather than an HTTP call.
Authorization
Bearer JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token.
In: header
Path Parameters
The integration identifier.
The unique identifier of the AI Tool.
The tenant identifier
The updated AI Tool data.
When true, hides this tool from listing APIs. Used for internal platform tools.
When true, the tool implements IAsyncPredefinedTool — its work completes
out-of-band, so the executor dispatches via StartAsync (suspending the run)
instead of the synchronous ExecuteAsync. Default false; only predefined
async tools set it. See docs/design/async-operations.md.
int64Tool id can consist of only letters, numbers, underscores and hyphens.
int64Integration
Categorization of a tool's execution backend. Wire form is UPPER_SNAKE
per project convention; Unspecified = 0 is the AIP-126 zero-sentinel.
"UNSPECIFIED" | "API" | "PREDEFINED" | "AGENT_TOOL" | "PYTHON_SCRIPT" | "LLM_BUILT_IN" | "MCP" | "AGENT_TASK"Classifies the tool's side-effect behavior: read-only, reversible, or irreversible. Used to inform users and agents about the risk level of executing this tool.
"UNSPECIFIED" | "READ_ONLY" | "REVERSIBLE" | "IRREVERSIBLE"Whether this tool delivers a message into a participant's live conversation channel — set to Fruxon.Model.Tools.Common.ToolMessagingRole.ChannelSend for the raw channel senders (Telegram/Slack/ Discord/WhatsApp/SMS). Drives the channel-send withhold on orchestrator dialogue runs.
"UNSPECIFIED" | "CHANNEL_SEND"Authentication settings for a tool — whether it supports OAuth and, if so, the OAuth scope sets it can request.
Response Body
curl -X PUT "https://api.fruxon.com/v1/tenants/string/integrations/string/tools/string:python" \ -H "Content-Type: application/json" \ -d '{ "descriptor": {} }'{
"descriptor": {
"apiTool": {
"headers": {},
"httpMethod": "string",
"url": "string",
"queryParameters": {},
"body": "string",
"bodyContentType": "string",
"formParameters": {},
"resultType": "STRING",
"resultTransformExpression": "string",
"pagination": {
"cursorPath": "string",
"hasMorePath": "string",
"offset": null,
"linkHeader": null
},
"successStatusCodes": [
0
],
"multipart": {
"parts": []
},
"timeoutMs": 0,
"responseSchema": null
},
"predefinedTool": {
"resultType": "STRING"
},
"mcpTool": {
"serverUrl": "string",
"mcpToolName": "string",
"resultType": "STRING"
},
"codeTool": {
"code": "string",
"timeoutSeconds": 0,
"packages": [
"string"
],
"resultType": "STRING"
}
},
"isInternal": false,
"isAsync": false,
"createdAt": 0,
"id": "string",
"modifiedAt": 0,
"integrationId": "string",
"displayName": "string",
"description": "string",
"toolType": "API",
"isModifiable": true,
"actionType": "READ_ONLY",
"messagingRole": "CHANNEL_SEND",
"resultType": "STRING",
"parametersMetadata": [
{
"name": "string",
"index": 0,
"type": "STRING",
"typeName": "STRING",
"integerRange": {
"min": 0,
"max": 0
},
"floatRange": {
"min": 0,
"max": 0
},
"options": [],
"asset": {
"providers": null,
"contentTypes": null,
"vectorized": false
},
"displayName": "string",
"description": "string",
"required": false,
"secret": false,
"secretResolvable": false,
"defaultValue": "string",
"jsonSchema": null,
"minLength": 0,
"maxLength": 0,
"pattern": "string",
"validator": "string",
"uiHint": "CODE",
"rules": []
}
],
"authSettings": {
"supportsOAuth": false,
"oAuth": [
{
"scopeSize": 0,
"scopes": [],
"userScopes": [],
"allScopes": [],
"requiresResourceAuth": false,
"successfulOAuthRedirect": "string"
}
]
}
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}Updates an existing AI Tool.
Replaces the API-tool definition at `(integration, tool)` wholesale with the supplied object; this is a PUT, not a patch, so any field omitted from the body is reset. Use this for HTTP-based tools only — Python script tools must go through `/integrations/{integration}/tools/{tool}:python`, which validates the script payload differently.
Runs a tool with the provided parameters.
Resolves the tool by ID within the integration and executes it. When `configId` is set the tool runs against that config's currently published revision — the server resolves its (encrypted) credentials internally, so no secret ever travels in the request. Omit `configId` for SYSTEM / no-auth tools (e.g. File Tools), which run against an empty placeholder config. An optional `resultSelect` previews the agent runtime's `result_select` field projection over a JSON result; it is preview-only and never persisted. Every value in `parameters` must be sent as a JSON <b>string</b>, whatever the parameter's declared type — `"count": "3"`, `"dryRun": "true"`, `"rows": "[[1,2]]"`. The bag is typed server-side against the tool's declared parameters; sending a bare number, boolean or object fails model binding with 400 `"The JSON value could not be converted to System.String"`. The result comes back both ways: `response` is the flattened string form (unchanged), and `resultType` / `jsonValue` / `fileLink` carry the shape the tool actually returned, so a caller need not sniff `response` nor fetch the tool's metadata to learn its type.