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.
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" \ -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
}Creates a new AI Tool.
Registers a new tool definition under the integration. The request body carries the integration ID it should belong to; the route `integration` is currently scoped for routing and logging only, so callers should ensure the two match. After creation, expose the tool to agents or MCP clients by adding its ID to the relevant allowlist.
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.