curl --request POST \
--url https://api.qovery.com/organization/{organizationId}/mcpServer/qovery \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Qovery MCP",
"description": ""
}
'import requests
url = "https://api.qovery.com/organization/{organizationId}/mcpServer/qovery"
payload = {
"name": "Qovery MCP",
"description": ""
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'Qovery MCP', description: ''})
};
fetch('https://api.qovery.com/organization/{organizationId}/mcpServer/qovery', 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.qovery.com/organization/{organizationId}/mcpServer/qovery",
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([
'name' => 'Qovery MCP',
'description' => ''
]),
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.qovery.com/organization/{organizationId}/mcpServer/qovery"
payload := strings.NewReader("{\n \"name\": \"Qovery MCP\",\n \"description\": \"\"\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.qovery.com/organization/{organizationId}/mcpServer/qovery")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Qovery MCP\",\n \"description\": \"\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qovery.com/organization/{organizationId}/mcpServer/qovery")
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 \"name\": \"Qovery MCP\",\n \"description\": \"\"\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"name": "<string>",
"description": "<string>",
"url": "<string>",
"header_names": [
"<string>"
],
"scope": "ORGANIZATION",
"attachable": true,
"owner_user_sub": "<string>",
"owner_name": "<string>"
}Create a read-only Qovery MCP connector
Create a connector to Qovery’s own MCP server in READ-ONLY mode. Scope is always
ORGANIZATION; this endpoint accepts no scope parameter.
During the request, an organization API token is generated, bound to the Viewer role,
and stored as the encrypted Authorization connector header. The token is never returned
in the response; header_names will contain Authorization.
The generated token is visible and revocable in the organization’s API token list. Deleting the connector does not revoke the generated token; revoke it separately from the API token list.
403 — Access forbidden: Requires the MANAGE_INFRASTRUCTURE permission. Viewer and
Billing callers cannot mint API tokens and are rejected with 403.
Only one Qovery MCP connector is allowed per organization; a second call returns 409.
curl --request POST \
--url https://api.qovery.com/organization/{organizationId}/mcpServer/qovery \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Qovery MCP",
"description": ""
}
'import requests
url = "https://api.qovery.com/organization/{organizationId}/mcpServer/qovery"
payload = {
"name": "Qovery MCP",
"description": ""
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'Qovery MCP', description: ''})
};
fetch('https://api.qovery.com/organization/{organizationId}/mcpServer/qovery', 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.qovery.com/organization/{organizationId}/mcpServer/qovery",
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([
'name' => 'Qovery MCP',
'description' => ''
]),
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.qovery.com/organization/{organizationId}/mcpServer/qovery"
payload := strings.NewReader("{\n \"name\": \"Qovery MCP\",\n \"description\": \"\"\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.qovery.com/organization/{organizationId}/mcpServer/qovery")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Qovery MCP\",\n \"description\": \"\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qovery.com/organization/{organizationId}/mcpServer/qovery")
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 \"name\": \"Qovery MCP\",\n \"description\": \"\"\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"name": "<string>",
"description": "<string>",
"url": "<string>",
"header_names": [
"<string>"
],
"scope": "ORGANIZATION",
"attachable": true,
"owner_user_sub": "<string>",
"owner_name": "<string>"
}Authorizations
JWT tokens should be used with OIDC account (human to machine). JWT tokens used by the Qovery console to communicate with the API have a TTL. Curl Example ' curl https://console.qovery.com/organization -H "Authorization: Bearer $qovery_token" '
Path Parameters
Organization ID
Body
Response
Qovery MCP connector created
HTTPS URL of the remote MCP server
^https://Names of the configured HTTP headers. Header values are never returned.
ORGANIZATION: usable by every member who can edit an agentic workflow. USER: personal to the member who created it; only that member can attach or edit it.
ORGANIZATION, USER Whether the member making this request may attach the connector to an agentic workflow. Computed per caller: an organization admin sees every USER connector but can attach none of them, so a picker must use this rather than scope alone.
Identity of the owning member. Null for an ORGANIZATION connector.
Display name of the owning member. Null for an ORGANIZATION connector.
Was this page helpful?