Update scope MCP config
curl --request PATCH \
--url https://api.getmodus.com/api/v1/scopes/{id}/mcp-config \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"config": {
"coreTools": {
"chat": {
"enabled": true
},
"get_context": {
"enabled": true
}
},
"mcpToolExposure": {
"mode": "all"
}
}
}
'import requests
url = "https://api.getmodus.com/api/v1/scopes/{id}/mcp-config"
payload = { "config": {
"coreTools": {
"chat": { "enabled": True },
"get_context": { "enabled": True }
},
"mcpToolExposure": { "mode": "all" }
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
config: {
coreTools: {chat: {enabled: true}, get_context: {enabled: true}},
mcpToolExposure: {mode: 'all'}
}
})
};
fetch('https://api.getmodus.com/api/v1/scopes/{id}/mcp-config', 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.getmodus.com/api/v1/scopes/{id}/mcp-config",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'config' => [
'coreTools' => [
'chat' => [
'enabled' => true
],
'get_context' => [
'enabled' => true
]
],
'mcpToolExposure' => [
'mode' => 'all'
]
]
]),
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.getmodus.com/api/v1/scopes/{id}/mcp-config"
payload := strings.NewReader("{\n \"config\": {\n \"coreTools\": {\n \"chat\": {\n \"enabled\": true\n },\n \"get_context\": {\n \"enabled\": true\n }\n },\n \"mcpToolExposure\": {\n \"mode\": \"all\"\n }\n }\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.getmodus.com/api/v1/scopes/{id}/mcp-config")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"config\": {\n \"coreTools\": {\n \"chat\": {\n \"enabled\": true\n },\n \"get_context\": {\n \"enabled\": true\n }\n },\n \"mcpToolExposure\": {\n \"mode\": \"all\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getmodus.com/api/v1/scopes/{id}/mcp-config")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"config\": {\n \"coreTools\": {\n \"chat\": {\n \"enabled\": true\n },\n \"get_context\": {\n \"enabled\": true\n }\n },\n \"mcpToolExposure\": {\n \"mode\": \"all\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"config": {
"coreTools": {},
"mcpToolExposure": {}
}
}{
"error": {
"code": "BAD_REQUEST",
"status": "INVALID_ARGUMENT",
"message": "Invalid value for query parameter `pageSize`.",
"requestId": "req_01HQ7K8ABCDEFGHIJKLMNOPQRS"
}
}{
"error": {
"code": "UNAUTHORIZED",
"status": "UNAUTHENTICATED",
"message": "Missing or invalid access token.",
"requestId": "req_01HQ7K8ABCDEFGHIJKLMNOPQRS"
}
}{
"error": {
"code": "FORBIDDEN",
"status": "PERMISSION_DENIED",
"message": "Missing required scope(s) for this operation.",
"requestId": "req_01HQ7K8ABCDEFGHIJKLMNOPQRS",
"info": {
"missing": [
"<required-scope>"
]
}
}
}{
"error": {
"code": "NOT_FOUND",
"status": "NOT_FOUND",
"message": "Resource not found.",
"requestId": "req_01HQ7K8ABCDEFGHIJKLMNOPQRS"
}
}{
"error": {
"code": "CONFLICT",
"status": "ALREADY_EXISTS",
"message": "A resource with that identifier already exists.",
"requestId": "req_01HQ7K8ABCDEFGHIJKLMNOPQRS"
}
}{
"error": {
"code": "VALIDATION",
"status": "INVALID_ARGUMENT",
"message": "Updates that would revoke your own access are not allowed.",
"requestId": "req_01HQ7K8ABCDEFGHIJKLMNOPQRS"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"status": "INTERNAL",
"message": "An unexpected error occurred.",
"requestId": "req_01HQ7K8ABCDEFGHIJKLMNOPQRS"
}
}Scopes
Update scope MCP config
Writes coreTools and mcpToolExposure to the scope draft variation. Changes take effect for MCP clients on the next scope deploy — the active (published) variation is not mutated live. Requires manage permission; unpublished scopes return 404.
Requires: scopes:write
PATCH
/
api
/
v1
/
scopes
/
{id}
/
mcp-config
Update scope MCP config
curl --request PATCH \
--url https://api.getmodus.com/api/v1/scopes/{id}/mcp-config \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"config": {
"coreTools": {
"chat": {
"enabled": true
},
"get_context": {
"enabled": true
}
},
"mcpToolExposure": {
"mode": "all"
}
}
}
'import requests
url = "https://api.getmodus.com/api/v1/scopes/{id}/mcp-config"
payload = { "config": {
"coreTools": {
"chat": { "enabled": True },
"get_context": { "enabled": True }
},
"mcpToolExposure": { "mode": "all" }
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
config: {
coreTools: {chat: {enabled: true}, get_context: {enabled: true}},
mcpToolExposure: {mode: 'all'}
}
})
};
fetch('https://api.getmodus.com/api/v1/scopes/{id}/mcp-config', 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.getmodus.com/api/v1/scopes/{id}/mcp-config",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'config' => [
'coreTools' => [
'chat' => [
'enabled' => true
],
'get_context' => [
'enabled' => true
]
],
'mcpToolExposure' => [
'mode' => 'all'
]
]
]),
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.getmodus.com/api/v1/scopes/{id}/mcp-config"
payload := strings.NewReader("{\n \"config\": {\n \"coreTools\": {\n \"chat\": {\n \"enabled\": true\n },\n \"get_context\": {\n \"enabled\": true\n }\n },\n \"mcpToolExposure\": {\n \"mode\": \"all\"\n }\n }\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.getmodus.com/api/v1/scopes/{id}/mcp-config")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"config\": {\n \"coreTools\": {\n \"chat\": {\n \"enabled\": true\n },\n \"get_context\": {\n \"enabled\": true\n }\n },\n \"mcpToolExposure\": {\n \"mode\": \"all\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getmodus.com/api/v1/scopes/{id}/mcp-config")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"config\": {\n \"coreTools\": {\n \"chat\": {\n \"enabled\": true\n },\n \"get_context\": {\n \"enabled\": true\n }\n },\n \"mcpToolExposure\": {\n \"mode\": \"all\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"config": {
"coreTools": {},
"mcpToolExposure": {}
}
}{
"error": {
"code": "BAD_REQUEST",
"status": "INVALID_ARGUMENT",
"message": "Invalid value for query parameter `pageSize`.",
"requestId": "req_01HQ7K8ABCDEFGHIJKLMNOPQRS"
}
}{
"error": {
"code": "UNAUTHORIZED",
"status": "UNAUTHENTICATED",
"message": "Missing or invalid access token.",
"requestId": "req_01HQ7K8ABCDEFGHIJKLMNOPQRS"
}
}{
"error": {
"code": "FORBIDDEN",
"status": "PERMISSION_DENIED",
"message": "Missing required scope(s) for this operation.",
"requestId": "req_01HQ7K8ABCDEFGHIJKLMNOPQRS",
"info": {
"missing": [
"<required-scope>"
]
}
}
}{
"error": {
"code": "NOT_FOUND",
"status": "NOT_FOUND",
"message": "Resource not found.",
"requestId": "req_01HQ7K8ABCDEFGHIJKLMNOPQRS"
}
}{
"error": {
"code": "CONFLICT",
"status": "ALREADY_EXISTS",
"message": "A resource with that identifier already exists.",
"requestId": "req_01HQ7K8ABCDEFGHIJKLMNOPQRS"
}
}{
"error": {
"code": "VALIDATION",
"status": "INVALID_ARGUMENT",
"message": "Updates that would revoke your own access are not allowed.",
"requestId": "req_01HQ7K8ABCDEFGHIJKLMNOPQRS"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"status": "INTERNAL",
"message": "An unexpected error occurred.",
"requestId": "req_01HQ7K8ABCDEFGHIJKLMNOPQRS"
}
}Authorizations
A Modus personal access token (modus_<orgUuid>_<prefix>_<secret>) or an OAuth 2.1 access token, sent as Authorization: Bearer <token>.
Path Parameters
Numeric scope id.
Example:
42
Body
application/json
Full MCP interface config to apply live on the published scope (and mirrored to draft when forked).
Show child attributes
Show child attributes
Response
Sanitized MCP config now stored on the published variation.
Show child attributes
Show child attributes
⌘I