mcpField
T
Tufin MCP Server - Open Source Community Project

Tufin MCP Server - Open Source Community Project

ローカル
github.com/stonecircle82セキュリティ477 週間前に更新

Tufin MCP Server - Open Source Community Project について

Tufin MCP Serverは、Tufinユーザー向けのオープンソースRESTレイヤーで、SecureTrackとSecureChangeの操作をスクリプト、アプリ、AIワークフローに公開します。APIキー認証とロールベースのアクセス制御を備え、デバイス、チケット、トポロジーのAPIを提供します。

主な機能

  1. 01SecureTrackとSecureChangeへの接続
  2. 02デバイス、チケット、トポロジー操作
  3. 03APIキー認証とロールベースアクセス制御
  4. 04IPレート制限と構造化ログ
  5. 05OpenAPI仕様とクライアントライブラリ

活用シーン

  1. 01AIワークフローでのTufinデバイス照会
  2. 02SecureChangeチケットの作成と管理
  3. 03トポロジーAPIによるネットワーク経路の分析

MCP 対応

SecureTrackとSecureChangeの操作をREST/JSON APIで公開し、APIキーでクライアントを認証します。READMEにはMCPプロトコルのトランスポート実装について記載がありません。

設定

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

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ

ツール

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

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

詳細

Tufin MCP サーバー - オープンソースコミュニティプロジェクト

ライセンス:MIT

はじめに

Tufin MCP(Multi-Controller Protocol)サーバープロジェクトへようこそ!このオープンソースの取り組みは、Tufin の堅牢な API(SecureTrack と SecureChange)と最新の AI 開発ワークフローの間をつなぐ強力なツールを、Tufin ユーザーに提供することを目指しています。

Tufin の機能を、ロールベースのアクセス制御(RBAC)を備えた安全で標準化された REST API を通じて公開することで、このサーバーを使用して、Tufin のデータや操作をカスタムスクリプト、アプリケーション、AI エージェント(Cursor、ChatGPT Actions、Ollama などで実行されるもの)に簡単に統合できます。

これはコミュニティ主導のプロジェクトです。 コントリビューションを歓迎します!新しいエンドポイントの対応追加、セキュリティの改善、クライアントライブラリの強化、バグ修正など、皆様からのご意見は貴重です。詳しくはコントリビューションのセクションをご確認ください。

GitHub でプロジェクトのリポジトリをご覧ください:https://github.com/stonecircle82/tufin-mcp

これを使用する理由

  • AI 統合を簡素化: Tufin の既存 API を基盤とする最新の REST API レイヤーを提供し、AI ツール、チャットボット、自動化スクリプトとの統合を容易にします。
  • 一元管理: Tufin へのアクセスと認証を一元的に管理できます。
  • セキュリティの強化: Tufin の認証に加えて、API キー認証とロールベースのアクセス制御を追加します。
  • 拡張性: より多くの Tufin API や、将来的には他のセキュリティプラットフォームにも対応できるよう設計されています。
  • 将来的な可能性: 新しい Tufin API(GraphQL など)や、直接 API を呼び出すと複雑になり得る一括操作(ファイルからデバイスを追加するなど)といった機能への対応を目指しています。

概要

このサーバーは、Tufin API(v25.1 を対象)のセキュアなプロキシおよび抽象化レイヤーとして動作します。

主な機能:

  • OpenAPI でドキュメント化された、標準的な REST/JSON API インターフェース。
  • Tufin 認証の一元管理(環境変数で設定する Basic 認証を使用)。
  • MCP クライアント向けの API キー認証(キーは bcrypt でハッシュ化)。
  • 設定可能なロールベースのアクセス制御(Admin、Ticket Manager、User)。
  • SecureChange と SecureTrack の主要な操作(チケット管理、デバイス、トポロジー)向けのエンドポイント。
  • リクエスト ID を含む構造化 JSON ロギング。
  • IP ベースのレート制限。
  • 基本的な Python クライアントライブラリ。
  • Docker のサポート。

はじめに

前提条件
  • Python 3.8+
  • 稼働中の Tufin SecureTrack および SecureChange インスタンスへのアクセス(v25.1 互換)。
  • Docker(コンテナ経由で実行する場合)。
  • Git。
インストール
  1. リポジトリをクローンします:

    git clone https://github.com/<your-username>/tufin-mcp.git # ** URL を置き換えてください **
    cd tufin-mcp
    
  2. 仮想環境を作成して有効化します:

    python -m venv venv
    source venv/bin/activate # Windows の場合は `venv\Scripts\activate` を使用します
    
  3. 依存関係をインストールします:

    pip install -r requirements.txt
    
設定

設定は、環境変数またはプロジェクトのルートにある .env ファイルで管理します。

  1. .env ファイルを作成します: .env.example が提供されている場合はコピーするか、.env を手動で作成します。

  2. 必須の変数を設定します:

    # Server Settings
    MCP_PORT=8000
    LOG_LEVEL="INFO" # DEBUG, INFO, WARNING, ERROR
    
    # Tufin Connection (REPLACE with your details)
    TUFIN_SECURETRACK_URL="https://your-securetrack-host"
    TUFIN_SECURECHANGE_URL="https://your-securechange-host"
    TUFIN_USERNAME="your_tufin_username"
    TUFIN_PASSWORD="your_tufin_password"
    TUFIN_SSL_VERIFY="True" # Set to False only if absolutely necessary (insecure!)
    TUFIN_API_TIMEOUT="30.0" # Timeout for Tufin API calls in seconds
    
    # --- Development API Keys (Insecure - For Dev/Test Only!) ---
    # For the default In-Memory secure store, provide initial RAW keys and roles via this JSON string.
    # The server will HASH the keys on startup and store them in memory.
    # DO NOT USE PRODUCTION KEYS HERE.
    DEV_API_KEYS='[{"key":"admin_key_abc", "role":"admin"}, {"key":"manager_key_xyz", "role":"ticket_manager"}, {"key":"user_key_123", "role":"user"}]'
    

    SSL 検証に関する注意(TUFIN_SSL_VERIFY): デフォルトでは、サーバーは Tufin インスタンスの SSL 証明書を検証します(TUFIN_SSL_VERIFY="True")。これを "False" に設定すると検証が無効になります。自己署名証明書を使用する環境では必要となる場合がありますが、接続が中間者攻撃にさらされるため、本番環境では非常に危険です。内部 CA を使用する場合は、基盤となるシステムを設定するか、カスタム CA バンドルのパスを指定することを検討してください(コードの変更が必要です)。

    本番環境のセキュリティに関する注意: API キーは bcrypt を使用してハッシュ化されます。デフォルトの InMemorySecureStore は、開発環境でのみ DEV_API_KEYS から未加工のキーを読み込みます。本番環境では、必ず以下を行ってください。

    1. src/app/core/secure_store.py の InMemorySecureStore を、セキュアなデータベースまたはシークレットマネージャー(例:HashiCorp Vault)を使用する実装に置き換えます。
    2. API キーを管理するための安全なプロセス/エンドポイント(生成、ハッシュとロールの保存、取り消し)を実装します。
    3. 本番環境では DEV_API_KEYS を使用しないでください。

サーバーの実行

ローカル開発(Uvicorn)
# From the project root directory
uvicorn src.app.main:app --reload --port ${MCP_PORT:-8000}
  • --reload フラグを指定すると、コードの変更時に自動で再読み込みされます。
  • .env で定義されたポートを使用します。定義されていない場合は、デフォルトの 8000 を使用します。
Docker コンテナー
  1. イメージをビルドします:

    # From the project root directory
    docker build -t tufin-mcp-server:latest .
    
  2. コンテナーを実行します:

    docker run --rm -d \
      --name tufin-mcp \
      --env-file .env \
      -p ${MCP_PORT:-8000}:${MCP_PORT:-8000} \
      tufin-mcp-server:latest
    
    • ローカルの .env ファイルから環境変数を読み込みます。
    • ホストのポートをコンテナーのポート(MCP_PORT で定義。未定義の場合はデフォルトの 8000)にマッピングします。
  3. アクセス: http://localhost:${MCP_PORT:-8000}

  4. ログ: docker logs tufin-mcp(追跡するには -f を指定)

  5. 停止: docker stop tufin-mcp

テスト

このプロジェクトでは、テストに pytest を使用します。

  1. テスト用の依存関係をインストールします:

    pip install -r requirements-dev.txt
    
  2. テストを実行します:

    # From the project root directory
    pytest
    
    • 特定のファイルを実行できます:pytest tests/api/v1/test_endpoints.py
    • 詳細な出力には -v を使用します:pytest -v
    • -k を使用すると、名前でテストを絞り込めます:pytest -k list_devices
  3. テストカバレッジ(任意): pytest-cov をインストールし(pip install pytest-cov)、次を実行します。

    pytest --cov=src/app --cov-report=term-missing
    

API の使用方法

認証

/health を除くすべてのリクエストで、生成した API キーを HTTP ヘッダー X-API-Key に指定します。

認可(RBAC)

アクセスは、キーの作成時にAPIキーに割り当てられたロールによって制御されます(安全な本番環境向けプロセスを使用するか、開発環境ではDEV_API_KEYSを使用します)。各エンドポイントで許可されるロールは、src/app/core/config.pyのENDPOINT_PERMISSIONSで設定します。

  • ロール: admin、ticket_manager、user。
  • 必要な権限のない状態で操作を試みると、403 Forbiddenが返されます。

エンドポイント権限の設定:

src/app/core/config.pyのENDPOINT_PERMISSIONS辞書で、各論理アクション(権限ID)にアクセスできるロールを定義します。例:

# src/app/core/config.py
ENDPOINT_PERMISSIONS: Dict[str, List[UserRole]] = {
    "list_devices": [UserRole.ADMIN, UserRole.TICKET_MANAGER, UserRole.USER],
    "get_device": [UserRole.ADMIN, UserRole.TICKET_MANAGER, UserRole.USER],
    "create_ticket": [UserRole.ADMIN, UserRole.TICKET_MANAGER],
    # ... other permissions ...
}
  • この方法を採用する理由: アクセス制御ポリシーを一元管理することで、エンドポイントのコード自体を変更せずに権限を簡単に確認、変更できます。
  • 仕組み: 各APIエンドポイントのルートでは、require_permission("permission_id")依存関係を使用します。この依存関係は、ユーザーの有効なAPIキーに関連付けられたロールが、ENDPOINT_PERMISSIONS辞書で該当するpermission_idに定義されているリストに含まれているかを確認します。
  • カスタマイズ: config.pyで、任意の権限IDに対するUserRole列挙型のリストを変更することで、アクセス権を簡単にカスタマイズできます。エンドポイントを追加する際は、新しい権限IDも追加してください。
レート制限

IPアドレスベースのレート制限が適用されます(デフォルト:60回/分)。制限を超えると、429 Too Many Requestsが返されます。

エンドポイントの概要

APIの構成はopenapi.yamlで定義されています。このファイルを直接確認するか、仕様がアプリケーションから提供されている場合はSwagger UIなどのツールを使用できます(main.pyに静的ファイル配信を追加する必要があります)。

現在のエンドポイント一覧:

  • GET /health:ヘルスチェック。
  • POST /api/v1/tickets:SecureChangeチケットを作成します。
  • GET /api/v1/tickets:SecureChangeチケットの一覧を取得します(statusによるフィルタリングに対応)。
  • GET /api/v1/tickets/{ticket_id}:指定したSecureChangeチケットを取得します。
  • PUT /api/v1/tickets/{ticket_id}:SecureChangeチケットを更新します。
  • GET /api/v1/devices:SecureTrackデバイスの一覧を取得します(status、name、vendorによるフィルタリングに対応)。
  • GET /api/v1/devices/{device_id}:SecureTrackデバイスの詳細を取得します。
  • POST /api/v1/devices/bulk:1台以上のデバイスを追加します(リクエスト本文にベンダー固有のdevice_dataが必要です)。
  • POST /api/v1/devices/bulk/import:管理対象デバイス(DG、ADOM、コンテキストなど)を既存の管理デバイスにインポートします。
  • GET /api/v1/topology/map:SecureTrackのトポロジーマップを取得します。
  • POST /api/v1/topology/query:SecureTrackのトポロジークエリを実行します。
  • GET /api/v1/topology/path:SecureTrackのトポロジーパスクエリを実行します。traffic_allowed、is_fully_routed、および(通信が許可され、ルーティングされている場合は)path_device_namesを含む要約結果を返します。
  • GET /api/v1/topology/path/image:トポロジーパスを画像(例:PNG)として取得します。
  • POST /api/v1/graphql/rules:GraphQLとTQLフィルターを使用してSecureTrackのルールをクエリします。

注: 実装には、Tufin 25.1 REST APIドキュメントに照らした確認が必要です。フィルターの実装については、Tufin API固有の構文を確認する必要があります。

基本的な例(curl)
# Set environment variables for convenience
export MCP_URL="http://localhost:8000"
export MCP_API_KEY="your_api_key_here"

# Health Check
curl "$MCP_URL/health"

# List Devices
curl -H "X-API-Key: $MCP_API_KEY" "$MCP_URL/api/v1/devices?limit=5"

# Create Ticket (Requires appropriate role for the key)
curl -X POST -H "X-API-Key: $MCP_API_KEY" -H "Content-Type: application/json" \
     -d '{"subject": "API: Allow Port 443", "description": "...details..."}' \
     "$MCP_URL/api/v1/tickets"

# Example Topology Path Query
curl -G -H "X-API-Key: $MCP_API_KEY" "$MCP_URL/api/v1/topology/path" \
     --data-urlencode "src=1.1.1.1" \
     --data-urlencode "dst=8.8.8.8" \
     --data-urlencode "service=tcp:443"
# Example Topology Path Image Request (save to file)
curl -H "X-API-Key: $MCP_API_KEY" "$MCP_URL/api/v1/topology/path/image?src=1.1.1.1&dst=8.8.8.8&service=tcp:443" -o topology_path.png

# Example Add Device (Cisco ASA - requires ADMIN role & correct device_data)
curl -X POST -H "X-API-Key: $MCP_API_KEY" -H "Content-Type: application/json" \
     -d '{
           "devices": [
             {
               "display_name": "MCP-ASA-Test",
               "ip_address": "10.1.2.3",
               "vendor": "Cisco",
               "model": "ASA",
               "securetrack_domain": "Default",
               "enable_topology": true,
               "device_data": {
                 "user_name": "tufin-api-user", 
                 "password": "tufin-api-password",
                 "enable_password": "tufin-enable-password"
                 # Add other ASA specific fields from Tufin docs here
               }
             }
           ]
         }' \
     "$MCP_URL/api/v1/devices/bulk"

# Example Import Managed Devices (Panorama DG)
curl -X POST -H "X-API-Key: $MCP_API_KEY" -H "Content-Type: application/json" \
     -d '{
           "devices": [
             {
               "device_id": "1", 
               "device_data": {
                 "import_all": false,
                 "import_devices": [
                   {"name": "DG1", "import_all": false, "managed_devices": ["fw1"]}
                 ]
               }
             }
           ]
         }' \
     "$MCP_URL/api/v1/devices/bulk/import"

# Example GraphQL Rule Query (using curl and jq for readability)
# Find firewall rules allowing any source to 8.8.8.8
export TQL_FILTER="destination.ip 8.8.8.8"
curl -X POST -H "X-API-Key: $MCP_API_KEY" -H "Content-Type: application/json" \
     -d "{\"tql_filter\": \"$TQL_FILTER\"}" \
     "$MCP_URL/api/v1/graphql/rules" | jq

OpenAPI仕様

ルートディレクトリには、OpenAPI 3.0仕様ファイル(openapi.yaml)が含まれています。このファイルでは、エンドポイント、パラメーター、リクエスト/レスポンスのスキーマ、セキュリティ要件など、APIが正式に記述されています。さまざまなツールで利用できます。

  • コード生成: さまざまな言語でクライアントライブラリを生成します。
  • APIドキュメント: Swagger UIやRedocなどのツールを使用して、インタラクティブなドキュメントを表示します。
  • AI連携: ChatGPT Actionsなどのプラットフォームにインポートして、連携を可能にします。
  • テストツール: PostmanやInsomniaなどのツールで使用します。

(任意の拡張): この仕様を/openapi.yamlで自動的に提供し、インタラクティブなドキュメント(Swagger UI/Redoc)を表示するよう、FastAPIを設定することを検討してください。

Pythonクライアントライブラリ

基本的なPythonクライアントライブラリの構成がclient_libs/python/に用意されています。

インストール(ローカルソースから)
# From the project root directory
cd client_libs/python
pip install .
使用例
from tufin_mcp_client import TufinMCPClient, TufinMCPClientError

SERVER_URL = "http://localhost:8000" 
API_KEY = "your_api_key_here"

# Use as a context manager (recommended)
with TufinMCPClient(base_url=SERVER_URL, api_key=API_KEY) as client:
    try:
        health = client.get_health()
        print(f"Health: {health}")
        
        devices = client.list_devices()
        print(f"Devices Found: {devices.total}")
        
        # Example: Get first device if list is not empty
        if devices.devices:
            first_device_id = devices.devices[0].id
            device_details = client.get_device(first_device_id)
            print(f"Device {first_device_id}: {device_details.name} ({device_details.vendor})")
        
        # Example: Create Ticket 
        ticket_data = {
            "workflow_name": "Example Firewall Workflow", # Check configured workflows
            "subject": "Client Lib Test", 
            "details": { # Workflow specific fields go here
                "description": "Testing ticket creation via client",
                "priority": "Medium"
                 # Add other fields required by the specific workflow
            }
        }
        created_ticket = client.create_ticket(ticket_data)
        print(f"Created Ticket ID: {created_ticket.id}, Status: {created_ticket.status}")
        ticket_id = created_ticket.id
        
        if ticket_id:
            retrieved_ticket = client.get_ticket(ticket_id)
            print(f"Retrieved Ticket {ticket_id}: Subject: {retrieved_ticket.subject}")
            
            updated_data = {"status": "In Progress"} # Check actual updatable fields
            updated_ticket = client.update_ticket(ticket_id, updated_data)
            print(f"Updated Ticket {ticket_id}: Status: {updated_ticket.status}")
            
            # Example Add Device
            asa_device = {
              "display_name": "MCP-ASA-Test-Client",
              "ip_address": "10.1.2.4",
              "vendor": "Cisco",
              "model": "ASA",
              "securetrack_domain": "Default",
              "enable_topology": True,
              "device_data": {
                 "user_name": "tufin-api-user", 
                 "password": "tufin-api-password",
                 "enable_password": "tufin-enable-password"
              }
            }
            client.add_devices([asa_device]) # Pass as a list
            print("Device add request accepted.")
            
        # Example Import Managed Device
        import_details = {
            "devices": [
                {
                    "device_id": "1", # Panorama ID
                    "device_data": {
                        "import_all": False,
                        "import_devices": [
                            {"name": "DG_CLIENT", "import_all": True}
                        ]
                    }
                }
            ]
        }
        client.import_managed_devices(import_details)
        print("Managed device import request accepted.")

        # Example GraphQL Rule Query
        rule_filter = "action accept and source.ip 192.168.1.0/24"
        rules_response = client.query_rules_graphql(tql_filter=rule_filter)
        print(f"\nFound {rules_response.rules.count} rules matching filter:")
        for rule in rules_response.rules.values:
            print(f"  - ID: {rule.id}, Name: {rule.name}, Action: {rule.action}")
            
    except TufinMCPClientError as e:
        print(f"MCP Client Error: {e}")
        if e.status_code:
            print(f"  Status Code: {e.status_code}")
        if e.response_text:
            print(f"  Response: {e.response_text}")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")

注記: クライアントライブラリは基本的な機能とエラー処理(TufinMCPClientError)を提供し、レスポンスとして Pydantic モデルを返します。今後、さらなる機能強化を予定しています(ロードマップを参照)。

JavaScript / TypeScript クライアントライブラリ

MCP サーバー API とやり取りするための基本的な TypeScript クライアントライブラリの構成が、client_libs/javascript/ に用意されています。

インストール
# From your JS/TS project directory
npm install <path_to_client_libs/javascript> 
# or link for local development
# cd client_libs/javascript && npm link && cd ../../ && npm link tufin-mcp-client-js

# Or if published to npm:
# npm install tufin-mcp-client-js 

ソースからインストールする場合は、事前にクライアントをビルドしてください:cd client_libs/javascript && npm run build && cd ../..

使用例(TypeScript)
import { TufinMCPClient, TufinMCPClientError } from 'tufin-mcp-client-js'; // Adjust import path

const SERVER_URL = 'http://localhost:8000'; // Your MCP Server URL
const API_KEY = 'your_api_key_here';

const client = new TufinMCPClient(SERVER_URL, API_KEY);

async function runClient() {
    try {
        const health = await client.getHealth();
        console.log('Health:', health);

        const devices = await client.listDevices({ limit: 5 }); // Example param
        console.log(`Devices Found: ${devices.total}`);
        console.log('First device:', devices.devices[0]);
        
        // Example: Create Ticket
        const ticketData = {
            workflow_name: 'Example Firewall Workflow', // Check configured workflows
            subject: 'TS Client Test',
            details: {
                description: 'Testing ticket from TS client',
                priority: 'Low'
                // Add other workflow-specific fields
            }
        };
        const createdTicket = await client.createTicket(ticketData);
        console.log(`Created Ticket ID: ${createdTicket.id}, Status: ${createdTicket.status}`);

        // Example Add Device
        const asaDevice = {
          display_name: "MCP-ASA-Test-JS",
          ip_address: "10.1.2.5",
          vendor: "Cisco",
          model: "ASA",
          securetrack_domain: "Default",
          enable_topology: true,
          device_data: {
             user_name: "tufin-api-user", 
             password: "tufin-api-password",
             enable_password: "tufin-enable-password"
          }
        };
        await client.addDevices([asaDevice]); // Pass as an array
        console.log("Device add request accepted.");

        // Example Import Managed Device
        const importDetails = {
          devices: [
            {
              device_id: "1", // Panorama ID
              device_data: {
                import_all: false,
                import_devices: [
                  { name: "DG_JS_CLIENT", import_all: true }
                ]
              }
            }
          ]
        };
        await client.importManagedDevices(importDetails);
        console.log("Managed device import request accepted.");

        // Example GraphQL Rule Query
        const ruleFilter = "disabled true";
        const rulesResponse = await client.queryRulesGraphQL({tql_filter: ruleFilter});
        console.log(`\nFound ${rulesResponse.rules.count} disabled rules:`);
        rulesResponse.rules.values.forEach(rule => {
            console.log(`  - ID: ${rule.id}, Name: ${rule.name}`);
        });

    } catch (error) {
        if (error instanceof TufinMCPClientError) {
            console.error('MCP Client Error:', error.message);
            if (error.status) {
                console.error('  Status Code:', error.status);
            }
            if (error.data) {
                console.error('  Response Data:', error.data);
            }
        } else {
            console.error('An unexpected error occurred:', error);
        }
    }
}

runClient();

注記: このクライアントは基本的なものです。包括的なエラー処理、モデルの解析(any に依存しない場合)、より堅牢な型安全性を実現するには、さらなる開発が必要です。

Tufin API 直接クライアント(代替)

MCP サーバーを介さず、基本認証を使用して Tufin API に直接接続する必要がある場合は、client_libs/javascript_direct/ に別のシンプルな JS/TS クライアントライブラリがあります。詳細については、そのディレクトリ内の README を参照してください。

AI ツールとの統合

  • 主な要件: MCP サーバー URL、API キー。
  • 方法: Python クライアントライブラリまたは API の直接呼び出し。
  • ツールの使用方法: Cursor、ChatGPT Actions(openapi.yaml を使用)、Copilot(コードコンテキスト経由)、Ollama/OpenRouter(中継スクリプト経由)。
  • セキュリティ上の考慮事項: キー管理、HTTPS、最小権限、モニタリング。

コントリビューション

コントリビューションを歓迎します!参加方法、バグの報告、機能の提案、プルリクエストの送信については、コントリビューションガイドラインをご覧ください。

また、行動規範を遵守しています。

ロードマップ/今後の機能強化

このリストには、既知の TODO と今後の機能強化案が記載されています。

  • Tufin REST API ロジックの検証と改善:
    • src/app/clients/tufin.py で使用しているすべての Tufin REST API エンドポイントのパス、メソッド、リクエストパラメーター/本文(特にフィルタリングの構文/機能)、レスポンス構造を、公式の Tufin 25.1 REST ドキュメントと照らし合わせて再確認してください。
    • src/app/models/ の Pydantic モデルが、検証済みの Tufin REST API レスポンスを正確に解析できるようにしてください。
  • GraphQL API の統合:
    • Tufin SecureTrack GraphQL API(ドキュメント)を利用するエンドポイントを調査・実装し、より豊富なデータ取得(デバイス、ルール、USP など)を実現します。(ルールのクエリを追加済み)
    • MCP API 経由で GraphQL クエリのフィールドを動的に選択できるようにします。
  • 一括操作:
    • ファイル(CSV/Excel など)から複数のデバイスを追加/更新する操作や、管理対象デバイスのインポートなど、一括操作用のエンドポイントを実装します。
  • 本番環境のセキュリティ:
    • InMemorySecureStore を本番環境対応のソリューション(データベース、Vault)に置き換え、安全な API キー管理(生成、失効)を実装します。
    • src/app/core/logging_config.py に機密データの堅牢なマスキングを実装します。
    • 本番環境へのデプロイで適切な SSL 証明書検証(TUFIN_SSL_VERIFY)が設定されていることを確認します。
  • テスト:
    • クライアントロジック、API エンドポイント、セキュリティ、エラー処理を網羅する包括的な単体テストと統合テストを追加します。
  • クライアントライブラリ:
    • Python クライアントライブラリを強化します(エラー処理、レスポンスモデル/解析)。
    • JS/TS クライアントライブラリを強化します(エラー処理、ビルドプロセス)。
  • Tufin クライアントの改善:
    • src/app/clients/tufin.py の httpx クライアントに、設定可能なタイムアウトとリトライロジックを追加します。
  • デプロイと開発者体験:
    • 追加のデプロイガイダンス(Kubernetes マニフェスト、本番環境向け Gunicorn 設定など)を追加します。
    • openapi.yaml とインタラクティブなドキュメント(Swagger UI/Redoc)を提供するように FastAPI を設定します。

ライセンス

このプロジェクトは MIT License のもとでライセンスされています。詳細については、LICENSE ファイルをご覧ください。

コメント

MCP は初めてですか?

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

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