Exir MCP Server
Servidor MCP Exir
Una puerta de enlace multiinquilino del Model Context Protocol que se sitúa entre los hosts MCP (Claude, ChatGPT o cualquier otro agente compatible con MCP) y la API de Exir CRM (Perfex CRM bajo el capó).
┌──────────────────────┐
│ ChatGPT / Agent │
│ Claude / Other Host │
└──────────┬────────────┘
│
MCP / HTTPS
│
▼
┌────────────────────────────────┐
│ Exir MCP Server │
│ │
│ OAuth 2.1 / OIDC │
│ Tenant Resolver │
│ Permission Engine │
│ Tool Registry │
│ Audit Logger │
│ Rate Limiter │
│ Input Validation │
└───────────────┬─────────────────┘
│
Internal API
│
▼
┌────────────────────────────────┐
│ Exir CRM API │
│ │
│ Customers / Leads / Sales │
│ Tasks / Projects / Tickets │
│ Invoices / Contracts / ... │
└───────────────┬─────────────────┘
│
▼
┌──────────────────┐
│ Customer Tenant │
│ Data / Database │
└──────────────────┘Cómo fluye una solicitud
Transporte — un host MCP envía una solicitud
POST /mcp(Streamable HTTP) con un token de accesoBearer.OAuth 2.1 / OIDC (
src/auth/oidc.ts) — la firma, el emisor, la audiencia y la caducidad del token se verifican contra el JWKS del proveedor de identidad. Los tokens no verificados nunca llegan a nada por debajo de esta capa.Resolvedor de inquilinos (
src/tenant/tenantResolver.ts) — el id del inquilino se lee de una reclamación del token verificado y se asigna a la conexión de Exir CRM de ese inquilino (URL base + clave de API). Las solicitudes nunca pueden cruzar los límites de los inquilinos.Limitador de velocidad (
src/middleware/rateLimiter.ts) — las solicitudes se limitan por inquilino para que un llamador ruidoso no pueda privar a otro en una implementación compartida.Registro de herramientas (
src/tools/) — el servidor MCP para esta solicitud se construye envolviendo cada herramienta registrada (src/mcp/server.ts) con:Motor de permisos (
src/permissions/permissionEngine.ts) — comprueba los alcances OAuth del token contra el alcance requerido por la herramienta.Validación de entrada — cada herramienta declara un esquema zod; la entrada no válida se rechaza antes de que llegue al CRM.
Registro de auditoría (
src/audit/auditLogger.ts) — cada llamada (permitida, denegada, exitosa o con error) se registra con inquilino, sujeto, nombre de la herramienta y resultado.
API interna (
src/crm/perfexClient.ts) — un cliente HTTP con ámbito de inquilino llama a la API real de Exir CRM (API REST de Perfex CRM, autenticación con cabeceraauthtoken) y devuelve el resultado hacia arriba en la cadena como salida de la herramienta.
Related MCP server: Nervora
Estructura del proyecto
src/
auth/oidc.ts OAuth 2.1 / OIDC bearer-token verification
tenant/tenantResolver.ts Tenant lookup + per-tenant CRM connection details
permissions/permissionEngine.ts Scope-based authorization
audit/auditLogger.ts Structured audit trail for every tool call
middleware/rateLimiter.ts Per-tenant rate limiting
crm/perfexClient.ts Internal API client to the Exir CRM API
tools/ Tool Registry + one file per CRM domain
customers.ts leads.ts tasks.ts invoices.ts
mcp/server.ts Wires tools -> permissions -> validation -> audit -> CRM
http/app.ts Express app: /healthz, POST /mcp
index.ts Process entrypoint
tests/ Vitest unit tests (permission engine, tool registry)Primeros pasos
npm install
cp .env.example .env # fill in OIDC_ISSUER, CRM_API_BASE_URL, CRM_API_KEY, ...
npm run dev # ts-node/tsx dev server on :3333Compilar y ejecutar para producción:
npm run build
npm startO mediante Docker:
docker compose up --buildEjecutar pruebas:
npm testAñadir una nueva herramienta
Añade una llamada
registry.register({...})en el archivo correspondiente bajosrc/tools/(o un archivo nuevo para un nuevo dominio del CRM), con unname,description,requiredScope, uninputSchemadezody unhandler(crm, input)que llame alPerfexClient.Si es un archivo nuevo, conéctalo en
buildToolRegistry()ensrc/tools/index.ts.Añade una prueba en
tests/tools.test.tsque verifique que la herramienta está registrada y que su esquema rechaza entradas incorrectas.
No se necesitan cambios en ningún otro lugar: los permisos, la validación y la auditoría se aplican genéricamente a cada herramienta registrada mediante src/mcp/server.ts.
Multiinquilinato
src/tenant/tenantResolver.ts incluye un EnvTenantStore de respaldo para desarrollo que resuelve cada id de inquilino a la única conexión CRM en .env. Para implementaciones reales de multiinquilinato, implementa la interfaz TenantStore contra tu directorio de inquilinos (Postgres, un servicio de configuración, etc.) que asigne id de inquilino -> { baseUrl, apiKey }, y pásalo a tenantResolver(myStore) en src/http/app.ts.
Notas de seguridad
El id del inquilino solo se confía en una reclamación de un token de acceso verificado criptográficamente, nunca en una cabecera proporcionada por el cliente, a menos que
TENANT_HEADER_FALLBACK=truese establezca explícitamente para llamadores de confianza en la red interna (por ejemplo, desarrollo local).Las claves de API del CRM por inquilino nunca se registran (
src/logger.tsredactaAuthorization,*.apiKey,*.token).Cada llamada a una herramienta se valida dos veces: una por el SDK de MCP contra el esquema JSON de la herramienta, y otra por
zod.safeParsedentro del manejador, antes de realizar cualquier llamada a la API del CRM.El servidor se ejecuta sin estado (
sessionIdGenerator: undefined): se crea una nueva instancia del servidor MCP por solicitud HTTP, con ámbito al inquilino y permisos verificados de esa solicitud, por lo que no hay estado de sesión compartido que pueda filtrarse entre inquilinos.
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
- AlicenseNot gradedqualityCmaintenanceA secure MCP gateway for enterprise AI tool execution, enabling governed invocation of business tools with authentication, RBAC, audit logging, PII redaction, and async processing.Apache 2.0
- AlicenseBqualityBmaintenanceMCP server that connects AI assistants to the Conexa business management system, enabling CRUD operations on sales, customers, plans, contracts, charges, and more via 83 tools.831211MIT
- AlicenseNot gradedqualityCmaintenanceA security-hardened MCP gateway that enables AI agents to call LLM APIs (Gemini, OpenAI, Claude, etc.) using ephemeral proxy tokens, eliminating exposure of real API keys.606Apache 2.0
Related MCP Connectors
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
Phone, SMS & email for AI agents — one remote MCP endpoint, OAuth login, zero install.
MCP Server for agents to onboard, pay, and provision services autonomously with InFlow
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/milad13711/Exir-MCP-Connector'
If you have feedback or need assistance with the MCP directory API, please join our Discord server