FruxonDocs
IntegrationsTools

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.

PUT
/v1/tenants/{tenant}/integrations/{integration}/tools/{tool}:python
AuthorizationBearer <token>

JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token.

In: header

Path Parameters

integration*string

The integration identifier.

tool*string

The unique identifier of the AI Tool.

tenant*string

The tenant identifier

The updated AI Tool data.

descriptor*
isInternal?boolean

When true, hides this tool from listing APIs. Used for internal platform tools.

isAsync?boolean

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.

createdAt?integer
Formatint64
id?string

Tool id can consist of only letters, numbers, underscores and hyphens.

modifiedAt?integer
Formatint64
integrationId?string

Integration

displayName?string|null
description?string
toolType?string

Categorization of a tool's execution backend. Wire form is UPPER_SNAKE per project convention; Unspecified = 0 is the AIP-126 zero-sentinel.

Value in"UNSPECIFIED" | "API" | "PREDEFINED" | "AGENT_TOOL" | "PYTHON_SCRIPT" | "LLM_BUILT_IN" | "MCP" | "AGENT_TASK"
actionType?string

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.

Value in"UNSPECIFIED" | "READ_ONLY" | "REVERSIBLE" | "IRREVERSIBLE"
messagingRole?string

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.

Value in"UNSPECIFIED" | "CHANNEL_SEND"
parametersMetadata?
authSettings?

Authentication settings for a tool — whether it supports OAuth and, if so, the OAuth scope sets it can request.

[key: string]?never

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
}
Empty
Empty
{
  "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.