curl --request POST \
--url https://api.runaether.dev/v1/mcp-servers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"display_name": "<string>",
"key": "<string>",
"kind": "http",
"required": true,
"url": "<string>",
"api_key": true,
"headers": {}
}
'import requests
url = "https://api.runaether.dev/v1/mcp-servers"
payload = {
"display_name": "<string>",
"key": "<string>",
"kind": "http",
"required": True,
"url": "<string>",
"api_key": True,
"headers": {}
}
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({
display_name: '<string>',
key: '<string>',
kind: 'http',
required: true,
url: '<string>',
api_key: true,
headers: {}
})
};
fetch('https://api.runaether.dev/v1/mcp-servers', 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.runaether.dev/v1/mcp-servers",
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([
'display_name' => '<string>',
'key' => '<string>',
'kind' => 'http',
'required' => true,
'url' => '<string>',
'api_key' => true,
'headers' => [
]
]),
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.runaether.dev/v1/mcp-servers"
payload := strings.NewReader("{\n \"display_name\": \"<string>\",\n \"key\": \"<string>\",\n \"kind\": \"http\",\n \"required\": true,\n \"url\": \"<string>\",\n \"api_key\": true,\n \"headers\": {}\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.runaether.dev/v1/mcp-servers")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"display_name\": \"<string>\",\n \"key\": \"<string>\",\n \"kind\": \"http\",\n \"required\": true,\n \"url\": \"<string>\",\n \"api_key\": true,\n \"headers\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/v1/mcp-servers")
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 \"display_name\": \"<string>\",\n \"key\": \"<string>\",\n \"kind\": \"http\",\n \"required\": true,\n \"url\": \"<string>\",\n \"api_key\": true,\n \"headers\": {}\n}"
response = http.request(request)
puts response.read_body{
"mcp_server": {
"auth": "none",
"connection_kind": "static_secret",
"created_at": "2023-11-07T05:31:56Z",
"default_credential_policy": "creator",
"display_name": "<string>",
"enabled_by_default": true,
"headers": {},
"homepage": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"key": "<string>",
"kind": "http",
"plugin_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"required": true,
"secret_names": [
"<string>"
],
"source": "manual",
"updated_at": "2023-11-07T05:31:56Z",
"url": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"code": "org_membership_required",
"error": "<string>"
}{
"code": "mcp_server_key_invalid",
"error": "<string>"
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}Add an MCP server to the organization's catalog
A remote (http) server’s URL is probed and the auth it finds stored. A local (stdio) server is validated, never run, and its auth derived from its declared secret variables. The server is enabled on every current project of the organization, and every project created later, with its default credential policy: the task creator’s connection for a server that needs a credential, none otherwise.
curl --request POST \
--url https://api.runaether.dev/v1/mcp-servers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"display_name": "<string>",
"key": "<string>",
"kind": "http",
"required": true,
"url": "<string>",
"api_key": true,
"headers": {}
}
'import requests
url = "https://api.runaether.dev/v1/mcp-servers"
payload = {
"display_name": "<string>",
"key": "<string>",
"kind": "http",
"required": True,
"url": "<string>",
"api_key": True,
"headers": {}
}
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({
display_name: '<string>',
key: '<string>',
kind: 'http',
required: true,
url: '<string>',
api_key: true,
headers: {}
})
};
fetch('https://api.runaether.dev/v1/mcp-servers', 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.runaether.dev/v1/mcp-servers",
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([
'display_name' => '<string>',
'key' => '<string>',
'kind' => 'http',
'required' => true,
'url' => '<string>',
'api_key' => true,
'headers' => [
]
]),
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.runaether.dev/v1/mcp-servers"
payload := strings.NewReader("{\n \"display_name\": \"<string>\",\n \"key\": \"<string>\",\n \"kind\": \"http\",\n \"required\": true,\n \"url\": \"<string>\",\n \"api_key\": true,\n \"headers\": {}\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.runaether.dev/v1/mcp-servers")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"display_name\": \"<string>\",\n \"key\": \"<string>\",\n \"kind\": \"http\",\n \"required\": true,\n \"url\": \"<string>\",\n \"api_key\": true,\n \"headers\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/v1/mcp-servers")
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 \"display_name\": \"<string>\",\n \"key\": \"<string>\",\n \"kind\": \"http\",\n \"required\": true,\n \"url\": \"<string>\",\n \"api_key\": true,\n \"headers\": {}\n}"
response = http.request(request)
puts response.read_body{
"mcp_server": {
"auth": "none",
"connection_kind": "static_secret",
"created_at": "2023-11-07T05:31:56Z",
"default_credential_policy": "creator",
"display_name": "<string>",
"enabled_by_default": true,
"headers": {},
"homepage": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"key": "<string>",
"kind": "http",
"plugin_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"required": true,
"secret_names": [
"<string>"
],
"source": "manual",
"updated_at": "2023-11-07T05:31:56Z",
"url": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"code": "org_membership_required",
"error": "<string>"
}{
"code": "mcp_server_key_invalid",
"error": "<string>"
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
- Option 1
- Option 2
1 - 100^[a-z][a-z0-9_-]{0,31}$http True: a task is not created until the connection its project's credential policy names can be used, and a turn that cannot reach the server fails, naming it. False, the Integrations tab's default: a task whose connection cannot be used starts without the server, and its agent is not given it.
1 - 2048^https://True: authenticate with an API key sent as a bearer token (auth static_secret) instead of the OAuth the server advertises; refused for a server that asks for no credential. False or omitted: the auth the probe finds. The URL is probed again when it changed or when an API-key server stops being one; a server's connections go when its URL or auth changes.
Non-secret headers sent upstream on every request, as a local .mcp.json entry's headers: GitHub's X-MCP-Toolsets, for one. Never Authorization, Accept, Content-Type, Last-Event-ID or an Mcp-* header. Omitted: none. One of Aether's own servers keeps the headers Aether defines for it (X-MCP-Readonly on github_readonly).
Show child attributes
Show child attributes
Response
Created
- Option 1
- Option 2
Show child attributes
Show child attributes