Exchange or refresh OAuth tokens
Exchanges an authorization code for tokens or refreshes an existing token pair. The endpoint accepts application/x-www-form-urlencoded, application/json, or raw form-encoded payloads.
curl -X POST "https://api.example.com/mcp-server/token" \
-H "Content-Type: application/json" \
-d '{
"grant_type": "authorization_code",
"code": "mcp_code_example_1234567890abcdef",
"redirect_uri": "https://client.example.app/callback",
"client_id": "mcp_client_example_1234567890abcdef",
"code_verifier": "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
}'
import requests
import json
url = "https://api.example.com/mcp-server/token"
headers = {
"Content-Type": "application/json"
}
data = {
"grant_type": "authorization_code",
"code": "mcp_code_example_1234567890abcdef",
"redirect_uri": "https://client.example.app/callback",
"client_id": "mcp_client_example_1234567890abcdef",
"code_verifier": "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const response = await fetch("https://api.example.com/mcp-server/token", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"grant_type": "authorization_code",
"code": "mcp_code_example_1234567890abcdef",
"redirect_uri": "https://client.example.app/callback",
"client_id": "mcp_client_example_1234567890abcdef",
"code_verifier": "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
})
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
"bytes"
"encoding/json"
)
func main() {
data := []byte(`{
"grant_type": "authorization_code",
"code": "mcp_code_example_1234567890abcdef",
"redirect_uri": "https://client.example.app/callback",
"client_id": "mcp_client_example_1234567890abcdef",
"code_verifier": "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
}`)
req, err := http.NewRequest("POST", "https://api.example.com/mcp-server/token", bytes.NewBuffer(data))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://api.example.com/mcp-server/token')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request.body = '{
"grant_type": "authorization_code",
"code": "mcp_code_example_1234567890abcdef",
"redirect_uri": "https://client.example.app/callback",
"client_id": "mcp_client_example_1234567890abcdef",
"code_verifier": "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
}'
response = http.request(request)
puts response.body
{
"access_token": "mcp_at_example_1234567890abcdef",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "mcp_rt_example_rotated_abcdef1234567890",
"scope": "mcp"
}
{
"error": "invalid_grant",
"error_description": "The authorization code or refresh token is invalid or expired."
}
{
"error": "unsupported_grant_type",
"error_description": "The specified grant_type is not supported."
}
{
"code": 500,
"message": "Internal server error"
}
/token
Target server for requests. Edit to use your own host.
The media type of the request body
OAuth grant type.
Authorization code for the authorization code grant.
Redirect URI used in the original authorization request.
Registered OAuth client identifier.
PKCE code verifier, required when a code challenge was set.
Refresh token for the refresh token grant.
Request Preview
Response
Response will appear here after sending the request
Body
Authorization code for the authorization code grant.
mcp_code_example_1234567890abcdefRedirect URI used in the original authorization request.
https://client.example.app/callbackPKCE code verifier, required when a code challenge was set.
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXkRefresh token for the refresh token grant.
mcp_rt_example_1234567890abcdefResponses
OAuth access token with a 1-hour expiry.
Bearer token type.
BearerAccess token lifetime in seconds.
Refresh token with a 30-day expiry.
Granted scope.