mcpField
T
Twilio Agent Payments MCP Server

Twilio Agent Payments MCP Server

ローカル
github.com/deshartmanAI・エージェント578 週間前に更新

Twilio Agent Payments MCP Server について

Twilio Agent Payments MCP Serverは、Twilio APIを使い、音声通話中のエージェント支援決済を可能にします。決済情報を段階的に収集するフロー向けに、ガイド用プロンプト、非同期コールバック用リソース、決済情報のトークン化を備えています。

主な機能

  1. 01音声通話中の決済処理
  2. 02カード情報の取得とトークン化
  3. 03MCPリソースによる非同期コールバック処理
  4. 04プロンプトによる決済手順の案内
  5. 05決済情報の再入力に対応

活用シーン

  1. 01通話相手の決済情報入力を案内
  2. 02トークン化による決済情報の取り扱い
  3. 03非同期決済コールバック状態の確認
  4. 04入力エラー後の決済情報再入力

MCP 対応

MCPサーバーとして、段階的な決済フローを案内する決済ツール、コールバック用リソース、プロンプトをクライアントに公開します。READMEではClaude DesktopなどのMCPクライアントとの連携に触れています。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"twilio-agent-payments": {
"command": "npx",
"args": [
"-y",
"twilio-agent-payments-mcp-server"
]
}
}
}
起動コマンドnpx -y twilio-agent-payments-mcp-server

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmtwilio-agent-payments-mcp-server

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

Twilio エージェント決済 MCP サーバー

Twilio API を介してエージェント支援による決済を処理する MCP(Model Context Protocol)サーバーです。非同期コールバックに対応する拡張機能と、コンテキストに応じたプロンプトによるガイド付きワークフローを備えています。

機能

  • Twilio を介して音声通話中に安全な決済を処理します
  • 決済情報(カード番号、セキュリティコード、有効期限)を取得します
  • PCI 準拠のため、決済情報をトークン化します
  • MCP リソースを介した非同期コールバックに対応します
  • 決済プロセスの各ステップで MCP プロンプトを使ったガイド付きワークフローを提供します
  • 決済情報の再入力に対応します
  • Claude Desktop などの MCP クライアントと連携します
  • 認証情報を安全に取り扱います
  • セキュリティを強化するために Twilio API Keys を使用します
  • イベントベースのロギングアーキテクチャを採用しています

インストール

このサーバーは npx から直接使用できます。

npx twilio-agent-payments-mcp-server <accountSid> <apiKey> <apiSecret>

または、グローバルにインストールできます。

npm install -g twilio-agent-payments-mcp-server
twilio-agent-payments-mcp-server <accountSid> <apiKey> <apiSecret>
環境パラメーター

サーバーをインストールする際は、次のパラメーターを指定する必要があります。

  1. コマンドライン引数(必須):

    • accountSid:Twilio Account SID
    • apiKey:Twilio API Key
    • apiSecret:Twilio API Secret
  2. 環境変数(サーバーの実行前に設定):

    • TOKEN_TYPE:決済に使用するトークンの種類(例:'reusable'、'one-time')
    • CURRENCY:決済通貨(例:'USD'、'EUR')
    • PAYMENT_CONNECTOR:Twilio と連携する決済コネクター
    • NGROK_AUTH_TOKEN:Ngrok 認証トークン(コールバック処理に必須)
    • NGROK_CUSTOM_DOMAIN:Ngrok のカスタムドメイン(任意)

環境変数を使用する例:

TOKEN_TYPE=reusable CURRENCY=USD PAYMENT_CONNECTOR=your_connector NGROK_AUTH_TOKEN=your_token npx twilio-agent-payments-mcp-server <accountSid> <apiKey> <apiSecret>

これらのパラメーターの詳細については、以下の「設定」セクションを参照してください。

設定

サーバーには次のパラメーターが必要です。

  • accountSid:Twilio Account SID('AC' で始まる必要があり、検証されます)
  • apiKey:Twilio API Key('SK' で始まります)
  • apiSecret:Twilio API Secret
環境変数

設定には次の環境変数を使用します。

  • TOKEN_TYPE:決済に使用するトークンの種類(例:'reusable'、'one-time')
  • CURRENCY:決済通貨(例:'USD'、'EUR')
  • PAYMENT_CONNECTOR:Twilio と連携する決済コネクター
  • NGROK_AUTH_TOKEN:Ngrok 認証トークン(コールバック処理に必須)
  • NGROK_CUSTOM_DOMAIN:Ngrok のカスタムドメイン(任意)

注:Twilio の認証情報(accountSid、apiKey、apiSecret)は環境変数ではなく、コマンドライン引数として指定します。

セキュリティに関する注意

このサーバーはセキュリティ強化のため、Auth Tokens の代わりに API Keys と Secrets を使用します。この方法により、アクセス制御を強化でき、必要に応じて認証情報を取り消せます。詳細については、Twilio API Keys のドキュメントを参照してください。

Claude Desktop での使用

ローカル開発

ローカル開発時(パッケージが npm に公開されていない場合)は、Claude Desktop の設定ファイル(macOS では ~/Library/Application Support/Claude/claude_desktop_config.json、Windows では %APPDATA%\Claude\claude_desktop_config.json)に次の内容を追加します。

{
  "mcpServers": {
    "twilio-agent-payments": {
      "command": "node",
      "args": [
        "/PATHTONODE/twilio-agent-payments-mcp-server/build/index.js",
        "your_account_sid_here",
        "your_api_key_here",
        "your_api_secret_here"
      ],
      "env": {
        "TOKEN_TYPE": "reusable",
        "CURRENCY": "USD",
        "PAYMENT_CONNECTOR": "your_connector_name",
        "NGROK_AUTH_TOKEN": "your_ngrok_auth_token_here",
        "NGROK_CUSTOM_DOMAIN": "your_custom_domain_here" // Optional
      }
    }
  }
}

値を実際の Twilio 認証情報と設定に置き換えてください。

npm への公開後

パッケージが npm に公開されたら、次の設定を使用できます。

{
  "mcpServers": {
    "twilio-agent-payments": {
      "command": "npx",
      "args": [
        "-y", 
        "twilio-agent-payments-mcp-server",
        "your_account_sid_here",
        "your_api_key_here",
        "your_api_secret_here"
      ],
      "env": {
        ...process.env,   // Include existing environment variables so child process has access to the path
        "TOKEN_TYPE": "reusable",
        "CURRENCY": "USD",
        "PAYMENT_CONNECTOR": "your_connector_name",
        "NGROK_AUTH_TOKEN": "your_ngrok_auth_token_here",
        "NGROK_CUSTOM_DOMAIN": "your_custom_domain_here" // Optional
      }
    }
  }
}

ホストアプリケーションとの連携

Model Context Protocol(MCP)の主な利点の 1 つは、LLM のコンテキストを手動で細かく設定する必要がなくなることです。MCP サーバーは、必要なすべてのツール定義、リソーステンプレート、機能を LLM クライアントに自動的に提供します。

ホストアプリケーションのセットアップ

この MCP サーバーを独自のホストアプリケーションに統合するには、次の手順を実行します。

  1. MCP クライアントを実装する:既存の MCP クライアントライブラリを使用するか、アプリケーションに MCP クライアントプロトコルを実装します。

  2. MCP サーバーに接続する:Twilio Agent Payments MCP サーバーに接続するようにアプリケーションを設定します。

  3. プロトコルに残りの処理を任せる:MCP サーバーは次の処理を自動的に行います。

    • ツールとリソースをクライアントに登録します
    • すべてのツールの入力スキーマを提供します
    • 決済フローを LLM が進められるよう、コンテキストに応じたプロンプトを提供します

LLM のコンテキストでツールやリソースを手動で定義する必要はありません。MCP プロトコルがこの検出を自動的に処理します。

統合コードの例

MCP クライアントとの統合方法を示す簡略化した例は、次のとおりです。

// Initialize your MCP client
const mcpClient = new McpClient();

// Connect to the Twilio Agent Payments MCP server
await mcpClient.connectToServer({
  name: "twilio-agent-payments",
  // Connection details depend on your specific MCP client implementation
  // This could be a WebSocket URL, stdio connection, or other transport
});

// The client will automatically discover available tools and resources

// When the LLM wants to use a tool, your application can handle it like this:
function handleLlmToolRequest(toolRequest) {
  // The toolRequest would contain:
  // - server_name: "twilio-agent-payments"
  // - tool_name: e.g., "startPaymentCapture"
  // - arguments: e.g., { callSid: "CA1234567890abcdef" }
  
  return mcpClient.callTool(toolRequest);
}

// Similarly for resources:
function handleLlmResourceRequest(resourceRequest) {
  // The resourceRequest would contain:
  // - server_name: "twilio-agent-payments"
  // - uri: e.g., "payment://CA1234567890abcdef/PA9876543210abcdef/status"
  
  return mcpClient.accessResource(resourceRequest);
}
必要最小限の LLM コンテキスト

LLM が知っておく必要があるのは、決済処理に Twilio Agent Payments MCP サーバーを使用できるということだけです。システムプロンプトに簡単な指示を記述するだけで十分です。

You have access to a Twilio Agent Payments MCP server that can help process secure payments during voice calls. 
When a customer wants to make a payment, you can use the tools provided by this server to securely capture 
payment information while maintaining PCI compliance.

The server will guide you through the payment process with contextual prompts at each step.

MCP サーバー自体が、決済フローを LLM が進められるよう、詳細なツール定義、入力スキーマ、コンテキストに応じたプロンプトをすべて提供します。

開発者向け実装メモ

このセクションでは、使用されているアーキテクチャパターンに焦点を当てながら、MCP サーバーの実装がさまざまなコンポーネントとファイルにどのように分割されているかを説明します。

コンポーネントの構成

サーバーの実装は、複数のディレクトリに分かれています。

  1. src/index.ts:メインのエントリーポイントです。次の処理を行います。

    • MCP サーバーを初期化します
    • TwilioAgentPaymentServer シングルトンを初期化します
    • 自動検出を使用して、すべてのコンポーネントを検出し、MCP サーバーに登録します
    • ログ記録用のイベントリスナーを設定します
    • サーバーをトランスポート層に接続します
  2. src/tools/:個々のツール実装を格納します

    • 各ツールは、name、description、shape、execute プロパティを持つオブジェクトを返すファクトリー関数として実装されています
    • ツールは、特定の決済操作を処理します(例:StartPaymentCaptureTool、CaptureCardNumberTool)
    • 各ツールは Zod を使用して入力スキーマを定義し、execute メソッドを実装します
    • ツールは getInstance() を介して TwilioAgentPaymentServer シングルトンにアクセスします
  3. src/prompts/:プロンプトの実装を格納します

    • 各プロンプトは、name、description、execute プロパティを持つオブジェクトを返すファクトリー関数として実装されています
    • プロンプトは、決済フローの各ステップで LLM にコンテキストに応じたガイダンスを提供します
    • 一部のプロンプトは、プロンプトの内容をカスタマイズするために使用できるパラメーターを受け取ります
  4. src/resources/:リソースの実装を格納します

    • リソースはデータへのアクセスを提供します(例:PaymentStatusResource)
    • 各リソースは、name、template、description、read プロパティを持つオブジェクトを返すファクトリー関数として実装されています
    • リソースは getInstance() を介して TwilioAgentPaymentServer シングルトンにアクセスします
  5. src/api-servers/:Twilio API クライアントの実装を格納します

    • TwilioAgentPaymentServer をシングルトンとして実装します
    • Twilio API との通信を処理します
    • 決済セッションの状態を管理します
    • シングルトンインスタンスにアクセスするための静的メソッドを提供します
  6. src/utils/:ユーティリティ関数を格納します

    • autoDiscovery.ts ファイルは、ツール、プロンプト、リソースの自動検出と登録を処理します
TwilioAgentPaymentServer のシングルトンパターン

このコードベースにおける主要なアーキテクチャパターンの 1 つは、TwilioAgentPaymentServer にシングルトンパターンを使用することです。

class TwilioAgentPaymentServer extends EventEmitter {
    // Singleton instance
    private static instance: TwilioAgentPaymentServer | null = null;

    /**
     * Static method to get the instance
     */
    public static getInstance(): TwilioAgentPaymentServer {
        if (!TwilioAgentPaymentServer.instance) {
            throw new Error('TwilioAgentPaymentServer not initialized. Call initialize() first.');
        }
        return TwilioAgentPaymentServer.instance;
    }
    
    /**
     * Static method to initialize the instance
     */
    public static initialize(accountSid: string, apiKey: string, apiSecret: string): TwilioAgentPaymentServer {
        if (!TwilioAgentPaymentServer.instance) {
            TwilioAgentPaymentServer.instance = new TwilioAgentPaymentServer(accountSid, apiKey, apiSecret);
        }
        return TwilioAgentPaymentServer.instance;
    }

    // Private constructor to prevent direct instantiation
    private constructor(accountSid: string, apiKey: string, apiSecret: string) {
        // Initialization code...
    }
}

このアプローチの利点:

  • アプリケーション全体で TwilioAgentPaymentServer のインスタンスが 1 つだけになることを保証します
  • 複数の関数にインスタンスを渡す必要がなくなります
  • 関数シグネチャがよりシンプルになり、API がすっきりします
  • コードベースのどこからでも TwilioAgentPaymentServer に簡単にアクセスできます
ファクトリー関数パターン

ツール、プロンプト、リソースは、ファクトリー関数パターンを使用して実装されています。

  1. ツールの場合:

    // Example from StartPaymentCaptureTool.ts
    export function startPaymentCaptureTool() {
        // Get the TwilioAgentPaymentServer instance
        const twilioAgentPaymentServer = TwilioAgentPaymentServer.getInstance();
        
        // Create an event emitter for logging
        const emitter = new EventEmitter();
        
        return {
            name: "startPaymentCapture",
            description: "Start a new payment capture session",
            shape: schema.shape,
            execute: async function execute(params: z.infer<typeof schema>, extra: any): Promise<ToolResult> {
                // Implementation that calls Twilio API and returns result
            },
            emitter // For attaching event listeners
        }
    }
    
  2. リソースの場合:

    // Example from PaymentStatusResource.ts
    export function paymentStatusResource() {
        // Get the TwilioAgentPaymentServer instance
        const twilioAgentPaymentServer = TwilioAgentPaymentServer.getInstance();
        
        // Create an event emitter for logging
        const emitter = new EventEmitter();
        
        return {
            name: "PaymentStatus",
            template: new ResourceTemplate("payment://{callSid}/{paymentSid}/status", { list: undefined }),
            description: "Get the current status of a payment session",
            read: async (uri: URL, variables: Record<string, string | string[]>, extra: any): Promise<ResourceReadResult> => {
                // Implementation that retrieves and formats payment status data
            },
            emitter // For attaching event listeners
        };
    }
    
  3. プロンプトの場合:

    // Example from a prompt factory function
    export function startCapturePrompt() {
        return {
            name: "StartCapture",
            description: "Prompt for starting the payment capture process",
            execute: (args: { callSid: string }, extra: RequestHandlerExtra): GetPromptResult | Promise<GetPromptResult> => {
                // Return prompt content
            }
        };
    }
    
自動検出と登録

サーバーは、自動検出メカニズムを使用して、すべてのコンポーネントを検出して登録します。

// In src/utils/autoDiscovery.ts
export async function discoverComponents(mcpServer: McpServer) {
    // Get the current directory path
    const basePath: string = path.dirname(fileURLToPath(import.meta.url));

    await Promise.all([
        discoverTools(mcpServer, path.join(basePath, '../tools')),
        discoverPrompts(mcpServer, path.join(basePath, '../prompts')),
        discoverResources(mcpServer, path.join(basePath, '../resources'))
    ]);
}

この方法には、次の利点があります。

  • それぞれのディレクトリにあるすべてのツール、プロンプト、リソースを自動的に検出します
  • それらを動的にインポートし、MCP サーバーに登録します
  • メインファイルを変更せずに、新しいコンポーネントを簡単に追加できます
  • 定型コードを減らし、保守性を向上させます
プロンプトのパラメーター

一部のプロンプトは、プロンプトの内容をカスタマイズするためのパラメーターを受け取ります。StartCapturePrompt はその好例です。

  1. パラメーターの定義:

    // In the prompt factory function
    return {
        name: "StartCapture",
        description: "Prompt for starting the payment capture process",
        schema: { callSid: z.string().describe("The Twilio Call SID") }, // Parameter schema
        execute: (args: { callSid: string }, extra: RequestHandlerExtra) => {
            // Implementation
        }
    };
    
    • schema プロパティでは、Zod を使用してパラメータースキーマを定義します
    • この例では、文字列型の callSid パラメーターが必要です
  2. プロンプトでのパラメーターの使用:

    execute: (args: { callSid: string }, extra: RequestHandlerExtra): GetPromptResult | Promise<GetPromptResult> => {
      const { callSid } = args;
    
      if (!callSid) {
        throw new Error("callSid parameter is required");
      }
      
      return {
        messages: [
          {
            role: "assistant",
            content: {
              type: "text",
              text: getStartCapturePromptText(callSid), // Use the parameter in the prompt text
            }
          }
        ]
      };
    }
    
    • execute メソッドは、最初の引数としてパラメーターを受け取ります
    • パラメーターを検証し、プロンプトの内容のカスタマイズに使用できます
    • この例では、プロンプトのテキストで callSid を使用してコンテキストを提供します

このパターンにより、プロンプトを動的かつ状況に応じたものにでき、決済フローの現在の状態に基づいた適切なガイダンスを提供できます。

利用可能なツール

startPaymentCapture

通話中の決済キャプチャープロセスを開始します。

パラメーター:

  • callSid:通話中の通話に対する Twilio Call SID

重要:StartCapturePrompt.ts では、MCP クライアント側で Call SID を入力する必要があります。これは必須パラメーターであり、指定されていない場合、プロンプトはエラーをスローします。

注意:Twilio の通話を処理する際は、どちらの通話レッグの Call SID を使用しているかを把握する必要があります。Twilio Payments は、PSTN 側の通話レッグに紐づける必要があります。Twilio Client 側に適用した場合、DTMF の数字はキャプチャーされません。そのため、この MCP Server は正しい通話レッグが使用されることを前提としています。通常、次のように確認します。

 // Pseudo code: direction of the call
  if (event.CallDirection === "toPSTN") {
    theCallSid = event.CallSid;
  }

  if (event.CallDirection == "toSIP") {
    theCallSid = event.ParentCallSid;
  }

戻り値:

  • paymentSid:新しい決済セッションの Twilio Payment SID
captureCardNumber

決済カード番号のキャプチャーを開始します。

パラメーター:

  • callSid:通話中の通話に対する Twilio Call SID
  • paymentSid:決済セッションの Twilio Payment SID
  • captureType:'payment-card-number' に設定します

戻り値:

  • カード番号のキャプチャー操作のステータス
captureSecurityCode

カードのセキュリティコードのキャプチャーを開始します。

パラメーター:

  • callSid:通話中の通話に対する Twilio Call SID
  • paymentSid:決済セッションの Twilio Payment SID
  • captureType:'security-code' に設定します

戻り値:

  • セキュリティコードのキャプチャー操作のステータス
captureExpirationDate

カードの有効期限のキャプチャーを開始します。

パラメーター:

  • callSid:通話中の通話に対する Twilio Call SID
  • paymentSid:決済セッションの Twilio Payment SID
  • captureType:'expiration-date' に設定します

戻り値:

  • 有効期限のキャプチャー操作のステータス
completePaymentCapture

決済キャプチャーセッションを完了します。

パラメーター:

  • callSid:通話中の通話に対する Twilio Call SID
  • paymentSid:決済セッションの Twilio Payment SID

戻り値:

  • 決済完了操作のステータス

利用可能なリソース

payment://{callSid}/{paymentSid}/status

決済セッションの現在のステータスを JSON オブジェクトとして取得します。このリソースは、決済キャプチャープロセスの現在の状態に関する詳細情報を提供します。以下の情報が含まれます。

  • Payment SID
  • 決済カード番号(一部マスキング済み)
  • 決済カードの種類
  • セキュリティコードのステータス
  • 有効期限
  • 決済確認コード
  • 決済結果
  • 決済トークン

MCP プロンプト

このサーバーは、決済フローの各ステップで LLM を導く、状況に応じたプロンプトを提供します。

StartCapture プロンプト

支払いのキャプチャ処理を開始する方法を説明します。内容は次のとおりです。

  • 顧客に支払い情報を入力する準備ができているか確認する方法
  • 安全な処理とトークン化の説明
  • startPaymentCapture ツールを使用する手順
  • 重要:MCP クライアント側で Call SID をユーザーに入力してもらう必要があります。これは必須パラメーターです
CardNumber プロンプト

カード番号のキャプチャ処理で LLM がどのように対応するかを説明します。内容は次のとおりです。

  • 顧客に必要な情報を説明する方法
  • 顧客からの質問や懸念への対応のヒント
  • captureCardNumber ツールを使用する手順
SecurityCode プロンプト

カードのセキュリティコードをキャプチャする方法を説明します。内容は次のとおりです。

  • セキュリティコードとは何かを説明する方法
  • 顧客からの質問や懸念への対応のヒント
  • captureSecurityCode ツールを使用する手順
ExpirationDate プロンプト

カードの有効期限をキャプチャする方法を LLM に説明します。内容は次のとおりです。

  • 必要な形式(MM/YY)を説明する方法
  • 顧客からの質問や懸念への対応のヒント
  • captureExpirationDate ツールを使用する手順
FinishCapture プロンプト

支払いのキャプチャ処理を完了する方法を説明します。内容は次のとおりです。

  • すべての情報が収集されたことを確認する方法
  • completePaymentCapture ツールを使用する手順
Completion プロンプト

支払いの処理が正常に完了した後に LLM が行うことを説明します。内容は次のとおりです。

  • 支払いが成功したことを確認する方法
  • 会話の次のステップの提案
Error プロンプト

支払いのキャプチャ処理中に発生したエラーへの対応方法を説明します。内容は次のとおりです。

  • 顧客にエラーを説明する方法
  • よくある問題のトラブルシューティングの提案
  • 支払いのキャプチャ処理を再試行する手順

アーキテクチャ

この MCP サーバーは、支払いフローを処理するための拡張アーキテクチャを実装しています。

イベントベースのアーキテクチャ

サーバーは、コンポーネント間の通信に EventEmitter を使用するイベントベースのアーキテクチャを採用しています。

  • 各ツール、リソース、サーバーコンポーネントは EventEmitter を拡張します
  • コンポーネントはログ記録とコールバックのためにイベントを発行します
  • イベントリスナーはログを MCP サーバーのロギングシステムに転送します
コールバック処理

サーバーは、Twilio からの非同期コールバックを処理するために @deshartman/mcp-status-callback パッケージを使用します。

  • コールバックを受信するため、Ngrok を使用して安全なトンネルを作成します
  • 各支払い段階のコールバックを処理します
  • コールバックデータに基づいて状態ストアを更新します
  • エラー状態と再入力のシナリオに対応します
状態管理

支払いの状態は、Map ベースのストアで管理されます。

  • statusCallbackMap には、支払い SID をキーとする支払いセッションデータが格納されます
  • 各コールバックは、最新情報で状態を更新します
  • PaymentStatusResource を通じて、この状態データにアクセスできます
MCP 統合

サーバーは、次の要素を通じて MCP プロトコルと統合します。

  • ツール:入力検証に Zod スキーマを使用して定義します
  • リソース:支払い状態データへのアクセスを提供します
  • プロンプト:支払いフローの各ステップに応じたガイダンスを提供します
  • ロギング:イベントベースのログを MCP サーバーに転送します

開発

プロジェクトをビルドするには:

npm install
npm run build
前提条件
  • Node.js 18+
  • Express(コールバック処理用)
  • Twilio SDK
  • 認証トークン付きの Ngrok アカウント
サーバーを手動で実行する

テストのために Claude Desktop の外部でサーバーを手動で起動するには:

# Run with actual credentials
node build/index.js "your_account_sid_here" "your_api_key_here" "your_api_secret"

# Or use the npm script (which uses ts-node for development)
npm run dev -- "your_account_sid_here" "your_api_key_here" "your_api_secret"

サーバーが起動し、MCP クライアントからの接続を待機します。

Claude Desktop で使用する場合、Claude が設定ファイルを読み込むとサーバーは自動的に起動します。手動で起動する必要はありません。

PCI 準拠

このサーバーは、決済カード情報をトークン化することで PCI 準拠を支援します。実際のカードデータは Twilio が処理し、お使いのシステムには保存されません。Twilio の PCI 準拠について詳しくは、Twilio のセキュアな決済に関するドキュメントをご覧ください。

ライセンス

MIT

MCP Inspector との互換性

このサーバーを MCP Inspector とともに使用する場合、すべてのログ出力は console.log() ではなく MCP のロギング機能を通じて行われる点にご注意ください。これは意図的なものであり、JSON 通信に標準出力を使用する MCP プロトコルとの互換性に必要です。

このサーバーを拡張する場合や問題をデバッグする場合は、以下の点にご注意ください。

  1. LOG_EVENT イベントを発行して、イベントベースのロギングシステムを使用してください
  2. console.log() は MCP プロトコルの標準出力上の JSON メッセージに干渉するため、使用しないでください
  3. MCP のコンテキスト外でデバッグする場合は、標準エラー出力に書き込む console.error() を使用できます

イベントベースのロギングアーキテクチャ

このサーバーはイベントベースのロギングアーキテクチャを使用しています。

  1. イベントエミッター:すべてのツールクラスとリソースクラスは Node.js の EventEmitter を拡張し、レベルとメッセージデータを含む 'log' イベントを発行します。

  2. ログの転送:これらのイベントはイベントリスナーによって捕捉され、MCP サーバーのロギングシステムに転送されます。

    // Set up event listeners for tool logs
    startPaymentCaptureTool.on(LOG_EVENT, logToMcp);
    captureCardNumberTool.on(LOG_EVENT, logToMcp);
    // ... other tools
    
  3. MCP との統合:logToMcp 関数は、これらのイベントを MCP 互換のログメッセージに変換します。

    const logToMcp = (data: { level: string, message: string }) => {
        // Only use valid log levels: info, error, debug
        // If level is 'warn', treat it as 'info'
        const mcpLevel = data.level === 'warn' ? 'info' : data.level as "info" | "error" | "debug";
    
        // Send the log message to the MCP server's underlying Server instance
        mcpServer.server.sendLoggingMessage({
            level: mcpLevel,
            data: data.message,
        });
    };
    
サポートされるログレベル

このサーバーでは、以下のログレベルがサポートされています。

  • info:一般的な情報メッセージ
  • error:エラーメッセージと例外
  • debug:詳細なデバッグ情報
  • warn:警告メッセージ(MCP との互換性のため、自動的に 'info' に変換されます)

決済コールバックのデータ構造

このサーバーは、Twilio からの主に 2 種類のコールバックデータを処理します。

初期コネクターデータ

決済セッションが初めて作成されると、Twilio はコネクターデータを送信します。

{
  "PaymentConnector": "PGP_MOCK",
  "DateCreated": "2021-08-10T03:55:53.408Z",
  "PaymentMethod": "credit-card",
  "CallSid": "CAzzzzz",
  "ChargeAmount": "9.99",
  "AccountSid": "ACxxxxx",
  "Sid": "PKxxxx"
}
キャプチャデータ

決済情報が取得されると、Twilio は更新されたデータを送信します。

{ 
  "SecurityCode": "xxx",
  "PaymentCardType": "visa",
  "Sid": "PKxxxx",
  "PaymentConfirmationCode": "ch_a9dc6297cd1a4fb095e61b1a9cf2dd1d",
  "CallSid": "CAxxxxx",
  "Result": "success",
  "AccountSid": "AC75xxxxxx",
  "ProfileId": "",
  "DateUpdated": "2021-08-10T03:58:27.290Z",
  "PaymentToken": "",
  "PaymentMethod": "credit-card",
  "PaymentCardNumber": "xxxxxxxxxxxx1111",
  "ExpirationDate": "1225"
}

このサーバーは、このデータを決済 SID をインデックスとして statusCallbackMap に保存し、PaymentStatusResource を通じて利用できるようにします。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。