Servidor MCP

Support DQE
Support DQE
  • Actualización
Servidor MCP - DQE One Standalone

DQE One Standalone expone un endpoint de Model Context Protocol (MCP) para que asistentes de IA como Claude puedan enumerar, crear y ejecutar sus processes, consultar runs y cargar archivos — las mismas operaciones que la API REST, controladas mediante una conversación.

{DOMAIN} es el nombre de host de su propio servidor DQE One Standalone — es autoalojado, por lo que este valor depende de su implementación. {EMAIL} es su usuario de DQE One y {API_TOKEN} el token generado en My Account > API Token.
Documentación relacionada: DQE One Standalone API — Introduction (la API REST en la que se basan las herramientas) y Manage your profile in DQE One Standalone (API token).
De un vistazo: JSON-RPC 2.0 sobre HTTP en POST https://{DOMAIN}/mcp, versión de protocolo 2024-11-05, 18 herramientas, 5 prompts, sin recursos. Respuestas JSON simples (sin streaming).

Conectar un asistente de IA

El asistente actúa en su nombre y solo ve sus propios objetos. Internamente, cada herramienta llama a la API REST con su API token, por lo que debe haber generado un API token (My Account > API Token) incluso si se conecta mediante OAuth.

Opción A — con una cabecera (Claude Code, archivo de configuración de Claude Desktop)

Construya el credential Basic a partir de su email y su token:

# Linux / macOS echo -n "you@example.com:your_api_token" | base64 # Windows PowerShell [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("you@example.com:your_api_token"))

Claude Code (reinicie la sesión después; los servidores MCP se cargan al arrancar):

claude mcp add --transport http dqe-one https://{DOMAIN}/mcp \ --header "Authorization: Basic <your_base64_credential>"

Claude Desktop — edite claude_desktop_config.json (macOS ~/Library/Application Support/Claude/, Windows %APPDATA%\Claude\) y reinicie:

{ "mcpServers": { "dqe-one": { "type": "http", "url": "https://{DOMAIN}/mcp", "headers": { "Authorization": "Basic <your_base64_credential>" } } } }

Opción B — OAuth (conectores personalizados, por ejemplo en claude.ai)

Introduzca únicamente la URL https://{DOMAIN}/mcp. El asistente descubre entonces todo por sí mismo:

  1. El servidor responde 401 con una cabecera WWW-Authenticate que apunta a /.well-known/oauth-protected-resource.
  2. El cliente lee /.well-known/oauth-authorization-server y se registra mediante /oauth/register.
  3. Abre /oauth/authorize. Debe haber iniciado sesión en DQE One en el mismo navegador; compruebe el nombre del cliente y haga clic en Authorize.
  4. El cliente intercambia el código en /oauth/token (se requiere PKCE S256) y recibe un token Bearer válido durante 1 hora más un token de actualización.
Accesibilidad: en claude.ai, el callback y cada llamada a una herramienta proceden de los servidores de Anthropic, por lo que su servidor debe ser accesible por HTTPS desde Internet. Un servidor accesible solo en su intranet funciona con Claude Code o Claude Desktop desde una máquina que pueda acceder a él (Opción A).

Herramientas (18)

Los argumentos marcados con * son obligatorios. Una herramienta que falla responde igualmente HTTP 200 con isError: true y el mensaje de la API REST subyacente.

Herramienta Argumentos Devuelve
list_processes — [{id,name,type,isDraft,lastRunId}] (sus processes)
get_process id* Detalles del process: fuente, archivo, credentials, ruleSet, lastRunId, fechas
list_runs processId, runId, kind Un run (con runId) o [{id,processId,type,startedOn,updatedOn,status,outputFile,count,error}]. processId prevalece sobre kind.
list_files — [{id,name,headers,rows,process_id}]
get_file id* Una entrada de archivo
list_rulesets — [{id,setId,label,updatedOn,source}]. No se devuelve ningún estado de publicación, aunque la descripción de la herramienta diga lo contrario.
list_credentials — [{id,name}]. El tipo de conector no se devuelve.
get_credential id* {id,login,name,type,status,process}; nunca la contraseña ni la clave
get_upload_status token* {status: pending|done|expired, file_id, ttl_seconds}
check_dataverse_table credential_id*, table_name* {table,exists,record_count}. Requiere un credential de Dynamics.
query_dataverse_table credential_id*, table_name*, top (100, máx. 5000) {table,exists,total_count,returned_count,records} — devuelve registros reales de clientes al asistente.
start_marketing_campaign — El texto del prompt marketing_campaign; no ejecuta nada.
create_process WRITE name*, kind*, source*, primaryKey*, fields*; opcionales credential, ruleSet, file, object, input_file_path, output_dir_path, description {"status":"success","id":N}. Mismas reglas que Processes → createProcess.
run_process WRITE id* {"status":"success","message":"Process Enqueue","run_id":"101"} — asíncrono
upload_file WRITE — {url, token, expires_in: 3600, instructions} — un enlace de carga para el navegador
delete_file WRITE DESTRUCTIVE id* Permanente; se rechaza mientras el archivo esté vinculado a un process
create_credential WRITE name*, type* (salesforce, sftp, bigquery); login, client_id, endpoint, port, password, email, id, key_id, pvt {"status":"success","id":N}
delete_credential WRITE DESTRUCTIVE id* Se rechaza mientras un process lo utilice

Qué difiere de las descripciones de las herramientas

  • create_process no puede establecer filters, sync, autoMerge, mergeThreshold, metaToReparent, allowEmpty, next ni reject_dir_path — por lo que los processes SFTP no se pueden crear mediante MCP. fields tiene una estructura distinta según kind (véase Processes), y para check_duplicate es {"<setId>": ["<matching rule label>"]}.
  • create_credential ofrece 3 de los 6 tipos de la API REST. Sus secretos pasan por el contexto del asistente (y se escriben en los logs de depuración del servidor): cree los credentials en la interfaz web.
  • run_process puede devolver un resultado normal que contenga {"status":"error"} (process en borrador, sin archivo SFTP, fallo de la cola): lea el cuerpo.
  • Ninguna herramienta lee las etiquetas de coincidencia de un RuleSet, cancela un run, descarga resultados, fusiona ni sincroniza. Revise los resultados en la interfaz web.

Prompts (5)

prompts/list devuelve cinco prompts sin parámetros. prompts/get devuelve {description, messages, instructions} (instructions es un extra no estándar). No hay recursos MCP.

Prompt Finalidad
create_process_dedup Creación guiada de un process de deduplicación (sigue solicitando filtros, reparenting y sync, que create_process no puede establecer).
marketing_campaign Flujo de trabajo de Dynamics en siete pasos: query_dataverse_table → create_process + run_process (check_email, check_phone, check_duplicate) → list_runs. El envío de SMS está “próximamente”.
run_existing_process list_processes → get_process → run_process → list_runs.
check_process_status Comprobar el estado de un process.
manage_credentials Flujo de trabajo de gestión de credentials.

Cargar un archivo mediante MCP

  1. El asistente llama a upload_file y obtiene https://{DOMAIN}/upload/<token>/, válido durante 1 hora.
  2. Usted abre el enlace en un navegador y suelta un archivo .csv, .xlsx o .xls (encabezados únicos, sin espacios, un archivo por enlace).
  3. El asistente consulta periódicamente get_upload_status hasta que sea done, lo que proporciona el file_id.
  4. create_process con "source":"csv" y "file": <file_id>.
El enlace es el credential. La página de carga no requiere inicio de sesión: cualquiera que tenga la URL puede cargar archivos en su cuenta durante una hora, y el enlace se muestra en el chat. La página indica “max 50 MB”, pero el servidor no aplica ningún límite.

Ejemplo práctico — deduplicar un CSV

  1. list_rulesets → elija uno con source: "csv"; anote su id (7) y su setId (RS_ABC).
  2. upload_file, entregue la URL al usuario y luego get_upload_status hasta done (file_id 12).
  3. get_file {"id":12} → compruebe que la clave primaria está en headers.
  4. Busque las etiquetas de coincidencia del RuleSet. Ninguna herramienta MCP las devuelve: pregunte al usuario o lea matching.Labels[].value con getRuleset en la API REST.
  5. create_process:
{ "name": "Dedup contacts", "kind": "check_duplicate", "source": "csv", "primaryKey": "id", "file": 12, "ruleSet": 7, "fields": { "RS_ABC": ["Email + Name"] } }
  1. run_process {"id":42} → run_id "101".
  2. list_runs {"runId":101} hasta que status sea Finished o Failed.
  3. Revise los duplicados en la interfaz web de DQE One.

Limitaciones y notas de seguridad

Estas limitaciones describen el comportamiento actual del producto.

  • Sin scopes ni modo de solo lectura: un asistente conectado puede hacer todo lo que puede hacer su cuenta. Conecte únicamente asistentes de confianza.
  • El registro de clientes OAuth es abierto (sin autenticación): cualquier cliente puede registrarse y elegir el nombre que se muestra en la pantalla de consentimiento. Compruebe el nombre y la redirección antes de hacer clic en Authorize. Aun así, debe haber iniciado sesión y dar su consentimiento.
  • Los tokens de actualización nunca caducan y no se rotan; los tokens se almacenan en claro en la base de datos; no existe ninguna pantalla de revocación. Los administradores pueden revocar un token en la base de datos.
  • El servidor escribe los cuerpos de las solicitudes y los argumentos de las herramientas — incluidos los secretos de los credentials — en su salida de depuración; que esto llegue a los logs depende de su implementación.
  • Sin límite de frecuencia; CORS está abierto a cualquier origen; el transporte SSE heredado mantiene las sesiones en memoria y solo funciona con un único worker.
Endpoint JSON-RPC - DQE One Standalone MCP

El único punto de entrada: envíe un mensaje JSON-RPC y reciba un objeto JSON.

mcpRpc

Solicitud

Envíe un cuerpo JSON-RPC 2.0. initialize y ping no requieren autenticación; todo lo demás requiere Basic o Bearer.

Llamar a una herramienta: {"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"list_processes","arguments":{}}}. El resultado es {"content":[{"type":"text","text":"<JSON as a string>"}]}; en caso de fallo, isError es true pero el estado HTTP sigue siendo 200.
Códigos de error: -32700 error de análisis (HTTP 400); -32601 método desconocido o herramienta desconocida; -32602 prompt desconocido. Unauthorized es un HTTP 401 con una cabecera WWW-Authenticate que inicia el descubrimiento de OAuth. No hay procesamiento por lotes y resources/* no está implementado.
POSThttps://{DOMAIN}/mcp

Ejemplos de código

Enviar una solicitud JSON-RPC

curl -u "{EMAIL}:{API_TOKEN}" -X POST \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/list" }' \ "https://{DOMAIN}/mcp"
fetch("https://{DOMAIN}/mcp", { method: "POST", headers: { "Authorization": "Basic " + btoa("{EMAIL}:{API_TOKEN}"), "Content-Type": "application/json" }, body: JSON.stringify({ "jsonrpc": "2.0", "id": 2, "method": "tools/list" }) }) .then(r => r.text()) .then(data => console.log(data));
import requests response = requests.post( "https://{DOMAIN}/mcp", auth=("{EMAIL}", "{API_TOKEN}"), json={"jsonrpc": "2.0", "id": 2, "method": "tools/list"}, ) print(response.status_code, response.text)
<?php $ch = curl_init("https://{DOMAIN}/mcp"); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_USERPWD, "{EMAIL}:{API_TOKEN}"); $data = ['jsonrpc' => '2.0', 'id' => 2, 'method' => 'tools/list']; curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo $status . " " . $response;
const axios = require('axios'); axios({ method: "post", url: "https://{DOMAIN}/mcp", auth: { username: "{EMAIL}", password: "{API_TOKEN}" }, data: { "jsonrpc": "2.0", "id": 2, "method": "tools/list" } }) .then(res => console.log(res.status, res.data)) .catch(err => console.log(err.response ? err.response.status : err.message, err.response && err.response.data));
import java.net.URI; import java.net.http.*; import java.util.Base64; String auth = Base64.getEncoder().encodeToString("{EMAIL}:{API_TOKEN}".getBytes()); String body = "{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/list\"}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://{DOMAIN}/mcp")) .header("Authorization", "Basic " + auth) .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString(body)) .build(); HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode() + " " + response.body());
using System.Net.Http; using System.Net.Http.Headers; using System.Text; using var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes("{EMAIL}:{API_TOKEN}"))); using var request = new HttpRequestMessage(HttpMethod.Post, "https://{DOMAIN}/mcp"); request.Content = new StringContent("{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/list\"}", Encoding.UTF8, "application/json"); var response = await client.SendAsync(request); Console.WriteLine((int)response.StatusCode + " " + await response.Content.ReadAsStringAsync());
package main import ( "bytes" "fmt" "io" "net/http" ) func main() { body := []byte(`{"jsonrpc":"2.0","id":2,"method":"tools/list"}`) req, _ := http.NewRequest("POST", "https://{DOMAIN}/mcp", bytes.NewBuffer(body)) req.SetBasicAuth("{EMAIL}", "{API_TOKEN}") req.Header.Set("Content-Type", "application/json") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() out, _ := io.ReadAll(resp.Body) fmt.Println(resp.StatusCode, string(out)) }

Parámetros

Campo Descripción Tipo Obl / Opc
jsonrpc
Valores: 2.0
String Obligatorio
id Integer Opcional
method initialize y ping no requieren autenticación. Todo lo demás sí. resources/* no está implementado (-32601).
Valores: initialize, ping, tools/list, tools/call, prompts/list, prompts/get
String Obligatorio
params Object Opcional
Autenticación: HTTP Basic (email:api_token) o un token OAuth Bearer. La consola de abajo usa Basic.

Respuesta

Respuesta JSON-RPC. Una herramienta que falla devuelve igualmente HTTP 200 con result.isError = true.. Estado HTTP 200.

Clave Descripción Tipo
jsonrpc String
id Integer
result Object
error Object

Ejemplo de respuesta

Respuesta de ejemplo
{ "jsonrpc": "2.0", "id": 1, "result": { "protocolVersion": "2024-11-05", "capabilities": { "tools": {}, "prompts": {} }, "serverInfo": { "name": "dqe-one", "version": "1.0.0" } } }

Errores

HTTP Cuerpo / significado
400 Error de análisis (-32700).
401 Unauthorized. Incluye una cabecera WWW-Authenticate: Bearer resource_metadata=... que activa el descubrimiento de OAuth.

Probar la API

Haga clic en el botón de abajo para probar este endpoint en directo en su navegador.

Atención: esta consola envía una solicitud real a su propio servidor desde su navegador, con su API token real. tools/call puede iniciar runs o eliminar datos.
Abrir consola
Información del servidor - DQE One Standalone MCP

Devuelve información básica del servidor sin autenticación. Con Accept: text/event-stream abre en su lugar el transporte SSE heredado (solo con autenticación Basic; un único worker).

mcpInfo

Solicitud

Envíe una solicitud GET.

GEThttps://{DOMAIN}/mcp

Ejemplos de código

Información del servidor o flujo SSE heredado

curl \ "https://{DOMAIN}/mcp"
fetch("https://{DOMAIN}/mcp", { method: "GET" }) .then(r => r.text()) .then(data => console.log(data));
import requests response = requests.get( "https://{DOMAIN}/mcp", ) print(response.status_code, response.text)
<?php $ch = curl_init("https://{DOMAIN}/mcp"); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo $status . " " . $response;
const axios = require('axios'); axios({ method: "get", url: "https://{DOMAIN}/mcp" }) .then(res => console.log(res.status, res.data)) .catch(err => console.log(err.response ? err.response.status : err.message, err.response && err.response.data));
import java.net.URI; import java.net.http.*; import java.util.Base64; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://{DOMAIN}/mcp")) .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode() + " " + response.body());
using System.Net.Http; using System.Net.Http.Headers; using System.Text; using var client = new HttpClient(); using var request = new HttpRequestMessage(HttpMethod.Get, "https://{DOMAIN}/mcp"); var response = await client.SendAsync(request); Console.WriteLine((int)response.StatusCode + " " + await response.Content.ReadAsStringAsync());
package main import ( "fmt" "io" "net/http" ) func main() { req, _ := http.NewRequest("GET", "https://{DOMAIN}/mcp", nil) resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() out, _ := io.ReadAll(resp.Body) fmt.Println(resp.StatusCode, string(out)) }

Parámetros

Este endpoint no acepta parámetros.

Autenticación: ninguna — este endpoint es público (o está protegido por un token en la URL, véase más arriba).

Respuesta

Información del servidor o flujo de eventos.. Estado HTTP 200.

Ejemplo de respuesta

Respuesta de ejemplo
{ "name": "dqe-one", "version": "1.0.0" }

Errores

HTTP Cuerpo / significado
No se documenta ninguna respuesta de error para este endpoint.

Probar la API

Haga clic en el botón de abajo para probar este endpoint en directo en su navegador.

Atención: esta consola envía una solicitud real a su propio servidor desde su navegador, con su API token real.
Abrir consola
Metadatos del recurso protegido OAuth - DQE One Standalone MCP

Metadatos RFC 9728 que los clientes usan para descubrir el servidor de autorización.

oauthProtectedResource

Solicitud

Envíe una solicitud GET.

GEThttps://{DOMAIN}/.well-known/oauth-protected-resource

Ejemplos de código

Metadatos del recurso protegido (RFC 9728)

curl \ "https://{DOMAIN}/.well-known/oauth-protected-resource"
fetch("https://{DOMAIN}/.well-known/oauth-protected-resource", { method: "GET" }) .then(r => r.text()) .then(data => console.log(data));
import requests response = requests.get( "https://{DOMAIN}/.well-known/oauth-protected-resource", ) print(response.status_code, response.text)
<?php $ch = curl_init("https://{DOMAIN}/.well-known/oauth-protected-resource"); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo $status . " " . $response;
const axios = require('axios'); axios({ method: "get", url: "https://{DOMAIN}/.well-known/oauth-protected-resource" }) .then(res => console.log(res.status, res.data)) .catch(err => console.log(err.response ? err.response.status : err.message, err.response && err.response.data));
import java.net.URI; import java.net.http.*; import java.util.Base64; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://{DOMAIN}/.well-known/oauth-protected-resource")) .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode() + " " + response.body());
using System.Net.Http; using System.Net.Http.Headers; using System.Text; using var client = new HttpClient(); using var request = new HttpRequestMessage(HttpMethod.Get, "https://{DOMAIN}/.well-known/oauth-protected-resource"); var response = await client.SendAsync(request); Console.WriteLine((int)response.StatusCode + " " + await response.Content.ReadAsStringAsync());
package main import ( "fmt" "io" "net/http" ) func main() { req, _ := http.NewRequest("GET", "https://{DOMAIN}/.well-known/oauth-protected-resource", nil) resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() out, _ := io.ReadAll(resp.Body) fmt.Println(resp.StatusCode, string(out)) }

Parámetros

Este endpoint no acepta parámetros.

Autenticación: ninguna — este endpoint es público (o está protegido por un token en la URL, véase más arriba).

Respuesta

{resource, authorization_servers, bearer_methods_supported}. Estado HTTP 200.

Ejemplo de respuesta

Respuesta de ejemplo
{ "resource": "https://{DOMAIN}/mcp", "authorization_servers": [ "https://{DOMAIN}" ], "bearer_methods_supported": [ "header" ] }

Errores

HTTP Cuerpo / significado
No se documenta ninguna respuesta de error para este endpoint.

Probar la API

Haga clic en el botón de abajo para probar este endpoint en directo en su navegador.

Atención: esta consola envía una solicitud real a su propio servidor desde su navegador, con su API token real.
Abrir consola
Metadatos del servidor OAuth - DQE One Standalone MCP

Metadatos RFC 8414: endpoints y flujos admitidos.

oauthServerMetadata

Solicitud

Envíe una solicitud GET.

GEThttps://{DOMAIN}/.well-known/oauth-authorization-server

Ejemplos de código

Metadatos del servidor de autorización (RFC 8414)

curl \ "https://{DOMAIN}/.well-known/oauth-authorization-server"
fetch("https://{DOMAIN}/.well-known/oauth-authorization-server", { method: "GET" }) .then(r => r.text()) .then(data => console.log(data));
import requests response = requests.get( "https://{DOMAIN}/.well-known/oauth-authorization-server", ) print(response.status_code, response.text)
<?php $ch = curl_init("https://{DOMAIN}/.well-known/oauth-authorization-server"); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo $status . " " . $response;
const axios = require('axios'); axios({ method: "get", url: "https://{DOMAIN}/.well-known/oauth-authorization-server" }) .then(res => console.log(res.status, res.data)) .catch(err => console.log(err.response ? err.response.status : err.message, err.response && err.response.data));
import java.net.URI; import java.net.http.*; import java.util.Base64; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://{DOMAIN}/.well-known/oauth-authorization-server")) .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode() + " " + response.body());
using System.Net.Http; using System.Net.Http.Headers; using System.Text; using var client = new HttpClient(); using var request = new HttpRequestMessage(HttpMethod.Get, "https://{DOMAIN}/.well-known/oauth-authorization-server"); var response = await client.SendAsync(request); Console.WriteLine((int)response.StatusCode + " " + await response.Content.ReadAsStringAsync());
package main import ( "fmt" "io" "net/http" ) func main() { req, _ := http.NewRequest("GET", "https://{DOMAIN}/.well-known/oauth-authorization-server", nil) resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() out, _ := io.ReadAll(resp.Body) fmt.Println(resp.StatusCode, string(out)) }

Parámetros

Este endpoint no acepta parámetros.

Autenticación: ninguna — este endpoint es público (o está protegido por un token en la URL, véase más arriba).

Respuesta

Endpoints, tipos de concesión (authorization_code, refresh_token), PKCE S256, métodos de autenticación none/client_secret_post.. Estado HTTP 200.

Ejemplo de respuesta

Respuesta de ejemplo
{ "authorization_endpoint": "https://{DOMAIN}/oauth/authorize", "token_endpoint": "https://{DOMAIN}/oauth/token", "registration_endpoint": "https://{DOMAIN}/oauth/register", "response_types_supported": [ "code" ], "grant_types_supported": [ "authorization_code", "refresh_token" ], "code_challenge_methods_supported": [ "S256" ], "token_endpoint_auth_methods_supported": [ "none", "client_secret_post" ] }

Errores

HTTP Cuerpo / significado
No se documenta ninguna respuesta de error para este endpoint.

Probar la API

Haga clic en el botón de abajo para probar este endpoint en directo en su navegador.

Atención: esta consola envía una solicitud real a su propio servidor desde su navegador, con su API token real.
Abrir consola
Registrar un cliente - DQE One Standalone MCP

Registro dinámico de clientes (RFC 7591). Abierto: sin autenticación.

oauthRegister

Solicitud

Envíe un cuerpo JSON con al menos redirect_uris.

POSThttps://{DOMAIN}/oauth/register

Ejemplos de código

Registro dinámico de clientes (RFC 7591)

curl -X POST \ -H "Content-Type: application/json" \ -d '{ "redirect_uris": [ "https://client.example.com/callback" ], "client_name": "My connector" }' \ "https://{DOMAIN}/oauth/register"
fetch("https://{DOMAIN}/oauth/register", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ "redirect_uris": [ "https://client.example.com/callback" ], "client_name": "My connector" }) }) .then(r => r.text()) .then(data => console.log(data));
import requests response = requests.post( "https://{DOMAIN}/oauth/register", json={"redirect_uris": ["https://client.example.com/callback"], "client_name": "My connector"}, ) print(response.status_code, response.text)
<?php $ch = curl_init("https://{DOMAIN}/oauth/register"); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); $data = ['redirect_uris' => ['https://client.example.com/callback'], 'client_name' => 'My connector']; curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo $status . " " . $response;
const axios = require('axios'); axios({ method: "post", url: "https://{DOMAIN}/oauth/register", data: { "redirect_uris": [ "https://client.example.com/callback" ], "client_name": "My connector" } }) .then(res => console.log(res.status, res.data)) .catch(err => console.log(err.response ? err.response.status : err.message, err.response && err.response.data));
import java.net.URI; import java.net.http.*; import java.util.Base64; String body = "{\"redirect_uris\":[\"https://client.example.com/callback\"],\"client_name\":\"My connector\"}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://{DOMAIN}/oauth/register")) .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString(body)) .build(); HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode() + " " + response.body());
using System.Net.Http; using System.Net.Http.Headers; using System.Text; using var client = new HttpClient(); using var request = new HttpRequestMessage(HttpMethod.Post, "https://{DOMAIN}/oauth/register"); request.Content = new StringContent("{\"redirect_uris\":[\"https://client.example.com/callback\"],\"client_name\":\"My connector\"}", Encoding.UTF8, "application/json"); var response = await client.SendAsync(request); Console.WriteLine((int)response.StatusCode + " " + await response.Content.ReadAsStringAsync());
package main import ( "bytes" "fmt" "io" "net/http" ) func main() { body := []byte(`{"redirect_uris":["https://client.example.com/callback"],"client_name":"My connector"}`) req, _ := http.NewRequest("POST", "https://{DOMAIN}/oauth/register", bytes.NewBuffer(body)) req.Header.Set("Content-Type", "application/json") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() out, _ := io.ReadAll(resp.Body) fmt.Println(resp.StatusCode, string(out)) }

Parámetros

Campo Descripción Tipo Obl / Opc
redirect_uris Lista no vacía de URL de callback. Array Obligatorio
client_name Se muestra al usuario en la página de consentimiento. String Opcional
token_endpoint_auth_method client_secret_post también devuelve un client_secret, una sola vez.
Valores: none, client_secret_post · Valor predeterminado: "none"
String Opcional
Autenticación: ninguna — este endpoint es público (o está protegido por un token en la URL, véase más arriba).

Respuesta

Cliente registrado (client_secret se devuelve una sola vez para client_secret_post).. Estado HTTP 201.

Ejemplo de respuesta

Respuesta de ejemplo
{ "client_id": "kQ3...", "client_name": "My connector", "redirect_uris": [ "https://client.example.com/callback" ], "token_endpoint_auth_method": "none" }

Errores

HTTP Cuerpo / significado
400 Solicitud no válida.
Página de consentimiento - DQE One Standalone MCP

La página donde usted aprueba un conector. Se abre en un navegador, no se llama desde código. Debe haber iniciado sesión en DQE One en el mismo navegador; PKCE S256 es obligatorio; el código dura 5 minutos.

oauthAuthorize

Solicitud

El cliente redirige su navegador a esta URL.

GEThttps://{DOMAIN}/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type={response_type}&code_challenge={code_challenge}&code_challenge_method={code_challenge_method}&state={state}

URL de ejemplo

https://{DOMAIN}/oauth/authorize?client_id=kQ3...&redirect_uri=https%3A%2F%2Fclient.example.com%2Fcallback&response_type=code&code_challenge=E9Melhoa...&code_challenge_method=S256&state=xyz

Parámetros

Campo Descripción Tipo Obl / Opc
client_id Client id devuelto por /oauth/register. String Obligatorio
redirect_uri Debe coincidir exactamente con uno de los URI de redirección registrados. String Obligatorio
response_type code (por defecto). String Opcional
code_challenge Desafío PKCE. String Obligatorio
code_challenge_method Debe ser S256. String Obligatorio
state Valor opaco devuelto al cliente. String Opcional
Autenticación: ninguna — este endpoint es público (o está protegido por un token en la URL, véase más arriba).

Respuesta

Página de consentimiento (Allow / Deny).. Estado HTTP 200.

Ejemplo de respuesta

Respuesta de ejemplo
{ "redirect": "https://client.example.com/callback?code=...&state=xyz" }

Errores

HTTP Cuerpo / significado
400 Solicitud no válida.
Endpoint de tokens - DQE One Standalone MCP

Intercambia un código de autorización por tokens, o actualiza un token de acceso. El token de acceso dura 1 hora; los tokens de actualización no caducan y no se rotan.

oauthToken

Solicitud

Envíe un POST codificado como formulario.

POSThttps://{DOMAIN}/oauth/token

Ejemplos de código

Intercambiar un código o actualizar un token

curl -X POST \ --data-urlencode "grant_type=authorization_code" \ --data-urlencode "code=AUTH_CODE" \ --data-urlencode "redirect_uri=https://client.example.com/callback" \ --data-urlencode "code_verifier=PKCE_VERIFIER" \ --data-urlencode "client_id=CLIENT_ID" \ "https://{DOMAIN}/oauth/token"
fetch("https://{DOMAIN}/oauth/token", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ "grant_type": "authorization_code", "code": "AUTH_CODE", "redirect_uri": "https://client.example.com/callback", "code_verifier": "PKCE_VERIFIER", "client_id": "CLIENT_ID" }) }) .then(r => r.text()) .then(data => console.log(data));
import requests response = requests.post( "https://{DOMAIN}/oauth/token", data={"grant_type": "authorization_code", "code": "AUTH_CODE", "redirect_uri": "https://client.example.com/callback", "code_verifier": "PKCE_VERIFIER", "client_id": "CLIENT_ID"}, ) print(response.status_code, response.text)
<?php $ch = curl_init("https://{DOMAIN}/oauth/token"); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(['grant_type' => 'authorization_code', 'code' => 'AUTH_CODE', 'redirect_uri' => 'https://client.example.com/callback', 'code_verifier' => 'PKCE_VERIFIER', 'client_id' => 'CLIENT_ID'])); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo $status . " " . $response;
const axios = require('axios'); axios({ method: "post", url: "https://{DOMAIN}/oauth/token", data: new URLSearchParams({ "grant_type": "authorization_code", "code": "AUTH_CODE", "redirect_uri": "https://client.example.com/callback", "code_verifier": "PKCE_VERIFIER", "client_id": "CLIENT_ID" }) }) .then(res => console.log(res.status, res.data)) .catch(err => console.log(err.response ? err.response.status : err.message, err.response && err.response.data));
import java.net.URI; import java.net.http.*; import java.util.Base64; String body = "grant_type=authorization_code&code=AUTH_CODE&redirect_uri=https%3A%2F%2Fclient.example.com%2Fcallback&code_verifier=PKCE_VERIFIER&client_id=CLIENT_ID"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://{DOMAIN}/oauth/token")) .header("Content-Type", "application/x-www-form-urlencoded") .method("POST", HttpRequest.BodyPublishers.ofString(body)) .build(); HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode() + " " + response.body());
using System.Net.Http; using System.Net.Http.Headers; using System.Text; using var client = new HttpClient(); using var request = new HttpRequestMessage(HttpMethod.Post, "https://{DOMAIN}/oauth/token"); request.Content = new FormUrlEncodedContent(new Dictionary<string, string> { { "grant_type", "authorization_code" }, { "code", "AUTH_CODE" }, { "redirect_uri", "https://client.example.com/callback" }, { "code_verifier", "PKCE_VERIFIER" }, { "client_id", "CLIENT_ID" } }); var response = await client.SendAsync(request); Console.WriteLine((int)response.StatusCode + " " + await response.Content.ReadAsStringAsync());
package main import ( "fmt" "io" "net/http" "net/url" "strings" ) func main() { form := url.Values{} form.Set("grant_type", "authorization_code") form.Set("code", "AUTH_CODE") form.Set("redirect_uri", "https://client.example.com/callback") form.Set("code_verifier", "PKCE_VERIFIER") form.Set("client_id", "CLIENT_ID") req, _ := http.NewRequest("POST", "https://{DOMAIN}/oauth/token", strings.NewReader(form.Encode())) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() out, _ := io.ReadAll(resp.Body) fmt.Println(resp.StatusCode, string(out)) }

Parámetros

Campo Descripción Tipo Obl / Opc
grant_type
Valores: authorization_code, refresh_token
String Obligatorio
code Código de autorización (5 minutos, de un solo uso). String Opcional
redirect_uri El mismo valor que en la solicitud de autorización. String Opcional
code_verifier Verificador PKCE. String Opcional
refresh_token Para grant_type refresh_token. String Opcional
client_id String Opcional
client_secret Solo para clientes registrados con client_secret_post. String Opcional
Autenticación: ninguna — este endpoint es público (o está protegido por un token en la URL, véase más arriba).

Respuesta

{access_token, token_type: Bearer, expires_in: 3600, refresh_token, scope}. Estado HTTP 200.

Ejemplo de respuesta

Respuesta de ejemplo
{ "access_token": "...", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "...", "scope": "" }

Errores

HTTP Cuerpo / significado
400 invalid_grant / invalid_client.
Página de carga - DQE One Standalone MCP

La página de navegador a la que lleva el enlace devuelto por la herramienta upload_file. El token de la URL es el único credential.

uploadPage

Solicitud

Usted abre el enlace en un navegador.

GEThttps://{DOMAIN}/upload/{token}/

URL de ejemplo

https://{DOMAIN}/upload/3f1c0a52-...-9b7e/

Parámetros

Campo Descripción Tipo Obl / Opc
token String Obligatorio
Autenticación: ninguna — este endpoint es público (o está protegido por un token en la URL, véase más arriba).

Respuesta

Página HTML.. Estado HTTP 200.

Ejemplo de respuesta

Respuesta de ejemplo
{ "info": "HTML page" }

Errores

HTTP Cuerpo / significado
No se documenta ninguna respuesta de error para este endpoint.
Cargar el archivo - DQE One Standalone MCP

Lo que envía la página de carga cuando usted suelta un archivo. Normalmente nunca la llama usted mismo.

uploadFile

Solicitud

Una solicitud multipart/form-data mediante POST con el campo file.

Un archivo por enlace, válido durante 1 hora. .csv, .xlsx, .xls; encabezados únicos y sin espacios. Sin límite de tamaño en el servidor.
POSThttps://{DOMAIN}/upload/{token}/

Ejemplos de código

Cargar el archivo

curl -X POST \ -F "file=@contacts.csv" \ "https://{DOMAIN}/upload/{token}/"
const form = new FormData(); form.append("file", fileInput.files[0]); // <input type="file"> fetch("https://{DOMAIN}/upload/{token}/", { method: "POST", body: form }) .then(r => r.text()) .then(data => console.log(data));
import requests response = requests.post( "https://{DOMAIN}/upload/{token}/", files={"file": open("contacts.csv", "rb")}, ) print(response.status_code, response.text)
<?php $ch = curl_init("https://{DOMAIN}/upload/{token}/"); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, ['file' => new CURLFile("contacts.csv")]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo $status . " " . $response;
const axios = require('axios'); const FormData = require('form-data'); const fs = require('fs'); const form = new FormData(); form.append('file', fs.createReadStream("contacts.csv")); axios({ method: "post", url: "https://{DOMAIN}/upload/{token}/", headers: form.getHeaders(), data: form }) .then(res => console.log(res.status, res.data)) .catch(err => console.log(err.response ? err.response.status : err.message, err.response && err.response.data));
import java.net.URI; import java.net.http.*; import java.util.Base64; String boundary = "----dqe" + System.nanoTime(); byte[] content = java.nio.file.Files.readAllBytes(java.nio.file.Path.of("contacts.csv")); var out = new java.io.ByteArrayOutputStream(); out.write(("--" + boundary + "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"" + "contacts.csv" + "\"\r\n\r\n").getBytes()); out.write(content); out.write(("\r\n--" + boundary + "--\r\n").getBytes()); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://{DOMAIN}/upload/{token}/")) .header("Content-Type", "multipart/form-data; boundary=" + boundary) .method("POST", HttpRequest.BodyPublishers.ofByteArray(out.toByteArray())) .build(); HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode() + " " + response.body());
using System.Net.Http; using System.Net.Http.Headers; using System.Text; using var client = new HttpClient(); using var request = new HttpRequestMessage(HttpMethod.Post, "https://{DOMAIN}/upload/{token}/"); var form = new MultipartFormDataContent(); form.Add(new ByteArrayContent(File.ReadAllBytes("contacts.csv")), "file", "contacts.csv"); request.Content = form; var response = await client.SendAsync(request); Console.WriteLine((int)response.StatusCode + " " + await response.Content.ReadAsStringAsync());
package main import ( "bytes" "fmt" "io" "mime/multipart" "net/http" "os" ) func main() { var buf bytes.Buffer w := multipart.NewWriter(&buf) part, _ := w.CreateFormFile("file", "contacts.csv") f, _ := os.Open("contacts.csv") io.Copy(part, f) w.Close() req, _ := http.NewRequest("POST", "https://{DOMAIN}/upload/{token}/", &buf) req.Header.Set("Content-Type", w.FormDataContentType()) resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() out, _ := io.ReadAll(resp.Body) fmt.Println(resp.StatusCode, string(out)) }

Parámetros

Campo Descripción Tipo Obl / Opc
token String Obligatorio
file String (file) Obligatorio
Autenticación: ninguna — este endpoint es público (o está protegido por un token en la URL, véase más arriba).

Respuesta

{status: success, file_id, name}. Estado HTTP 200.

Ejemplo de respuesta

Respuesta de ejemplo
{ "status": "success", "file_id": 12, "name": "contacts.csv" }

Errores

HTTP Cuerpo / significado
400 Extensión incorrecta, encabezados no válidos o enlace ya utilizado.

Véase también

Relacionada con

¿Fue útil este artículo?

Usuarios a los que les pareció útil: 0 de 0