AI bots
List an MCP server's tools again
New tools start off, and tools the server no longer lists are dropped. The rest take the server’s new description and schema and keep their switch, unless their effect changed (for example from read to delete): such a tool is switched off.
Needs the we_bots.update permission.
POST
/
api
/
company
/
v2026-10
/
bot-connections
/
{id}
/
refresh-tools
List an MCP server's tools again
curl --request POST \
--url https://api.fluid.app/api/company/v2026-10/bot-connections/{id}/refresh-tools \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/company/v2026-10/bot-connections/{id}/refresh-tools"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/company/v2026-10/bot-connections/{id}/refresh-tools', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/company/v2026-10/bot-connections/{id}/refresh-tools",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/company/v2026-10/bot-connections/{id}/refresh-tools"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fluid.app/api/company/v2026-10/bot-connections/{id}/refresh-tools")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/bot-connections/{id}/refresh-tools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"bot_connection": {
"id": "0190a1b2-7c3d-7e4f-8a5b-6c7d8e9f0a99",
"kind": "mcp_server",
"scope": "company",
"connector_key": "remote_mcp",
"name": "Helpdesk",
"mcp_host": "mcp.helpdesk.example",
"status": "active",
"connected_by_admin_id": "0190a1b2-7c3d-7e4f-8a5b-6c7d8e9f0a2c",
"has_api_key": true,
"tools_refreshed_at": "2026-10-25T09:00:00.000Z",
"last_used_at": null,
"created_at": "2026-10-25T09:00:00.000Z",
"tools": [
{
"name": "search_tickets",
"description": "Find tickets.",
"effect": "read",
"enabled": false
}
]
},
"status": 200,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-25T09:00:00Z"
}
}{
"message": "Invalid credentials."
}{
"error": {
"message": "Only the person who connected this can change it",
"details": {
"type": "not_connector"
}
},
"status": 403,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-25T09:00:00Z"
}
}{
"error": {
"message": "Connection not found",
"details": {}
},
"status": 404,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-25T09:00:00Z"
}
}{
"error": {
"message": "The MCP server turned the key down",
"details": {
"type": "mcp_unauthorized"
}
},
"status": 422,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-25T09:00:00Z"
}
}{
"error": {
"message": "The MCP server could not be reached",
"details": {
"type": "mcp_unreachable"
}
},
"status": 502,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-25T09:00:00Z"
}
}Authorizations
The session token of an admin of your company. Company API, partner and droplet installation tokens are refused.
Path Parameters
The connection's id.
Response
The connection with its refreshed tools.
⌘I
List an MCP server's tools again
curl --request POST \
--url https://api.fluid.app/api/company/v2026-10/bot-connections/{id}/refresh-tools \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/company/v2026-10/bot-connections/{id}/refresh-tools"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/company/v2026-10/bot-connections/{id}/refresh-tools', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/company/v2026-10/bot-connections/{id}/refresh-tools",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/company/v2026-10/bot-connections/{id}/refresh-tools"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fluid.app/api/company/v2026-10/bot-connections/{id}/refresh-tools")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/bot-connections/{id}/refresh-tools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"bot_connection": {
"id": "0190a1b2-7c3d-7e4f-8a5b-6c7d8e9f0a99",
"kind": "mcp_server",
"scope": "company",
"connector_key": "remote_mcp",
"name": "Helpdesk",
"mcp_host": "mcp.helpdesk.example",
"status": "active",
"connected_by_admin_id": "0190a1b2-7c3d-7e4f-8a5b-6c7d8e9f0a2c",
"has_api_key": true,
"tools_refreshed_at": "2026-10-25T09:00:00.000Z",
"last_used_at": null,
"created_at": "2026-10-25T09:00:00.000Z",
"tools": [
{
"name": "search_tickets",
"description": "Find tickets.",
"effect": "read",
"enabled": false
}
]
},
"status": 200,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-25T09:00:00Z"
}
}{
"message": "Invalid credentials."
}{
"error": {
"message": "Only the person who connected this can change it",
"details": {
"type": "not_connector"
}
},
"status": 403,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-25T09:00:00Z"
}
}{
"error": {
"message": "Connection not found",
"details": {}
},
"status": 404,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-25T09:00:00Z"
}
}{
"error": {
"message": "The MCP server turned the key down",
"details": {
"type": "mcp_unauthorized"
}
},
"status": 422,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-25T09:00:00Z"
}
}{
"error": {
"message": "The MCP server could not be reached",
"details": {
"type": "mcp_unreachable"
}
},
"status": 502,
"meta": {
"request_uuid": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-25T09:00:00Z"
}
}