cURL
curl 'https://api.gumloop.com/api/v1/mcp/tools/call' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"team_id": "team_4f8c92ab",
"calls": [
{
"ref": "send-1",
"server_id": "gumloop_slack",
"tool_name": "slack_send_message",
"arguments": {"channel": "#general", "text": "Hello from Gumloop"}
}
]
}'from gumloop import Gumloop
client = Gumloop(access_token="YOUR_ACCESS_TOKEN")
response = client.mcp.execute(
server_id="gumloop_slack",
tool_name="slack_send_message",
arguments={"channel": "#general", "text": "Hello from Gumloop"},
ref="send-1",
team_id="team_4f8c92ab",
)
for result in response.results:
print(result.ref, result.status)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
calls: [
{
server_id: 'gumloop_slack',
tool_name: 'slack_send_message',
ref: 'send-1',
arguments: {channel: '#general', text: 'Hello from Gumloop'}
}
],
team_id: 'team_4f8c92ab'
})
};
fetch('https://api.gumloop.com/api/v1/mcp/tools/call', 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.gumloop.com/api/v1/mcp/tools/call",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'calls' => [
[
'server_id' => 'gumloop_slack',
'tool_name' => 'slack_send_message',
'ref' => 'send-1',
'arguments' => [
'channel' => '#general',
'text' => 'Hello from Gumloop'
]
]
],
'team_id' => 'team_4f8c92ab'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.gumloop.com/api/v1/mcp/tools/call"
payload := strings.NewReader("{\n \"calls\": [\n {\n \"server_id\": \"gumloop_slack\",\n \"tool_name\": \"slack_send_message\",\n \"ref\": \"send-1\",\n \"arguments\": {\n \"channel\": \"#general\",\n \"text\": \"Hello from Gumloop\"\n }\n }\n ],\n \"team_id\": \"team_4f8c92ab\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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.gumloop.com/api/v1/mcp/tools/call")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"calls\": [\n {\n \"server_id\": \"gumloop_slack\",\n \"tool_name\": \"slack_send_message\",\n \"ref\": \"send-1\",\n \"arguments\": {\n \"channel\": \"#general\",\n \"text\": \"Hello from Gumloop\"\n }\n }\n ],\n \"team_id\": \"team_4f8c92ab\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gumloop.com/api/v1/mcp/tools/call")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"calls\": [\n {\n \"server_id\": \"gumloop_slack\",\n \"tool_name\": \"slack_send_message\",\n \"ref\": \"send-1\",\n \"arguments\": {\n \"channel\": \"#general\",\n \"text\": \"Hello from Gumloop\"\n }\n }\n ],\n \"team_id\": \"team_4f8c92ab\"\n}"
response = http.request(request)
puts response.read_body{
"results": [
{
"ref": "send-1",
"server_id": "gumloop_slack",
"tool_name": "slack_send_message",
"status": "success",
"content": [
{
"type": "text",
"text": "Message sent to #general"
}
],
"error": null
}
]
}Call MCP tools
Execute a batch of 1–5 MCP tool calls. Calls run concurrently and each result reports its own status.
POST
/
mcp
/
tools
/
call
cURL
curl 'https://api.gumloop.com/api/v1/mcp/tools/call' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"team_id": "team_4f8c92ab",
"calls": [
{
"ref": "send-1",
"server_id": "gumloop_slack",
"tool_name": "slack_send_message",
"arguments": {"channel": "#general", "text": "Hello from Gumloop"}
}
]
}'from gumloop import Gumloop
client = Gumloop(access_token="YOUR_ACCESS_TOKEN")
response = client.mcp.execute(
server_id="gumloop_slack",
tool_name="slack_send_message",
arguments={"channel": "#general", "text": "Hello from Gumloop"},
ref="send-1",
team_id="team_4f8c92ab",
)
for result in response.results:
print(result.ref, result.status)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
calls: [
{
server_id: 'gumloop_slack',
tool_name: 'slack_send_message',
ref: 'send-1',
arguments: {channel: '#general', text: 'Hello from Gumloop'}
}
],
team_id: 'team_4f8c92ab'
})
};
fetch('https://api.gumloop.com/api/v1/mcp/tools/call', 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.gumloop.com/api/v1/mcp/tools/call",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'calls' => [
[
'server_id' => 'gumloop_slack',
'tool_name' => 'slack_send_message',
'ref' => 'send-1',
'arguments' => [
'channel' => '#general',
'text' => 'Hello from Gumloop'
]
]
],
'team_id' => 'team_4f8c92ab'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.gumloop.com/api/v1/mcp/tools/call"
payload := strings.NewReader("{\n \"calls\": [\n {\n \"server_id\": \"gumloop_slack\",\n \"tool_name\": \"slack_send_message\",\n \"ref\": \"send-1\",\n \"arguments\": {\n \"channel\": \"#general\",\n \"text\": \"Hello from Gumloop\"\n }\n }\n ],\n \"team_id\": \"team_4f8c92ab\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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.gumloop.com/api/v1/mcp/tools/call")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"calls\": [\n {\n \"server_id\": \"gumloop_slack\",\n \"tool_name\": \"slack_send_message\",\n \"ref\": \"send-1\",\n \"arguments\": {\n \"channel\": \"#general\",\n \"text\": \"Hello from Gumloop\"\n }\n }\n ],\n \"team_id\": \"team_4f8c92ab\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gumloop.com/api/v1/mcp/tools/call")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"calls\": [\n {\n \"server_id\": \"gumloop_slack\",\n \"tool_name\": \"slack_send_message\",\n \"ref\": \"send-1\",\n \"arguments\": {\n \"channel\": \"#general\",\n \"text\": \"Hello from Gumloop\"\n }\n }\n ],\n \"team_id\": \"team_4f8c92ab\"\n}"
response = http.request(request)
puts response.read_body{
"results": [
{
"ref": "send-1",
"server_id": "gumloop_slack",
"tool_name": "slack_send_message",
"status": "success",
"content": [
{
"type": "text",
"text": "Message sent to #general"
}
],
"error": null
}
]
}How are errors and credit checks reported?
How are errors and credit checks reported?
When Gumloop accepts the request, MCP execution failures such as target server authentication, policy blocks, invalid tools, upstream HTTP errors, and connection failures are returned in
results[*].status and results[*].error. A credit check runs before the tool calls; insufficient credits return HTTP 402 credit_limit_exceeded. Top-level 4xx responses are reserved for Gumloop request, authentication, permission, and credit failures. 200 covers homogeneous execution outcomes (all calls succeeded or all calls failed); mixed success/failure batches return 207. If you previously treated non-2xx HTTP statuses as MCP execution failures, update your integration to inspect each result’s status and error.Authorizations
Body
application/json
Response
Batch processed. Inspect each result's status and error; this can include all-success and all-failed execution outcomes.
Show child attributes
Show child attributes
Was this page helpful?