En resumen: si usas la app de escritorio de Postman en Mac y además Claude Code, Codex o Cursor, dedica dos minutos a revisar la configuración de tus agentes.
- Según el issue #14370 de GitHub, Postman 12.33.4 registró
auto-existing-upgradecuando un usuario existente la abrió, y después Claude Code y Codex tenían el plugin de Postman. El archivo~/.codex/config.tomlademás tenía un registrotrusted_hashpara el hook de inicio de Postman. Otro usuario informa del mismo comportamiento con 12.35.1 en el mismo issue. - Un empleado de Postman respondió en el issue que el paquete conjunto buscaba facilitar la instalación del CLI y los plugins, que Postman hará más claro el opt-in (consentimiento explícito) y que está revisando la aprobación del hook y el comportamiento al iniciar sesión.
- El 4 de noviembre reprodujimos las mismas entradas con el instalador npx oficial de Postman en un directorio aislado: el
trusted_hashcoincide carácter por carácter con el del issue, y el hook de inicio inyectó las instrucciones de Postman en sesiones de Claude Code y de Codex. - El comando oficial
npx @postman/postman-plugin removedesinstala el plugin de ambos agentes, pero en nuestra prueba la entrada de marketplace de Codex y el registrotrusted_hashsiguieron en config.toml. Hay que quitarlos a mano.
Revisión más rápida:
grep -n -i postman ~/.codex/config.toml ~/.claude/settings.json ~/.claude.json 2>/dev/null
claude plugin list
codex plugin list
Si aparece algo de Postman, sigue los 3 pasos de abajo.
Crear una API Key y conectar modelos en Claude Code, Codex y Cursor →
Qué pasó
Según el issue #14370 (abierto el 25 de octubre y marcado [SEVERE]), el autor abrió Postman 12.33.4 en macOS tras un tiempo sin usarlo. Después, Codex pedía una y otra vez iniciar sesión en un servidor MCP y cargaba skills de Postman en tareas de API. El registro de Postman, ~/Library/Application Support/Postman/logs/main.log, contenía estas dos líneas:
PostmanAgentPluginService~install: script completed
{"source":"auto-existing-upgrade","results":["claude-code:installed","codex:installed"],"installer":"script"}
Main: autoInstall.plugin.existing-user finished
{"outcome":"installed","platform":"darwin","exposed":true,"signedIn":true,...}
Cambios que recoge el informe:
| Ubicación | Lo que encontró el informe |
|---|---|
| Codex ~/.codex/config.toml | [marketplaces.postman] (apunta a postmanlabs/postman-plugin), [plugins."postman@postman"] enabled = true y un trusted_hash bajo [hooks.state."postman@postman:..."] |
| Hook del plugin de Codex | Un hook SessionStart (en startup, clear y compact) que inyecta en cada sesión «carga la skill postman:api-engineer antes de cualquier tarea de ingeniería de API no trivial» |
| MCP remoto | https://mcp.postman.com/mcp; sin iniciar sesión, el registro de Codex muestra Auth required |
| Claude Code | postman@claude-plugins-official activado en ~/.claude/settings.json, versión 2.0.1, ámbito user |
| CLI | El CLI de Postman y su carpeta lib en ~/.local/bin |
El código del instalador citado en el informe tiene una función approvePostmanHook que, tras instalar el plugin, usa hooks/list y config/batchWrite de Codex para marcar el hook de Postman como confiable. El autor aclara que el informe muestra cambios en otras herramientas sin consentimiento y no muestra ningún envío de datos. The New Stack también señala que el issue no contiene pruebas de que Postman recopilara o transmitiera datos de API.
Lo que vino después:
- Según un comentario del issue, otro usuario de macOS vio cómo Postman se actualizaba de 12.31.3 a 12.35.1; el registro volvió a mostrar
auto-existing-upgradey se instalaron el CLI y los plugins de Claude Code y Codex, concursor:already-installedpara Cursor. El config.toml de esa máquina no teníatrusted_hash. - Según otro comentario, el
~/.copilot/settings.jsonde GitHub Copilot CLI también tenía el marketplace y el plugin de Postman, y la opción de desinstalar del menú de Postman no los quitó de Copilot. - Según @daniiie7, al desempaquetar la app de Mac 12.35.1 se ve que un feature flag decide si se ejecuta la instalación automática, también en descargas nuevas.
- Las publicaciones de @szchan111 y @Curingieul difundieron el caso entre desarrolladores de habla inglesa y china, y X lo muestra como noticia en tendencia.
Respuesta de Postman: el 3 de noviembre (hora de EE. UU.), el empleado de Postman zecoquit respondió en el issue que la app incluye el CLI de Postman y los plugins de agente porque muchos usuarios tenían problemas para instalarlos y conectarlos por separado, que esto se menciona en la página de descarga y en el flujo de actualización, y que los componentes se pueden desinstalar desde la app. Añade «we've heard you»: Postman hará más claro el opt-in, sobre todo para usuarios existentes, está revisando la aprobación del hook y el comportamiento al iniciar sesión, y publicará los cambios en el issue.
Quién debería revisar
- Usas la app de escritorio de Postman en macOS con sesión iniciada y la abriste o actualizaste hace poco (los informes cubren 12.33.4 y 12.35.1).
- Tienes Claude Code, Codex, Cursor o GitHub Copilot CLI en la misma máquina.
- Codex te pide sin parar iniciar sesión en un servidor MCP de Postman o menciona skills de Postman en tareas de API.
Aunque no uses Postman, estas revisiones muestran qué ha añadido cualquier herramienta de terceros a tus agentes.
Nuestra reproducción
Entorno: 4 de noviembre de 2026, 17:20–17:25 hora de Pekín, Linux, Claude Code 2.1.318, codex-cli 0.166.0, @postman/postman-plugin 0.6.0 (el paquete npm que mantiene Postman), una clave de aicodewith, y HOME y CODEX_HOME apuntando a un directorio aislado nuevo, sin tocar ninguna configuración real.
No tenemos la versión de Mac de Postman, así que no reprodujimos el paso de «abrir la app de escritorio». El registro del issue dice "installer":"script". Usamos el instalador para agentes detectados de la documentación de Postman, npx @postman/postman-plugin install --agent claude-code,codex --yes. No podemos confirmar que la app ejecute el mismo script, pero las entradas escritas coinciden con las del informe.
| Paso | Resultado | Tiempo |
|---|---|---|
| npx @postman/postman-plugin install (Claude Code + Codex) | Instalado en ambos; muestra Approved Postman's Codex session-start hook. | 11,6 s |
| Un codex exec tras instalar | Se ejecuta hook: SessionStart, el registro de la sesión contiene el texto <EXTREMELY_IMPORTANT> de Postman y el MCP de Postman pide iniciar sesión | 3,0 s |
| Un claude -p tras instalar | La transcripción tiene un resultado de hook SessionStart:startup con el mismo texto | 2,7 s |
| npx @postman/postman-plugin remove --dry-run | Solo vista previa, config.toml sin cambios | 1,3 s |
| npx @postman/postman-plugin remove | Plugin quitado de ambos; quedan la entrada de marketplace de Codex y el trusted_hash | 2,2 s |
| Tarea con codex exec tras la limpieza manual | Imprime clean-ok, sin hook ni texto de Postman | 11,8 s |
| Tarea con claude -p tras la limpieza manual | Imprime clean-ok-cc | 9,4 s |
También instalamos el plugin una vez con los comandos nativos de Codex de la guía por agente de Postman. config.toml tenía entonces el plugin y el marketplace pero ningún trusted_hash, codex exec no ejecutó el hook y el registro de la sesión no tenía el texto de Postman. Coincide con la documentación: al instalar con el propio Codex, el hook empieza sin confianza y Codex te pide revisarlo. Así que si el hook se ejecuta en cada sesión depende de ese único registro trusted_hash.
Paso 1: revisar Claude Code
# 1) Installed plugins (user and project scope)
claude plugin list
# 2) Plugins and marketplaces turned on in your user settings
grep -n -i -E 'postman|enabledPlugins|extraKnownMarketplaces|"hooks"' ~/.claude/settings.json
# 3) MCP servers, including the ones a plugin brings in
claude mcp list
grep -n -i postman ~/.claude.json
# 4) Install records with timestamps
cat ~/.claude/plugins/installed_plugins.json
Nuestra salida con el plugin de Postman instalado:
$ claude plugin list
Installed plugins:
❯ postman@claude-plugins-official
Version: 2.0.1
Scope: user
Status: ✔ enabled
$ claude mcp list
plugin:postman:postman: https://mcp.postman.com/mcp (HTTP) - ! Needs authentication
Los dos bloques añadidos a ~/.claude/settings.json:
"extraKnownMarketplaces": {
"claude-plugins-official": {
"source": {
"source": "github",
"repo": "anthropics/claude-plugins-official"
}
}
},
"enabledPlugins": {
"postman@claude-plugins-official": true
}
claude-plugins-official es el marketplace oficial de plugins de Anthropic y no supone un problema por sí mismo; lo importante es si enabledPlugins incluye algo que no instalaste tú. El hook SessionStart de Postman está en el hooks/hooks.json del propio plugin, no en la clave hooks de settings.json, así que mirar solo settings.json no lo muestra. Usa claude plugin list.
Paso 2: revisar config.toml de Codex
codex plugin list
codex plugin marketplace list
codex mcp list
# Section names only (no keys are printed)
grep -n -E '^\[(marketplaces|plugins|hooks|mcp_servers)' ~/.codex/config.toml
# Hook trust records
grep -n -A2 'hooks.state' ~/.codex/config.toml
Con el plugin de Postman instalado:
$ codex plugin list
PLUGIN STATUS VERSION SOURCE
postman@postman installed, enabled 1.3.0 ~/.codex/.tmp/marketplaces/postman
$ codex plugin marketplace list
MARKETPLACE ROOT
postman ~/.codex/.tmp/marketplaces/postman
$ codex mcp list
Name Url Bearer Token Env Var Status Auth
postman-mcp https://mcp.postman.com/mcp - enabled Not logged in
Lo que se añadió a config.toml en nuestra reproducción (el trusted_hash coincide con el del issue):
[marketplaces.postman]
source_type = "git"
source = "https://github.com/postmanlabs/postman-plugin.git"
ref = "main"
[plugins."postman@postman"]
enabled = true
[hooks.state]
[hooks.state."postman@postman:hooks/codex-hooks.json:session_start:0:0"]
trusted_hash = "sha256:b67ddd1ece328f5a6f9103ce011bb58adb8411daea644f284732cff85d15cbb3"
trusted_content_hash = "sha256:30a87cda8b01827030f3a7572a88bef9e2ff199d95bd50915b4dd5bb9d5e0023"
Lee las tres partes por separado:
[marketplaces.xxx]: el origen de los plugins, un repositorio Git.[plugins."xxx@xxx"] enabled = true: el plugin está activo, así que se cargan sus skills y su servidor MCP.[hooks.state."...:session_start:..."]contrusted_hash: el hook es confiable y se ejecuta en cada sesión. Untrusted_hashde un hook que nunca aprobaste en Codex es lo primero que hay que borrar.
Registro de codex exec con el plugin instalado:
$ codex exec --skip-git-repo-check "<prompt>"
ERROR rmcp::transport::worker: worker quit with fatal: Transport channel closed,
when AuthRequired(... "https://mcp.postman.com/.well-known/oauth-protected-resource/mcp" ...)
hook: SessionStart
hook: SessionStart Completed
El principio del texto que inyecta el hook (de hooks/session-start-context.md en el repositorio del plugin de Postman):
<EXTREMELY_IMPORTANT>
You have the Postman plugin.
Before responding to any non-trivial API engineering task — designing, implementing,
mocking, testing, monitoring, documenting, or deploying an API or Postman Flow — load
the `postman:api-engineer` skill and follow it. ...
Para saber si sesiones anteriores lo recibieron, busca en los registros de sesión:
# Codex: sessions whose context received the hook text
grep -l 'EXTREMELY_IMPORTANT' ~/.codex/sessions/*/*/*/*.jsonl
# Claude Code: transcripts with a SessionStart hook result carrying that text
grep -l 'EXTREMELY_IMPORTANT' ~/.claude/projects/*/*.jsonl
En nuestra reproducción coincidieron las sesiones de ambos agentes tras la instalación y ninguna después de la limpieza.
Paso 3: revisar Cursor, Copilot CLI y el CLI de Postman
# Cursor (paths used by Postman's installer source)
ls -d ~/.cursor/plugins/local/postman ~/.cursor/plugins/cache/cursor-public/postman 2>/dev/null
# GitHub Copilot CLI
grep -n -i postman ~/.copilot/settings.json 2>/dev/null
# Postman CLI dropped next to the desktop app
ls -l ~/.local/bin | grep -i postman
Las dos rutas de Cursor vienen del código del instalador del plugin de Postman: un clon local en ~/.cursor/plugins/local/postman y la copia del marketplace de Cursor en ~/.cursor/plugins/cache/cursor-public/postman. La ruta de Copilot CLI viene de un comentario del issue.
Cómo quitarlo
Opción 1: el comando oficial de Postman
Según la documentación de Postman, el instalador admite status, remove (alias uninstall) y --dry-run:
# What is installed, per agent
npx @postman/postman-plugin status
# Preview the removal, nothing is changed
npx @postman/postman-plugin remove --dry-run
# Remove from every detected agent (alias: uninstall)
npx @postman/postman-plugin remove
# Or only some agents
npx @postman/postman-plugin remove --agent claude-code,codex
Nuestra salida de remove:
Found 2 coding agents. Postman in each:
Claude Code installed postman@claude-plugins-official 2.0.1
Codex installed postman@postman 1.3.0
Claude Code
$ claude plugin uninstall postman@claude-plugins-official --scope user --json
done: uninstalled postman@claude-plugins-official
Codex
$ codex plugin remove postman@postman --json
done: removed postman@postman
Summary:
Claude Code done uninstalled postman@claude-plugins-official
Codex done removed postman@postman
El empleado de Postman también dijo que los componentes se pueden quitar desde la app; según un comentario del issue, la opción del menú es Help → Postman CLI and Plugins → Uninstall Postman Coding Agent Plugin.
Opción 2: limpiar lo que queda
Tras el remove oficial, nuestro config.toml aún contenía:
# ~/.codex/config.toml after "npx @postman/postman-plugin remove"
[marketplaces.postman]
source_type = "git"
source = "https://github.com/postmanlabs/postman-plugin.git"
ref = "main"
[hooks.state]
[hooks.state."postman@postman:hooks/codex-hooks.json:session_start:0:0"]
trusted_hash = "sha256:b67ddd1ece328f5a6f9103ce011bb58adb8411daea644f284732cff85d15cbb3"
trusted_content_hash = "sha256:30a87cda8b01827030f3a7572a88bef9e2ff199d95bd50915b4dd5bb9d5e0023"
Las carpetas ~/.claude/plugins/cache/claude-plugins-official/postman y ~/.codex/plugins/cache/postman también seguían ahí. Limpia en este orden:
# --- Codex ---
codex plugin remove postman@postman # if codex plugin list still shows it
codex plugin marketplace remove postman
cp ~/.codex/config.toml ~/.codex/config.toml.bak
# Open ~/.codex/config.toml and delete the whole table
# [hooks.state."postman@postman:hooks/codex-hooks.json:session_start:0:0"]
# (the header line plus trusted_hash and trusted_content_hash)
rm -rf ~/.codex/plugins/cache/postman
# --- Claude Code ---
claude plugin uninstall postman@claude-plugins-official --scope user # if still listed
rm -rf ~/.claude/plugins/cache/claude-plugins-official/postman
# --- Cursor ---
rm -rf ~/.cursor/plugins/local/postman
# then uninstall Postman from Cursor's own plugin marketplace view
# --- Postman CLI, only if you do not use it ---
ls -l ~/.local/bin | grep -i postman
Después vuelve a revisar y ejecuta una tarea real para confirmar que ambos agentes funcionan:
$ grep -n -i -E 'postman@|marketplaces\.postman|trusted_hash' ~/.codex/config.toml ~/.claude/settings.json
(no output, exit 1)
$ codex plugin list | grep -i 'postman@'
(no output, exit 1)
$ codex mcp list
No MCP servers configured yet. Try `codex mcp add my-tool -- my-command`.
$ claude plugin list
No plugins installed. Use `claude plugin install` to install a plugin.
$ codex exec --skip-git-repo-check "Create hello.py that prints 'clean-ok', run it with python3, and report its output."
exec
/bin/bash -lc 'python3 hello.py' in <test-dir>/ws
succeeded in 0ms:
clean-ok
[exit 0, 11.8 s]
$ claude -p "Create hello2.py that prints 'clean-ok-cc', run it with python3, and report its output." \
--allowedTools "Write,Bash(python3:*)"
Output: `clean-ok-cc`
[exit 0, 9.4 s]
extraKnownMarketplaces.claude-plugins-official en ~/.claude/settings.json es el marketplace oficial y puede quedarse; si nunca usas plugins de Claude Code, también puedes borrar ese bloque.
Evitar que se repita
- Compara la configuración tras actualizar una app de escritorio, un IDE o un CLI. Esta instantánea guarda solo nombres de secciones y plugins, nunca tu clave:
# Snapshot without secrets: Codex section names, Claude Code plugin/marketplace/hook names
mkdir -p ~/.agent-audit
grep -E '^\[' ~/.codex/config.toml > ~/.agent-audit/codex.txt
python3 - > ~/.agent-audit/claude.txt <<'EOF'
import json, os
d = json.load(open(os.path.expanduser('~/.claude/settings.json')))
for k in ('enabledPlugins', 'extraKnownMarketplaces', 'hooks'):
print(k, sorted(d.get(k, {})))
EOF
# After updating a desktop app, IDE or CLI, compare with the snapshot
diff ~/.agent-audit/codex.txt <(grep -E '^\[' ~/.codex/config.toml)
La comparación antes y después de la instalación nos dio:
$ diff ~/.agent-audit/codex.txt <(grep -E '^\[' ~/.codex/config.toml)
2a3,6
> [marketplaces.postman]
> [plugins."postman@postman"]
> [hooks.state]
> [hooks.state."postman@postman:hooks/codex-hooks.json:session_start:0:0"]
# Claude Code, before and after
enabledPlugins [] -> ['postman@claude-plugins-official']
extraKnownMarketplaces [] -> ['claude-plugins-official']
- Confía solo en hooks que hayas aprobado tú. Si Codex tiene un
trusted_hashque no reconoces, bórralo; en el próximo inicio Codex te pedirá revisar el hook. - Apaga los servidores MCP que no uses. Un MCP remoto que pide iniciar sesión sin parar se contacta en cada inicio.
- Revisa también los archivos del proyecto.
AGENTS.mdy.claude/settings.jsondentro de un repositorio también cambian el comportamiento del agente; consulta ¿Un AGENTS.md en Descargas puede secuestrar Codex y Claude Code?. - Pon límites de permisos claros al agente. Si se cuela un hook no deseado, el sandbox y la política de aprobación siguen frenando acciones fuera de límites; consulta Sandbox de Codex y /permissions.
Mantener limpia la configuración con una clave de aicodewith
Un hook es un comando que se ejecuta con tu usuario, así que puede leer los archivos que tu usuario puede leer, incluida la configuración que guarda tu clave. Deja en esos archivos solo lo que reconozcas. Tras la limpieza, una configuración limpia de Codex solo necesita esto (Codex usa experimental_bearer_token en el config.toml global):
# ~/.codex/config.toml
model = "gpt-6.1-sol"
model_provider = "aicodewith"
[model_providers.aicodewith]
name = "aicodewith"
base_url = "https://api.aicodewith.ai/chatgpt/v1"
wire_api = "responses"
experimental_bearer_token = "TU_API_KEY"
[projects."/path/to/your/repo"]
trust_level = "trusted"
~/.claude/settings.json de Claude Code:
{
"env": {
"ANTHROPIC_BASE_URL": "https://api.aicodewith.ai",
"ANTHROPIC_AUTH_TOKEN": "TU_API_KEY"
}
}
Si la limpieza descubrió un hook o plugin que no reconoces, quítalo, crea una clave nueva en la consola y actualiza ambos archivos.
Crear una API Key para Claude Code, Codex y Cursor →
Todas las opciones están en la guía de config.toml de Codex y en Cómo conectar Claude Code a una API de terceros.
Preguntas frecuentes
¿El plugin de Postman envía mis datos a algún sitio?
Según el autor del informe y The New Stack, el issue no contiene pruebas de que se recopilaran o transmitieran datos. El informe trata de plugins, un hook y un servidor MCP remoto añadidos a otras herramientas sin un consentimiento claro. Sin iniciar sesión, el MCP de Postman no se conecta; en nuestra reproducción mostraba Not logged in / Needs authentication.
Quité el plugin. ¿Importa que quede un trusted_hash?
Sin el plugin, el hook no tiene archivos que ejecutar. Pero el registro de confianza sigue en config.toml, y si el mismo hook se vuelve a instalar se ejecuta de inmediato sin preguntarte. Bórralo también.
Instalé el plugin de Postman yo mismo. ¿Debo quitarlo?
No. Si ejecutaste npx @postman/postman-plugin tú mismo, la documentación de Postman indica que el instalador aprueba el hook de Codex por ti. Si prefieres aprobarlo tú, instala con los comandos nativos codex plugin add.
Solo uso Cursor o Copilot CLI. ¿Debo revisar?
Sí. Según comentarios del issue, el registro de 12.35.1 incluía cursor:already-installed, y también aparecieron entradas de Postman en el settings.json de Copilot CLI.
Claude Code o Codex dejó de funcionar tras la limpieza. ¿Qué hago?
Comprueba que no borraste la configuración del proveedor: [model_providers.aicodewith] en Codex, ANTHROPIC_BASE_URL y ANTHROPIC_AUTH_TOKEN en Claude Code. Copia config.toml con cp antes de editarlo para poder restaurarlo.



