Inicio rápido
Ediccio es un servidor MCP remoto. No hay nada que instalar: el host de tu agente apunta a tu endpoint con un token de portador y llama a tres herramientas del plano de datos. Las señales entran como texto plano; los perfiles se construyen en segundo plano.
1. Obtén tu credencial
Tu panel en app.ediccio.ai guarda tus datos de conexión y tu credencial del plano de datos (un ID de cliente y un secreto que solo se muestra una vez). Canjéala por un token de portador:
# endpoint + credential: dashboard → connection details TOKEN=$(curl -s "$EDICCIO_TOKEN_URL" \ -u "$CLIENT_ID:$CLIENT_SECRET" \ -d "grant_type=client_credentials" | jq -r .access_token)
2. Conecta tu agente
Añade esto al mcp.json de cualquier host compatible con MCP y reinicia. Tu agente ya puede llamar a las tres herramientas del plano de datos: ediccio___write, ediccio___read, ediccio___search. (Las herramientas de administración aparecen en el mismo listado, pero rechazan una clave de agente.) Los tokens son de corta duración: repite el canje cuando recibas un 401.
{ "mcpServers": { "ediccio": { "type": "http", "url": "https://mcp.eu.ediccio.ai/mcp", "headers": { "Authorization": "Bearer <your token>" } } } }
3. Envía una señal
Pídele a tu agente que registre lo que ha dicho un cliente, o llama tú mismo a la herramienta. Una entrada en lenguaje natural, identificada por el end_user_id que ya usas para ese cliente:
# via your agent, or one MCP tools/call by hand write( end_user_id = "pat@acme.com", source = "email", text = "we keep reinventing memory for every agent", ) # → { "event_id": "0197f3a8-…", "accepted_at": "…" } # the accept is immediate; extraction runs in the background
4. Recupérala
Después, pregúntale a tu agente por el cliente:
> What does Pat at Acme care about? Calling tool ediccio___read(end_user_id="pat@acme.com") ✓ profile Pat is evaluating managed customer-profile layers. Top pain: re-implementing memory per agent...
Los perfiles se construyen de forma asíncrona: la lectura de un sujeto completamente nuevo devuelve profile: null hasta que llega la primera proyección. Es un estado normal, no un error.
Referencia de la API
Tres herramientas en el plano de datos. Cada valor que guarda un perfil lleva una puntuación de confianza y apunta al evento del que procede.
write
Registra una señal asociada a un end_user_id. La extracción y la proyección se ejecutan de forma asíncrona.
write( end_user_id = "pat@acme.com", # required · your key, never resolved by us text = "…", # required · the conversation text source = "zendesk", # optional · defaults to "mcp" metadata = {…}, # optional idempotency_key = "…", # optional · see below ) # → { "event_id": "0197f3a8-…", "accepted_at": "…" }
Los agentes reintentan; el perfil lo cuenta una sola vez. La misma idempotency_key en un plazo de 24 horas devuelve el event_id original y no escribe nada nuevo.
read
Recupera el perfil. dimensions acota la respuesta a un subconjunto (intent, pain, sentiment, preferences, traditional, además de cualquier custom.<name> o journey.<name> que defina tu capa semántica).
read( end_user_id = "pat@acme.com", dimensions = ["intent", "pain"], # optional include_evidence = true, # optional ) # → { end_user_id, profile: { intent: [{value, confidence, # observed_at, provenance, evidence_event_id}], pain: […], … }, # schema_version, updated_at, last_event_id }
En la lista de un recorrido, la primera entrada es la etapa actual del cliente. last_event_id es la marca de agua de frescura.
search
Búsqueda en lenguaje natural entre todos los perfiles de tu tenant. La recencia va en un filtro, no en el texto de la consulta. No hay umbral de relevancia: se devuelven los perfiles más cercanos aunque ninguno se parezca a la consulta, así que revisa el relevance_score antes de dar uno por bueno. Un 0.5 equivale a ninguna similitud, y un texto sin relación suele quedar apenas por encima.
search( query = "anyone close to cancelling", top_k = 10, # max 50 dimensions = ["pain", "sentiment"], # optional min_confidence = 0.5, # optional recency_window_days = 30, # optional ) # → { matches: [{ end_user_id, relevance_score, # matched_observations: [{dimension, value, confidence, provenance}], # updated_at }] }
Capa semántica
Todo lo anterior es el plano de datos. Esta sección y la siguiente son la superficie de administración: una segunda credencial (ámbito ediccio/semantics.admin) que puede cambiar lo que significan los perfiles, pero no puede leerlos.
Las dimensiones base son cinco. Las demás son tuyas: define dimensiones custom.<name> y etapas journey.<name> en lenguaje natural, y el extractor las rellena en cada perfil. Cuatro herramientas:
- get_semantic_layer devuelve la versión activa y las propuestas abiertas.
- propose_semantic_layer recibe tus refinamientos, dimensiones personalizadas y recorridos, y devuelve un diff y un token de confirmación. Todavía no cambia nada.
- test_semantic_layer ejecuta una extracción real en modo de prueba sobre tu texto, para que veas exactamente qué guardaría una versión propuesta antes de que guarde nada.
- confirm_semantic_layer activa la versión, sin efecto retroactivo. Los cambios de esquema se despliegan igual que el código: diff, ejecución de prueba, confirmación.
Reprocesar el historial
Redefine una dimensión hoy y todo tu historial se adapta a ella: el reprocesado vuelve a proyectar cada evento guardado según la capa semántica activa. Te dice cuántos eventos y sujetos abarca antes de que se ejecute nada, cuenta sus propias llamadas de extracción (una por cada evento histórico no vacío, reintentos incluidos) y nunca arranca por sí solo.
- request_replay devuelve la estimación:
events_total,subjects_totaly un token de confirmación vinculado a la versión activa de la capa. - confirm_replay lo deja en cola para la siguiente pasada del worker. El worker reconstruye un sujeto por transacción, así que una llamada concurrente a
readve la proyección antigua o la nueva, nunca mitad y mitad. - get_replay informa del progreso y de los recuentos: eventos procesados, sujetos procesados, llamadas de extracción.
Seguridad y datos
Finalidad prevista. Ediccio construye un perfil profundo de los propios clientes, clientes potenciales y usuarios del producto de una empresa a partir de las conversaciones que esa empresa ya mantiene con ellos, para que los agentes de IA de su producto (asistente de ventas, copiloto de soporte, bot de onboarding de clientes, agente de éxito del cliente, agente de marketing que escribe a clientes que pueden responderle) puedan personalizar esas conversaciones. No está destinado a utilizarse en sistemas que evalúen a personas a efectos de crédito, seguros o prestaciones públicas, de triaje de emergencias, de contratación de personal o en el trabajo, o de educación o formación, ni como fuente de datos de entrada de dichos sistemas ni como parte de ellos, ni en los ámbitos de la garantía del cumplimiento del Derecho, la migración, la justicia o las elecciones. Tampoco está destinado a elaborar perfiles de los propios trabajadores, candidatos a un empleo, estudiantes, personas en formación o pacientes de una empresa. Una definición de dimensión, campo o recorrido que mencione una categoría especial de datos personales o antecedentes penales (arts. 9 y 10 del RGPD) se rechaza antes de que surta efecto.
- El aislamiento entre tenants no es un filtro de filas. Los perfiles de cada tenant están en su propia base de datos. Ninguna herramienta recibe un parámetro de tenant: tu tenant se obtiene de tu token verificado, nunca de nada que envíes.
- Credenciales particionadas por ámbito. La clave que tienen tus agentes puede escribir señales y leer perfiles; no puede tocar el esquema. La clave de administración puede cambiar el esquema; no puede leer perfiles. Un agente víctima de una inyección de prompts sigue siendo un grabador de datos, nunca un administrador.
- Procedencia en cada dato. Cada observación lleva su puntuación de confianza, su marca de tiempo y el evento del que procede. Si no puede mostrar su evidencia, no se guarda nunca.
- Supresión y exportación a petición. La supresión elimina físicamente al sujeto de la base de datos activa con un único borrado en cascada, mientras la solicitud sigue abierta; la exportación llega del mismo modo, como un paquete completo.
- Rotación de claves sin tiempo de inactividad. Rótalas desde el panel; las credenciales antiguas y las nuevas conviven durante siete días. El nuevo secreto se muestra una sola vez y nunca más se puede recuperar desde el panel.
- Residencia de datos en la UE por defecto. El almacenamiento, el procesamiento y la terminación TLS de los endpoints de la API permanecen todos en la UE; los modelos y proveedores que hay detrás del servicio se publican en la página de confianza y seguridad.
Planes y límites
Para los precios solo cuenta una cosa: las señales, las entradas en lenguaje natural que le das al extractor. Las lecturas nunca cuentan, y el número de perfiles que guardes tampoco. Estos son los precios que entrarán en vigor cuando empiece la facturación. Durante el acceso anticipado no se contabiliza nada ni se aplica ningún límite de plan; el único techo es una salvaguarda de concurrencia de toda la plataforma contra el tráfico desbocado, no un tope por plan. Los precios no incluyen el IVA ni otros impuestos aplicables.
- Free. $0 para siempre. 5.000 señales / mes.
- Team. $349 / mes. Incluye 250.000 señales / mes · luego $0,0015 cada una.
- Scale. $1.499 / mes. Incluye 1,5 M de señales / mes · luego $0,0011 cada una.
- Enterprise. Próximamente. Volumen a medida · anual · habla con nosotros.
Todos los planes incluyen el mismo producto: las mismas herramientas, las mismas credenciales particionadas por ámbito, el mismo aislamiento, la misma residencia de datos. Nada de lo que hay en esta página depende del plan.
Errores
Los errores de las herramientas se ajustan a JSON-RPC: un code, un message y un identificador con nombre en data.identifier que puedes comparar en tu código. Dos cosas que no son errores: un sujeto que aún no tiene perfil (read devuelve profile: null) y un reintento de escritura (la misma idempotency_key devuelve el event_id original).
{ "code": -32602, "message": "text must be non-empty", "data": { "identifier": "validation_error" } } # a token without the tool's scope: # -32001 · data.identifier = mcp_write_scope_required
Para soporte, indica el event_id que devolvió la escritura.