curl --request POST \
--url https://api.devic.ai/v1/tenant-mcp \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'origin: <origin>' \
--data '
{
"templateId": "<string>",
"url": "<string>",
"name": "<string>",
"auth": {
"headerName": "<string>",
"headerValue": "<string>",
"upstreamOAuth": {
"clientId": "<string>",
"clientSecret": "<string>",
"scopes": [
"<string>"
]
}
},
"returnTo": "<string>",
"tenantId": "<string>",
"subtenantId": "<string>"
}
'import requests
url = "https://api.devic.ai/v1/tenant-mcp"
payload = {
"templateId": "<string>",
"url": "<string>",
"name": "<string>",
"auth": {
"headerName": "<string>",
"headerValue": "<string>",
"upstreamOAuth": {
"clientId": "<string>",
"clientSecret": "<string>",
"scopes": ["<string>"]
}
},
"returnTo": "<string>",
"tenantId": "<string>",
"subtenantId": "<string>"
}
headers = {
"origin": "<origin>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
origin: '<origin>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
templateId: '<string>',
url: '<string>',
name: '<string>',
auth: {
headerName: '<string>',
headerValue: '<string>',
upstreamOAuth: {clientId: '<string>', clientSecret: '<string>', scopes: ['<string>']}
},
returnTo: '<string>',
tenantId: '<string>',
subtenantId: '<string>'
})
};
fetch('https://api.devic.ai/v1/tenant-mcp', 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.devic.ai/v1/tenant-mcp",
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([
'templateId' => '<string>',
'url' => '<string>',
'name' => '<string>',
'auth' => [
'headerName' => '<string>',
'headerValue' => '<string>',
'upstreamOAuth' => [
'clientId' => '<string>',
'clientSecret' => '<string>',
'scopes' => [
'<string>'
]
]
],
'returnTo' => '<string>',
'tenantId' => '<string>',
'subtenantId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"origin: <origin>"
],
]);
$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.devic.ai/v1/tenant-mcp"
payload := strings.NewReader("{\n \"templateId\": \"<string>\",\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"auth\": {\n \"headerName\": \"<string>\",\n \"headerValue\": \"<string>\",\n \"upstreamOAuth\": {\n \"clientId\": \"<string>\",\n \"clientSecret\": \"<string>\",\n \"scopes\": [\n \"<string>\"\n ]\n }\n },\n \"returnTo\": \"<string>\",\n \"tenantId\": \"<string>\",\n \"subtenantId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("origin", "<origin>")
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.devic.ai/v1/tenant-mcp")
.header("origin", "<origin>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"templateId\": \"<string>\",\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"auth\": {\n \"headerName\": \"<string>\",\n \"headerValue\": \"<string>\",\n \"upstreamOAuth\": {\n \"clientId\": \"<string>\",\n \"clientSecret\": \"<string>\",\n \"scopes\": [\n \"<string>\"\n ]\n }\n },\n \"returnTo\": \"<string>\",\n \"tenantId\": \"<string>\",\n \"subtenantId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.devic.ai/v1/tenant-mcp")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["origin"] = '<origin>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"templateId\": \"<string>\",\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"auth\": {\n \"headerName\": \"<string>\",\n \"headerValue\": \"<string>\",\n \"upstreamOAuth\": {\n \"clientId\": \"<string>\",\n \"clientSecret\": \"<string>\",\n \"scopes\": [\n \"<string>\"\n ]\n }\n },\n \"returnTo\": \"<string>\",\n \"tenantId\": \"<string>\",\n \"subtenantId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyConnect an MCP server
Either templateId (the url comes from the developer’s configuration and any url in the body is ignored) or url for a server of your own. Returns status: "active" when the server needed no authorization, or authorizationUrl to open in a popup. If the server requires a pre-registered OAuth client, requiresClientCredentials comes back with the callbackUrl to authorize on it — send them in auth.upstreamOAuth and try again.
curl --request POST \
--url https://api.devic.ai/v1/tenant-mcp \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'origin: <origin>' \
--data '
{
"templateId": "<string>",
"url": "<string>",
"name": "<string>",
"auth": {
"headerName": "<string>",
"headerValue": "<string>",
"upstreamOAuth": {
"clientId": "<string>",
"clientSecret": "<string>",
"scopes": [
"<string>"
]
}
},
"returnTo": "<string>",
"tenantId": "<string>",
"subtenantId": "<string>"
}
'import requests
url = "https://api.devic.ai/v1/tenant-mcp"
payload = {
"templateId": "<string>",
"url": "<string>",
"name": "<string>",
"auth": {
"headerName": "<string>",
"headerValue": "<string>",
"upstreamOAuth": {
"clientId": "<string>",
"clientSecret": "<string>",
"scopes": ["<string>"]
}
},
"returnTo": "<string>",
"tenantId": "<string>",
"subtenantId": "<string>"
}
headers = {
"origin": "<origin>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
origin: '<origin>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
templateId: '<string>',
url: '<string>',
name: '<string>',
auth: {
headerName: '<string>',
headerValue: '<string>',
upstreamOAuth: {clientId: '<string>', clientSecret: '<string>', scopes: ['<string>']}
},
returnTo: '<string>',
tenantId: '<string>',
subtenantId: '<string>'
})
};
fetch('https://api.devic.ai/v1/tenant-mcp', 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.devic.ai/v1/tenant-mcp",
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([
'templateId' => '<string>',
'url' => '<string>',
'name' => '<string>',
'auth' => [
'headerName' => '<string>',
'headerValue' => '<string>',
'upstreamOAuth' => [
'clientId' => '<string>',
'clientSecret' => '<string>',
'scopes' => [
'<string>'
]
]
],
'returnTo' => '<string>',
'tenantId' => '<string>',
'subtenantId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"origin: <origin>"
],
]);
$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.devic.ai/v1/tenant-mcp"
payload := strings.NewReader("{\n \"templateId\": \"<string>\",\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"auth\": {\n \"headerName\": \"<string>\",\n \"headerValue\": \"<string>\",\n \"upstreamOAuth\": {\n \"clientId\": \"<string>\",\n \"clientSecret\": \"<string>\",\n \"scopes\": [\n \"<string>\"\n ]\n }\n },\n \"returnTo\": \"<string>\",\n \"tenantId\": \"<string>\",\n \"subtenantId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("origin", "<origin>")
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.devic.ai/v1/tenant-mcp")
.header("origin", "<origin>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"templateId\": \"<string>\",\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"auth\": {\n \"headerName\": \"<string>\",\n \"headerValue\": \"<string>\",\n \"upstreamOAuth\": {\n \"clientId\": \"<string>\",\n \"clientSecret\": \"<string>\",\n \"scopes\": [\n \"<string>\"\n ]\n }\n },\n \"returnTo\": \"<string>\",\n \"tenantId\": \"<string>\",\n \"subtenantId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.devic.ai/v1/tenant-mcp")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["origin"] = '<origin>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"templateId\": \"<string>\",\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"auth\": {\n \"headerName\": \"<string>\",\n \"headerValue\": \"<string>\",\n \"upstreamOAuth\": {\n \"clientId\": \"<string>\",\n \"clientSecret\": \"<string>\",\n \"scopes\": [\n \"<string>\"\n ]\n }\n },\n \"returnTo\": \"<string>\",\n \"tenantId\": \"<string>\",\n \"subtenantId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyAuthorizations
Use JWT token for authentication
Headers
Body
Id of an MCP server the developer offers pre-filled. Its url is used; any url in this body is ignored.
https url of a server the end user brings. Only when the assistant allows custom servers, and only without templateId.
Display name. Defaults to the template’s.
Show child attributes
Show child attributes
Absolute URL of the page starting the flow. Must match this request’s Origin or one of the assistant’s allowed widget sources. The popup is returned there once the authorization completes.
Tenant, when not using a signed session.
End user inside the tenant. Omit to connect a server the whole tenant shares.
Response
Registered