curl --request GET \
--url https://api.egp.scale.com/v5/agent_configs/mcp_toolsimport requests
url = "https://api.egp.scale.com/v5/agent_configs/mcp_tools"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.egp.scale.com/v5/agent_configs/mcp_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.egp.scale.com/v5/agent_configs/mcp_tools",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.egp.scale.com/v5/agent_configs/mcp_tools"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.egp.scale.com/v5/agent_configs/mcp_tools")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.egp.scale.com/v5/agent_configs/mcp_tools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body[
"Slack"
]List MCP Tool Names
Return the fixed set of tool names that route to MCP servers rather than harness-provided tools.
These are the subset of allowed_tools values (Slack, Linear, GitHub, …)
the platform treats as MCP servers; the list is a static enum, not account
data, so it is identical for every caller. It is exposed mainly so the
generated SDK carries the McpTool type and the frontend can assert its own
MCP-versus-harness tool classifier against the backend to prevent drift. It
does not list configs or the tools actually granted to any particular config.
curl --request GET \
--url https://api.egp.scale.com/v5/agent_configs/mcp_toolsimport requests
url = "https://api.egp.scale.com/v5/agent_configs/mcp_tools"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.egp.scale.com/v5/agent_configs/mcp_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.egp.scale.com/v5/agent_configs/mcp_tools",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.egp.scale.com/v5/agent_configs/mcp_tools"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.egp.scale.com/v5/agent_configs/mcp_tools")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.egp.scale.com/v5/agent_configs/mcp_tools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body[
"Slack"
]Response
Successful Response
Subset of AllowedTool values that represent MCP servers.
Single source of truth for which tool names route to MCPs (Linear,
Notion, ...) vs harness-provided tools (Read, Bash, ...). Values must
stay aligned with the matching AllowedTool members.
The frontend reads this enum's members via the generated SDK
(components['schemas']['McpTool']). Its own MCP_TOOLS list in
egp-annotation/.../beta/build/custom/_api/constants.ts is asserted at
compile time to be a SUBSET of this enum, so renaming or removing a member
here fails the frontend typecheck. The reverse is deliberately not enforced:
a name can exist here while the UI still hides it, which is how a server is
staged before its OAuth flow is ready.
Like AllowedTool, this list is permissive by design. Presence here only
means the API accepts the name; the golden agent's catalog decides whether it
resolves, and MCP_TOOLS decides whether it is offered.
Slack, Linear, GitHub, Confluence, Notion, Datadog, PagerDuty, Salesforce, Figma, Granola, Jira, Gmail, GoogleCalendar, GoogleDrive, GoogleDocs, GoogleSheets, GoogleSlides, Snowflake, Redash, Tableau, Metabase, Gong, ZoomInfo, Clay 
