Documentación
Tiska para desarrolladores y agentes de IA
Última actualización: 29 de agosto de 2026
Tiska es el software de agenda y turnos de los negocios de belleza de Argentina (usetiska.com). Esta página lista todo lo que Tiska publica en formato legible por máquinas: el servidor MCP, el archivo llms.txt, la negociación de contenido en markdown, los sitemaps y la forma de las URLs públicas.
Todo lo que hay acá es público: no hace falta clave, token ni registro. Las consultas son de solo lectura; la única operación que escribe es reservar un turno, y hace exactamente lo mismo que el formulario de la página del negocio.
1. Servidor MCP
Tiska expone un servidor Model Context Protocol con transporte Streamable HTTP, para que Claude, ChatGPT y cualquier agente compatible consulten los datos públicos de los negocios sin scrapear HTML.
| Endpoint | https://usetiska.com/mcp |
|---|---|
| Transporte | Streamable HTTP (JSON-RPC 2.0 por POST) |
| Versión de protocolo | 2025-06-18 |
| Autenticación | Ninguna (datos públicos) |
| Estado | Sin sesión (stateless) |
Configuración
{
"mcpServers": {
"tiska": {
"type": "http",
"url": "https://usetiska.com/mcp"
}
}
}
En Claude Code: claude mcp add --transport http tiska https://usetiska.com/mcp
Tools disponibles
| Tool | Parámetros | Devuelve |
|---|---|---|
list_businesses |
query (opcional), limit (opcional) |
Negocios publicados con Tiska: slug y URL pública. |
get_business |
slug, local (opcional) |
Nombre, descripción, dirección, servicios con precio y duración, equipo, horarios de atención, reseñas y URL para reservar. |
get_availability |
slug, date (YYYY-MM-DD), local (opcional) |
Horario de atención de ese día y los bloques ya ocupados. No calcula los huecos libres: la disponibilidad real depende del servicio, del profesional y de las opciones elegidas, y la resuelve el formulario de reserva. |
create_appointment |
slug, service_id, date, time, first_name, last_name, phone, email; opcionales staff_id, local, note |
Reserva un turno real. Devuelve el id del turno, el resumen y, si el negocio pide seña, el link de pago de Mercado Pago. |
about_tiska |
— | Qué es Tiska, para quién, planes y precios vigentes. |
Reservar
create_appointment llama exactamente al mismo procedimiento que el formulario web, así que hereda sus reglas: tope de reservas por minuto, validación de teléfono y email, verificación de que el servicio y el profesional sean de ese negocio, control de superposición y cálculo de la seña en el servidor. Además chequea que la hora caiga dentro del horario de atención.
- El email es obligatorio (en el formulario web no lo es). Ahí le llega a la persona la confirmación con los links para modificar o cancelar el turno: es la garantía de que hay alguien real detrás de la reserva y de que se entera de lo que se agendó en su nombre.
- El turno queda marcado con la nota
[Reservado por un asistente de IA], para que el negocio sepa de dónde vino. - Si el negocio pide seña, el turno se crea con el pago pendiente y la respuesta trae un
link_de_pagode Mercado Pago. No queda firme hasta que se pague. - Modificar y cancelar no se hacen por MCP: van por los links del mail de confirmación, que son los que aplican la política de cancelación de cada negocio.
- Reservar implica aceptar los Términos y Condiciones. Mostráselos a la persona antes de llamar a la tool.
Antes de reservar, pedí get_business para obtener el id del servicio y get_availability para elegir un horario libre.
Ejemplo
curl -s https://usetiska.com/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
2. API REST
Los mismos datos que devuelve el MCP, por HTTP y en JSON, para cuando no hay un cliente MCP del otro lado. Es de sólo lectura y no pide clave ni registro.
| operationId | Endpoint | Devuelve |
|---|---|---|
listBusinesses |
GET /api/v1/businesses?query=&limit= |
Negocios publicados: slug, URL pública y URL de reserva. |
getBusiness |
GET /api/v1/businesses/{slug}?local= |
Nombre, descripción, dirección, sucursales, servicios con id, precio y duración, equipo, horarios de atención, reseñas y booking_url. |
getAvailability |
GET /api/v1/businesses/{slug}/availability?date=YYYY-MM-DD&local= |
Si el negocio abre ese día, su horario de atención y los tramos ya ocupados. |
Especificación completa: usetiska.com/openapi.json (OpenAPI 3.1, con operationId únicos, parámetros tipados y esquemas de respuesta; se puede cargar tal cual como herramientas de function calling). El índice de la API vive en usetiska.com/api/v1.
Ejemplo
curl -s https://usetiska.com/api/v1/businesses?limit=5
curl -s https://usetiska.com/api/v1/businesses/<slug>
curl -s "https://usetiska.com/api/v1/businesses/<slug>/availability?date=2026-09-15"
Errores
Ninguna ruta bajo /api/ devuelve HTML: los errores siempre vienen con este sobre y el código HTTP que corresponde.
{
"error": {
"code": "business_not_found",
"message": "No existe ningún negocio con el slug 'xxx' en Tiska.",
"resolution": "Listá los slugs vigentes en GET https://usetiska.com/api/v1/businesses o en https://usetiska.com/sitemap-negocios.xml"
}
}
Códigos posibles: invalid_parameter (400), not_found (404), business_not_found (404), method_not_allowed (405), rate_limited (429) y upstream_unavailable (503).
Autenticación y límites
- No hay claves de API ni registro de desarrollador: todo lo que expone la API ya es público en la página de cada negocio, así que no hay nada que autenticar. Tampoco hace falta gestionar, rotar ni revocar credenciales.
- Límite por IP: 60 consultas por minuto. Al pasarse, la respuesta es
429concode: "rate_limited". - Cabeceras para autolimitarse: toda respuesta trae
RateLimit-Policy: "reads";q=60;w=60— cuotaqde 60 consultas por ventanawde 60 segundos, contadas por IP, según el RFC de RateLimit header fields for HTTP. El429suma ademásRateLimit: "reads";r=0;t=60(restantes y segundos hasta reponerse) yRetry-After: 60. Las tres van expuestas por CORS, así que se leen también desde el navegador. No se emite un remanente exacto en las respuestas200a propósito: como se cachean 5 minutos en el CDN, ese número describiría la última llamada que fue al origen y no la tuya. - Cache: las respuestas se sirven con
s-maxage=300, así que repetir la misma consulta dentro de los 5 minutos la resuelve el CDN y no consume cupo. - CORS abierto (
Access-Control-Allow-Origin: *): se puede llamar desde el navegador.
Versionado y obsolescencia
La versión va en la ruta: /api/v1/.... La regla, para que se pueda integrar sin miedo:
- Cambios compatibles sobre
v1, sin aviso: campos nuevos en una respuesta, valores nuevos en unenum, endpoints nuevos. Un cliente tiene que ignorar los campos que no conoce. - Cambios que rompen (sacar un campo, cambiarle el tipo, cambiar el significado de uno existente): estrenan
/api/v2/....v1sigue respondiendo. - Cuando una versión se declara obsoleta, sus respuestas empiezan a traer
Deprecation: true,Sunset: <fecha>en el formato de fecha HTTP del RFC 9110 yLink: <https://usetiska.com/desarrolladores>; rel="deprecation". Entre el primerDeprecationy la fecha deSunsethay al menos 6 meses. - Hoy no hay ninguna versión obsoleta y esas tres cabeceras no se emiten. Si aparecen en una respuesta, son reales.
Lo mismo vale para el servidor MCP: protocolVersion se negocia en el initialize y el spec de las tools se lee siempre de tools/list, nunca de una copia guardada.
Probar sin romper nada
No hay un entorno sandbox aparte, y no hace falta: la API es de sólo lectura, así que cualquier llamada contra producción es inofensiva. Para probar, tomá un slug real de GET /api/v1/businesses y usalo en los otros dos endpoints. Lo único que escribe en Tiska es create_appointment, que está sólo en el servidor MCP y crea un turno de verdad en la agenda de un negocio real: no lo llames para probar.
3. llms.txt
usetiska.com/llms.txt, en el formato de llmstxt.org: resumen del producto, precios, cuándo conviene usar Tiska y el índice completo de páginas y artículos.
4. Contenido en markdown
La home responde en markdown si se lo pedís por Accept, en la misma URL (acceptmarkdown.com):
curl -s -H "Accept: text/markdown" https://usetiska.com/
Devuelve Content-Type: text/markdown; charset=utf-8 y Vary: Accept. Con cualquier otro Accept, la misma URL devuelve el HTML de siempre.
5. Sitemaps y robots
- /sitemap.xml — páginas del sitio (landings, blog, legales).
- /sitemap-negocios.xml — página pública de cada negocio, generada en vivo.
- /robots.txt — sin restricciones para agentes; sólo
/api/queda afuera.
6. URLs públicas de los negocios
https://usetiska.com/<negocio>— página pública: servicios, precios, horarios, equipo, reseñas y reserva.https://usetiska.com/<negocio>/<sucursal>— una sucursal puntual de una marca con varios locales.- Si el negocio cambia de nombre, la URL vieja redirige con un
301. - Un slug que no existe devuelve un
404real, no una página vacía con estado 200.
Las páginas de negocios se sirven con noindex a propósito: existen para los clientes de cada salón, no para posicionar en buscadores.
7. Lo que no hay
- No hay claves de API ni cuentas de desarrollador: la API REST y el MCP son públicos y anónimos.
- No hay un CLI de Tiska, ni paquete en npm, PyPI o Homebrew. El único comando de esta página,
claude mcp add --transport http tiska https://usetiska.com/mcp, es un comando de Claude Code para registrar el servidor MCP: no instala nada de Tiska. Para scriptear contra Tiska, la API REST concurlalcanza y no hay nada que instalar. - No hay endpoint REST para crear, mover ni cancelar turnos: reservar se hace por MCP o en la página del negocio.
- No se accede a datos privados de un negocio (clientes, caja, comisiones, teléfonos y emails del equipo): eso vive detrás de la cuenta del dueño.
- No se cancelan ni se reprograman turnos por MCP: eso va por los links del mail de confirmación, que aplican la política de cada negocio.
8. Contacto
Dudas, integraciones o algo que falte en esta página: hola@usetiska.com.