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 deployed
Maintenance
Related MCP Connectors
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Let AI agents query data and act across all your business apps via MCP.
Multi-tenant MCP gateway for AI commerce. One connection, every store.
Multi-tenant MCP gateway for AI commerce. One connection, every store.
Related MCP Servers
- FlicenseNot gradedqualityAmaintenanceA production-ready MCP gateway and control plane that provides credential vault, policy engine, audit logging, and managed runtime for routing tool calls between AI agents and downstream MCP servers.58-
- AlicenseNot gradedqualityDmaintenanceA 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
- AlicenseNot gradedqualityDmaintenanceProvides a secure MCP gateway for AI agents to access APIs without exposing raw credentials, with scoped access, audit logging, and OAuth support.MIT
- AlicenseNot gradedqualityDmaintenanceA multi-tenant MCP server that exposes DataCrazy CRM REST API as 63 auto-generated tools, allowing AI assistants to query leads, conversations, pipelines, and more through natural language.MIT