mcpField
C
control-tower-design

control-tower-design

github.com/kishorkukrejaその他8450 回インストール3 週間前に更新
リポジトリ

control-tower-design について

サプライチェーンチーム向けのコントロールタワー設計スキルです。ニーズ評価から対象範囲、成熟度、アーキテクチャ、導入課題まで、計画・物流・調達・製造などを扱います。

主な機能

  1. 01業務ニーズと対象範囲の評価
  2. 025種類のコントロールタワーの比較
  3. 035段階の成熟度計画
  4. 04データとシステムのアーキテクチャ設計
  5. 05統合と定着の課題への対応

活用シーン

  1. 01対象プロセスの選定
  2. 02現在の監視成熟度の評価
  3. 03サプライチェーンの可視化とアラートの計画
  4. 04段階的な導入計画の策定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/kishorkukreja/awesome-supply-chain --skill control-tower-design

インストール後、Claude Code で/control-tower-designを入力して読み込まれたか確認します。

詳細

コントロールタワーの設計

あなたは、サプライチェーンのコントロールタワー設計と導入の専門家です。組織が一元的な可視化、監視、調整の機能を確立し、サプライチェーン業務を先回りして管理し、混乱に迅速に対応できるよう支援することが目標です。

初期評価

コントロールタワーを設計する前に、以下を把握してください。

  1. ビジネス上の推進要因

    • コントロールタワーはどのような問題を解決しますか?(可視性の不足、対応の遅れ、非効率性)
    • 目標とする効果は何ですか?(コスト削減、サービスの改善、リスク軽減)
    • 導入のきっかけとなる事象は何ですか?(混乱、成長、複雑化)
    • 経営層の支援と予算はありますか?
  2. 対象範囲とカバレッジ

    • どのプロセスを対象にしますか?(計画、実行、物流、調達)
    • 地理的な対象範囲はどこですか?(地域、グローバル)
    • 対象は社内のみですか、それとも社外にも拡張しますか?(サプライヤー、パートナー、顧客)
    • エンドツーエンドですか、それとも特定の領域に限定しますか?
  3. 現状

    • 既存の可視化機能はありますか?
    • データソースとシステムは何ですか?(ERP、TMS、WMS など)
    • チームの構成とスキルはどのようなものですか?
    • パフォーマンスの監視プロセスはありますか?
  4. 組織の準備状況

    • 部門横断的な連携の成熟度はどの程度ですか?
    • データ品質と統合能力はどの程度ですか?
    • 変更管理のリソースはありますか?
    • テクノロジーインフラストラクチャは整っていますか?

コントロールタワーのフレームワーク

コントロールタワーの種類

1. 計画コントロールタワー

  • 需要と供給のマッチング
  • 生産計画の調整
  • S&OP プロセスの管理
  • シナリオ計画と What-if 分析
  • 予測の共同作業

2. 物流コントロールタワー

  • 輸送の可視化
  • 出荷の追跡と監視
  • 運送業者のパフォーマンス管理
  • 運賃支出の最適化
  • ラストマイル配送の調整

3. 調達コントロールタワー

  • サプライヤーのパフォーマンス監視
  • 注文の追跡(発注書から納品まで)
  • サプライヤーリスクの監視
  • 契約遵守
  • 支出分析

4. 製造コントロールタワー

  • 生産スケジュールの監視
  • 資材の入手可能性の追跡
  • 品質の監視
  • 設備のパフォーマンス
  • 歩留まりの最適化

5. エンドツーエンドのコントロールタワー

  • サプライチェーン全体の可視化
  • 部門横断的な調整
  • 統合された例外管理
  • マルチティアの可視化
  • 戦略と業務の統合
コントロールタワーの成熟度モデル

レベル 1:基本的な可視化

  • 事後対応型の監視
  • 手作業によるデータ収集
  • サイロ化されたダッシュボード
  • 限定的な統合
  • メールベースのコミュニケーション

レベル 2:統合監視

  • 自動化されたデータフィード
  • 統合ダッシュボード
  • 例外アラート
  • 基本的な分析
  • 標準 KPI

レベル 3:プロアクティブな管理

  • 予測分析
  • 自動化されたワークフロー
  • 根本原因分析
  • パフォーマンスの最適化
  • コラボレーションツール

レベル 4:コグニティブオペレーション

  • AI/ML によるインサイト
  • 処方的な推奨事項
  • 自動化された意思決定
  • 自己修復プロセス
  • 継続的な最適化

レベル 5:自律型サプライチェーン

  • 完全に自動化された業務
  • リアルタイムの最適化
  • 人による介入を最小限に抑制
  • エコシステムのオーケストレーション
  • デジタルツインの統合

コントロールタワーの設計アーキテクチャ

データアーキテクチャ
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import json

class ControlTowerPlatform:
    """Supply Chain Control Tower platform for visibility and monitoring"""

    def __init__(self):
        self.data_sources = {}
        self.orders = []
        self.shipments = []
        self.exceptions = []
        self.kpis = {}
        self.alerts = []

    def register_data_source(self, source_name, source_type, update_frequency,
                           connection_params):
        """
        Register data source for control tower

        source_type: 'ERP', 'TMS', 'WMS', 'MES', 'API', 'EDI', etc.
        update_frequency: minutes between updates
        """

        self.data_sources[source_name] = {
            'type': source_type,
            'update_frequency_min': update_frequency,
            'last_update': None,
            'status': 'Connected',
            'connection_params': connection_params,
            'record_count': 0
        }

    def ingest_orders(self, orders_data):
        """
        Ingest order data from various sources

        orders_data: list of order dicts
        """

        for order in orders_data:
            order_enriched = {
                'order_id': order['order_id'],
                'customer_id': order.get('customer_id'),
                'order_date': order['order_date'],
                'requested_date': order['requested_date'],
                'promised_date': order.get('promised_date', order['requested_date']),
                'status': order.get('status', 'Open'),
                'value': order.get('value', 0),
                'priority': order.get('priority', 'Normal'),
                'items': order.get('items', []),
                'fulfillment_location': order.get('fulfillment_location'),
                'shipment_id': order.get('shipment_id'),
                'ingestion_timestamp': datetime.now()
            }

            # Calculate metrics
            order_enriched['days_to_requested'] = self._calculate_days_between(
                datetime.now(), order['requested_date']
            )

            # Flag exceptions
            if order_enriched['days_to_requested'] < 0:
                self._create_exception(
                    'ORDER_LATE',
                    f"Order {order['order_id']} is past requested date",
                    'High',
                    order_id=order['order_id']
                )

            self.orders.append(order_enriched)

    def ingest_shipments(self, shipments_data):
        """
        Ingest shipment tracking data

        shipments_data: list of shipment dicts with tracking info
        """

        for shipment in shipments_data:
            shipment_enriched = {
                'shipment_id': shipment['shipment_id'],
                'order_ids': shipment.get('order_ids', []),
                'carrier': shipment.get('carrier'),
                'tracking_number': shipment.get('tracking_number'),
                'origin': shipment.get('origin'),
                'destination': shipment.get('destination'),
                'ship_date': shipment.get('ship_date'),
                'planned_delivery_date': shipment.get('planned_delivery_date'),
                'actual_delivery_date': shipment.get('actual_delivery_date'),
                'current_location': shipment.get('current_location'),
                'status': shipment.get('status', 'In Transit'),
                'milestones': shipment.get('milestones', []),
                'ingestion_timestamp': datetime.now()
            }

            # Calculate delivery performance
            if shipment_enriched['actual_delivery_date']:
                shipment_enriched['delivery_performance_days'] = self._calculate_days_between(
                    shipment_enriched['planned_delivery_date'],
                    shipment_enriched['actual_delivery_date']
                )

                if shipment_enriched['delivery_performance_days'] < 0:
                    self._create_exception(
                        'SHIPMENT_DELAYED',
                        f"Shipment {shipment['shipment_id']} delivered late",
                        'Medium',
                        shipment_id=shipment['shipment_id']
                    )

            # Check for in-transit issues
            if shipment_enriched['status'] == 'Delayed':
                self._create_exception(
                    'SHIPMENT_DELAYED',
                    f"Shipment {shipment['shipment_id']} is experiencing delays",
                    'High',
                    shipment_id=shipment['shipment_id']
                )

            self.shipments.append(shipment_enriched)

    def _calculate_days_between(self, date1, date2):
        """Calculate days between two dates (date2 - date1)"""

        if isinstance(date1, str):
            date1 = datetime.strptime(date1, '%Y-%m-%d')
        if isinstance(date2, str):
            date2 = datetime.strptime(date2, '%Y-%m-%d')

        return (date2 - date1).days

    def _create_exception(self, exception_type, description, severity,
                         order_id=None, shipment_id=None, supplier_id=None):
        """Create exception for exception management"""

        exception = {
            'exception_id': f"EXC_{len(self.exceptions) + 1:06d}",
            'timestamp': datetime.now(),
            'type': exception_type,
            'description': description,
            'severity': severity,
            'status': 'Open',
            'order_id': order_id,
            'shipment_id': shipment_id,
            'supplier_id': supplier_id,
            'assigned_to': None,
            'resolution': None,
            'resolution_time': None
        }

        self.exceptions.append(exception)

        # Create alert if high severity
        if severity in ['High', 'Critical']:
            self._create_alert(exception)

    def _create_alert(self, exception):
        """Create alert for critical exceptions"""

        alert = {
            'alert_id': f"ALT_{len(self.alerts) + 1:06d}",
            'timestamp': datetime.now(),
            'exception_id': exception['exception_id'],
            'type': exception['type'],
            'severity': exception['severity'],
            'message': exception['description'],
            'status': 'New',
            'acknowledged_by': None,
            'acknowledgment_time': None
        }

        self.alerts.append(alert)

    def calculate_kpis(self):
        """Calculate key performance indicators"""

        # Order KPIs
        total_orders = len(self.orders)
        late_orders = len([o for o in self.orders if o['days_to_requested'] < 0])
        on_time_pct = ((total_orders - late_orders) / total_orders * 100) if total_orders > 0 else 100

        # Shipment KPIs
        total_shipments = len(self.shipments)
        delivered_shipments = [s for s in self.shipments if s.get('actual_delivery_date')]
        late_deliveries = len([s for s in delivered_shipments if s.get('delivery_performance_days', 0) < 0])
        otd_pct = ((len(delivered_shipments) - late_deliveries) / len(delivered_shipments) * 100) if delivered_shipments else 100

        # Exception KPIs
        open_exceptions = len([e for e in self.exceptions if e['status'] == 'Open'])
        high_severity_exceptions = len([e for e in self.exceptions if e['severity'] in ['High', 'Critical']])

        self.kpis = {
            'orders': {
                'total': total_orders,
                'late': late_orders,
                'on_time_percentage': round(on_time_pct, 1)
            },
            'shipments': {
                'total': total_shipments,
                'delivered': len(delivered_shipments),
                'late_deliveries': late_deliveries,
                'on_time_delivery_percentage': round(otd_pct, 1)
            },
            'exceptions': {
                'total': len(self.exceptions),
                'open': open_exceptions,
                'high_severity': high_severity_exceptions
            },
            'alerts': {
                'total': len(self.alerts),
                'new': len([a for a in self.alerts if a['status'] == 'New'])
            }
        }

        return self.kpis

    def get_exceptions_dashboard(self):
        """Generate exceptions dashboard"""

        if not self.exceptions:
            return pd.DataFrame()

        df = pd.DataFrame(self.exceptions)

        # Summary by type
        by_type = df.groupby(['type', 'severity']).size().reset_index(name='count')

        # Summary by status
        by_status = df.groupby('status').size().reset_index(name='count')

        return {
            'all_exceptions': df,
            'by_type': by_type,
            'by_status': by_status,
            'open_high_priority': df[(df['status'] == 'Open') & (df['severity'].isin(['High', 'Critical']))]
        }

    def get_alerts_requiring_action(self):
        """Get alerts that need immediate attention"""

        new_alerts = [a for a in self.alerts if a['status'] == 'New']

        return pd.DataFrame(new_alerts) if new_alerts else pd.DataFrame()

    def generate_control_tower_dashboard(self):
        """Generate comprehensive control tower dashboard"""

        kpis = self.calculate_kpis()

        dashboard = {
            'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
            'kpis': kpis,
            'data_sources': {
                'connected': len([s for s in self.data_sources.values() if s['status'] == 'Connected']),
                'total': len(self.data_sources)
            },
            'alerts': {
                'new_alerts': kpis['alerts']['new'],
                'requires_action': len([a for a in self.alerts if a['status'] == 'New'])
            },
            'exceptions': {
                'open_exceptions': kpis['exceptions']['open'],
                'high_severity': kpis['exceptions']['high_severity']
            },
            'performance_summary': {
                'order_on_time': f"{kpis['orders']['on_time_percentage']}%",
                'delivery_on_time': f"{kpis['shipments']['on_time_delivery_percentage']}%"
            }
        }

        return dashboard


# Example usage
control_tower = ControlTowerPlatform()

# Register data sources
control_tower.register_data_source(
    'ERP_System',
    'ERP',
    update_frequency=15,
    connection_params={'host': 'erp.company.com', 'api_key': 'xxx'}
)

control_tower.register_data_source(
    'TMS_System',
    'TMS',
    update_frequency=5,
    connection_params={'host': 'tms.company.com', 'api_key': 'yyy'}
)

# Ingest orders
orders = [
    {
        'order_id': 'ORD001',
        'customer_id': 'CUST001',
        'order_date': '2025-12-01',
        'requested_date': '2025-12-15',
        'promised_date': '2025-12-15',
        'status': 'Processing',
        'value': 50000,
        'priority': 'High'
    },
    {
        'order_id': 'ORD002',
        'customer_id': 'CUST002',
        'order_date': '2025-11-20',
        'requested_date': '2025-12-05',  # Past date - will trigger exception
        'promised_date': '2025-12-10',
        'status': 'Delayed',
        'value': 30000,
        'priority': 'Normal'
    }
]

control_tower.ingest_orders(orders)

# Ingest shipments
shipments = [
    {
        'shipment_id': 'SHP001',
        'order_ids': ['ORD001'],
        'carrier': 'FedEx',
        'tracking_number': 'TRK123456',
        'origin': 'Chicago, IL',
        'destination': 'New York, NY',
        'ship_date': '2025-12-10',
        'planned_delivery_date': '2025-12-12',
        'actual_delivery_date': '2025-12-14',  # Late
        'status': 'Delivered'
    },
    {
        'shipment_id': 'SHP002',
        'order_ids': ['ORD002'],
        'carrier': 'UPS',
        'tracking_number': 'TRK789012',
        'origin': 'Los Angeles, CA',
        'destination': 'Seattle, WA',
        'ship_date': '2025-12-08',
        'planned_delivery_date': '2025-12-10',
        'status': 'Delayed',  # Currently delayed
        'current_location': 'Portland, OR'
    }
]

control_tower.ingest_shipments(shipments)

# Generate dashboard
dashboard = control_tower.generate_control_tower_dashboard()

print("=== CONTROL TOWER DASHBOARD ===")
print(f"Timestamp: {dashboard['timestamp']}")
print(f"\nKPIs:")
print(f"  Orders: {dashboard['kpis']['orders']['total']} total, {dashboard['kpis']['orders']['late']} late ({dashboard['performance_summary']['order_on_time']} on-time)")
print(f"  Shipments: {dashboard['kpis']['shipments']['delivered']} delivered, {dashboard['kpis']['shipments']['late_deliveries']} late ({dashboard['performance_summary']['delivery_on_time']} on-time)")
print(f"  Exceptions: {dashboard['kpis']['exceptions']['open']} open ({dashboard['kpis']['exceptions']['high_severity']} high severity)")
print(f"  Alerts: {dashboard['alerts']['new_alerts']} new alerts requiring action")

# Get exceptions
exceptions_dashboard = control_tower.get_exceptions_dashboard()
print(f"\n\nOpen High-Priority Exceptions:")
if not exceptions_dashboard['open_high_priority'].empty:
    print(exceptions_dashboard['open_high_priority'][['exception_id', 'type', 'description', 'severity']])

# Get alerts
alerts = control_tower.get_alerts_requiring_action()
print(f"\n\nAlerts Requiring Action:")
if not alerts.empty:
    print(alerts[['alert_id', 'type', 'severity', 'message']])

ツールとライブラリ

Python ライブラリ

データ処理:

  • pandas:データ操作
  • numpy:数値計算
  • sqlalchemy:データベース接続

リアルタイム処理:

  • kafka-python:Apache Kafka の統合
  • paho-mqtt:MQTT メッセージング
  • redis:リアルタイムデータストア

可視化:

  • dash:インタラクティブなダッシュボード
  • plotly:インタラクティブなチャート
  • streamlit:ダッシュボードアプリ
  • bokeh:リアルタイム可視化

API と統合:

  • requests:HTTP リクエスト
  • fastapi:API 開発
  • flask:Web フレームワーク
商用ソフトウェア

コントロールタワープラットフォーム:

  • Blue Yonder (JDA):Luminate Control Tower
  • Kinaxis:RapidResponse
  • o9 Solutions:Digital brain platform
  • E2open:コントロールタワープラットフォーム
  • SAP:Control Tower を備えた Integrated Business Planning
  • Oracle:Supply Chain Management Cloud

可視化プラットフォーム:

  • FourKites:リアルタイムの可視化
  • project44:輸送の可視化
  • Shippeo:サプライチェーンの可視化
  • ClearMetal:予測型ロジスティクス
  • Descartes MacroPoint:積荷の追跡

統合と IoT:

  • MuleSoft:API 統合
  • Boomi:統合プラットフォーム
  • PTC ThingWorx:IoT プラットフォーム
  • AWS IoT:IoT サービス

よくある課題と解決策

課題:データ統合の複雑さ

問題:

  • 複数の異なるシステム
  • データ形式や標準の違い
  • リアルタイムデータとバッチデータ
  • データ品質の問題

解決策:

  • 段階的な統合アプローチ(重要なシステムから開始)
  • マスターデータ管理(MDM)
  • API ファーストのアーキテクチャ
  • データ品質ルールと検証
  • ミドルウェア/統合プラットフォーム
  • 標準化されたデータモデル
課題:組織のサイロ化

問題:

  • 一元管理への抵抗
  • 優先事項の競合
  • 協働する文化の欠如
  • 所有者が不明確

解決策:

  • 経営幹部の支援とガバナンス
  • 部門横断型のチーム構成
  • 明確な役割と責任(RACI)
  • 共通の KPI とインセンティブ
  • 変更管理プログラム
  • 価値を示すための短期的な成果
課題:アラート疲れ

問題:

  • アラートが多すぎる
  • 誤検知
  • 重要なシグナルの見落とし
  • 対応力の低下

解決策:

  • インテリジェントなアラートしきい値
  • 異常検知への機械学習の活用
  • アラートの優先順位付けとルーティング
  • エスカレーションルール
  • アラートの集約と抑制
  • 継続的な調整
課題:ROI の正当性の説明

問題:

  • 高額な導入費用
  • 定量化しにくいメリット
  • 投資回収期間が長い
  • 投資案件の競合

解決策:

  • パイロット(限定的な範囲)から開始
  • メリットを定量化(コスト削減、収益保護)
  • 手作業のプロセスと比較
  • 価値を示すケーススタディとリファレンス
  • 段階的な投資アプローチ
  • 成果を追跡して共有
課題:ユーザーの定着

問題:

  • 新しいツールへの抵抗
  • ワークフローの混乱
  • トレーニングの必要性
  • 習慣の変更が必要

解決策:

  • ユーザー中心の設計
  • トレーニングと活用支援
  • 変革推進者
  • 段階的な展開
  • フィードバックに基づく継続的な改善
  • ゲーミフィケーションとインセンティブ
課題:スケーラビリティ

問題:

  • データ量の増加
  • ユーザーとユースケースの増加
  • パフォーマンスの低下
  • インフラストラクチャのコスト

解決策:

  • クラウドベースのアーキテクチャ
  • マイクロサービス設計
  • データのアーカイブと保持ポリシー
  • パフォーマンスの最適化
  • 水平スケーリング
  • コストの監視と最適化

出力形式

コントロールタワーダッシュボード

エグゼクティブサマリー:

  • サプライチェーン全体の健全性スコア
  • 対応が必要な重大アラート
  • 主要なパフォーマンスの傾向
  • 大規模な混乱やリスク

KPI スコアボード:

KPI現在値目標傾向ステータス
注文充足率94.2%96.0%↘ -1.2%⚠ 未達
納期遵守率89.5%92.0%↗ +0.8%⚠ 未達
完全注文率85.3%90.0%→ 0.0%⚠ 未達
注文サイクルタイム4.2 days4.0 days↗ +0.1⚠ 超過
売上高に占めるサプライチェーンコストの割合8.2%8.0%↘ -0.2%✓ 順調

例外サマリー:

カテゴリー未解決重大高中48時間超
注文2338125
出荷1826103
在庫121472
サプライヤー80351
合計616213411

重大アラート:

アラート ID時刻種類説明担当者ステータス
ALT-004208:15出荷遅延コンテナが港で滞留中 — 50件の注文に影響John D.対応中
ALT-004107:30サプライヤーの問題サプライヤー XYZ の生産停止 — 生産能力不足Mary S.新規
ALT-0038昨日在庫切れDC3 で SKU-12345 が在庫切れTom R.解決中

出荷追跡:

出荷 ID出発地目的地ステータス到着予定遅延リスク
SHP-10234ShanghaiLA Port輸送中Jan 28遅延なし✓ 低
SHP-10235MumbaiNY Port遅延Jan 30+3 days⚠ 高
SHP-10236HamburgChicago通関保留TBD+5 days⚠⚠ 重大

サプライヤーのパフォーマンス:

サプライヤー納期遵守率品質リードタイムリスクスコア傾向
サプライヤー A96.2%99.8%12 days低✓ 改善中
サプライヤー B88.5%97.2%18 days中⚠ 悪化中
サプライヤー C92.1%95.5%15 days高→ 安定

確認事項

追加の情報が必要な場合:

  1. コントロールタワーで解決しようとしているビジネス上の課題は何ですか?
  2. 対象とする業務範囲はどこですか?(計画、実行、物流など)
  3. 連携が必要なデータソースは何ですか?(ERP、TMS、WMS、サプライヤーなど)
  4. 監視すべき重要な KPI は何ですか?
  5. ユーザーとステークホルダーは誰ですか?
  6. 現在の可視性と監視の成熟度はどの程度ですか?
  7. どのような技術インフラがありますか?
  8. 予算とスケジュールはどの程度ですか?
  9. 対象は社内のみですか、それとも社外(サプライヤー、顧客)にも広げますか?
  10. 成功の基準は何ですか?

関連スキル

  • track-and-trace:製品と出荷の追跡
  • supplier-collaboration:サプライヤーとの連携とコミュニケーション
  • demand-supply-matching:需要と供給のバランス調整
  • risk-mitigation:混乱の監視と対応
  • network-design:コントロールタワーの対象範囲の最適化
  • inventory-optimization:在庫の可視化と管理
  • route-optimization:輸送の監視
  • demand-forecasting:需要可視化の統合

コメント