Skip to main content
Glama
milad13711
by milad13711

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   │
                    └──────────────────┘

リクエストの流れ

  1. Transport — MCPホストがBearerアクセストークンを添えてPOST /mcp(Streamable HTTP)リクエストを送信します。

  2. OAuth 2.1 / OIDC(src/auth/oidc.ts)— トークンの署名、発行者(issuer)、オーディエンス、有効期限が、IDプロバイダーのJWKSに対して検証されます。未検証のトークンはこの層より下に到達することはありません。

  3. Tenant Resolver(src/tenant/tenantResolver.ts)— テナントIDは検証済みトークンのクレームから読み取られ、そのテナントのExir CRM接続情報(ベースURL + APIキー)にマッピングされます。リクエストがテナントの境界を越えることは決してありません。

  4. Rate Limiter(src/middleware/rateLimiter.ts)— リクエストはテナントごとにスロットリングされるため、共有デプロイメント上で、ある大量リクエストを送る呼び出し元が別の呼び出し元を枯渇させることはありません。

  5. 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)— すべての呼び出し(許可、拒否、成功、エラー)が、テナント、主体、ツール名、結果とともに記録されます。

  6. 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

新しいツールの追加

  1. src/tools/配下の該当ファイル(新しいCRMドメインの場合は新しいファイル)に、name、description、requiredScope、zodのinputSchema、およびPerfexClientを呼び出すhandler(crm, input)を指定したregistry.register({...})呼び出しを追加します。

  2. 新しいファイルの場合は、src/tools/index.tsのbuildToolRegistry()に組み込みます。

  3. 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サーバーインスタンスが作成され、そのリクエストの検証済みテナントと権限にスコープされるため、テナント間で漏洩する可能性のある共有セッション状態は存在しません。

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    A
    maintenance
    A 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
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    A 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
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides a secure MCP gateway for AI agents to access APIs without exposing raw credentials, with scoped access, audit logging, and OAuth support.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A 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