1. 了解 Model Context Protocol (MCP) 伺服器與客戶端 [0]

thumbnail 本節介紹了 Model Context Protocol (MCP) 的基本概念,以及如何建立和使用 MCP 伺服器與客戶端。

1.1. MCP 簡介與運作方式 [0]

  1. MCP 代表 Model Context Protocol,它允許 AI 代理程式輕鬆連接多個工具,而無需為每個工具編寫複雜的程式碼 [0]。
  2. AI 代理程式的組成部分包括: [0]
    1. 大型語言模型 (LLM):用於理解使用者的問題。
    2. MCP 客戶端:使代理程式能夠與 MCP 伺服器互動。
  3. MCP 伺服器的運作流程如下: [0]
    1. 使用者提出問題,例如:「今天德里的天氣如何?」
    2. 問題傳送給 AI 代理程式,代理程式中的 LLM 理解問題。
    3. LLM 透過 MCP 客戶端連接到 MCP 伺服器。
    4. MCP 伺服器進一步連接到外部 API (例如:OpenWeather API),獲取問題的答案。
    5. MCP 伺服器將答案傳回給 AI 代理程式,然後代理程式將答案呈現給使用者。
  4. 本教學將使用 LangGraph 框架來建立 AI 代理程式,並使用 OpenAI 的 LLM [0]。

1.2. 建立單一 MCP 伺服器:天氣預報伺服器 [0]

  1. 首先,我們將建立一個單一的 MCP 伺服器,並將其部署在本地電腦上 [0]。
  2. 為了建立 MCP 伺服器,我們將使用一個公開可用的 GitHub 儲存庫,其中包含許多由社群建立的 MCP 伺服器 [0]。
    1. 這些伺服器可以直接在個人電腦上建置和執行。
    2. 本教學將選擇「OpenWeather」MCP 伺服器來進行建置 [0]。

2. 設定 OpenWeather MCP 伺服器的先決條件 [1]

thumbnail

本節詳細說明了在本地電腦上設定和執行 OpenWeather MCP 伺服器所需的兩個主要先決條件:OpenWeatherMap API 金鑰和 Go 語言環境。

2.1. 取得 OpenWeatherMap API 金鑰 [1]

  1. 為了讓 OpenWeather MCP 伺服器能夠獲取天氣資料,需要一個 OpenWeatherMap API 金鑰 [1]。
  2. 取得 API 金鑰的步驟如下: [1]
    1. 點擊提供的連結,重新導向到 OpenWeatherMap 網站。
    2. 如果尚未註冊,請先註冊並登入。
    3. 登入後,點擊使用者名稱旁邊的箭頭,選擇「我的 API 金鑰」。
    4. 如果是第一次,會看到「建立新的 API 金鑰」選項;輸入名稱並點擊「產生」即可獲得 API 金鑰。
    5. 務必儲存此 API 金鑰,因為在建置伺服器時會用到。

2.2. 安裝 Go 語言環境 [1]

  1. OpenWeather MCP 伺服器需要 Go 語言環境才能運行 [1]。
  2. 安裝 Go 的步驟如下: [2]
    1. 點擊提供的連結,進入 Go 的下載頁面。
    2. 根據作業系統下載對應的安裝程式 (例如:Windows 使用 .exe 檔案)。
    3. 執行下載的 .exe 檔案,並按照指示點擊「下一步」完成安裝。
    4. 安裝完成後,需要將 Go 的執行路徑新增到系統的環境變數中。
      1. 在 Windows 搜尋欄中輸入「env」,選擇「編輯系統環境變數」。
      2. 在「系統變數」中找到「Path」,點擊「編輯」。
      3. 點擊「新增」,然後輸入 Go 安裝目錄下 bin 資料夾的路徑 (例如:C:\Program Files\Go\bin)。
      4. 點擊「確定」儲存變更。
    5. 驗證 Go 是否成功安裝: [3]
      1. 開啟命令提示字元。
      2. 輸入 go version。
      3. 如果成功安裝,將會顯示 Go 的版本資訊。

3. 建置與執行 OpenWeather MCP 伺服器 [3]

thumbnail

本節說明如何將 OpenWeather MCP 伺服器的程式碼複製到本地,並使用 Go 語言環境建置和執行伺服器。

3.1. 複製 MCP 伺服器儲存庫 [3]

  1. 首先,在本地電腦上建立一個工作資料夾 (例如:LangGraph_MCP_Demo) [3]。
  2. 開啟命令提示字元,導航到該資料夾。
  3. 複製 OpenWeather MCP 伺服器的 GitHub 儲存庫: [3]
    1. 複製儲存庫的 URL。
    2. 在命令提示字元中輸入 git clone [儲存庫URL]。
    3. 執行後,儲存庫的內容將會被複製到本地資料夾中。
  4. 進入新複製的儲存庫資料夾 (例如:cd MCP_OpenWeather) [3]。

3.2. 建置 MCP 伺服器 [3]

  1. 在 MCP 伺服器的資料夾中,執行以下命令來建置伺服器: [3]
    • 對於 Linux 或 Mac 系統:go build -o MCP_Weather
    • 對於 Windows 系統:go build -o MCP_Weather.exe
  2. 執行此命令後,會在資料夾中生成一個可執行檔 (例如:MCP_Weather.exe),這是運行伺服器所需的檔案 [3]。

3.3. 設定 API 金鑰檔案 [4]

  1. 為了讓伺服器能夠使用 OpenWeatherMap API 和 OpenAI LLM,需要將它們的 API 金鑰儲存在一個 .env 檔案中 [4]。
  2. 建立一個名為 .env 的檔案,並將其放置在與程式碼檔案相同的資料夾中 [5]。
  3. 在 .env 檔案中,以以下格式儲存 API 金鑰: [5]
    OPENAI_API_KEY="你的 OpenAI API 金鑰" OWM_API_KEY="你的 OpenWeatherMap API 金鑰" 
  4. 這樣,程式碼就能夠從 .env 檔案中載入這些 API 金鑰。

4. 整合 LangGraph 與 MCP 客戶端 [5]

thumbnail

本節介紹如何使用 LangGraph 框架建立 AI 代理程式,並將其與 MCP 伺服器連接,以便代理程式能夠利用伺服器提供的工具。

4.1. 安裝必要的 Python 模組 [5]

  1. 為了運行程式碼,需要安裝以下 Python 模組: [5]
    • python-dotenv:用於從 .env 檔案載入 API 金鑰。
    • langchain-mcp-adapter:用於在 LangChain 或 LangGraph 中使用 MCP 伺服器和客戶端。
    • langgraph:用於建立 AI 代理程式。
    • openai:用於使用 OpenAI 的 LLM。
    • mcp:用於 MCP 伺服器和客戶端功能。
  2. 可以使用 pip install 命令一次性安裝所有這些模組 [5]。

4.2. 程式碼結構與模組導入 [5]

  1. 建立一個 Python 檔案 (例如:1.py),並在其中編寫程式碼 [5]。
  2. 導入以下模組: [5]
    • asyncio:Python 內建的工具包,用於處理非同步操作,讓 Python 在等待 MCP 伺服器回應時可以執行其他任務,避免程式閒置。
    • os 和 load_dotenv:用於從 .env 檔案載入環境變數 (即 API 金鑰)。
    • ChatOpenAI:用於使用 OpenAI 的聊天模型。
    • MCPClient:用於建立 MCP 客戶端。
    • StateGraph 和 MessageState:LangGraph 中的核心組件,用於建立圖形和管理訊息狀態。

4.3. 載入 API 金鑰並建立 MCP 客戶端 [6]

  1. 使用 load_dotenv() 函數載入 .env 檔案中的所有 API 金鑰 [6]。
  2. 建立一個非同步函數 async def remember(),用於載入 API 金鑰並建立 MCP 客戶端 [6]。
  3. 在該函數中,從環境變數中獲取 OpenAI API 金鑰和 OpenWeatherMap API 金鑰 [6]。
  4. 建立 MCP 客戶端,並指定要連接的 MCP 伺服器: [6]
    • client = MCPClient(server_path="[MCP 伺服器可執行檔的路徑]", server_args=["--api-key", open_weather_api_key])
    • server_path:指定 OpenWeather MCP 伺服器可執行檔的完整路徑。
    • server_args:提供 OpenWeatherMap API 金鑰作為伺服器的參數。
    • stdio:表示 MCP 客戶端和 MCP 伺服器之間的通訊將透過標準輸入/輸出進行 [7]。

4.4. 獲取伺服器工具與定義 LLM 模型 [7]

  1. 使用 client.get_tools() 方法獲取 MCP 伺服器提供的所有工具 [7]。
    • 這些工具將以列表的形式返回,表示伺服器可以執行的功能。
  2. 定義 OpenAI 的 LLM 模型: [7]
    • model = ChatOpenAI(openai_api_key=openai_api_key)
    • 將之前載入的 OpenAI API 金鑰傳遞給模型。

4.5. 將模型與工具綁定 [7]

  1. 建立一個名為 call_model 的函數,用於將 LLM 模型與 MCP 伺服器的工具綁定 [7]。
  2. 在此函數中,使用 model.bind_tools(tools) 將模型與所有獲取的工具綁定 [7]。
    • 這表示當模型需要使用特定工具來回答問題時,它將能夠存取這些工具。
  3. 函數還會接收使用者和代理程式之間的所有對話訊息,並根據這些訊息生成回應 [7]。
    • 例如,當使用者詢問「今天德里的天氣如何?」時,模型會判斷需要使用天氣工具,並透過綁定的工具來獲取資料。

4.6. 建立 LangGraph 圖形 [8]

  1. 使用 LangGraph 的 StateGraph 建立一個圖形,用於定義 AI 代理程式的工作流程 [8]。
  2. 定義圖形的狀態為 MessageState,用於儲存使用者和代理程式之間的對話訊息 [8]。
  3. 新增兩個節點到圖形中: [8]
    • 「call_model」節點:執行 call_model 函數,處理模型與工具的互動。
    • 「tools」節點:用於處理工具的執行。
  4. 定義圖形的流程: [8]
    • 從「start」節點開始 (LangGraph 內建)。
    • 「start」節點連接到「call_model」節點。
    • 如果「call_model」節點判斷需要使用工具,則會條件性地轉移到「tools」節點。
    • 「tools」節點完成後,控制權會返回到「call_model」節點。
  5. 使用 builder.compile() 編譯圖形,使其可執行 [8]。

5. 執行 MCP 伺服器與 AI 代理程式 [8]

thumbnail

本節說明如何同時運行 MCP 伺服器和 AI 代理程式,並展示代理程式如何透過 MCP 伺服器獲取天氣資料。

5.1. 運行 MCP 伺服器 [8]

  1. 開啟一個新的命令提示字元視窗 [8]。
  2. 導航到 OpenWeather MCP 伺服器可執行檔所在的資料夾 [8]。
  3. 執行以下命令來啟動伺服器:./MCP_Weather.exe (或對應的執行檔名稱) [8]。
  4. 伺服器將會開始運行,並等待客戶端的連接。

5.2. 運行 AI 代理程式並提問 [8]

  1. 開啟另一個新的命令提示字元視窗 [9]。
  2. 導航到包含 Python 程式碼檔案的資料夾 [9]。
  3. 執行 Python 程式碼:python 1.py [9]。
  4. 程式碼中預設的問題是:「What is the weather in Delhi today?」 [9]。
  5. AI 代理程式將會執行以下步驟: [9]
    1. 接收問題。
    2. 透過 MCP 客戶端連接到正在運行的 MCP 伺服器。
    3. MCP 伺服器與 OpenWeather API 互動,獲取天氣資料。
    4. MCP 伺服器將資料傳回給 MCP 客戶端。
    5. OpenAI 的 LLM 處理資料,並在螢幕上顯示天氣預報結果。
  6. 輸出結果將顯示德里當前的天氣狀況和預報 [9]。

5.3. 使用 MCP 伺服器的優勢 [10]

  1. MCP 伺服器的主要優勢在於簡化了 AI 代理程式與多個工具的連接 [10]。
  2. 如果沒有 MCP 伺服器,當需要連接多個不同類型的工具 (例如:金融工具、網路搜尋工具) 時,需要為每個工具編寫大量的獨立程式碼 [10]。
  3. 透過 MCP 伺服器,AI 代理程式只需要連接到 MCP 伺服器,而伺服器則負責處理與各種 API 的互動 [10]。
  4. 這使得 AI 代理程式可以根據使用者的問題,自動判斷並使用正確的 MCP 伺服器來獲取資訊,大大減少了程式碼的複雜性 [10]。

6. 連接多個 MCP 伺服器 [10]

thumbnail

本節展示如何將單一 MCP 客戶端連接到多個 MCP 伺服器,並讓 LLM 根據問題自動選擇合適的伺服器。

6.1. 建立第二個 MCP 伺服器:計算機伺服器 [10]

  1. 我們將建立第二個 MCP 伺服器,一個「計算機」MCP 伺服器,用於執行基本的數學運算 [10]。
  2. 獲取「計算機」MCP 伺服器的步驟如下: [11]
    1. 再次訪問公開可用的 MCP 伺服器 GitHub 儲存庫頁面。
    2. 找到並點擊「Calculator」MCP 伺服器的連結。
    3. 該伺服器可以透過 pip install mcp-calculator 命令安裝。
    4. 運行伺服器的命令是 mcp-calculator。

6.2. 運行兩個 MCP 伺服器 [11]

  1. 保持第一個 OpenWeather MCP 伺服器在一個命令提示字元視窗中運行 [11]。
  2. 開啟第三個命令提示字元視窗 (第二個伺服器專用) [11]。
  3. 在新的命令提示字元中,首先執行 pip install mcp-calculator 安裝計算機伺服器 (如果尚未安裝) [11]。
  4. 然後執行 mcp-calculator 命令來啟動計算機伺服器 [11]。
  5. 現在,兩個 MCP 伺服器 (天氣和計算機) 將同時在本地運行。

6.3. 修改程式碼以連接多個伺服器 [11]

  1. 回到 Python 程式碼檔案,修改 MCP 客戶端的建立部分 [11]。
  2. 為了連接多個伺服器,只需在 MCPClient 的 server_path 參數中,以逗號分隔的方式提供所有伺服器的路徑和參數 [11]。
    • 例如:client = MCPClient(server_path=["[天氣伺服器路徑]", "[計算機伺服器路徑]"], server_args=[["--api-key", open_weather_api_key], []])
    • 每個伺服器路徑對應一個參數列表,如果伺服器不需要額外參數,則提供空列表。
  3. 這樣,單一的 MCP 客戶端就能夠同時連接到多個 MCP 伺服器,而無需編寫額外的複雜程式碼 [11]。
  4. 這種方法的好處是,如果 API 或工具發生變化,無需修改核心程式碼,只需更新伺服器的連接資訊即可 [11]。

6.4. 互動式提問與 LLM 的自動選擇 [11]

  1. 修改程式碼,將手動輸入問題改為透過 while 迴圈接收使用者輸入 [11]。
  2. 運行修改後的 Python 程式碼 [11]。
  3. 程式會提示使用者提問。
  4. 首先,可以詢問代理程式:「What all tools you have?」 [11]
    • 代理程式會回應它有權存取「天氣工具」和「計算機工具」,並解釋它們的功能,這證明它已成功連接到兩個伺服器 [11]。
  5. 接著,可以提出不同類型的問題: [12]
    • 數學問題:「What is 8 + 10?」
    • 天氣問題:「What is the weather in Delhi today?」
  6. LLM 將根據問題的內容,自動判斷應該使用哪個 MCP 伺服器 (計算機或天氣) 來獲取答案,並顯示正確的結果 [12]。
  7. 這展示了 MCP 伺服器和客戶端如何實現 AI 代理程式與多個工具之間的無縫互動和智慧選擇。