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 has been superseded: it is left out of everything an author or an LLM
browses or searches to pick a tool (the tool listing, catalog search and describe, integration
tool counts, the skill generator's tool summary), so nothing new attaches it. Unlike
Tool.IsInternal it still resolves wherever a tool is named explicitly: a listing by
ids (how the editor renders an agent's attached tools) and the plan builder, so revisions
that already call it keep running and keep editing until a sweep moves them off it.
True when the tool completes asynchronously. The run can suspend while the operation completes. Defaults to false; currently set only by supported predefined asynchronous tools.
int64Tool id can consist of only letters, numbers, underscores and hyphens.
int64Integration
Category of a tool's execution backend. Serialized as an UPPER_SNAKE string.
"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"Counts the writes that changed what this tool does (Tools.ToolDefinitionFingerprint): its request, script, MCP tool or parameters, not its name or description. A Tools.ToolActionTypeReview names the version it approved, so any such change voids it. A concurrency token on workspace tools: two writes made from the same version cannot both land, so a review can never end up attached to a definition its reviewer did not see.
int32The last explicit review of Tool.ActionType by a signed-in person, or null if there has been none. Whether it still applies is Tool.ActionTypeReviewState. Always null on a built-in tool, whose classification is written in this repository instead.
Whether this tool delivers a message into a participant's live conversation channel — set to 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",
"annotations": {
"readOnlyHint": null,
"destructiveHint": null,
"idempotentHint": null,
"openWorldHint": null
},
"resultType": "STRING"
},
"codeTool": {
"code": "string",
"timeoutSeconds": 0,
"packages": [
"string"
],
"resultType": "STRING"
}
},
"isInternal": false,
"isDeprecated": false,
"isAsync": false,
"createdAt": 0,
"id": "string",
"modifiedAt": 0,
"integrationId": "string",
"displayName": "string",
"description": "string",
"toolType": "API",
"isModifiable": true,
"actionType": "READ_ONLY",
"definitionVersion": 0,
"actionTypeReview": {
"actionType": "READ_ONLY",
"definitionVersion": 0,
"reviewedAt": 0,
"reviewedBy": "string"
},
"actionTypeReviewState": "REVIEWED",
"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",
"tableHint": {
"rowKey": "string",
"readOnlyColumns": [],
"maxRows": null
},
"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.