AgentCloak: anonimizar PII antes de que llegue al modelo

AgentCloak sustituye los datos personales de un texto por valores sintéticos consistentes antes de que salgan hacia un modelo, y los devuelve a su valor original en la respuesta. Lo hace InCountry, la empresa de residencia de datos, y hoy tiene tres formas de usarse: una extensión de navegador gratuita, un MCP server con dos tools, y una skill que instalas en Claude Code o Cursor.
El problema que ataca es viejo y muy concreto: el momento en que un agente lee tu base de datos de clientes y manda los nombres reales a un proveedor de IA. Nadie lo decidió, simplemente pasa porque el contexto viaja entero.
Esto es lo que dicen las fuentes originales: la documentación de InCountry, el repositorio público de la skill y el comunicado de lanzamiento.
Qué es AgentCloak y qué productos incluye
AgentCloak es la línea de producto "Sovereign AI" de InCountry, separada de su negocio original de residencia de datos (InCountry DRaaS, InCountry Identity, InCountry China). Dentro de AgentCloak hay cuatro piezas con públicos distintos:
- AgentCloak Desktop, extensión de navegador y app de escritorio para usuarios finales.
- AgentCloak Server, la pieza para desarrolladores: MCP Server, MCP Proxy, A2A Proxy o API.
- AgentCloak Skills, la skill de agente que se instala en un editor o CLI.
- AgentCloak para Agentforce, la integración con Salesforce.
La empresa anunció AgentCloak el 22 de septiembre de 2025 junto con una ronda de 10 millones de dólares liderada por Arbor Ventures. Según el comunicado del 18 de septiembre de 2026, la financiación total acumulada es de 50 millones.
AgentCloak Desktop: la versión gratuita para ChatGPT y Claude
La pieza que se lanzó hoy. Es un cloaking que corre en tu máquina, no en la nube: según la página de producto, empareja el cifrado de gemelo digital con un modelo pequeño que se ejecuta localmente.
Sustituye por valores sintéticos consistentes, con el ejemplo literal que da el comunicado: "Peter Parker" pasa a ser "Julio Schmidt", y "364 23rd St" pasa a ser "401 Vanessa Curve". Luego restaura los valores originales en la respuesta del modelo.
Lo que detecta la versión gratuita: nombres, direcciones de correo, teléfonos, URLs, números de seguridad social e identificadores fiscales, números de cuenta y de ruta bancaria, y direcciones físicas. Siete idiomas, español incluido.
Chatbots cubiertos: ChatGPT, Claude, Gemini, Grok, Copilot y DeepSeek. Se distribuye como extensión para Chrome, Safari y Edge, y como app nativa para macOS y Windows. Es gratis para uso individual.
Peter Yared, fundador y CEO, resume la tesis en el comunicado: "People should not have to choose between useful AI and keeping their private data private" (la traducción es mía: la gente no debería tener que elegir entre una IA útil y mantener sus datos privados).
El MCP server de AgentCloak: las tools cloak y uncloak
Aquí empieza la parte de desarrollador. El MCP server expone exactamente dos tools, cloak y uncloak, sobre JSON-RPC 2.0 por HTTP POST. Si vienes de la introducción a MCP, el patrón es el de siempre: tools/call con un nombre y unos argumentos.
Las variables que necesitas:
export INC_MCP_URL="https://us-mt-01.api.incountry.io/mcp"
export INC_MCP_API_KEY="<uuid>:<token>"La URL no es fija: sale del campo mcp_server_url de tu entorno, y el patrón general que documenta el tutorial es https://<country>-restapi-<pop>.api.incountry.io/mcp. Es decir, el país en el que corre el servidor forma parte del hostname, que es coherente con el resto del negocio de InCountry.
Anonimizar un texto:
curl -s -X POST "$INC_MCP_URL" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "x-inc-agentcloak-api-key: $INC_MCP_API_KEY" \
-d '{
"jsonrpc": "2.0",
"method": "tools/call",
"id": 1,
"params": {
"name": "cloak",
"arguments": { "message": "John Smith, age 34" }
}
}'La respuesta trae el texto anonimizado y un id de sesión. Ese id es la pieza clave, porque sin él no hay vuelta atrás:
curl -s -X POST "$INC_MCP_URL" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "x-inc-agentcloak-api-key: $INC_MCP_API_KEY" \
-d '{
"jsonrpc": "2.0",
"method": "tools/call",
"id": 2,
"params": {
"name": "uncloak",
"arguments": { "message": "<texto anonimizado>", "id": "<cloak-id>" }
}
}'En Node, el propio README lo reduce a una función y un fetch, sin SDK ni dependencias nuevas:
async function callMcp(tool, args) {
const res = await fetch(process.env.INC_MCP_URL, {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-inc-agentcloak-api-key": process.env.INC_MCP_API_KEY,
},
body: JSON.stringify({
jsonrpc: "2.0",
method: "tools/call",
id: 1,
params: { name: tool, arguments: args },
}),
});
return (await res.json()).result.structuredContent;
}La consecuencia arquitectónica conviene decirla en voz alta: el mapeo entre el valor real y el sintético vive del lado de AgentCloak, porque es lo que permite que uncloak funcione. No estás eliminando el dato, lo estás moviendo a otro proveedor, uno cuyo modelo de negocio es precisamente dónde se guarda. Si tu requisito es que el dato no salga de tu infraestructura, la vía es el despliegue single-tenant, on-premises o en AWS Outposts que la empresa documenta, no el multi-tenant.
Instalar la skill de AgentCloak en Claude Code, Cursor o Codex
InCountry publica la skill en abierto, en el repositorio agentcloak/skill de su organización de GitHub. Se declara MIT en el package.json y en el marketplace.json, y se publica en npm como agentcloak-skill, cuya última versión es la 1.2.8, del 4 de junio de 2026.
La instalación recomendada usa el CLI skills de vercel-labs, el mismo que se está estandarizando para distribuir skills entre agentes:
npm install -g skills
npx skills add agentcloak/skillPara CI o scripts, sin prompts:
# A nivel de proyecto: instala en .agents/skills/ y .claude/skills/
npx github:agentcloak/skill
# Global, para todos los proyectos
npx github:agentcloak/skill -g
# Ver las skills disponibles
npx github:agentcloak/skill --listLa skill declara soporte para Claude Code (.claude/skills/), OpenCode, Cursor, Cline y GitHub Copilot (.agents/skills/), Windsurf (.windsurf/skills/), Roo Code (.roo/skills/) y Continue (.continue/skills/). Trae además un agents/openai.yaml para Codex, con allow_implicit_invocation: true, o sea que el agente puede decidir invocarla sin que se lo pidas.
Una vez instalada tiene dos modos. El primero es puntual, sin tocar código:
Cloak the name "Alice Johnson"
El segundo es el que importa, y es donde una skill se gana el sitio frente a un simple MCP server: el agente lee tu fuente, añade la llamada y reescribe la salida.
Add PII protection to acme-crm.ts using the AgentCloak MCP server.
Cloak the full names of all customers before printing them.
Merece la pena leer el SKILL.md antes de instalar nada, aunque solo sea por higiene, como con cualquier servidor MCP de terceros. Tiene un detalle bien pensado: la skill se instruye a sí misma para no imprimir nunca PII ni credenciales, y para referenciar siempre las claves por variable de entorno en los comandos curl que muestra, de forma que el valor real no aparezca en el historial de la conversación.
Los 8 campos que cubre el cloak, y los que no
Este es el dato que cambia la decisión y que no está en la portada. La tool cloak del MCP server reconoce ocho tipos de campo, con estas opciones por defecto:
| Campo | Opción por defecto |
|---|---|
name |
native (nombre sintético culturalmente apropiado) |
age |
keep |
gender |
keep |
weight |
placeholder |
weight_unit |
kilograms |
location |
country (reduce a nivel de país) |
medical_condition |
mask |
financial |
mask |
Las opciones disponibles son keep, placeholder, mask, native, country, city, region, categories, ranges, group, pounds y kilograms, y no todas valen para todos los campos: native es solo para name, group solo para medical_condition.
Lo interesante es la generalización, no solo la sustitución. age con opción ranges te deja definir tramos, y location puede degradarse a ciudad, región o país. Eso es minimización de datos de verdad, no enmascaramiento cosmético.
Y aquí está la trampa: email, teléfono y dirección no están entre esos ocho. El propio SKILL.md instruye al agente para que, si le pides anonimizar un campo fuera de la lista, explique la limitación y derive a las configuraciones de Border. La extensión de escritorio sí detecta correos y teléfonos; la tool cloak del MCP server, no. Son dos productos con coberturas distintas y conviene no asumir que la del uno aplica al otro.
Las 17 estrategias de redacción de las configuraciones Border
Para todo lo demás está la otra capa: la Portal API en portal.incountry.com/api, que se autentica con X-API-Key: inc_v1_... y donde viven las configuraciones Border. Ahí hay un catálogo de 17 estrategias de redacción que se aplican por JSONPath.
Las que más se van a usar:
| Estrategia | ¿Persistente? | Pensada para |
|---|---|---|
alphaNumericPersistent |
Sí | name, full_name, address, city |
emailPersistent |
Sí | email, username_email |
numeric |
No | phone, zip_code, amount |
defaultDateISO |
No | date, date_of_birth (fija 1970-01-01) |
masking |
No | name, email, phone, card_number |
password |
No | password, secret, token |
formula |
No | phone, email con hash a medida |
llm |
No | mcp_request, mcp_response |
fixed |
No | cualquier campo, valor constante |
"Persistente" significa que el mismo valor de entrada produce siempre el mismo valor de salida, usando un persistentTokenSalt de 32 caracteres hexadecimales. Es lo que necesitas si quieres seguir pudiendo agrupar por cliente sobre datos anonimizados. Las no persistentes rompen esa correlación, que a veces es justo lo que quieres.
La skill infiere la estrategia por el nombre del campo: un JSONPath que contenga email recibe emailPersistent, uno con name o fullName recibe alphaNumericPersistent, uno con phone o mobile recibe numeric, y el resto cae en alphaNumeric. emailPersistent genera correos de 12 caracteres con el sufijo @superredacted.us por defecto.
El flujo de edición es export, jq, import, y está pensado para que lo ejecute el agente:
curl -s -H "X-API-Key: $INC_API_KEY" \
"$INC_BASE_URL/environments/$INC_ENV_ID/export" > ./tmp/baseline.json
jq '.countries["se-mt-01"].border.configurations[0].target = "https://new.example.com"' \
./tmp/baseline.json > ./tmp/edited.json
curl -s -H "X-API-Key: $INC_API_KEY" -F "file=@./tmp/edited.json" \
"$INC_BASE_URL/environments/$INC_ENV_ID/import"Es un import completo, no un parche. Exportas el entorno entero, lo editas y lo vuelves a subir.
Cuándo tiene sentido y cuándo no
Tiene sentido cuando el agente toca datos de producción de terceros y necesitas una respuesta defendible ante la pregunta de qué salió hacia el proveedor del modelo. La minimización que exige el AI Act europeo es el caso de uso que la empresa nombra explícitamente, junto a la PIPL china y la PDPL saudí.
No tiene sentido si lo que quieres es que el dato no viaje a ningún sitio. En el modo multi-tenant estás sumando un proveedor más al circuito, y la latencia de dos llamadas HTTP extra por turno de conversación no es gratis.
Y hay un tercer caso, el más frecuente: si tu problema es un .env o unas credenciales que el agente no debería leer, esto no es lo que buscas. AgentCloak va de datos personales, no de secretos.
Preguntas frecuentes
¿AgentCloak es gratis?
AgentCloak Desktop es gratis para uso individual, como extensión de Chrome, Safari y Edge y como app de macOS y Windows. El MCP server y las configuraciones Border van por el portal de InCountry y requieren una cuenta con un entorno activado.
¿Cómo anonimizar datos antes de enviarlos a ChatGPT?
Con la extensión de escritorio no hay que configurar nada: detecta y sustituye en local antes de que el texto salga del navegador. Con código, la vía es llamar a la tool cloak del MCP server antes de construir el prompt y a uncloak sobre la respuesta, guardando el id de sesión entre ambas.
¿Se puede usar AgentCloak con Claude Code?
Sí, instalando la skill con npx skills add agentcloak/skill. Queda en .claude/skills/ y funciona en dos modos: anonimizar un valor puntual, o añadir las llamadas de cloaking a tu propio código. También se instala para Cursor, Codex, Cline, Copilot, Windsurf, Roo Code y Continue.
¿Qué diferencia hay entre AgentCloak Desktop y el MCP server?
Cubren campos distintos. La extensión detecta nombres, correos, teléfonos, URLs, identificadores fiscales, cuentas bancarias y direcciones. La tool cloak del MCP server reconoce ocho campos: nombre, edad, género, peso, unidad de peso, ubicación, condición médica y datos financieros. Para correo, teléfono o dirección por API hay que usar las configuraciones Border.
¿El cloaking es reversible?
Sí, esa es la diferencia con una redacción sin más. La tool uncloak restaura los valores originales a partir del id que devolvió cloak, lo que implica que el mapeo se conserva del lado del servidor.
En resumen
La idea que vale la pena llevarse, más allá de este producto concreto, es que el punto de intercepción correcto para la PII es el borde del prompt, no la base de datos. Un MCP server con dos tools, cloak y uncloak, es una forma sorprendentemente pequeña de poner ese borde donde toca: una función, un fetch, ninguna dependencia.
Antes de adoptarlo, comprueba dos cosas contra tu caso: que los campos que te importan estén entre los ocho que cubre la tool cloak, y que el modo de despliegue que eliges deje el mapeo donde tu política de datos exige que esté.
Fuentes
- AgentCloak Developers Overview, InCountry.
- Tutorial del MCP Server de AgentCloak, documentación de InCountry.
- agentcloak/skill en GitHub:
README.md,skills/agentcloak/SKILL.md,package.jsony.claude-plugin/marketplace.json. - agentcloak-skill en el registro de npm.
- AgentCloak Desktop, página de producto de InCountry.
- AgentCloak Launches AgentCloak Desktop, Free Sovereign AI That Cloaks Private Data Before It Reaches Popular AI Chatbots, comunicado de Business Wire del 18 de septiembre de 2026.
- InCountry raises $10 million in funding and launches AgentCloak AI agent data protection, Business Wire, 22 de septiembre de 2025.
¿Tienes un proyecto en mente?
Trabajo con Laravel, WordPress, SEO técnico y servidores MCP. El primer paso es una llamada de descubrimiento, sin costo ni compromiso, donde me cuentas qué necesitas y te digo con honestidad si puedo ayudarte.