Finish connecting an MCP server with OAuth
curl --request POST \
--url https://api.runaether.dev/v1/mcp-servers/oauth/callback \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"state": "<string>",
"code": "<string>",
"error": "<string>",
"iss": "<string>"
}
'import requests
url = "https://api.runaether.dev/v1/mcp-servers/oauth/callback"
payload = {
"state": "<string>",
"code": "<string>",
"error": "<string>",
"iss": "<string>"
}
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({state: '<string>', code: '<string>', error: '<string>', iss: '<string>'})
};
fetch('https://api.runaether.dev/v1/mcp-servers/oauth/callback', 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/oauth/callback",
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([
'state' => '<string>',
'code' => '<string>',
'error' => '<string>',
'iss' => '<string>'
]),
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/oauth/callback"
payload := strings.NewReader("{\n \"state\": \"<string>\",\n \"code\": \"<string>\",\n \"error\": \"<string>\",\n \"iss\": \"<string>\"\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/oauth/callback")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"state\": \"<string>\",\n \"code\": \"<string>\",\n \"error\": \"<string>\",\n \"iss\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/v1/mcp-servers/oauth/callback")
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 \"state\": \"<string>\",\n \"code\": \"<string>\",\n \"error\": \"<string>\",\n \"iss\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"mcp_server_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"oauth_error": "<string>",
"status": "connected"
}{
"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>"
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}MCP Servers
Finish connecting an MCP server with OAuth
Finishes an OAuth connection with the authorization response the browser brought back. Only the user who started it finishes it, while still a member of the server’s organization (and, for the organization’s connection, an owner or admin); a response finished in another user’s session is refused before its code is redeemed. The outcome is a typed status; the grant is stored encrypted when it is connected.
POST
/
mcp-servers
/
oauth
/
callback
Finish connecting an MCP server with OAuth
curl --request POST \
--url https://api.runaether.dev/v1/mcp-servers/oauth/callback \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"state": "<string>",
"code": "<string>",
"error": "<string>",
"iss": "<string>"
}
'import requests
url = "https://api.runaether.dev/v1/mcp-servers/oauth/callback"
payload = {
"state": "<string>",
"code": "<string>",
"error": "<string>",
"iss": "<string>"
}
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({state: '<string>', code: '<string>', error: '<string>', iss: '<string>'})
};
fetch('https://api.runaether.dev/v1/mcp-servers/oauth/callback', 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/oauth/callback",
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([
'state' => '<string>',
'code' => '<string>',
'error' => '<string>',
'iss' => '<string>'
]),
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/oauth/callback"
payload := strings.NewReader("{\n \"state\": \"<string>\",\n \"code\": \"<string>\",\n \"error\": \"<string>\",\n \"iss\": \"<string>\"\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/oauth/callback")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"state\": \"<string>\",\n \"code\": \"<string>\",\n \"error\": \"<string>\",\n \"iss\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/v1/mcp-servers/oauth/callback")
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 \"state\": \"<string>\",\n \"code\": \"<string>\",\n \"error\": \"<string>\",\n \"iss\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"mcp_server_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"oauth_error": "<string>",
"status": "connected"
}{
"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>"
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"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
application/json
Response
OK
Pattern:
^[A-Za-z0-9_.-]{1,64}$Available options:
connected, invalid_state, state_expired, other_user, not_authorized, iss_mismatch, authorization_failed, exchange_failed, token_invalid, server_changed