TushP's picture
Upload folder using huggingface_hub
fe94c75 verified
"""
MCP Client for Restaurant Intelligence Agent
This client connects to the MCP server and calls tools via HTTP.
This is the TRUE MCP integration - agent uses this to call tools.
"""
import requests
from typing import Dict, Any, List, Optional
import os
class MCPClient:
"""
Client for calling MCP tools on the server.
Usage:
client = MCPClient("https://your-mcp-server.modal.run")
result = client.call_tool("query_reviews", {
"restaurant_name": "Miku",
"question": "How is the sushi?"
})
"""
def __init__(self, server_url: Optional[str] = None):
"""
Initialize MCP client.
Args:
server_url: URL of the MCP server
"""
self.server_url = server_url or os.getenv(
"MCP_SERVER_URL",
"https://tushar-pingle--restaurant-intelligence-mcp-server.modal.run"
)
self.timeout = 60
def call_tool(self, tool_name: str, arguments: Dict[str, Any] = None) -> Dict[str, Any]:
"""
Call an MCP tool on the server.
Args:
tool_name: Name of the tool to call
arguments: Tool arguments
Returns:
Tool result
"""
arguments = arguments or {}
try:
response = requests.post(
f"{self.server_url}/mcp/call",
json={
"tool_name": tool_name,
"arguments": arguments
},
timeout=self.timeout
)
if response.status_code != 200:
return {
"success": False,
"error": f"MCP call failed: {response.status_code} - {response.text}"
}
return response.json()
except requests.exceptions.Timeout:
return {"success": False, "error": "MCP call timed out"}
except requests.exceptions.ConnectionError:
return {"success": False, "error": "Could not connect to MCP server"}
except Exception as e:
return {"success": False, "error": str(e)}
def list_tools(self) -> List[Dict[str, str]]:
"""Get list of available MCP tools."""
result = self.call_tool("list_tools")
if result.get("success"):
return result.get("result", {}).get("tools", [])
return []
def health_check(self) -> bool:
"""Check if MCP server is healthy."""
try:
response = requests.get(f"{self.server_url}/health", timeout=10)
return response.status_code == 200
except:
return False
# ========================================================================
# Convenience methods for specific tools
# ========================================================================
def index_reviews(self, restaurant_name: str, reviews: List[str]) -> Dict[str, Any]:
"""Index reviews for RAG Q&A."""
return self.call_tool("index_reviews", {
"restaurant_name": restaurant_name,
"reviews": reviews
})
def query_reviews(
self,
restaurant_name: str,
question: str,
top_k: int = 5
) -> Dict[str, Any]:
"""Query reviews using RAG."""
return self.call_tool("query_reviews", {
"restaurant_name": restaurant_name,
"question": question,
"top_k": top_k
})
def save_report(
self,
restaurant_name: str,
report_data: Dict[str, Any],
report_type: str = "analysis"
) -> Dict[str, Any]:
"""Save analysis report."""
return self.call_tool("save_report", {
"restaurant_name": restaurant_name,
"report_data": report_data,
"report_type": report_type
})
def get_report(self, report_id: str) -> Dict[str, Any]:
"""Retrieve saved report."""
return self.call_tool("get_report", {"report_id": report_id})
# Global client instance
_mcp_client: Optional[MCPClient] = None
def get_mcp_client() -> MCPClient:
"""Get or create global MCP client."""
global _mcp_client
if _mcp_client is None:
_mcp_client = MCPClient()
return _mcp_client
# ============================================================================
# Direct functions that use MCP client (for backward compatibility)
# ============================================================================
def index_reviews_mcp(restaurant_name: str, reviews: List[str]) -> str:
"""Index reviews via MCP."""
client = get_mcp_client()
result = client.index_reviews(restaurant_name, reviews)
if result.get("success"):
return result.get("result", {}).get("message", "Indexed successfully")
return f"Error: {result.get('error')}"
def query_reviews_mcp(restaurant_name: str, question: str, top_k: int = 5) -> Dict[str, Any]:
"""Query reviews via MCP."""
client = get_mcp_client()
result = client.query_reviews(restaurant_name, question, top_k)
if result.get("success"):
return result.get("result", {})
return {"error": result.get("error")}
def save_report_mcp(
restaurant_name: str,
report_data: Dict[str, Any],
report_type: str = "analysis"
) -> str:
"""Save report via MCP."""
client = get_mcp_client()
result = client.save_report(restaurant_name, report_data, report_type)
if result.get("success"):
return result.get("result", {}).get("report_id", "saved")
return f"Error: {result.get('error')}"
# ============================================================================
# Test
# ============================================================================
if __name__ == "__main__":
print("Testing MCP Client...")
client = MCPClient()
# Health check
print(f"\n1. Health check: {client.health_check()}")
# List tools
print(f"\n2. Available tools: {client.list_tools()}")
# Test index reviews
print("\n3. Testing index_reviews...")
result = client.index_reviews("Test Restaurant", ["Great food!", "Loved the sushi"])
print(f" Result: {result}")
# Test query reviews
print("\n4. Testing query_reviews...")
result = client.query_reviews("Test Restaurant", "How was the food?")
print(f" Result: {result}")