curl --request POST 'https://api.voicecheap.ai/oauth/register' \
--header 'Content-Type: application/json' \
--data '{"client_name":"Acme assistant","redirect_uris":["https://assistant.example.com/oauth/callback"],"token_endpoint_auth_method":"none","grant_types":["authorization_code","refresh_token"],"response_types":["code"],"scope":"account:read projects:read offline_access"}'
const input = {
client_name: 'Acme assistant',
redirect_uris: ['https://assistant.example.com/oauth/callback'],
token_endpoint_auth_method: 'none',
grant_types: ['authorization_code', 'refresh_token'],
response_types: ['code'],
scope: 'account:read projects:read offline_access',
};
const response = await fetch('https://api.voicecheap.ai/oauth/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(input),
redirect: 'manual',
});
console.log(response.status, await response.text());
import os
import requests
response = requests.request(
"POST",
"https://api.voicecheap.ai/oauth/register",
headers={"Content-Type":"application/json"},
json={"client_name": "Acme assistant", "redirect_uris": ["https://assistant.example.com/oauth/callback"], "token_endpoint_auth_method": "none", "grant_types": ["authorization_code", "refresh_token"], "response_types": ["code"], "scope": "account:read projects:read offline_access"},
timeout=120,
allow_redirects=False,
)
print(response.status_code, response.text)
OAuth- und MCP-Protokoll
Einen MCP-OAuth-Client registrieren
Registrieren Sie einen öffentlichen Client mit exakten Callback-URLs und einer begrenzten Menge an Produktberechtigungen.
POST
/
oauth
/
register
curl --request POST 'https://api.voicecheap.ai/oauth/register' \
--header 'Content-Type: application/json' \
--data '{"client_name":"Acme assistant","redirect_uris":["https://assistant.example.com/oauth/callback"],"token_endpoint_auth_method":"none","grant_types":["authorization_code","refresh_token"],"response_types":["code"],"scope":"account:read projects:read offline_access"}'
const input = {
client_name: 'Acme assistant',
redirect_uris: ['https://assistant.example.com/oauth/callback'],
token_endpoint_auth_method: 'none',
grant_types: ['authorization_code', 'refresh_token'],
response_types: ['code'],
scope: 'account:read projects:read offline_access',
};
const response = await fetch('https://api.voicecheap.ai/oauth/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(input),
redirect: 'manual',
});
console.log(response.status, await response.text());
import os
import requests
response = requests.request(
"POST",
"https://api.voicecheap.ai/oauth/register",
headers={"Content-Type":"application/json"},
json={"client_name": "Acme assistant", "redirect_uris": ["https://assistant.example.com/oauth/callback"], "token_endpoint_auth_method": "none", "grant_types": ["authorization_code", "refresh_token"], "response_types": ["code"], "scope": "account:read projects:read offline_access"},
timeout=120,
allow_redirects=False,
)
print(response.status_code, response.text)
Registrieren Sie einen öffentlichen Client mit exakten Callback-URLs und einer begrenzten Menge an Produktberechtigungen.
POST https://api.voicecheap.ai/oauth/register
Authentifizierung
Keine. Die Registrierung meldet keinen Benutzer an und autorisiert keine Kontoverbindung.Anfragetext
array
erforderlich
Zwischen 1 und 10 Callbacks vor dem Entfernen von Duplikaten.Mindestanzahl an Elementen: 1. Höchstanzahl an Elementen: 10.
string
Optionale Client-Bezeichnung; führende und nachgestellte Leerzeichen werden vor dem Speichern entfernt, und der Wert darf danach nicht leer sein.Mindestlänge: 1. Höchstlänge: 120. Muster:
^(?=.*\S)[^\u0000-\u001F\u007F]+$. Standardwert: “MCP client”.field
Nur öffentliche Clients.Erforderlicher Wert: “none”. Standardwert: “none”.
union
Muss authorization_code enthalten; refresh_token ist optional. Bei Auslassung oder null werden beide ausgewählt. Doppelte Werte werden entfernt.Standardwert: [“authorization_code”,“refresh_token”].
array
Liste von Werten. Die Struktur der Elemente finden Sie im vollständigen Eingabeschema.Mindestanzahl an Elementen: 1. Höchstanzahl an Elementen: 1. Standardwert: [“code”].
string
Durch Leerzeichen getrennte Berechtigungen aus scopes_supported, optional einschließlich offline_access. Nicht unterstützte Namen und Werte, die nur aus Leerraum bestehen, werden abgelehnt; Duplikate werden entfernt. Wird scope weggelassen oder werden keine Produktberechtigungen angegeben, etwa nur openid oder nur offline_access, werden alle unterstützten Produktberechtigungen registriert. email erfordert openid; email allein wird abgelehnt. Wenn OpenID Connect verfügbar ist, umfasst die Registrierung openid und email als Clientfähigkeiten, auch wenn scope fehlt. Die Registrierung gewährt keinen Zugriff; Identitätsberechtigungen erfordern eine ausdrückliche Autorisierungsanfrage und die Zustimmung des Benutzers.Mindestlänge: 1. Höchstlänge: 2048. Muster:
^ *(?:account:read|usage:read|settings:read|settings:write|team:read|team:write|projects:read|projects:write|projects:delete|translations:write|transcription:read|transcription:write|subtitles:read|subtitles:write|tts:read|tts:write|voices:read|voices:write|images:read|images:write|thumbnails:read|thumbnails:write|folders:read|folders:write|glossary:read|glossary:write|webhooks:read|webhooks:write|publishing:read|publishing:write|offline_access|openid|email)(?: +(?:account:read|usage:read|settings:read|settings:write|team:read|team:write|projects:read|projects:write|projects:delete|translations:write|transcription:read|transcription:write|subtitles:read|subtitles:write|tts:read|tts:write|voices:read|voices:write|images:read|images:write|thumbnails:read|thumbnails:write|folders:read|folders:write|glossary:read|glossary:write|webhooks:read|webhooks:write|publishing:read|publishing:write|offline_access|openid|email))* *$.Technisches Schema
Technisches Schema
{
"type": "object",
"properties": {
"redirect_uris": {
"type": "array",
"minItems": 1,
"maxItems": 10,
"items": {
"type": "string",
"minLength": 1,
"maxLength": 2048,
"pattern": "^[^\\s\\u0000-\\u001F\\u007F-\\u009F#\\\\]+$",
"format": "uri",
"anyOf": [
{
"pattern": "^[Hh][Tt][Tt][Pp][Ss]://"
},
{
"pattern": "^http://(?:localhost|127\\.0\\.0\\.1|\\[::1\\])(?::[0-9]{1,5})?(?:/|\\?|$)"
},
{
"const": "cursor://anysphere.cursor-mcp/oauth/callback"
}
],
"description": "An absolute HTTPS callback, an HTTP callback using the exact lowercase loopback spelling localhost, 127.0.0.1, or [::1], or exactly cursor://anysphere.cursor-mcp/oauth/callback. Must parse as a URL with no username/password, whitespace, control characters, backslashes, or fragment. A loopback port must be a valid URL port. The exact spelling is retained."
},
"description": "Between 1 and 10 callbacks before duplicates are removed."
},
"client_name": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"pattern": "^(?=.*\\S)[^\\u0000-\\u001F\\u007F]+$",
"default": "MCP client",
"description": "Optional client label; trimmed before saving and must remain nonempty."
},
"token_endpoint_auth_method": {
"const": "none",
"default": "none",
"description": "Public clients only."
},
"grant_types": {
"anyOf": [
{
"type": "array",
"minItems": 1,
"items": {
"enum": [
"authorization_code",
"refresh_token"
]
},
"contains": {
"const": "authorization_code"
}
},
{
"type": "null"
}
],
"default": [
"authorization_code",
"refresh_token"
],
"description": "Must include authorization_code; refresh_token is optional. Omitted or null selects both. Duplicate values are removed."
},
"response_types": {
"type": "array",
"minItems": 1,
"maxItems": 1,
"items": {
"const": "code"
},
"default": [
"code"
]
},
"scope": {
"type": "string",
"minLength": 1,
"maxLength": 2048,
"pattern": "^ *(?:account:read|usage:read|settings:read|settings:write|team:read|team:write|projects:read|projects:write|projects:delete|translations:write|transcription:read|transcription:write|subtitles:read|subtitles:write|tts:read|tts:write|voices:read|voices:write|images:read|images:write|thumbnails:read|thumbnails:write|folders:read|folders:write|glossary:read|glossary:write|webhooks:read|webhooks:write|publishing:read|publishing:write|offline_access|openid|email)(?: +(?:account:read|usage:read|settings:read|settings:write|team:read|team:write|projects:read|projects:write|projects:delete|translations:write|transcription:read|transcription:write|subtitles:read|subtitles:write|tts:read|tts:write|voices:read|voices:write|images:read|images:write|thumbnails:read|thumbnails:write|folders:read|folders:write|glossary:read|glossary:write|webhooks:read|webhooks:write|publishing:read|publishing:write|offline_access|openid|email))* *$",
"description": "Space-delimited permissions from scopes_supported, optionally including offline_access. Unsupported names and whitespace-only values are rejected; duplicates are removed. Omitting scope or supplying no product scopes, such as openid alone or offline_access alone, registers all supported product scopes. email requires openid; email alone is rejected. When OpenID Connect is available, registration includes openid and email as client capabilities even when scope is omitted. Registration grants no access; identity permissions require an explicit authorization request and user consent.",
"examples": [
"account:read projects:read offline_access"
]
}
},
"required": [
"redirect_uris"
],
"additionalProperties": true
}
Anfragebeispiele
Beachten Sie die für diese Route dokumentierte Kodierung und Authentifizierung. Die Antwortstruktur und Idempotenzregeln der Aktions-API gelten nur für Aktionsaufrufe.curl --request POST 'https://api.voicecheap.ai/oauth/register' \
--header 'Content-Type: application/json' \
--data '{"client_name":"Acme assistant","redirect_uris":["https://assistant.example.com/oauth/callback"],"token_endpoint_auth_method":"none","grant_types":["authorization_code","refresh_token"],"response_types":["code"],"scope":"account:read projects:read offline_access"}'
const input = {
client_name: 'Acme assistant',
redirect_uris: ['https://assistant.example.com/oauth/callback'],
token_endpoint_auth_method: 'none',
grant_types: ['authorization_code', 'refresh_token'],
response_types: ['code'],
scope: 'account:read projects:read offline_access',
};
const response = await fetch('https://api.voicecheap.ai/oauth/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(input),
redirect: 'manual',
});
console.log(response.status, await response.text());
import os
import requests
response = requests.request(
"POST",
"https://api.voicecheap.ai/oauth/register",
headers={"Content-Type":"application/json"},
json={"client_name": "Acme assistant", "redirect_uris": ["https://assistant.example.com/oauth/callback"], "token_endpoint_auth_method": "none", "grant_types": ["authorization_code", "refresh_token"], "response_types": ["code"], "scope": "account:read projects:read offline_access"},
timeout=120,
allow_redirects=False,
)
print(response.status_code, response.text)
Antwort
Registrierte Metadaten des öffentlichen Clients. Speichern Sie client_id und verwenden Sie sie mit der exakt registrierten redirect_uri. Es wird kein client_secret ausgestellt.HTTP 201
{
"client_id": "mcp_client_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"client_id_issued_at": 1792152000,
"client_name": "Acme assistant",
"redirect_uris": ["https://assistant.example.com/oauth/callback"],
"token_endpoint_auth_method": "none",
"grant_types": ["authorization_code", "refresh_token"],
"response_types": ["code"],
"scope": "account:read projects:read offline_access"
}
Antwortheader
{
"Cache-Control": "no-store",
"Pragma": "no-cache"
}
Hinweise zur Operation
- Erkannte skalare Parameter müssen genau einmal als nicht leere Zeichenfolgen ohne ASCII-Steuerzeichen oder DEL übergeben werden. Wiederholte Abfrage- oder Formularfelder werden als Arrays dekodiert und beim Lesen als Skalare abgelehnt.
- Verwenden Sie Content-Type application/json. Ein URL-codierter Registrierungs-Body wird mit der OAuth-Antwort invalid_request abgelehnt; nicht unterstützte Medientypen können bereits zuvor vom Integrationsparser abgelehnt werden.
- Weiterleitungs-URIs werden unverändert gespeichert und exakt verglichen. Änderungen an Groß- und Kleinschreibung, Portschreibweise, Pfad, Abfrage oder abschließendem Schrägstrich erfordern die Registrierung genau dieser URI.
- HTTP-Callbacks akzeptieren nur die unveränderten Loopback-Namen localhost, 127.0.0.1 und [::1]. Hosts in privaten Netzwerken, alternative IP-Schreibweisen, *.localhost und das großgeschriebene LOCALHOST erfüllen diese Voraussetzung nicht.
- Der einzige akzeptierte Callback mit benutzerdefiniertem URI-Schema lautet genau cursor://anysphere.cursor-mcp/oauth/callback.
- Jeder Callback muss die Validierung bestehen; ein ungültiger Callback führt zur Ablehnung der gesamten Registrierung. Zugangsdaten in URLs, Leerraum, Steuerzeichen, Fragmente und umgekehrte Schrägstriche werden abgelehnt.
- Der Client kann beliebige unterstützte Produktberechtigungsbereiche registrieren, aber der Benutzer muss die angefragte Teilmenge bei der Autorisierung separat genehmigen. Die Registrierung allein gewährt keinen Zugriff.
- Nur die Grant-Typen authorization_code und optional refresh_token werden unterstützt. Ein ohne refresh_token registrierter Client erhält kein Refresh-Token.
- Unbekannte Metadatenfelder auf oberster Ebene werden von der aktuellen Implementierung ignoriert. Für bekannte Felder gelten weiterhin die im Schema angegebenen Einschränkungen.
- Das öffentliche Registrierungslimit beträgt 10 Anfragen pro 10 Minuten und Client-IP und gilt gemeinsam für alle Worker. JSON-Bodys sind auf 1 MiB begrenzt.
- Eine erfolgreiche Registrierung gibt HTTP 201 zurück.
- openid und email sind Identitätsberechtigungen, getrennt von Produktberechtigungen, und werden nur akzeptiert, wenn sie angekündigt werden. email erfordert openid. Bei der ersten Autorisierung verwendet eine Anfrage nur mit Identitäts-Scopes die auf dem Zustimmungsbildschirm angezeigten Standard-Produktberechtigungen.
Fehler
| HTTP-Status | Code | Bedeutung oder Behebung |
|---|---|---|
| 400 | invalid_request | Der Anfragetext oder ein erkannter Parameter ist ungültig, fehlt, ist doppelt vorhanden oder hat die falsche Kodierung. |
| 400 | invalid_client_metadata | Ungültige Anzahl von Callbacks, leere Clientbezeichnung oder nicht unterstützte Clientauthentifizierung, Grant-Typen oder Antworttypen. |
| 400 | invalid_redirect_uri | Eine Callback-URL verwendet eine nicht unterstützte oder unsichere Form. |
| 400 | invalid_scope | Die scope-Zeichenfolge enthält eine nicht unterstützte Berechtigung oder keine angeforderten Berechtigungen. |
| 413 | REQUEST_TOO_LARGE | Die Anfrage überschreitet die zulässige Größe des Anfragetexts. JSON ist auf 1 MiB und URL-kodierte Formulare sind auf 32 KiB begrenzt. |
| 415 | UNSUPPORTED_CONTENT_TYPE | Der Body-Parser der Integration akzeptiert nur JSON oder URL-codierte Formulardaten. Die Route kann ausdrücklich eine dieser Codierungen erfordern. |
| 429 | temporarily_unavailable | Das öffentliche Anfrageratenlimit für OAuth wurde erreicht. Warten Sie vor einem erneuten Versuch das aktuelle Zeitfenster ab. |
| 500 | server_error | Die Autorisierung ist vorübergehend nicht verfügbar. Versuchen Sie es später erneut. |
War diese Seite hilfreich?

