Exir MCP Server
Exir MCP Server
MCPホスト(Claude、ChatGPT、またはその他のMCP互換エージェント)とExir CRM API(内部ではPerfex CRM)の間に位置する、マルチテナント対応のModel Context Protocolゲートウェイです。
┌──────────────────────┐
│ 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 │
└──────────────────┘リクエストの流れ
Transport — MCPホストが
Bearerアクセストークンを添えてPOST /mcp(Streamable HTTP)リクエストを送信します。OAuth 2.1 / OIDC(
src/auth/oidc.ts)— トークンの署名、発行者(issuer)、オーディエンス、有効期限が、IDプロバイダーのJWKSに対して検証されます。未検証のトークンはこの層より下に到達することはありません。Tenant Resolver(
src/tenant/tenantResolver.ts)— テナントIDは検証済みトークンのクレームから読み取られ、そのテナントのExir CRM接続情報(ベースURL + APIキー)にマッピングされます。リクエストがテナントの境界を越えることは決してありません。Rate Limiter(
src/middleware/rateLimiter.ts)— リクエストはテナントごとにスロットリングされるため、共有デプロイメント上で、ある大量リクエストを送る呼び出し元が別の呼び出し元を枯渇させることはありません。Tool Registry(
src/tools/)— このリクエストに対するMCPサーバーは、登録済みのすべてのツール(src/mcp/server.ts)を以下のものでラップして構築されます:Permission Engine(
src/permissions/permissionEngine.ts)— トークンのOAuthスコープをツールの必須スコープと照合します。Input Validation — すべてのツールはzodスキーマを宣言します。無効な入力はCRMに到達する前に拒否されます。
Audit Logger(
src/audit/auditLogger.ts)— すべての呼び出し(許可、拒否、成功、エラー)が、テナント、主体、ツール名、結果とともに記録されます。
Internal API(
src/crm/perfexClient.ts)— テナントスコープのHTTPクライアントが実際のExir CRM API(Perfex CRMのREST API、authtokenヘッダー認証)を呼び出し、その結果をツールの出力としてチェーンを遡って返します。
Related MCP server: Nervora
プロジェクト構成
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)はじめに
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 :3333本番用にビルドして実行するには:
npm run build
npm startまたはDockerを使用する場合:
docker compose up --buildテストを実行するには:
npm test新しいツールの追加
src/tools/配下の該当ファイル(新しいCRMドメインの場合は新しいファイル)に、name、description、requiredScope、zodのinputSchema、およびPerfexClientを呼び出すhandler(crm, input)を指定したregistry.register({...})呼び出しを追加します。新しいファイルの場合は、
src/tools/index.tsのbuildToolRegistry()に組み込みます。tests/tools.test.tsに、ツールが登録されていることと、そのスキーマが不正な入力を拒否することを検証するテストを追加します。
他の場所での変更は不要です。権限付与、検証、監査は、src/mcp/server.tsによって登録済みのすべてのツールに汎用的に適用されます。
マルチテナンシー
src/tenant/tenantResolver.tsには、開発用のフォールバックとしてEnvTenantStoreが同梱されており、すべてのテナントIDを.env内の単一のCRM接続情報に解決します。実際のマルチテナントデプロイメントでは、テナントディレクトリ(Postgres、設定サービスなど)に対してTenantStoreインターフェースを実装し、テナントIDを{ baseUrl, apiKey }にマッピングして、src/http/app.tsのtenantResolver(myStore)に渡します。
セキュリティに関する注意事項
テナントIDは、暗号学的に検証されたアクセストークンのクレームからのみ信頼され、クライアントが指定したヘッダーからは決して信頼されません。ただし、信頼できる内部ネットワークの呼び出し元(例:ローカル開発)のために
TENANT_HEADER_FALLBACK=trueが明示的に設定されている場合は除きます。テナントごとのCRM APIキーがログに記録されることはありません(
src/logger.tsがAuthorization、*.apiKey、*.tokenをマスクします)。すべてのツール呼び出しは2回検証されます。1回目はMCP SDKがツールのJSONスキーマに対して検証し、2回目はハンドラー内の
zod.safeParseが検証します。CRM APIの呼び出しが行われる前です。サーバーはステートレスに動作します(
sessionIdGenerator: undefined)。HTTPリクエストごとに新しいMCPサーバーインスタンスが作成され、そのリクエストの検証済みテナントと権限にスコープされるため、テナント間で漏洩する可能性のある共有セッション状態は存在しません。
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