midd-nestjs-hexagonal-architecture-mcp@0.1.0
CAUTION· install onlyPublisher claims: "Enables agents and IDEs to generate and verify NestJS microservices with hexagonal architecture, JSON:API contracts, and mandatory security headers. Supports declarative spec-based module generation, refactoring existing services, quality checks, and per-repository inventory and auditing." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Nothing executable in the bundle ran; the trace covers the install step only.- Tested
- every file read, file written and host contacted by what ran
- Not tested
- use of the skill by an agent
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
AUTHORIZATION_API_URLConfiguration, not credentials: MIDD_NESTJS_AUTO_KIT- Where it talks to
- no vendor host named in the codeAlso getpostman.com — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- use of the skill by an agent
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names getpostman.com as well as its own vendor. The guard injects AUTHORIZATION_API_URL only into requests to the host you bind (and its subdomains) and refuses the rest.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (1 scenario; nothing executable in the bundle ran; the trace covers the install step only) on 2026-11-11 and scored it 71/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Access to sensitive file paths; Access to sensitive file paths; Access to sensitive file paths. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 1 scenarios · 0 deviationsStatic findings
…cio en src/shared/authorization. Parchea ConfigurationVariables, el schema Joi, .env.example y app.module (la registra DESPUÉS de SecurityModule para que el rate li…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…esita base de datos, conexion ni motor; declara <API>_BASE_URL en config, Joi y .env.example. SP: con adapterType="sp" el wiring es quirúrgico — apunta el módulo al…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…, sin pisar nada: escribe solo los archivos que faltan, agrega a package.json y .env.example solo lo que falta y reporta la infra propia del proyecto, las dependenc…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.['.env.example', patchEnvExample(join(projectRoot, '.env.example'), conexion, motor), 'add its DB_* variables'],Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// Recorre el inner por líneas y encuentra el offset (dentro de content) delFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.'# .env.example — generated from joiSchema (source of truth of the variables).',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose..describe('Ruta absoluta de la raÃz del servicio NestJS destino donde se escriben los archivos.')Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.for (const name of ['.env.example', '.env']) {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const text = read(join(projectRoot, '.env.example'))Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.patched.push('.env.example')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.ENV_EXAMPLE: 'Keep .env.example in sync with every key of the Joi schema.',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose./** Sample user for .env.example (a placeholder, never a secret). */Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// "'<Conexion>Connection'"; 'default' lo omite (conexión por defecto delFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.ENV_NOT_IGNORED: 'Add a line .env to .gitignore before putting real values in .env: credentials must never be committed.',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose./** Añade la clave del SP al .env.example (y a .env si existe). */Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…ia del proyecto (ver infraRoot); el agente aún debe conciliar los NOMBRES de sÃmbolo (p.ej. ResponseJsonApiBase vs ResponseJsonApi del proyecto).' ) export …Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.* MUST resolve to the same name in ConfigurationVariables, joiSchema and .env.example.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.for (const file of ['.env.example', '.env']) {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* Sections for `.env.example`.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* `.env.example` generation derived from the dataset joiSchema.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* Builds the `.env.example` content from the joiSchema and, optionally, fromFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.orígenes reales, ponlos en esa variable del .env; no requiere tocar código.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* Inputs comunes a las herramientas. `projectRoot` es la raÃz del servicioFix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.'Nombre del stored procedure (solo si adapterType="sp"). El MCP lo registra en ConfigurationVariables.storedProcedures + joiSchema + .env.example.'Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* the configuration variables, its variables in the Joi schema and in .env.example, its registration inFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.else if (config !== 'unchanged') warnings.push(`No se pudo declarar ${envVar} en ConfigurationVariables.externalApis (${config}): declarala a mano (config + joiSchema + .env.example).`)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.'# Copy to .env and fill in the real values. Keep in sync with joiSchema.ts.',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* Secrets: .env is read ONLY for the API_CONTEXT line; no other value of it is looked at or returned.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const envFile = join(projectRoot, '.env.example')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* `.env.example`, which is what `verify_standards` expects (WARN when a schemaFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* at boot when missing) and in .env.example, in its own section.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.SP_NOT_DECLARED: 'Declare every stored procedure in ConfigurationVariables (configuration-variables.ts), the Joi schema and .env.example.',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.'Ejecuta la verificación de estándares (naming, cabeceras de seguridad, @Version, .env.example, SP opt-in) sobre el proyecto destino. Devuelve el reporte; falla si hay errores bloqueantes.',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// aquí no es necesario. Además, el parcheo es QUIRÚRGICO: solo quita delFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.* en el joiSchema y en el .env.example (lo exige verify_standards).Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const text = readFileSync(join(root, '.env.example'), 'utf8')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const example = parseEnvExample(readFileSync(join(WORKSPACE, '.env.example'), 'utf8'))Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.doesNotMatch(config, /MSSQL_DATABASE|process\.env\.DATABASE_NAME/, 'no variable is tied to one engine')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// Si hay branching de negocio, el application service elige el MÉTODO delFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.const text = readFileSync(join(root, '.env.example'), 'utf8')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.'Sample base URL of the authorization API for .env.example. Use a placeholder: the real value goes in the untracked .env.'Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.- Crea TÚ el .env a partir de .env.example (sin pisar uno existente) con los valores REALES que dio el usuario en el PASO 1; nuncaFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.- ".env.example sincronizado con el schema Joi (toda clave del schema presente). Se genera desde el Joi, incluyendo los .default()."Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.'.env.example': patchEnvExample(join(projectRoot, '.env.example'), args.authorizationApiUrl),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.notas.push('AGENTE: pide al usuario el nombre real del SP y escríbelo tú en el .env.')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const env = read(root, '.env.example')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.L.push('', 'Coleccion de Postman: [middleware.postman_collection.json](middleware.postman_collection.json)')Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.outputs.push(` SP "${m.sp}" (env: ${envVarSp}) registrado en la configuracion, el Joi schema y .env.example.`)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.doesNotMatch(read(root, '.env.example'), /DB_MSSQL2_/)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.'AGENT: ask the user for the real AUTHORIZATION_API_URL and write it yourself in the untracked .env.'Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.await t.test('boot the service using only the values of its own .env.example', async () => {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.env: { ...process.env, ...env }Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// (import al .sp.adapter, sin forFeature) y registra el SP en config/joi/.env.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// A NEW named connection is created complete (module, options, config, Joi, .env.example, AppModule, driver).Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…rationVariables.externalApis + Joi .uri().required() + sección External APIs de .env.example), el verbo y la ruta son detalle del adapter (GET envía la request como…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.- "Nunca commitear secretos reales; .env.example solo con placeholders."Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const env = read(root, '.env.example')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.match(out, /AGENTE: pide al usuario los valores de DB_MSSQL_HOST, _PORT, _USERNAME, _PASSWORD y _NAME y escríbelos tú en el \.env/)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.`SP opt-in cableado automáticamente: "${nombreSp}" (env: ${envVarSp}) registrado en la configuracion (configuration-variables), el Joi schema y .env.example; módulos apuntando al .sp.adapter.`Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.match(out, /AGENTE: crea el \.env a partir del \.env\.example/)Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.test('a new .env.example is grouped by topic and keeps EVERY variable and value', async () => {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// - adds to .env.example only the variables that are missing, with the defaults of the area,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.'.env.*',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const env = read(root, '.env.example')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.match(config, /Catalog: \{[\s\S]*Server: process\.env\.DB_CATALOG_HOST,[\s\S]*Port: Number\(process\.env\.DB_CATALOG_PORT\)[\s\S]*DataBaseName: process\.env\.DB_CATALOG_NAME/)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…. CORS_ALLOWED_ORIGINS vale '*' POR DEFECTO (default del schema Joi y valor del .env.example): se TOLERA para un middleware servidor-a-servidor, decisión del área. …Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// declared (ConfigurationVariables + joiSchema + .env.example) or the service does not compile.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.equal(existsSync(join(root, 'docs/api/middleware.postman_collection.json')), false, 'Postman is opt-in')Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.'.env',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.(Genera shared + config + main.ts + app.module.ts con la conexión ya cableada, y .env.example desde joi-schema.ts.)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.match(read(root, '.env.example'), /^DB_CATALOG_HOST=/m)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…AGENTE: pide al usuario los valores de sus variables DB_* y escríbelos tú en el .env (sin repetir la contraseña).` ) if (args.mode === 'refactor') { …Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.env.length ? `.env.example: agregadas con el valor por defecto del area ${env.join(', ')}.` : '.env.example: ya tenia todas las variables de la capa.',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const env = read(root, '.env.example')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const example = parseEnvExample(readFileSync(join(WORKSPACE, '.env.example'), 'utf8'))Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.- "Cada conexión adicional se crea completa (módulo, opciones, variables, Joi, .env.example). Un motor distinto al de una conexión existente se rechaza."Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// Real values live in .env and never go to git; .env.example documents the keys.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.'# Environment: the real values (credentials, URLs) stay out of git. .env.example documents the keys.',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.servicio, la registra después de SecurityModule y agrega AUTHORIZATION_API_URL a Joi, config y .env.example.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const env = readFileSync(join(WORKSPACE, '.env.example'), 'utf8')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const file = join(projectRoot, '.env.example')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.equal(read(root, '.env.example').match(/^DB_POSTGRES_HOST=/gm).length, 1)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// The answers the user can see (and edit) in AGENTS.md win over the ones saved in the learnings file.Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.const env = read(root, '.env.example')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.match(config, new RegExp(`${sp}: process\\.env\\.${envVar}\\b`), `config is missing ${sp}`)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.match(env, new RegExp(`^${envVar}=`, 'm'), `.env.example is missing ${envVar}`)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const env = readFileSync(join(projectRoot, '.env.example'), 'utf8')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.write(root, '.env.example', 'PORT=3000\nAPI_CONTEXT=midd-stores\n')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.test('generate_from_spec wires the SP of EVERY method (config + Joi + .env.example), not just the first', async () => {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.write(root, '.env.example', 'PORT=3000\nRL_MAX=10\n')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.write(root, 'AGENTS.md', '<!-- BEGIN midd-nestjs-preferences (managed) -->\nAUTHORIZATION: required # hint\nPOSTMAN: no\n<!-- END midd-nestjs-preferences -->\n')Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.const env = read(root, '.env.example')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// What the user wrote in AGENTS.md wins over what was saved in the learnings file: it is the one he can edit.Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.* that has no block is left alone: the user did not want the MCP to write to AGENTS.md.Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.assert.match(config, /CustomerCore: \{ baseUrl: process\.env\.CUSTOMER_CORE_BASE_URL \}/)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.deepEqual(s.prefijoApi, { value: 'midd-stores', evidence: '.env.example: API_CONTEXT' })Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.match(out, /AGENTE: crea el \.env a partir del \.env\.example/)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.write(root, 'AGENTS.md', `${head}${AGENTS_BEGIN}\nseccion vieja v0.0.1\n${AGENTS_END}${tail}`)Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.const env = read(root, '.env.example')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.write(root, 'AGENTS.md', mine)Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.write(root, 'AGENTS.md', broken)Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.test('.env.example keeps the External APIs section between Authorization and Stored procedures', () => {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.write(root, 'AGENTS.md', withBlock + after)Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.assert.match(read(root, 'src/shared/infrastructure/config/configuration-variables.ts').replace(/^\s*\/\/.*$/gm, ''), /ExchangeRates: \{ baseUrl: process\.env\.EXCHANGE_RATES_BASE_URL \}/)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const env = read(root, '.env.example')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.match(useCase.content[0].text, /AGENTE: pide al usuario esa URL y escríbela tú en el \.env/)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.match(read(root, '.env.example'), /^DB_POSTGRES_PORT=5432$/m)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.write(root, 'AGENTS.md', '# Proyecto\r\n\r\nlinea con CRLF\r\n')Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.assert.doesNotMatch(out, /^\s+- (Corre npm install|Copia \.env\.example)/m, 'no step is phrased as an order to the user')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.equal(existsSync(join(root, '.env.example')), false)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const env = read(root, '.env.example')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.write(root, '.env', 'API_CONTEXT=\nDB_PASSWORD=secret-value\n')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const env = readFileSync(join(root, '.env.example'), 'utf8')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.doesNotMatch(text, /secret-value/, 'no value of .env other than API_CONTEXT is ever read into the output')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.
What would make this Verified
9 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim ivan-madera: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Destructive file system command detected≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- Hidden zero-width characters detected≈ +4 on the totalKeep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.