zyta-sign-mcp
Enables AI agents to manage Zyta Sign documents, signatures, and studies with secure authentication and permission-respecting operations.
README
zyta-sign-mcp
Servidor Model Context Protocol (stdio) que expone tus documentos, firmas y estudios de Zyta Sign a un agente como Claude Desktop, Cursor o Codex CLI — respetando tus permisos exactos.
Instalación rápida (cualquier usuario)
{
"mcpServers": {
"zyta": {
"command": "npx",
"args": ["-y", "zyta-sign-mcp"],
"env": {
"KAIRO_BASE_URL": "https://sign.zyta.app",
"KAIRO_CLIENT_LABEL": "Cursor"
}
}
}
}
- Pegá eso en
.cursor/mcp.json(Cursor) oclaude_desktop_config.json(Claude) - Recargá MCP → conectado
- En el chat: "logueate en zyta" → el agente llama
kairo_login→ autorizás en/device
No hace falta clonar repos ni rutas locales. Solo Node.js 18+.
Nota: el paquete npm se llama
zyta-sign-mcp(el nombrekairo-mcpya está ocupado en npm por otro proyecto). Las herramientas siguen usando el prefijokairo_*.
Autenticación (login obligatorio)
Sin sesión autenticada, todas las herramientas fallan — salvo kairo_login y
kairo_disconnect. No hay auto-login silencioso por variables de entorno: el token
KAIRO_API_TOKEN solo se usa si lo pasás explícitamente a kairo_login({ access_token })
(o como fallback dentro de esa herramienta). Los permisos los determina el usuario del
token: el agente no puede hacer más de lo que podés hacer vos en el dashboard.
Device Authorization Flow (recomendado, estilo gh auth login)
El MCP conecta al instante (stdio) sin bloquear en login. Cuando el agente necesita
operar, llama a kairo_login:
- Se abre el navegador en
/device?user_code=XXXX-XXXX - Autorizás con tu cuenta (o email/contraseña si no tenés sesión web)
- El agente recibe el token y responde en el chat: "Sesión OK como Juan…"
- El token queda en
~/.kairo/credentials-*.json(sesiones posteriores se reutilizan)
No hace falta copiar/pegar secretos en mcp.json.
Cursor (recomendado)
- Levantá la app:
cd kairo-sign
npm run dev # :3000
- Configurá
.cursor/mcp.json(proyecto o global):
{
"mcpServers": {
"zyta": {
"command": "npx",
"args": ["-y", "zyta-sign-mcp"],
"env": {
"KAIRO_BASE_URL": "http://localhost:3000",
"KAIRO_CLIENT_LABEL": "Cursor"
}
}
}
}
- Cursor → Settings → MCP → Reload →
kairoconectado (verde) - En el chat: "logueate en kairo" o el agente llama
kairo_login - Autorizás en el browser → mensaje en Cursor (hook) y/o respuesta de
kairo_login
Al autorizar en /device, se escribe .cursor/kairo-auth-complete.json y un hook de Cursor muestra en el chat que la sesión quedó lista (al terminar la respuesta del agente o al enviar el próximo mensaje).
Smoke test device flow: cd kairo-sign && npx tsx scripts/smoke-device-auth.ts
Bridge local (misma PC, alternativa al device flow)
Si desarrollás con el dashboard y Cursor en la misma máquina, podés sincronizar la
sesión del navegador al MCP sin abrir /device:
cd kairo-sign && npm run agent:setup— genera un secreto compartido en.env.localy.cursor/mcp.json(KAIRO_AGENT_BRIDGE_SECRET)- Reiniciá
npm run devy recargá el MCP en Cursor - Logueate en el dashboard → el front hace POST al puente local (
127.0.0.1:9322) y el agente queda autenticado solo
El puente no reemplaza el login obligatorio: solo copia el token cuando ya iniciaste
sesión en el browser. En producción remota seguí usando kairo_login (device flow).
Token manual (alternativa)
- Dashboard → "Acceso para agentes (MCP)" → Crear token
- En el chat:
kairo_login({ access_token: "ztk_..." })— no lo pongas enmcp.json
Config mínima (sin token manual)
{
"mcpServers": {
"zyta": {
"command": "npx",
"args": ["-y", "zyta-sign-mcp"],
"env": {
"KAIRO_BASE_URL": "https://sign.zyta.app",
"KAIRO_CLIENT_LABEL": "Cursor laptop"
}
}
}
}
Instalación
npm install -g zyta-sign-mcp
# o on-demand: npx -y zyta-sign-mcp
Claude Desktop
Editá claude_desktop_config.json (Settings → Developer):
{
"mcpServers": {
"kairo": {
"command": "npx",
"args": ["-y", "zyta-sign-mcp"],
"env": {
"KAIRO_BASE_URL": "https://sign.zyta.app"
}
}
}
}
Codex CLI
En ~/.codex/config.toml:
[mcp_servers.kairo]
command = "npx"
args = ["-y", "zyta-sign-mcp"]
env = { KAIRO_BASE_URL = "https://app.zyta.legal" }
Avanzado / legacy: HTTP OAuth en Cursor
Cursor también puede conectarse por URL con OAuth 2.1 (cursor:// redirect).
Este flujo es más frágil en Windows (alert del browser, PKCE en Cursor).
Preferí stdio + kairo_login arriba.
Si igual querés probarlo:
cd kairo-sign
npm run dev # :3000
npm run mcp:http # :3001
{
"mcpServers": {
"kairo": {
"url": "http://localhost:3001/mcp",
"transport": "http"
}
}
}
Smoke test: npx tsx scripts/smoke-cursor-oauth.ts
Flujo típico: subir, firmar y descargar
kairo_loginsi no hay sesiónkairo_upload_document({ base64, filename, alias? })→document.idkairo_get_sign_url({ documentId, mode: "external" })→url+waitParams- Abrís la URL en el browser y firmás con el mouse
kairo_wait_for_signature(waitParams)→ cuandosigned: true, obtenéssignature.idkairo_download_signed_pdf({ signatureId })→ PDF firmado en base64kairo_verify_signature({ documentHash })→ verificación por hash
Para firma con tu cuenta (PIN + certificado completo), usá mode: "account" en el paso 3.
Variables de entorno
| Variable | Default | Descripción |
|---|---|---|
KAIRO_BASE_URL |
http://localhost:3000 |
URL base de la instancia de Kairo. |
KAIRO_API_TOKEN |
— | Solo para scripts/CI o kairo_login vía env; no auto-login al arrancar. |
KAIRO_CLIENT_LABEL |
Agente MCP |
Nombre mostrado en la pantalla /device. |
KAIRO_AGENT_BRIDGE_SECRET |
— | Secreto compartido con el dashboard (bridge local). |
KAIRO_AGENT_BRIDGE_PORT |
9322 |
Puerto del puente localhost. |
KAIRO_AGENT_BRIDGE |
(activo) | 0 = no levantar el bridge al arrancar. |
BRAVE_PATH |
(Windows) ruta a brave.exe |
Navegador usado por kairo_login (default: Brave). |
KAIRO_TOKEN_CACHE_DIR |
~/.kairo |
Carpeta donde se guarda el token tras Device Flow. |
Tools expuestas (49)
Autenticación
| Tool | Qué hace |
|---|---|
kairo_login |
Inicia sesión (device flow o token manual). |
kairo_whoami |
Usuario detrás del token. |
kairo_disconnect |
Borra token cacheado. |
Documentos
| Tool | Qué hace |
|---|---|
kairo_list_documents |
Lista documentos visibles. |
kairo_get_document |
Detalle + firmas. |
kairo_download_document |
PDF original en base64. |
kairo_upload_document |
Sube PDF (base64). Requiere scope write. |
kairo_upload_documents |
Sube hasta 10 PDFs en una llamada. |
kairo_update_document |
Cambia alias. Requiere scope write. |
kairo_delete_document |
Elimina documento propio. Requiere scope write. |
Firma
| Tool | Qué hace |
|---|---|
kairo_get_sign_url |
URL para firmar + waitParams + share links (WhatsApp/Telegram). Soporta placement e inviteMessage. |
kairo_wait_for_signature |
Polling hasta firmado. |
kairo_sign_workflow |
Subir PDF + link externo en un paso. |
kairo_request_external_sign |
(legacy) Preferí get_sign_url o sign_workflow. |
kairo_create_external_bundle |
Paquete multi-documento (2–25 PDFs). |
kairo_get_external_bundle_status |
Estado del paquete. |
kairo_wait_for_external_bundle |
Polling hasta paquete completo. |
kairo_list_external_requests |
Pedidos externos de un documento. |
kairo_revoke_external_request |
Revoca link externo. Requiere scope write. |
kairo_download_signed_pdf |
PDF estampado en base64. |
kairo_get_signature_certificate |
Certificado JSON con verifyUrl. |
kairo_verify_signature |
Verifica por hash del documento. |
kairo_verify_document |
Verifica subiendo el PDF + signatureId. |
kairo_signature_diff |
Informe diff PDF (Premium). |
kairo_signature_anchor |
OpenTimestamps: status / upgrade / .ots |
kairo_open_browser |
Abre URL de firma en navegador. |
Presets de firma
| Tool | Qué hace |
|---|---|
kairo_list_signature_presets |
Biblioteca de firmas guardadas. |
kairo_create_signature_preset |
Crea preset (PNG base64 obligatorio). Scope write. |
kairo_update_signature_preset |
Edita preset. Scope write. |
kairo_delete_signature_preset |
Elimina preset. Scope write. |
Estudios
| Tool | Qué hace |
|---|---|
kairo_list_studios |
Estudios donde sos miembro. |
kairo_create_studio |
Crea estudio (Premium). Scope write. |
kairo_get_studio |
Detalle con áreas y miembros. |
kairo_update_studio |
Renombra estudio. Scope write. |
kairo_delete_studio |
Elimina estudio. Scope write. |
kairo_create_studio_area |
Crea área. Scope write. |
kairo_update_studio_area |
Renombra área. Scope write. |
kairo_delete_studio_area |
Elimina área. Scope write. |
kairo_add_studio_member |
Agrega miembro por email. Scope write. |
kairo_update_studio_member |
Cambia rol/área. Scope write. |
kairo_remove_studio_member |
Quita miembro. Scope write. |
Cuenta, webhooks y settings
| Tool | Qué hace |
|---|---|
kairo_get_plan_quota |
Plan, cuota mensual y features. |
kairo_get_external_sign_settings |
TTL del link externo. |
kairo_update_external_sign_settings |
Cambia TTL (10m…on_sign). Scope write. |
kairo_list_webhooks |
Lista webhooks HTTPS. |
kairo_create_webhook |
Registra webhook. Scope write. |
kairo_delete_webhook |
Elimina webhook. Scope write. |
Próximamente (stub)
| Tool | Estado |
|---|---|
kairo_create_template |
No implementado en backend |
kairo_create_sequential_sign |
Firma A→B no implementada |
Las mutaciones con scope write fallan con 403 si el token es solo lectura.
Modelo de seguridad
- El token está hasheado con HMAC-SHA256 (
SIGNING_SECRET) en la base; solo guardamos el prefijo + últimos 4 chars para identificación. - Cualquier endpoint que el MCP consume usa el mismo
getCurrentUserOrTokenque el dashboard → no hay "modo admin" oculto. - Podés revocar un token en cualquier momento desde el dashboard. La revocación es instantánea (no hay TTL de caché).
- Los tokens pueden tener vencimiento opcional (1–365 días).
Desarrollo
npm install
KAIRO_BASE_URL=http://localhost:3000 npm run dev
# o lo inspeccionás con MCP Inspector (login explícito vía kairo_login):
KAIRO_API_TOKEN=ztk_... npm run inspect
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。