Model Context Protocol

Guía del Servidor MCP

Conecta agentes de IA directamente con la API de Singula usando el protocolo MCP.

¿Qué es MCP?

El Model Context Protocol (MCP) es un estándar abierto que permite a agentes de IA conectarse con herramientas y datos externos. El servidor MCP de Singula expone todas nuestras herramientas de verificación como tools que cualquier agente compatible puede usar.

Agente IA
Claude, GPT, etc.
MCP Server
Singula
Singula API
Verificación

Conexión

El MCP de Singula es un servidor remoto (SSE/HTTP), no un binario que se instale. En Claude Code lo conectas con un solo comando:

Opción A (recomendada) — un comando
terminal
claude mcp add --transport sse singula "https://api.singula.mx/mcp/sse?api_key=sk_live_xxx"

Con scope de proyecto se comparte con tu equipo: se commitea en .mcp.json.

terminal
claude mcp add --transport sse singula --scope project "https://api.singula.mx/mcp/sse?api_key=sk_live_xxx"

Configuración manual

Si prefieres editar el archivo a mano, define el servidor en .mcp.json (proyecto) o ~/.claude.json (usuario):

Opción B — .mcp.json (SSE)
.mcp.json
{
  "mcpServers": {
    "singula": {
      "type": "sse",
      "url": "https://api.singula.mx/mcp/sse?api_key=${SINGULA_API_KEY}"
    }
  }
}
Opción C — transporte HTTP con Bearer
.mcp.json
{
  "mcpServers": {
    "singula": {
      "type": "http",
      "url": "https://api.singula.mx/mcp",
      "headers": { "Authorization": "Bearer sk_live_xxx" }
    }
  }
}

.claude/settings.json NO define servers MCP en Claude Code. Las definiciones van en .mcp.json (proyecto) o ~/.claude.json (usuario, vía claude mcp add). El bloque mcpServers dentro de .claude/settings.json se ignora.

La API key puede ir en la query (?api_key=) o en el header Authorization: Bearer — ambas están soportadas. Reemplaza sk_live_xxx por tu API key real del panel de Singula.

Solución de problemas

Los errores más comunes al conectar el servidor y cómo resolverlos.

Error POSTing to endpoint (HTTP 400)

El servidor queda en estado failed. Era un bug del servidor, ya corregido — no es tu configuración. Si persiste, contacta a soporte.

MCP server "singula" has a "url" but no "type"

Falta "type": "sse" (o "http") en el bloque del servidor en .mcp.json.

El servidor no aparece

Estaba definido en .claude/settings.json en vez de .mcp.json o ~/.claude.json. Verifícalo con claude mcp list.

⏸ Pending approval

Corre claude de forma interactiva dentro del proyecto para aprobar el servidor.

Herramientas Disponibles

El servidor MCP expone las siguientes herramientas que tu agente de IA puede usar:

customer_id O datos directos. Las tools marcadas sin cliente aceptan customer_id o los campos del dato (nombre, teléfono, correo, RFC, el nombre y el tipo del archivo…). En las tools de datos (checkBlacklist, getJudicialRecords, getJudicialRecordsMoral, getIntelligence, checkEmail, checkPhone y sus variantes Premium) son excluyentes: mandar ambos o ninguno devuelve un error claro; en las de archivo (extractDocument, verifyCsf, verifyPoder, extractIne) omite customer_id para ir directo, checkFiel y sendEmailOtp aceptan al menos uno, y checkSpei lleva siempre la transferencia: su customer_id, opcional, sólo dice en qué expediente queda. No hay tools nuevas para las consultas directas: son las mismas, con una forma más de llamarlas. Una llamada con datos directos no toca ningún cliente y cobra exactamente lo mismo, y el sandbox devuelve los mismos mocks. Un customer_id de otra organización contesta exactamente como uno que no existe; getRisk y getRiskSignals, además, sólo leen los clientes del ambiente de tu llave.

createCustomer

Crea persona física con datos personales

createMoralCustomer

Crea persona moral (empresa)

getCustomer

Detalle completo de un cliente. Cada consulta de su historial trae bundled_with: el producto que la corrió por dentro, incluida y sin cargo, o null. Su gender es null si no se capturó

getCurp

Obtiene el CURP oficial de un cliente buscándolo en RENAPO por sus datos; si RENAPO no lo tiene responde found: false, nunca inventa uno (sin cliente: calculateCurp, con name sólo con el nombre o los nombres de pila y los apellidos en last_name / mothers_last_name: con el nombre completo puede salir otra CURP). Necesita su sexo: un cliente sin él (null, no se capturó) responde 409

validateCurp

Valida el CURP de un cliente contra RENAPO (sin cliente: validateCurpDirect). match compara nombres, apellidos y CURP sin acentos, mayúsculas, puntuación ni espacios; su gender es informativo: vale el sexo de RENAPO

getRfc

Calcula el RFC de un cliente (sin cliente: calculateRfc, con la misma regla de name: sólo el nombre o los nombres de pila, los apellidos aparte)

validateRfc

Valida el RFC de un cliente ante el SAT (sin cliente: validateRfcDirect)

extractIne

sin cliente

Lectura de la INE/IFE + Lista Nominal Vigente, en dos pasos: reserva y devuelve el POST firmado de S3 de cada foto con su curl listo para correr. Las fotos nunca pasan por la API. Con customer_id, el cruce con RENAPO va incluido, sin cargo extra

completeIneExtraction

Paso 2 de extractIne: confirma que las dos fotos están en S3, arranca la lectura y la Lista Nominal (ahí se cobra; si falla después de leer la credencial —también con la Lista Nominal en mantenimiento—, su cargo base) y espera el resultado

checkBlacklist

sin cliente

Busca en listas de sanciones (OFAC, UE, ONU, UK). Corre sin KYB, también con el saldo de prueba. En personas, name lleva sólo el nombre o los nombres de pila y los apellidos van en last_name / mothers_last_name; desde 1.115.0 un nombre completo en name se tolera: un apellido con el que ya termina no se busca dos veces. En empresas, name es el nombre comercial y legal_name, opcional, la razón social: se criban los dos en una sola consulta. Con customer_id, el sexo que se busca es el de RENAPO si su CURP ya se validó, si no el capturado, y sin ninguno no se manda

getJudicialRecords

sin cliente

Antecedentes judiciales persona física. Pide el KYB: sin él responde 403, y los antecedentes corren dentro de un flujo KYC, después de una identidad aprobada que nombra al cliente

getJudicialRecordsMoral

sin cliente

Antecedentes judiciales persona moral. Pide el KYB. legal_name opcional: razón social y nombre comercial se buscan en una sola consulta

getIntelligence

sin cliente

Huella digital (getIntelligencePremium es Huella digital Premium: suma la síntesis del perfil): la huella pública de una persona o una empresa en la web, noticias, imágenes y redes. No incluye antecedentes judiciales, listas de sanciones ni consultas al SAT: son tools aparte. Con customer_id decide el tipo del cliente (persona moral = empresa). Sin cliente, una persona lleva name (sólo el nombre o los nombres de pila), last_name (obligatorio) y mothers_last_name —desde 1.115.0 un nombre completo en name se tolera: un apellido con el que ya termina no se busca dos veces—; una empresa, subject: "company" + name (nombre comercial) y, si los tienes, legal_name, rfc (12 caracteres) y website. Mismo cargo para las dos. El reporte trae subject y, en cada resultado web y cada nota, about_subject (yes, no o unknown), sentiment hacia el sujeto (negative si reporta un hecho adverso suyo; si no, positive, negative o neutral cuando el tono es claro y no habla de alguien más; si no, neutral) y adverse ({ category, role }, o null si no reporta un hecho adverso; adverso sólo con role accused, detained, convicted o sued). Los perfiles de LinkedIn y de redes traen también about_subject. sentiment_summary resume el tono de lo que habla del sujeto: { positive, neutral, negative, overall, unconfirmed_adverse }, con overall none si nada habla del sujeto, negative si algo de eso es adverso y si no el tono que más se repite (mixed si empatan, neutral si no hay ninguno); unconfirmed_adverse cuenta aparte lo adverso que trae su nombre pero no se pudo confirmar que hable de él. excluded cuenta lo que se dejó fuera: namesakes (otra persona con el mismo nombre), brands_or_companies (una marca o una empresa; si el sujeto es una empresa, también otra empresa con el mismo nombre) y other (lo demás). En un flujo corre en un KYC, sobre la persona, y en un KYB, sobre la empresa. Si falla, el webhook intelligence.completed (desde 1.117.0, el evento de Huella digital: documentos y e.firma tienen el suyo) llega firmado, con status: error

createVerification

Crea el link KYC (INE, pasaporte o tarjeta de residente + selfie + prueba de vida). Corre sin KYB: la persona tiene que estar presente. Opcionales: redirect_url, external_id, metadata, document_types (ine, passport, resident_card; por default los tres), language, expires_in_hours. Incluidos, sin cargo extra: con una INE, un pasaporte o una tarjeta de residente y un cliente con CURP, el cruce del documento contra RENAPO (reusa la validación de CURP o corre una por dentro) y, con una INE, la Lista Nominal, que llega después del veredicto. Un pasaporte se lee por su zona MRZ —dígitos verificadores, lo impreso y la CURP contra el MRZ, su vigencia— y corre la misma prueba de vida que la INE: uno vencido nunca sale verified y un número que no cuadra con su dígito verificador deja la sesión rejected. La tarjeta de residente del INM (desde 1.130.0; temporal o permanente) se lee por el MRZ de su reverso, con la misma regla: dígitos verificadores críticos, lo impreso y la CURP contra el MRZ y su vigencia impresa; una permanente no vence. La sesión verifica el documento que nombre submit ({ document_type }, desde 1.130.0) o, sin él, el de la última foto del documento que se subió; una foto de un documento que la sesión no ofrece contesta 400 document_type_not_offered. Las rutas públicas de la captura tienen tope por minuto (presign y confirm 600 por sesión y 3000 por IP, submit 60 y 600, la revisión previa 300 y 3000): pasado, 429 con Retry-After. Una sesión que falla después de una llamada con costo se cobra su cargo base; antes, nada

getVerificationStatus

Estado y veredicto de la sesión: session_status, decision, score, verdict, el resultado completo y network, desde dónde se conectó la persona

getVerificationResult

Lo mismo más las fotos firmadas; los cuadros de la prueba de vida sólo si los pides

getVerificationFiles

URLs firmadas de las fotos de la última verificación de un cliente

searchCustomers

Busca clientes por nombre o ID

listCustomers

Lista todos los clientes paginado

extractDocument

sin cliente

Reserva la lectura de cualquier documento y devuelve su POST firmado de S3 con un curl listo para correr: el archivo nunca pasa por la API. Con completeDocumentUpload regresa su tipo, sus datos, el checklist, la autenticidad, el resumen de riesgo del archivo y la decisión que sostiene bajo las reglas de tu organización (accept, review, reject o pending, con su reason). Cada señal y cada requisito traen sus valores en params. Reconoce también el pasaporte y la tarjeta de residente (pasaporte y tarjeta_residente, categoría id_document) y trae su zona MRZ cotejada en el bloque mrz —status consistent, inconsistent o unverifiable, cada dato impreso contra el MRZ y la vigencia: la del MRZ en un pasaporte si pasa su dígito, el vencimiento impreso en la tarjeta, indefinida en una permanente—; un MRZ que contradice lo impreso suma la señal mrz_printed_mismatch (media: revisión, nunca forged por sí sola). Esa identificación no llena ninguna casilla de los expedientes: la identidad la da la verificación de identidad. En sandbox, mock_kind passport o residentCard

verifyCsf

sin cliente

Constancia fiscal cotejada contra el registro del SAT. Reserva y devuelve el POST firmado de S3 con su curl; termina con completeDocumentUpload

verifyPoder

sin cliente

Poder notarial: apoderado, facultades y vigencia. Reserva y devuelve el POST firmado de S3 con su curl; termina con completeDocumentUpload

completeDocumentUpload

Paso 2 de extractDocument, verifyCsf y verifyPoder: confirma que el archivo está en S3 —aquí van la contraseña de un PDF protegido y lo declarado—, arranca la lectura y espera el resultado, con la validación del SAT. Se cobra al terminar —extractDocument por página, también un TIFF de varias páginas; verifyCsf y verifyPoder, cargo fijo— y sólo si el archivo se llegó a leer: uno protegido sin su contraseña, vacío, demasiado grande o que no es imagen ni PDF no se cobra; uno leído se cobra aunque salga ilegible, y su cargo base si después falla el proceso

checkFiel

sin cliente

Certificados de e.firma y CSD de un RFC, con su vigencia. Su webhook es fiel.checked (nuevo en 1.117.0)

checkSpei

sin cliente

Rastreo SPEI: confirma con Banxico si una transferencia existe y en qué estado está; con el pago liquidado, quién la envió y quién la recibió, y si hay comprobante (CEP). Los datos de la transferencia van siempre; customer_id sólo dice en qué expediente queda. Su webhook es spei.checked (nuevo en 1.123.0)

validateClabe

Validador CLABE, sin cargo: dígito verificador, banco y plaza de una CLABE; reconoce también una tarjeta de débito y un celular. Sólo directa

sendEmailOtp

sin cliente

Manda un código de 6 dígitos y perfila el dominio

verifyEmailOtp

Verifica el código de 6 dígitos recibido. send_failed: ese código nunca salió y su envío no se cobró; manda otro

kybExpediente

Cruza entre sí lo que ya pagó una empresa: 30 controles sobre once casillas, cada uno con holds_approval (desde 1.114.0: true cuando ESE control es lo que impide el pass). La INE se coteja contra RENAPO con la CURP que imprime: el cierre de una corrida KYB lo hace incluido, sin cargo, y esta tool sola sólo reusa una validación de esa CURP que ya exista. Desde 1.130.0, sin INE leída y con la casilla ine exigida, la sesión de identidad del representante (INE, pasaporte o tarjeta de residente, con prueba de vida) es su identificación si está VERIFICADA y es de la persona que nombran el poder o el acta (si no, ine falta: revisión); su aviso de calidad de imagen nunca reprueba, e ine_source dice de dónde salió (ine_extraction o identity_session). Los nombres de persona se comparan con kyc.name_match_threshold (80 % por default) y con los dos apellidos, quien firma tiene que ser un apoderado del poder (y una KYC de firmante rechazada es false), y un acta sin RFC sólo deja de retener con la denominación idéntica a la de la constancia. Con flow_id contesta en cambio la cobertura de ese flujo —qué se reutilizaría y qué falta, con su how— sin cruzar, sin registrar y sin cobrar, con la ventana de la versión PUBLICADA; sin él suma flows[] para elegir cuál correr

kycExpediente

Cruza entre sí lo que ya pagó una persona: 19 controles, 14 sobre nueve casillas, 2 del documento de la sesión de identidad (un pasaporte desde 1.128.0, una tarjeta de residente desde 1.130.0: identity_doc_vigente, crítico —una tarjeta permanente no vence—, e identity_doc_dob_vs_renapo, su fecha de nacimiento contra RENAPO; los dos en null con una INE) y 3 de red (desde dónde se conectó, leída de su sesión de identidad), cada uno con holds_approval (desde 1.114.0: true cuando ESE control es lo que impide el pass). Sin una INE aparte, los tres controles de la INE leen la sesión de identidad: su documento contra RENAPO y su Lista Nominal. Desde 1.130.0, si esa sesión leyó un pasaporte expedido fuera de México que no imprime CURP y de un titular que no es mexicano, la casilla curp sale en excused (un extranjero no tiene CURP) y no retiene; con una tarjeta de residente, ip_country_vs_document acepta una IP de México o del país de su nacionalidad. Dentro de una corrida, form_vs_renapo compara RENAPO con lo que la persona capturó, nunca con lo que un paso copió al registro. Con flow_id contesta en cambio la cobertura de ese flujo —qué se reutilizaría y qué falta, con su how— sin cruzar, sin registrar y sin cobrar, con la ventana de la versión PUBLICADA; sin él suma flows[] para elegir cuál correr

getVerificationPolicy

Qué tan estricta es tu verificación: umbrales (nómina, factura y comprobante de pago nacen sin tope de antigüedad; el estado de cuenta, bajo el del comprobante de domicilio), reglas, si exiges origen digital verificable, qué hace la decisión de un documento suelto con cada condición (decision_rules, que nacen en la decisión de siempre), los 30 controles del expediente KYB, los 19 del KYC —dos del pasaporte o la tarjeta de residente, su vigencia (crítico) y su fecha de nacimiento contra RENAPO (no crítico), y tres de red, encendidos y no críticos: mandan a revisión, nunca rechazan ni aprueban solos— y la retención de consultas directas

updateVerificationPolicy

Mueve los umbrales —incluido un tope de antigüedad propio para el estado de cuenta, la nómina, la factura o el comprobante de pago—, exige origen digital, decide qué hace la decisión de un documento suelto con cada condición (falso, sospechoso, requisito que falla, sin metadatos, escaneado o sin confirmar ante el SAT; una escritura sin decision_rules las regresa al default), apaga un control, cierra el candado de cualquiera de los dos expedientes o caduca las consultas directas. Su kyc.name_match_threshold, el umbral de nombres de persona, juzga desde 1.114.0 también a las personas del KYB: el apoderado contra la INE y contra el acta, y quien firma contra el poder

listFlows

Lista tus flujos de alta; kind opcional filtra kyc o kyb

getFlow

Detalle de un flujo: pasos con sus reglas y sus ramas (when), versión publicada, lienzo del editor, estimación y problems — ahí sale unmet_need cuando un paso lee algo que ni el formulario pide ni produce un paso anterior OBLIGATORIO y sin rama, invalid_form_field o invalid_rule cuando el cuestionario del paso de datos o sus reglas están mal armados, invalid_condition cuando una rama está mal armada —desde 1.114.0 también un valor que el campo nunca tiene (verification.status eq approved) o un operador que su tipo no admite: ramas que nunca abrían—, form_cannot_create_customer cuando el paso de datos no pide, obligatorios, los campos con los que se crea al cliente (KYC: name y last_name; KYB: legal_name o name), y repeated_tool cuando repite una herramienta: sólo se repiten el paso de documento, el de representantes y la misma herramienta en ramas que se excluyen (p. ej. «si es extranjero» / «si es mexicano»)

getFlowCatalog

El catálogo con el que se arma un flujo: pasos disponibles, tus cargos —un paso cobra lo mismo que su herramienta suelta, sin descuentos de flujo—, qué desbloquea tu plan —y en after_identity, lo que una cuenta sin KYB corre sólo después de un paso de identidad—, conditions —las fuentes, los operadores y los campos que puede leer una rama—, el provides de cada paso (qué dato le deja a los que van después) y form_fields: cómo se arma el cuestionario del paso de datos, con sus diez tipos, los campos conocidos y los límites

listFlowTemplates

Las plantillas de flujo ya armadas; kind opcional filtra kyc o kyb. Cada una trae su clave, sus pasos y el cargo estimado a tus precios

createFlowFromTemplate

Crea un borrador con los pasos de una plantilla (key); name opcional. Nace en draft: publicarlo sigue siendo tuyo

createFlowSession

Abre una verificación de un flujo publicado y devuelve su link y su token. channel: "hosted" (nuestra página, el default) o "api" (la corre tu front; exige customer_id). Con reuse_evidence: true —que también exige customer_id— los pasos cuya consulta fresca ya existe nacen resueltos y con cargo 0, y la respuesta trae reused[] y missing[] con su how. El reuso se resuelve antes del estimado, así que el saldo que se retiene es el de lo que falta; y si un paso reusado rechaza, la verificación cierra en la misma apertura y next llega en null. Un archivo de «Sube tus documentos» que ningún paso usa se cobra una vez, a su cargo suelto, sólo si ya se leyó

getFlowSession

Estado y veredicto de una verificación; con wait espera hasta la decisión. Cada paso dice si nació reusado (reused), así que uno con cargo 0 no se confunde con uno pegado. Trae además attempt y attempts[] por paso, resubmission_count y resubmissions[] (las rondas de reenvío), form_data, las respuestas propias del cuestionario, link_id, el link compartible que la abrió, network: desde dónde se conectó la persona (hasta 10 IPs con país, ASN y banderas Tor, hosting o Private Relay; null = sin IPs; en el canal API sólo cuenta el navegador de la persona, nunca tu servidor), y unused_uploads[]: los archivos de «Sube tus documentos» que ningún paso usó, con por qué y lo que sumó cada uno (0 si nunca se leyó)

nextFlowStep

Canal API: qué paso sigue y cómo resolverlo (how: api | sdk | wait). done: true = toca cerrar. Trae attempt, y resubmission cuando un revisor reabrió el paso; el paso de datos con preguntas propias sale con interaction: form e input_contract, y un paso de subida con upload (init y complete): el archivo va directo a S3. Desde 1.114.0, si la captura de identidad de ese intento ya se envió (p. ej. la página se recargó), identity_start contesta status: "submitted" sin token: no abras otra, la corrida espera el veredicto de la enviada

submitFlowForm

Contesta el paso de datos (el cuestionario): { <name>: valor } por campo. Valida igual que la página; un error es invalid_form con problems[] por campo. Las respuestas propias van a form_data, nunca al cliente ni al webhook. No cobra

attachFlowStep

Canal API: pega a un paso el request_id de una consulta que ya corriste sobre ese cliente. En un paso reabierto, la consulta tiene que ser posterior al reenvío

closeFlowSession

Canal API: cierra la corrida, arma el expediente y devuelve el veredicto y los cargos. En un KYC de producción cuya identidad leyó una INE puede contestar la corrida aún abierta: espera esa Lista Nominal (hasta 10 min) y el veredicto llega por flow.completed o getFlowSession. Desde 1.114.0, en un KYB coteja la INE del representante contra RENAPO con la CURP que imprime (incluido, sin cargo) y espera esa consulta unos segundos: si sigue en curso, también contesta la corrida aún abierta. Desde 1.130.0, si la identificación del representante es su sesión de identidad, la coteja igual y, si leyó una INE, espera también su Lista Nominal. En la página hospedada, una corrida cuyos pasos ya terminaron cierra en la siguiente consulta de la página, sin esperar al rescate de cada minuto

decideFlowSession

Cierra a mano una corrida en revisión: approved o declined, con nota. Decidir no es pedir reenvío

resubmitFlowSession

Pide que la persona repita pasos de una corrida en review o declined, con el mismo link: steps, reason, note interna y expires_in_hours opcional. Queda resubmitted y el expediente vuelve a juzgar al cerrar. Repetir no se cobra (si lo que pagó falló después de una llamada con costo —un documento que se leyó y falló, una INE, una identidad—, el siguiente paga sólo la diferencia hasta su propio cargo: 0 en un cargo fijo); hasta 3 rondas

submitFlowRepresentatives

KYB: entrega las personas de la empresa (nombre, correo, rol) y abre una corrida KYC hija por cada una. Desde 1.114.0 el expediente que cierra la corrida lee sólo a estas hijas, y quien firma tiene que ser un apoderado del poder

listFlowSessions

Lista corridas; filtra por flow_id, status (resubmitted incluido), channel, parent (las hijas de un KYB) y link_id (las que abrió un link compartible)

createFlowLink

Crea un link compartible (flk_) y su QR sobre un flujo publicado que empieza con el paso de datos y no exige cliente: cada uso abre una verificación y un cliente nuevos. label, y max_sessions y expires_at opcionales, pero un link de producción siempre los tiene: sin ellos, 100 usos y 30 días (null es 400 link_requires_cap / link_requires_expiry); una llave de sandbox crea links de sandbox, donde los dos son opcionales. El link no cobra: cada verificación se cobra como cualquier otra

listFlowLinks

Los links de un flujo con su status (active, paused, expired o exhausted), sus usos, su tope, su vencimiento y su url, la del QR

updateFlowLink

Pausa, reanuda o edita un link sin borrarlo (link_id es su id, no su token): active false apaga un QR impreso y null en max_sessions o expires_at quita el tope o el vencimiento sólo en un link de sandbox (en uno de producción es 400 link_requires_cap / link_requires_expiry)

listCustomerRelations

Las personas de una empresa con su rol y su identidad verificada, o las empresas que representa una persona

createCustomerRelation

Relaciona a mano una persona con una empresa y su rol (representante legal, apoderado, socio o beneficiario controlador)

checkEmail

sin cliente

Verifica dirección de correo electrónico

checkPhone

sin cliente

Verifica número telefónico; desde 1.113.0 uno inválido se cobra igual cuando su consulta tuvo costo

Una falla se cobra sólo si ya tuvo costo. En documentos, INE, identidad, e.firma, rastreo SPEI e investigación, una consulta que falla después de su llamada con costo se cobra a su cargo base, aunque la falla sea nuestra (por ejemplo, una INE ya leída cuya Lista Nominal estaba en mantenimiento); una que falla antes, o en la que ninguna fuente contestó, no se cobra. En CURP, RFC, teléfono, listas, judiciales y correo una falla no se cobra. Lo entregado se cobra como siempre. Repetir una captura en la página de un flujo no se cobra, y un envío de correo que falló (send_failed) nunca.

Archivos: directo a S3

Ninguna tool manda el archivo por la API. Leer un documento o una INE son dos llamadas: la primera (extractDocument, verifyCsf, verifyPoder o extractIne) reserva la consulta con el nombre y el tipo del archivo y devuelve el POST firmado de S3 con un curl listo para correr; ese curl se corre donde está el archivo —tu máquina o tu servidor—, con su ruta real, y la segunda (completeDocumentUpload o completeIneExtraction) confirma, arranca la lectura y espera el resultado. Nada se cobra hasta confirmar, y el POST vence en 10 minutos.

extractDocument → respuesta
{
  "request_id": "6622f8a1c1d2e3f4a5b6c7d8",
  "upload": {
    "url": "https://singula-documents.s3.amazonaws.com/",
    "fields": { "key": "documents/incoming/6622f8a1c1d2e3f4a5b6c7d8.pdf", "Content-Type": "application/pdf", "Policy": "…", "X-Amz-Signature": "…" }
  },
  "curl": "curl -sS -o /dev/null -w '%{http_code}\\n' -X POST 'https://singula-documents.s3.amazonaws.com/' …",
  "next": {
    "tool": "completeDocumentUpload",
    "arguments": { "request_id": "6622f8a1c1d2e3f4a5b6c7d8" }
  }
}
terminal
curl -sS -o /dev/null -w '%{http_code}\n' -X POST 'https://singula-documents.s3.amazonaws.com/' \
  --form-string 'key=documents/incoming/6622f8a1c1d2e3f4a5b6c7d8.pdf' \
  --form-string 'Content-Type=application/pdf' \
  --form-string 'bucket=singula-documents' \
  --form-string 'X-Amz-Algorithm=AWS4-HMAC-SHA256' \
  --form-string 'X-Amz-Credential=…' \
  --form-string 'X-Amz-Date=…' \
  --form-string 'Policy=…' \
  --form-string 'X-Amz-Signature=…' \
  -F 'file=@/ruta/a/recibo-cfe.pdf'

# → 204

S3 contesta 204. Después el agente llama completeDocumentUpload con el request_id (ahí va la contraseña de un PDF protegido). Si el archivo no llegó, la respuesta es 409 upload_not_received: se sube con el mismo POST mientras no venza, o se vuelve a reservar. En la INE son dos POST, uno por cara (uploads.ine_front y uploads.ine_back, con curl.ine_front y curl.ine_back), y se confirma una vez con completeIneExtraction.

Ejemplos de Uso

Una vez configurado, tu agente de IA puede usar las herramientas directamente:

Verificar identidad completa

"Crea un cliente con estos datos y valida su CURP contra RENAPO"

createCustomer()getCurp()validateCurp()

Investigación de antecedentes

"Busca los antecedentes judiciales y blacklist de este cliente"

getJudicialRecords()checkBlacklist()

Due diligence automatizado

"Haz una investigación OSINT completa del cliente cus_abc123"

getCustomer()getIntelligence()checkBlacklist()getJudicialRecords()

Alta de una empresa

Da de alta a Constructora Demo: verifica su constancia, lee el acta y el poder, revisa la e.firma y arma el expediente.

createMoralCustomer()verifyCsf()extractDocument()verifyPoder()completeDocumentUpload()checkFiel()kybExpediente()

Una consulta suelta, sin cliente

¿El teléfono +52 55 1234 5678 es real y de quién es? Y revisa si Juan Pérez García está en listas de sanciones. No me lo guardes como cliente todavía.

checkPhonePremium()checkBlacklist()

Clientes Compatibles

El servidor MCP de Singula funciona con cualquier cliente que soporte el protocolo:

🤖

Claude Desktop

Aplicación oficial de Anthropic

💻

Cursor

IDE con IA integrada

⌨️

Claude Code

CLI de Claude para desarrollo

🏄

Windsurf

IDE con agentes de IA

🔌

Cline

Extensión VS Code con MCP

Conecta tu agente de IA hoy

Sin contratos. Sandbox gratuito.