curl --request POST \
--url https://api.reasonmachines.ai/v3/organizations/{orgId}/mcp-servers/{id}/oauth-import \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"access_token": "<string>",
"expires_at": "2023-11-07T05:31:56Z",
"source_application": "<string>",
"device_label": "<string>",
"refresh_token": "<string>",
"scopes": "<string>",
"replace_existing": false,
"acknowledgement": "reason_owns_refresh_token",
"client": {
"client_id": "<string>",
"client_secret": "<string>"
}
}
'import requests
url = "https://api.reasonmachines.ai/v3/organizations/{orgId}/mcp-servers/{id}/oauth-import"
payload = {
"access_token": "<string>",
"expires_at": "2023-11-07T05:31:56Z",
"source_application": "<string>",
"device_label": "<string>",
"refresh_token": "<string>",
"scopes": "<string>",
"replace_existing": False,
"acknowledgement": "reason_owns_refresh_token",
"client": {
"client_id": "<string>",
"client_secret": "<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({
access_token: '<string>',
expires_at: '2023-11-07T05:31:56Z',
source_application: '<string>',
device_label: '<string>',
refresh_token: '<string>',
scopes: '<string>',
replace_existing: false,
acknowledgement: 'reason_owns_refresh_token',
client: {client_id: '<string>', client_secret: '<string>'}
})
};
fetch('https://api.reasonmachines.ai/v3/organizations/{orgId}/mcp-servers/{id}/oauth-import', 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.reasonmachines.ai/v3/organizations/{orgId}/mcp-servers/{id}/oauth-import",
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([
'access_token' => '<string>',
'expires_at' => '2023-11-07T05:31:56Z',
'source_application' => '<string>',
'device_label' => '<string>',
'refresh_token' => '<string>',
'scopes' => '<string>',
'replace_existing' => false,
'acknowledgement' => 'reason_owns_refresh_token',
'client' => [
'client_id' => '<string>',
'client_secret' => '<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.reasonmachines.ai/v3/organizations/{orgId}/mcp-servers/{id}/oauth-import"
payload := strings.NewReader("{\n \"access_token\": \"<string>\",\n \"expires_at\": \"2023-11-07T05:31:56Z\",\n \"source_application\": \"<string>\",\n \"device_label\": \"<string>\",\n \"refresh_token\": \"<string>\",\n \"scopes\": \"<string>\",\n \"replace_existing\": false,\n \"acknowledgement\": \"reason_owns_refresh_token\",\n \"client\": {\n \"client_id\": \"<string>\",\n \"client_secret\": \"<string>\"\n }\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.reasonmachines.ai/v3/organizations/{orgId}/mcp-servers/{id}/oauth-import")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"access_token\": \"<string>\",\n \"expires_at\": \"2023-11-07T05:31:56Z\",\n \"source_application\": \"<string>\",\n \"device_label\": \"<string>\",\n \"refresh_token\": \"<string>\",\n \"scopes\": \"<string>\",\n \"replace_existing\": false,\n \"acknowledgement\": \"reason_owns_refresh_token\",\n \"client\": {\n \"client_id\": \"<string>\",\n \"client_secret\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.ai/v3/organizations/{orgId}/mcp-servers/{id}/oauth-import")
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 \"access_token\": \"<string>\",\n \"expires_at\": \"2023-11-07T05:31:56Z\",\n \"source_application\": \"<string>\",\n \"device_label\": \"<string>\",\n \"refresh_token\": \"<string>\",\n \"scopes\": \"<string>\",\n \"replace_existing\": false,\n \"acknowledgement\": \"reason_owns_refresh_token\",\n \"client\": {\n \"client_id\": \"<string>\",\n \"client_secret\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"connected": true,
"mode": "temporary",
"expires_at": "2023-11-07T05:31:56Z",
"refresh_owned_by_reason": true,
"refresh_tested": false
}{
"error": "prompt_required"
}{
"error": "missing_scope",
"required_scope": "sessions:read"
}{
"error": "session_not_found"
}{
"error": "last_owner"
}Import a local MCP OAuth credential
Validates and imports a locally held OAuth credential for an existing MCP server. Temporary mode never stores or refreshes a refresh token. Transfer mode takes ownership of the supplied refresh-token chain. The access token is validated immediately; the refresh token is not exercised until the access token expires because testing it could rotate the local client’s token chain. Token values are write-only and never returned.
Scope:mcp:writecurl --request POST \
--url https://api.reasonmachines.ai/v3/organizations/{orgId}/mcp-servers/{id}/oauth-import \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"access_token": "<string>",
"expires_at": "2023-11-07T05:31:56Z",
"source_application": "<string>",
"device_label": "<string>",
"refresh_token": "<string>",
"scopes": "<string>",
"replace_existing": false,
"acknowledgement": "reason_owns_refresh_token",
"client": {
"client_id": "<string>",
"client_secret": "<string>"
}
}
'import requests
url = "https://api.reasonmachines.ai/v3/organizations/{orgId}/mcp-servers/{id}/oauth-import"
payload = {
"access_token": "<string>",
"expires_at": "2023-11-07T05:31:56Z",
"source_application": "<string>",
"device_label": "<string>",
"refresh_token": "<string>",
"scopes": "<string>",
"replace_existing": False,
"acknowledgement": "reason_owns_refresh_token",
"client": {
"client_id": "<string>",
"client_secret": "<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({
access_token: '<string>',
expires_at: '2023-11-07T05:31:56Z',
source_application: '<string>',
device_label: '<string>',
refresh_token: '<string>',
scopes: '<string>',
replace_existing: false,
acknowledgement: 'reason_owns_refresh_token',
client: {client_id: '<string>', client_secret: '<string>'}
})
};
fetch('https://api.reasonmachines.ai/v3/organizations/{orgId}/mcp-servers/{id}/oauth-import', 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.reasonmachines.ai/v3/organizations/{orgId}/mcp-servers/{id}/oauth-import",
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([
'access_token' => '<string>',
'expires_at' => '2023-11-07T05:31:56Z',
'source_application' => '<string>',
'device_label' => '<string>',
'refresh_token' => '<string>',
'scopes' => '<string>',
'replace_existing' => false,
'acknowledgement' => 'reason_owns_refresh_token',
'client' => [
'client_id' => '<string>',
'client_secret' => '<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.reasonmachines.ai/v3/organizations/{orgId}/mcp-servers/{id}/oauth-import"
payload := strings.NewReader("{\n \"access_token\": \"<string>\",\n \"expires_at\": \"2023-11-07T05:31:56Z\",\n \"source_application\": \"<string>\",\n \"device_label\": \"<string>\",\n \"refresh_token\": \"<string>\",\n \"scopes\": \"<string>\",\n \"replace_existing\": false,\n \"acknowledgement\": \"reason_owns_refresh_token\",\n \"client\": {\n \"client_id\": \"<string>\",\n \"client_secret\": \"<string>\"\n }\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.reasonmachines.ai/v3/organizations/{orgId}/mcp-servers/{id}/oauth-import")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"access_token\": \"<string>\",\n \"expires_at\": \"2023-11-07T05:31:56Z\",\n \"source_application\": \"<string>\",\n \"device_label\": \"<string>\",\n \"refresh_token\": \"<string>\",\n \"scopes\": \"<string>\",\n \"replace_existing\": false,\n \"acknowledgement\": \"reason_owns_refresh_token\",\n \"client\": {\n \"client_id\": \"<string>\",\n \"client_secret\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.ai/v3/organizations/{orgId}/mcp-servers/{id}/oauth-import")
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 \"access_token\": \"<string>\",\n \"expires_at\": \"2023-11-07T05:31:56Z\",\n \"source_application\": \"<string>\",\n \"device_label\": \"<string>\",\n \"refresh_token\": \"<string>\",\n \"scopes\": \"<string>\",\n \"replace_existing\": false,\n \"acknowledgement\": \"reason_owns_refresh_token\",\n \"client\": {\n \"client_id\": \"<string>\",\n \"client_secret\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"connected": true,
"mode": "temporary",
"expires_at": "2023-11-07T05:31:56Z",
"refresh_owned_by_reason": true,
"refresh_tested": false
}{
"error": "prompt_required"
}{
"error": "missing_scope",
"required_scope": "sessions:read"
}{
"error": "session_not_found"
}{
"error": "last_owner"
}Authorizations
Your Reason API key from Settings > API. New keys use reason_; legacy ara_ keys remain accepted. Keys are capability-scoped: run, mcp:read, mcp:write, secrets:read, secrets:write, sessions:read, sessions:debug, knowledge:read, memory:read, memory:write, skills:read, skills:write, repos:read, repos:write, reviews:read, reviews:write, deployment:read, analytics:read, org:read, org:write, attachments:read, attachments:write, guardrails:read, guardrails:write, automations:read, automations:write, agent_auth:read. mcp:write manages MCP server configuration only; it does not authorize remote MCP-tool execution. sessions:debug is privileged: it expands diagnostic session events only for organization owners/admins.
Path Parameters
Organization id or slug. Resolve it with GET /v3/self.
The MCP server id.
Body
Imports a local OAuth credential for an existing HTTP MCP server. Temporary mode stores only the access token until expiry. Transfer mode also stores the refresh token and originating OAuth client, and requires acknowledgement that Reason owns future refreshes.
temporary, transfer Write-only OAuth access token. Never returned.
65536120120Write-only. Transfer mode only.
655368192Required as true to replace an existing OAuth connection.
"reason_owns_refresh_token"Show child attributes
Show child attributes
Response
Credential imported and verified.
temporary, transfer Always false. Testing an imported refresh token could rotate or invalidate the local client's token chain.

