Kroger MCP
🚀 Kroger MCP 服務器
本項目實現了一個封裝了克羅格(Kroger)API 的模型上下文協議(MCP)服務器。它允許像 Anthropic 的 Claude 這樣的大語言模型(LLM)與克羅格的雜貨服務進行交互,實現產品搜索、店鋪查找和購物車管理等功能。
✨ 主要特性
- OAuth2 認證:處理通用數據的客戶端憑證以及購物車操作的基於用戶的授權。
- 產品搜索:按關鍵詞在特定店鋪位置搜索產品。
- 產品詳情:檢索產品的詳細信息,包括價格、可用性和配送選項。
- 店鋪位置:按郵政編碼查找克羅格店鋪位置。
- 購物車管理:將商品添加到用戶的克羅格購物車(需要用戶授權)。
📦 安裝指南
1. 配置
在運行服務器之前,你需要配置克羅格 API 憑證和 OAuth2 設置。
1.1 API 憑證(客戶端 ID 和密鑰)
- 獲取憑證:在 克羅格開發者門戶 上註冊一個應用程序,以獲取
客戶端 ID和客戶端密鑰。 - 設置憑證:你可以通過以下兩種方式之一設置這些憑證:
config.py(推薦用於本地簡單使用): 打開config.py文件,將KROGER_CLIENT_ID和KROGER_CLIENT_SECRET的佔位符值替換為你實際的憑證。
# config.py
KROGER_CLIENT_ID = "YOUR_ACTUAL_CLIENT_ID"
KROGER_CLIENT_SECRET = "YOUR_ACTUAL_CLIENT_SECRET"
- **環境變量**:如果你更喜歡通過環境變量管理機密信息,可以修改 `auth.py` 腳本,使其也能讀取 `os.environ.get("KROGER_CLIENT_ID")` 和 `os.environ.get("KROGER_CLIENT_SECRET")`。(注意:`tools.py` 和 `server.py` 當前的實現直接使用 `config.py` 中的值)。
1.2 用戶授權(用於購物車操作)
要使用修改用戶購物車的工具(例如 add_to_cart),用戶必須授權該應用程序。此服務器使用 OAuth2 授權碼授予流程。
- 重定向 URI:確保
config.py中的KROGER_REDIRECT_URI與你在克羅格應用程序中註冊的重定向 URI 相匹配。對於本地測試,http://localhost:8080/callback是常見的默認值,但你需要一種方法來捕獲此重定向中的代碼。
# config.py
KROGER_REDIRECT_URI = "http://localhost:8080/callback" # 或你配置的 URI
- 獲取授權碼和刷新令牌:
- 直接運行
auth.py腳本(python auth.py)。 - 它將打印出一個“授權 URL”。將此 URL 複製並粘貼到你的網頁瀏覽器中。
- 使用你的克羅格賬戶登錄並授予訪問權限。
- 你將被重定向到你的
KROGER_REDIRECT_URI。瀏覽器地址欄中的 URL 現在將包含一個授權代碼(例如,http://localhost:8080/callback?code=YOUR_AUTH_CODE&...)。 - 複製此
代碼。 - 在提示時將
代碼粘貼回auth.py腳本中。 - 腳本將用該代碼交換一個訪問令牌和一個 刷新令牌。
- 至關重要的是,安全地存儲顯示的
刷新令牌。
- 直接運行
- 配置刷新令牌:
- 為了在服務器重啟時無需每次都重新認證即可啟用購物車操作,你應該將獲取的
刷新令牌設置在config.py中,或者作為AuthManager可以加載的環境變量。 - 修改
auth.py中的AuthManager.__init__以從config.py或環境中加載此KROGER_USER_REFRESH_TOKEN:
- 為了在服務器重啟時無需每次都重新認證即可啟用購物車操作,你應該將獲取的
# 在 auth.py -> AuthManager.__init__ 中
# self.user_refresh_token = os.environ.get("KROGER_USER_REFRESH_TOKEN")
# 或者
# from config import KROGER_USER_REFRESH_TOKEN # 添加到 config.py
# self.user_refresh_token = KROGER_USER_REFRESH_TOKEN
然後在 config.py 中添加 KROGER_USER_REFRESH_TOKEN = "YOUR_SAVED_REFRESH_TOKEN"。
- 當調用 get_user_token() 時,如果訪問令牌過期或缺失,它將嘗試使用此刷新令牌。
2. 運行服務器
- 安裝依賴項:如果你還沒有安裝所需的 Python 庫,請安裝:
pip install requests mcp
(注意:假設 mcp 庫的名稱如此;如果不同,請進行調整,例如 modelcontextprotocol)。
2. 啟動服務器:
在終端中運行 server.py 腳本:
python server.py
- 服務器操作:
- 服務器使用 標準輸入輸出(STDIO) 與 MCP 客戶端進行通信。它不會打開任何網絡端口。
- 啟動後,它將打印初始化消息,包括已註冊工具的列表。
- 然後它將監聽來自 MCP 客戶端的 JSON-RPC 請求。
- 停止服務器:
在運行服務器的終端中按
Ctrl+C。
💻 使用示例
3. MCP 客戶端集成
3.1 Claude 桌面版
- 打開 Claude 桌面版的
設置。 - 導航到
集成(或類似的 MCP 服務器部分)。 - 點擊
添加 MCP 服務器(或等效操作)。 - 提供運行服務器的命令。通常需要指定 Python 解釋器和
server.py的路徑。例如:- 如果 Python 在你的系統路徑中:
python /path/to/your/project/server.py - 否則:
/path/to/your/python /path/to/your/project/server.py
- 如果 Python 在你的系統路徑中:
- 添加後,Claude 將能夠查看和調用克羅格工具(例如
find_stores、search_products)。
3.2 編程式使用(示例)
開發者還可以使用 MCP 客戶端庫以編程方式與服務器進行交互。
# 這是一個基於 MCP 規範的概念示例。
# 實際的庫可能會有所不同。
from modelcontext import Client, StdioClientTransport # 假設庫結構
async def main():
client = Client(name="example-kroger-client", version="1.0", capabilities={})
# 如果 python/server.py 不在系統路徑中或需要完整路徑,請調整命令
python_executable = "python" # 或 Python 解釋器的完整路徑
server_script_path = "server.py" # 或 server.py 的完整路徑
transport = StdioClientTransport(command=[python_executable, server_script_path])
await client.connect(transport)
# 示例:查找店鋪
try:
store_results = await client.call_tool(
"find_stores",
{"zip_code": "45202", "limit": 1}
)
print("店鋪搜索結果:", store_results)
if store_results and not store_results.get("error") and len(store_results) > 0:
location_id = store_results[0].get("locationId")
if location_id:
# 示例:搜索產品
product_results = await client.call_tool(
"search_products",
{"query": "milk", "location_id": "01400123", "limit": 2}
)
print("產品搜索結果:", product_results)
# 示例:添加到購物車(需要在服務器中設置用戶認證令牌)
# 確保 product_results[0] 存在且有 'productId'
if product_results and not product_results.get("error") and len(product_results) > 0:
product_id = product_results[0].get("productId")
cart_result = await client.call_tool(
"add_to_cart",
{"product_id": product_id, "quantity": 1, "location_id": location_id}
)
print("添加到購物車結果:", cart_result)
except Exception as e:
print(f"發生錯誤: {e}")
finally:
await client.disconnect()
if __name__ == "__main__":
# 如果你的客戶端庫使用 asyncio
# import asyncio
# asyncio.run(main())
print("如果你的 MCP 客戶端庫需要,請使用 asyncio 事件循環運行異步 main() 函數。")
4. 與大語言模型的示例對話
用戶:“我需要兩加侖有機全脂牛奶和一打雞蛋,從 90210 附近的克羅格店購買。”
大語言模型(助手)內部步驟:
- (可選:如果未提供或不明確,大語言模型詢問用戶的郵政編碼)
- 大語言模型調用
find_stores:{"zip_code": "90210", "limit": 1}- 服務器返回店鋪詳情,例如
[{ "locationId": "01400123", "name": "比佛利山莊克羅格店", ... }]
- 服務器返回店鋪詳情,例如
- 大語言模型調用
search_products(搜索牛奶):{"query": "organic whole milk", "location_id": "01400123", "limit": 5}- 服務器返回牛奶產品列表。大語言模型選擇一個,例如
{"productId": "0001111060404", "description": "Simple Truth 有機牛奶...", ...}
- 服務器返回牛奶產品列表。大語言模型選擇一個,例如
- 大語言模型調用
search_products(搜索雞蛋):{"query": "dozen eggs", "location_id": "01400123", "limit": 3}- 服務器返回雞蛋產品列表。大語言模型選擇一個。
- (如果尚未完成,用戶必須完成購物車的授權)
- 大語言模型調用
add_to_cart(添加牛奶):{"product_id": "0001111060404", "quantity": 2, "location_id": "01400123"}- 服務器確認添加。
- 大語言模型調用
add_to_cart(添加雞蛋):{"product_id": "...", "quantity": 1, "location_id": "01400123"}- 服務器確認添加。
大語言模型(助手)回覆用戶:“好的,我找到了比佛利山莊克羅格店。我已經將兩加侖 Simple Truth 有機全脂牛奶和一打雞蛋添加到你的購物車中。還有其他需求嗎?”
📚 詳細文檔
5. 錯誤場景
- 缺少用戶授權:如果你在用戶未授權應用程序的情況下嘗試使用
add_to_cart,該工具將返回錯誤:
{
"error": "需要用戶認證。",
"message": "未找到用戶訪問令牌。用戶需要授權該應用程序...",
"action_needed": "用戶必須完成 OAuth2 授權流程。"
}
大語言模型應引導用戶執行授權步驟(見第 1.2 節)。錯誤消息中可能會包含授權 URL。
- 無效/過期的令牌:如果訪問令牌過期,
AuthManager將嘗試刷新它。如果刷新令牌也無效(例如,在add_to_cart出現 401 錯誤後針對用戶令牌),則需要重新授權。 - API 速率限制:克羅格的 API 有速率限制(例如,見 developer.kroger.com/support/rate-limits/)。如果服務器達到這些限制,API 調用將失敗。服務器將返回來自克羅格的錯誤,通常狀態碼為 HTTP 429。大語言模型應告知用戶稍後再試。
- 其他 API 錯誤:如果克羅格的 API 返回其他錯誤(例如,無效的產品 ID、根據 locationId 未找到店鋪),工具將返回一個包含
error、details、status_code(來自克羅格的 HTTP 狀態)以及可能的raw_response或kroger_error字段的 JSON 字典。
6. 可用工具
服務器向大語言模型公開以下工具:
find_stores(zip_code: str, radius_miles: int = 10, limit: int = 5) -> list | dict- 描述:按郵政編碼查找克羅格店鋪位置(返回帶有 ID 的最近店鋪)。
search_products(query: str, location_id: str, limit: int = 10) -> list | dict- 描述:在給定店鋪按關鍵詞搜索克羅格產品。
get_product(product_id: str, location_id: str) -> dict- 描述:按 ID 獲取產品的詳細信息(價格、尺寸、庫存、配送選項)。
add_to_cart(product_id: str, quantity: int, location_id: str) -> dict- 描述:將產品添加到用戶的克羅格購物車(需要用戶認證)。
(以上描述基於 tools.py 中的 @tool 裝飾器)。

Markdownify MCP
Markdownify是一個多功能文件轉換服務,支持將PDF、圖片、音頻等多種格式及網頁內容轉換為Markdown格式。
TypeScript
33.0K
5分

Baidu Map
已認證
百度地圖MCP Server是國內首個兼容MCP協議的地圖服務,提供地理編碼、路線規劃等10個標準化API接口,支持Python和Typescript快速接入,賦能智能體實現地圖相關功能。
Python
39.8K
4.5分

Firecrawl MCP Server
Firecrawl MCP Server是一個集成Firecrawl網頁抓取能力的模型上下文協議服務器,提供豐富的網頁抓取、搜索和內容提取功能。
TypeScript
132.0K
5分

Sequential Thinking MCP Server
一個基於MCP協議的結構化思維服務器,通過定義思考階段幫助分解複雜問題並生成總結
Python
32.7K
4.5分

Notion Api MCP
已認證
一個基於Python的MCP服務器,通過Notion API提供高級待辦事項管理和內容組織功能,實現AI模型與Notion的無縫集成。
Python
19.3K
4.5分

Magic MCP
Magic Component Platform (MCP) 是一個AI驅動的UI組件生成工具,通過自然語言描述幫助開發者快速創建現代化UI組件,支持多種IDE集成。
JavaScript
20.2K
5分

Edgeone Pages MCP Server
EdgeOne Pages MCP是一個通過MCP協議快速部署HTML內容到EdgeOne Pages並獲取公開URL的服務
TypeScript
25.0K
4.8分

Context7
Context7 MCP是一個為AI編程助手提供即時、版本特定文檔和代碼示例的服務,通過Model Context Protocol直接集成到提示中,解決LLM使用過時信息的問題。
TypeScript
83.0K
4.7分




