users-demo
Demo en capas de API de gestión de usuarios + MCP
Pequeña demo hecha con Node.js (solo JS). Es una muestra para presentaciones que muestra por capas la configuración de «ofrecer la misma API tanto a usuarios humanos como a agentes de IA, con autenticación y alcance de exposición distintos para cada uno, y cubrir el lado de la IA con un servidor MCP (capa de descripción de API)».
La base del diseño es el MCP en producción de spx-learning-square (spx-learning-square/mcp/, 65 herramientas,
distribución .mcpb). Esta demo reduce esa idea a la configuración mínima.
Visión general
人間ユーザー ──ログイン──▶ セッショントークン ─┐
│ Authorization: Bearer
AI (Claude) ──▶ MCP サーバー ──PAT──────────────┤
(mcp/index.mjs ▼
= API 説明層) ┌─────────────────────────┐
│ API サーバー (Express) │
│ 認証層(2 系統) │
│ エージェント公開 │
│ レジストリ │
│ controller │
│ service │
│ repository(メモリ) │
└─────────────────────────┘Related MCP server: MCP CRUD Tools
Estructura de capas
Capa | Archivo | Función |
Capa de autenticación (humana) |
| Inicio de sesión → emisión de token de sesión. Guarda |
Capa de autenticación (IA) |
| Validación de PAT (clave emitida previamente). Sin inicio de sesión |
Registro público |
| Lista de registro de las API abiertas a la IA. Las API no registradas devuelven 403 aunque la autenticación sea correcta |
Capa de controladores |
| Conversión HTTP ⇄ servicio + declaración de guardas por ruta |
Capa de servicios |
| Reglas de negocio (validación, comprobación de duplicados). No conoce HTTP |
Capa de repositorios |
| Persistencia de datos (en la demo es memoria. En producción se sustituye por MySQL, etc.) |
Capa MCP (capa de descripción de API) |
| Explica a la IA cómo usar la API en japonés y actúa de intermediario. No tiene permisos |
Matriz de permisos (la clave de la demo)
API | Usuario humano | Agente de IA |
GET /api/users (lista) | ✅ | ✅ registrado |
GET /api/users/:id (obtener) | ✅ | ✅ registrado |
POST /api/users (crear) | ✅ | ✅ registrado |
PUT /api/users/:id (actualizar) | ✅ | ❌ |
DELETE /api/users/:id (eliminar) | ✅ | ❌ |
GET /api/agent/apis (lista pública) | ✅ | ✅ registrado |
Las operaciones destructivas (actualizar y eliminar) son exclusivas de humanos porque no se registran
en el registro. El punto clave es que «qué se le permite a la IA» se puede ver de un vistazo en un único
archivo, agentRegistry.mjs.
Cómo ejecutarlo
1. Servidor de API
npm install
npm run api # http://localhost:3000Para arrancarlo con Docker (solo la API se conteneriza):
npm run docker # = docker compose up --build → http://localhost:3000La capa MCP (
mcp/index.mjs) no se mete en el contenedor. Como Claude Desktop / Claude Code la inician con stdio en la máquina del usuario, la distribución se hace con.mcpb, no con Docker. Este también es un punto de la presentación: la API está en el lado del servidor (Docker/ECS), el MCP en el lado del cliente (.mcpb), y las unidades de despliegue están separadas.
Flujo del usuario humano (inicio de sesión → CRUD):
# ログイン(デモ: alice / demo)
TOKEN=$(curl -s -X POST localhost:3000/api/auth/login \
-H 'Content-Type: application/json' \
-d '{"login_id":"alice","password":"demo"}' | node -p 'JSON.parse(require("fs").readFileSync(0)).data.token')
curl -s localhost:3000/api/users -H "Authorization: Bearer $TOKEN" # 一覧
curl -s -X DELETE localhost:3000/api/users/3 -H "Authorization: Bearer $TOKEN" # 削除も OKFlujo del agente de IA (PAT, clave predeterminada agent-demo-key):
curl -s localhost:3000/api/users -H "Authorization: Bearer agent-demo-key" # ✅ 200
curl -s localhost:3000/api/agent/apis -H "Authorization: Bearer agent-demo-key" # ✅ 公開一覧
curl -s -X DELETE localhost:3000/api/users/2 \
-H "Authorization: Bearer agent-demo-key" # ❌ 403 user_onlyHay 2 tipos de códigos de error:
user_only = API con guarda exclusiva de humanos (actualizar y eliminar),
agent_not_allowed = API cuya guarda es forAgent pero que no está registrada en el registro.
2. Servidor MCP (capa de descripción de API)
UI de depuración (MCP Inspector):
npm run inspectRegistro en Claude Code:
claude mcp add users-demo -- node /Users/d.bui/Documents/project/mcp-from-scratch/mcp/index.mjsEjemplos de conversación: «enséñame la lista de usuarios» → list_users, «registra a un nuevo miembro» → create_user,
«elimina al número 3» → no hay herramienta, así que se indica la pantalla de administración (indicado en instructions).
3. Pruebas E2E (golpear el MCP «en lugar de Claude»)
npm test # test/mcp-client.test.mjsCon el cliente del SDK de MCP se hace una conexión stdio a mcp/index.mjs (la misma ruta que Claude),
y se verifica automáticamente: arranque de la API → todas las herramientas + recursos + casos anómalos
(ID inexistente / email duplicado / violación de esquema). También sirve para la demo en vivo durante la presentación.
4. Distribución con .mcpb para Claude Desktop
.mcpb = manifest.json + código comprimido en zip como Desktop Extension. Se instala con doble clic,
y el usuario no necesita instalar Node ni editar archivos de configuración.
La URL de la API y la clave de acceso se inyectan en env desde user_config (el formulario de instalación)
(las claves con sensitive: true se guardan en el llavero del SO).
npx @anthropic-ai/mcpb validate manifest.json
npm run pack # → dist/users-mcp-demo.mcpb(node_modules ごと同梱)El artefacto de compilación se genera en dist/ (fuera del control de git). Gracias a .mcpbignore,
el código de la API y los archivos relacionados con Docker no se incluyen en la extensión:
en el paquete solo entran manifest.json + mcp/ + node_modules.
Diapositivas de la presentación
Si abres slides/index.html en el navegador, puedes presentar directamente (navegación con las teclas ← →, 14 diapositivas,
funciona sin conexión). La estructura es: visión general → capturas de código de cada capa → matriz de permisos → distribución →
procedimiento de la demo → aprendizajes de producción.
Puntos de la presentación (desde la operación real de spx-learning-square)
La capa MCP no tiene permisos. No toca la base de datos; solo llama a la API REST con el PAT. La comprobación de permisos y la validación están todas en un único lugar del lado de la API: aunque el MCP se rompa, no ocurren accidentes que la UI no pueda hacer.
La autenticación está separada en 2 vías. Humanos = inicio de sesión + sesión, IA = PAT emitido previamente. Si el origen del token es distinto, la revocación, la auditoría y la limitación de tasa también se pueden diseñar por separado.
La exposición a la IA es «por registro explícito». Si se abre por prefijo de ruta, se corre el riesgo de abrir sin querer también las API sensibles vecinas (lección que casi ocurre de verdad). El registro funciona además directamente como «especificación de API para IA».
El texto de descripción de las herramientas es una instrucción para el modelo. Escribir reglas operativas como «no adivines el ID, resuélvelo con list_users» o «para eliminar, indica la pantalla de administración» en description / instructions permite controlar el comportamiento de la IA con texto, no con código.
Los errores no se lanzan con throw, se devuelven con
isError+ un code legible por máquina. El modelo puede leer el code y recuperarse por sí mismo (email_taken → proponer otra opción, etc.).stdout es exclusivo para JSON-RPC. En un servidor stdio, usar
console.logrompe la comunicación. Los registros deben ir siempre conconsole.error.
Referencias
Especificación y documentación de MCP: https://modelcontextprotocol.io
SDK de TypeScript/JS: https://github.com/modelcontextprotocol/typescript-sdk
MCPB (especificación de manifest + CLI): https://github.com/anthropics/mcpb
Implementación en producción:
../spx-learning-square/mcp/(bundle de 1 archivo con esbuild, etiqueta de entorno incrustada, configuración en la que el backend genera dinámicamente el.mcpb)
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseCqualityDmaintenanceEnables AI assistants to manage employee data through a REST API with full CRUD operations. Provides tools to create, read, update, and delete employee records via the Model Context Protocol.5
- FlicenseNot gradedqualityNot gradedmaintenanceEnables interaction with Users and Products through a CRUD service REST API, providing tools for listing, creating, reading, updating, and deleting records via HTTP transport.
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to access user and message data through MCP resources, providing REST API integration for user management with paginated lists and thread tracking.182MIT

Axonity Flow MCP Serverofficial
AlicenseAqualityAmaintenanceEnables AI agents to author and manage workflows, agents, tools, skills, policies, and reference docs in an Axonity tenant via the public REST API, with guardrails preventing direct publishing and secret exposure.100432MIT
Related MCP Connectors
Runtime permission, approval, and audit layer for AI agent tool execution.
Odoo ERP for AI agents: hosted OAuth endpoint, gated writes, one endpoint for every instance.
Permission boundary receipts for ChatGPT agents.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/d-bui/mcp-from-scratch'
If you have feedback or need assistance with the MCP directory API, please join our Discord server