Retail Supply Chain Analysis MCP

hybrid server

The server is able to function both locally and remotely, depending on the configuration or use case.

Integrations

  • Used for data visualization of retail supply chain analytics

  • Used for the frontend and API routes of the retail supply chain analysis tool

小売サプライチェーン分析ツール

小売サプライ チェーン データを分析し、在庫の最適化、ベンダー管理、売上予測のための実用的な洞察を提供する AI 搭載ツールです。

特徴

  • 複数の Excel/CSV ファイルをアップロードして分析する
  • 発注書、販売データ、在庫ファイルのサポート
  • ファイルタイプの自動検出
  • 複数のデータソースを組み合わせたクロス分析
  • 詳細な視覚化と指標
  • サプライチェーンの最適化のための実用的な推奨事項

はじめる

  1. リポジトリをクローンする
  2. 依存関係をインストール: npm install
  3. 開発サーバーを起動します: npm run dev
  4. ブラウザでhttp://localhost:3000を開きます。

使用法

  1. 小売データを含む1つ以上のExcel/CSVファイルをアップロードします
  2. 自動的に検出されない場合は、各ファイルに適切なデータタイプを選択します。
  3. 「ファイルを分析」をクリックしてデータを処理します
  4. さまざまなカテゴリ(概要、在庫、ベンダー、売上)にわたる分析情報を表示します
  5. 複合分析と個別のファイルタイプ分析を切り替える

テクノロジー

  • フロントエンドとAPIルート用のNext.js
  • インテリジェントなデータ分析のためのClaude AI
  • データ視覚化のためのChart.js
  • Excelファイル処理用のXLSX

環境変数

次の変数を含む.env.localファイルを作成します。

ANTHROPIC_API_KEY=your_api_key_here

ライセンス

マサチューセッツ工科大学

在庫レポートや売上レポートなどの小売店データをExcelスプレッドシートにアップロードし、AIがまるで小売業者のシニアサプライチェーンエキスパートであるかのように、トレンドや予測、その他のインサイトを分析できるMCPを作成したいと考えています。何かお手伝いできることはありますか?

参考になればとデータの例を挙げておきます。

小売サプライチェーン分析MCP はい、シニアサプライチェーンエキスパートのように小売店のデータを分析するマルチモーダル会話型ペルソナ(MCP)の作成をお手伝いできます。これはAI分析の優れたユースケースです。ハイレベルアプローチ このプロジェクトの構成は以下のとおりです。データのアップロードと処理:在庫、売上、その他の小売データを含むExcelファイルをアップロードするためのインターフェースを作成する。データ分析:データを処理して有益な洞察を抽出する。エキスパートペルソナ:シニアサプライチェーンエキスパートのように洞察を伝えるAIを設計する。可視化:傾向と予測を視覚的に表現する。

実装手順

  1. データアップロードコンポーネント まず、Excel ファイルをアップロードして処理する方法が必要です。

'react' から React をインポートし、{ useState } を 'xlsx' から XLSX としてインポートします。

function RetailDataProcessor({ onDataProcessed }) { const [isProcessing, setIsProcessing] = useState(false); const [dataType, setDataType] = useState('purchase_orders'); const [location, setLocation] = useState('');

const handleFileUpload = async (e) => { const file = e.target.files[0]; setIsProcessing(true);

const reader = new FileReader(); reader.onload = (event) => { try { const data = new Uint8Array(event.target.result); const workbook = XLSX.read(data, { type: 'array' }); // Process the first sheet by default const worksheet = workbook.Sheets[workbook.SheetNames[0]]; const jsonData = XLSX.utils.sheet_to_json(worksheet); // Detect data type based on column headers const detectedType = detectDataType(jsonData); // Process and normalize the data based on type const processedData = { type: detectedType || dataType, location: location, data: normalizeData(jsonData, detectedType || dataType) }; onDataProcessed(processedData); } catch (error) { console.error("Error processing Excel file:", error); } finally { setIsProcessing(false); } }; reader.readAsArrayBuffer(file);

};

// 列ヘッダーに基づいてデータ型を検出します。constdetectDataType = (data) => { if (!data || data.length === 0) return null;

const headers = Object.keys(data[0]); if (headers.includes('PO #') && headers.includes('# Ordered')) { return 'purchase_orders'; } else if (headers.includes('Invoice #') || headers.includes('Sale By')) { return 'sales_data'; } else if (headers.includes('On Hand') || headers.includes('In Stock')) { return 'inventory'; } return null;

};

// タイプに基づいてデータを正規化します。const normalizeData = (data, type) => { switch(type) { case 'purchase_orders': return data.map(item => ({ poNumber: item['PO #'], status: item['ステータス'], vendor: item['ベンダー'], productSku: item['製品 SKU'], productName: item['商品名'], category: item['カテゴリ'], quantityOrdered: item['# Ordered'], quantityReceived: item['# Received'], amountOutstanding: item['# Outstanding'], costPerItem: item['Cost Per Item'], costReceived: item['Cost Received'], costOutstanding: item['Cost Outstanding'], orderedAt: item['Ordered At'], daysOnOrder: item['Days on Order'], eta: item['ETA'] }));

case 'sales_data': // Normalize sales data based on your fourth screenshot return data.map(item => ({ invoiceNumber: item['Invoice #'], saleDate: item['Date'], saleBy: item['Sale By'], product: item['Product Name'], category: item['Category'], quantity: item['Qty'], price: item['Price'], cost: item['Cost'], profit: item['Profit'], location: item['Location'] || location })); default: return data; }

};

return ( データ型: <select value={dataType} onChange={(e) => setDataType(e.target.value)} > 発注書 販売データ 在庫

<div className="form-group"> <label>Store Location:</label> <input type="text" value={location} onChange={(e) => setLocation(e.target.value)} placeholder="Aberdeen, Huron, Luverne, etc." /> </div> </div> <div className="file-upload"> <input type="file" accept=".xlsx,.xls,.csv" onChange={handleFileUpload} disabled={isProcessing} /> {isProcessing && <p>Processing data...</p>} </div> </div>

); }

デフォルトの RetailDataProcessor をエクスポートします。

2. サプライチェーン分析コンポーネント

次に、AI 分析を処理するコンポーネントを作成します。

import React, { useState, useEffect } from 'react'; import { analyzeRetailData } from '../services/aiService'; function SupplyChainAnalysis({ data }) { const [analysis, setAnalysis] = useState(null); const [isAnalyzing, setIsAnalyzing] = useState(false); useEffect(() => { if (data) { performAnalysis(); } }, [data]); const performAnalysis = async () => { setIsAnalyzing(true); try { // This would call your AI service const result = await analyzeRetailData(data); setAnalysis(result); } catch (error) { console.error("Error analyzing data:", error); } finally { setIsAnalyzing(false); } }; return ( <div className="analysis-container"> <h2>Supply Chain Analysis</h2> {isAnalyzing && <p>Analyzing your retail data...</p>} {analysis && ( <div className="analysis-results"> <h3>Key Insights</h3> <div dangerouslySetInnerHTML={{ __html: analysis.insights }} /> <h3>Inventory Recommendations</h3> <div dangerouslySetInnerHTML={{ __html: analysis.inventoryRecommendations }} /> <h3>Sales Trends</h3> <div dangerouslySetInnerHTML={{ __html: analysis.salesTrends }} /> <h3>Forecasts</h3> <div dangerouslySetInnerHTML={{ __html: analysis.forecasts }} /> </div> )} </div> ); } export default SupplyChainAnalysis;

3. AIサービス

それでは、AI と対話するためのサービスを作成しましょう。

// services/aiService.js export async function analyzeRetailData(data) { try { const response = await fetch('/api/analyze-mobile-retail', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ data }), }); if (!response.ok) { throw new Error('Failed to analyze data'); } return await response.json(); } catch (error) { console.error('Error in AI analysis service:', error); throw error; } }

4. バックエンドAPIエンドポイント

バックエンドでは、データを処理して AI と対話するためのエンドポイントが必要になります。

// api/analyze-mobile-retail.js import { OpenAI } from 'openai'; const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); export default async function handler(req, res) { if (req.method !== 'POST') { return res.status(405).json({ error: 'Method not allowed' }); } try { const { data } = req.body; // Create a specialized prompt based on data type let prompt = ''; if (data.type === 'purchase_orders') { prompt = createPurchaseOrderPrompt(data); } else if (data.type === 'sales_data') { prompt = createSalesDataPrompt(data); } else if (data.type === 'inventory') { prompt = createInventoryPrompt(data); } else { prompt = createGeneralPrompt(data); } // Call the AI const completion = await openai.chat.completions.create({ model: "gpt-4-turbo", messages: [ { role: "system", content: "You are a senior supply chain expert with 20+ years of experience in mobile device retail. You analyze data and provide actionable insights with a focus on inventory optimization, vendor management, and sales forecasting for smartphone and mobile accessory retailers." }, { role: "user", content: prompt } ], temperature: 0.2, }); // Process the AI response const analysisText = completion.choices[0].message.content; // Parse the response into structured data const analysisData = parseAnalysisResponse(analysisText, data.type); return res.status(200).json(analysisData); } catch (error) { console.error('Error analyzing mobile retail data:', error); return res.status(500).json({ error: 'Failed to analyze data' }); } } // Create specialized prompts based on data type function createPurchaseOrderPrompt(data) { return ` As a senior supply chain expert for a mobile device retailer, analyze the following purchase order data for ${data.location || 'our stores'}: ${JSON.stringify(data.data, null, 2)} Focus your analysis on: 1. Vendor performance (delivery times, order fulfillment) 2. Product category insights (smartphones, accessories, etc.) 3. Inventory management recommendations 4. Cost optimization opportunities 5. Order cycle time improvements Provide specific actionable recommendations for improving the supply chain. `; } function createSalesDataPrompt(data) { return ` As a senior supply chain expert for a mobile device retailer, analyze the following sales data for ${data.location || 'our stores'}: ${JSON.stringify(data.data, null, 2)} Focus your analysis on: 1. Sales trends by product category and specific models 2. Profitability analysis by product type 3. Seasonal patterns and forecasting 4. Product mix optimization 5. Inventory replenishment recommendations based on sales velocity Provide specific actionable recommendations for improving sales and inventory alignment. `; } function createInventoryPrompt(data) { // Similar structure for inventory data } function createGeneralPrompt(data) { // Fallback for other data types } // Parse the AI response into structured data function parseAnalysisResponse(text, dataType) { // Basic parsing logic - this could be enhanced with more sophisticated parsing const sections = { keyInsights: extractSection(text, "Key Insights"), inventoryAnalysis: extractSection(text, "Inventory Analysis"), inventoryRecommendations: extractSection(text, "Inventory Recommendations"), vendorAnalysis: extractSection(text, "Vendor Analysis"), vendorRecommendations: extractSection(text, "Vendor Recommendations"), salesTrends: extractSection(text, "Sales Trends"), salesForecasts: extractSection(text, "Sales Forecasts") }; // Add placeholder metrics and chart data // In a real implementation, you might extract these from the AI response // or calculate them directly from the data const metrics = { inventoryTurnover: "4.2", fulfillmentRate: "92.5", avgDaysOnOrder: "6.3" }; const charts = { inventoryTurnover: [], categoryPerformance: [], vendorPerformance: [], salesVsPurchases: [] }; return { ...sections, metrics, charts }; } function extractSection(text, sectionName) { const regex = new RegExp(`${sectionName}[:\\s]+(.*?)(?=\\d+\\.\\s+[A-Z]|#|$)`, 's'); const match = text.match(regex); return match ? match[1].trim() : ''; }

5. メインアプリコンポーネント

最後に、すべてをまとめてみましょう。

import React, { useState } from 'react'; import DataUploader from './components/DataUploader'; import SupplyChainAnalysis from './components/SupplyChainAnalysis'; function RetailAnalysisMCP() { const [retailData, setRetailData] = useState(null); const handleDataProcessed = (data) => { setRetailData(data); }; return ( <div className="retail-analysis-app"> <header> <h1>Retail Supply Chain Analysis</h1> <p>Upload your retail data for expert supply chain analysis</p> </header> <main> <DataUploader onDataProcessed={handleDataProcessed} /> {retailData && <SupplyChainAnalysis data={retailData} />} </main> </div> ); } export default RetailAnalysisMCP;

次のステップ

この MCP をさらに強力にするには:

  1. データの例: はい、実際のデータの例を確認することは、分析を微調整し、AI が特定の小売データ形式を適切に解釈できることを確認するのに非常に役立ちます。
  2. データの視覚化: Chart.js や D3.js などのライブラリを使用してチャートやグラフを追加し、傾向や予測を視覚化します。
  3. 会話型インターフェース: ユーザーが分析に関するフォローアップの質問をすることができるチャット インターフェースを追加します。
  4. ドメイン固有のプロンプト: 業界に基づいて、特定のサプライ チェーン用語とフレームワークを使用して AI プロンプトを調整します。
  5. データ前処理: 分析前に、より高度なデータクリーニングと正規化を追加します。

このソリューションをより具体的にお客様のニーズに合わせてカスタマイズできるよう、データの例を共有していただけますか?

はい、ぜひ例を共有したいです。ファイルをアップロードしてご覧いただいてもよろしいでしょうか?

はい、Excelファイルをアップロードしていただければ、レビューさせていただきます。これにより、お客様のデータ構造と小売業の状況に合わせてソリューションをカスタマイズすることができます。ファイルをアップロードしていただければ、以下の作業が可能になります。データの構造と形式を分析する。主要なフィールドと関係性を特定する。必要な前処理手順を提案する。AIプロンプトを調整して、お客様の小売データをより適切に解釈できるようにする。得られたインサイトに適した視覚化を提案する。在庫レポート、売上データ、その他、検証をご希望の小売業向けスプレッドシートなど、サンプルデータをアップロードしてください。実際のデータを拝見し、MCPを最大限効果的に構築するためのより具体的なアドバイスを提供できます。

スクリーンショットを4枚共有します。

1位 - アバディーン郵便局:2位 - ヒューロン郵便局:3位 - ルバーン郵便局:4位 - 2023年7月から2024年2月までの販売データ:

スクリーンショットを共有していただきありがとうございます!これで小売データの構造が分かりました。よりカスタマイズされたMCPソリューションを設計する上で役立ちます。分析させてください。

データ分析

  1. 発注書レポート 最初の 3 つのスクリーンショットは、次のような同様の構造を持つ、さまざまな場所 (アバディーン、ヒューロン、ルバーン) の発注書の詳細を示しています。 主要フィールド: 発注書番号、ステータス、受領場所、ベンダー情報、製品 SKU/ID、製品名、カテゴリ 数量データ: 発注数、受領数、未払い数 財務データ: アイテムあたりのコスト、受領コスト、未払いコスト タイミング情報: コミット日、発注日、発注日数、ETA 追加情報: 発注コメント、受領コメント、注文入力数 これらのレポートは、詳細な調達情報を使用して、モバイル デバイスとアクセサリ (スマートフォン、ケーブル、充電器など) を追跡します。
  2. 販売データ 4 番目のスクリーンショットには、次の販売データが表示されています: 取引の詳細: 請求書番号、受領日、販売元情報 製品情報: さまざまなモバイル デバイスとアクセサリ 価格データ: 複数の価格関連列 場所/店舗情報 データに基づく MCP 設計 データ構造を理解したので、小売サプライ チェーンの MCP に合わせたよりカスタマイズされたアプローチを次に示します:

// components/MobileRetailAnalysis.js import React, { useState, useEffect } from 'react'; import { analyzeRetailData } from '../services/aiService'; import { InventoryTurnoverChart, ProductCategoryChart, VendorPerformanceChart, SalesVsPurchasesChart } from './charts';

function MobileRetailAnalysis({ data }) { const [analysis, setAnalysis] = useState(null); const [isAnalyzing, setIsAnalyzing] = useState(false); const [selectedView, setSelectedView] = useState('overview');

useEffect(() => { if (data) { performAnalysis(); } }, [データ]);

const performAnalysis = async () => { setIsAnalyzing(true); try { const result = await analyzeRetailData(data); setAnalysis(result); } catch (error) { console.error("データの分析エラー:", error); } finally { setIsAnalyzing(false); } };

// 選択に基づいて異なるビューをレンダリングします const renderAnalysisView = () => { if (!analysis) return null;

switch(selectedView) { case 'overview': return ( <div className="analysis-overview"> <h3>Key Insights</h3> <div dangerouslySetInnerHTML={{ __html: analysis.keyInsights }} /> <div className="metrics-summary"> <div className="metric-card"> <h4>Inventory Turnover</h4> <p className="metric-value">{analysis.metrics.inventoryTurnover}</p> </div> <div className="metric-card"> <h4>Order Fulfillment Rate</h4> <p className="metric-value">{analysis.metrics.fulfillmentRate}%</p> </div> <div className="metric-card"> <h4>Average Days on Order</h4> <p className="metric-value">{analysis.metrics.avgDaysOnOrder}</p> </div> </div> </div> ); case 'inventory': return ( <div className="inventory-analysis"> <h3>Inventory Analysis</h3> <div dangerouslySetInnerHTML={{ __html: analysis.inventoryAnalysis }} /> <h4>Top Products by Turnover</h4> <InventoryTurnoverChart data={analysis.charts.inventoryTurnover} /> <h4>Category Performance</h4> <ProductCategoryChart data={analysis.charts.categoryPerformance} /> <h3>Inventory Recommendations</h3> <div dangerouslySetInnerHTML={{ __html: analysis.inventoryRecommendations }} /> </div> ); case 'vendor': return ( <div className="vendor-analysis"> <h3>Vendor Performance</h3> <div dangerouslySetInnerHTML={{ __html: analysis.vendorAnalysis }} /> <h4>Vendor Delivery Performance</h4> <VendorPerformanceChart data={analysis.charts.vendorPerformance} /> <h3>Vendor Recommendations</h3> <div dangerouslySetInnerHTML={{ __html: analysis.vendorRecommendations }} /> </div> ); case 'sales': return ( <div className="sales-analysis"> <h3>Sales Trends</h3> <div dangerouslySetInnerHTML={{ __html: analysis.salesTrends }} /> <h4>Sales vs Purchases</h4> <SalesVsPurchasesChart data={analysis.charts.salesVsPurchases} /> <h3>Sales Forecasts</h3> <div dangerouslySetInnerHTML={{ __html: analysis.salesForecasts }} /> </div> ); default: return null; }

};

return ( モバイル小売サプライチェーン分析 <button className={selectedView === 'overview' ? 'active' : ''} onClick={() => setSelectedView('overview')} > 概要 <button className={selectedView === 'inventory' ? 'active' : ''} onClick={() => setSelectedView('inventory')} > 在庫 <button className={selectedView === 'vendor' ? 'active' : ''} onClick={() => setSelectedView('vendor')} > ベンダー <button className={selectedView === 'sales' ? 'active' : ''} onClick={() => setSelectedView('sales')} > 売上

{isAnalyzing ? ( <div className="loading"> <p>Analyzing your mobile retail data...</p> </div> ) : renderAnalysisView()} </div>

); }

デフォルトの MobileRetailAnalysis をエクスポートします。

次に、モバイル小売データに特化するように AI サービスを更新しましょう。

// services/aiService.js をエクスポートします。async function analyzeRetailData(data) { try { const response = await fetch('/api/analyze-mobile-retail', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ data }), });

if (!response.ok) { throw new Error('Failed to analyze data'); } return await response.json();

} catch (error) { console.error('AI分析サービスでエラーが発生しました:', error); throw error; } }

-
security - not tested
F
license - not found
-
quality - not tested

ユーザーが小売データをアップロードし、トレンドを分析し、在庫を最適化し、AI を活用した洞察を使用して売上を予測し、上級サプライ チェーンの専門家として機能できるようにします。

  1. Features
    1. Getting Started
      1. Usage
        1. Technologies
          1. Environment Variables
            1. License
              1. 2. Supply Chain Analysis Component
              2. 3. AI Service
              3. 4. Backend API Endpoint
              4. 5. Main App Component
            2. Next Steps
              ID: 7eaayourkx