|
|
"""MCP Tools Package - Model Context Protocol tools for the agent. |
|
|
|
|
|
Tools: |
|
|
1. retrieve_context_text - Text search via pgvector + places_metadata |
|
|
2. retrieve_similar_visuals - Image search via pgvector + places_metadata |
|
|
3. find_nearby_places - Neo4j spatial search + place details |
|
|
""" |
|
|
|
|
|
from app.mcp.tools.text_tool import ( |
|
|
TextSearchResult, |
|
|
retrieve_context_text, |
|
|
TOOL_DEFINITION as TEXT_TOOL_DEFINITION, |
|
|
) |
|
|
from app.mcp.tools.visual_tool import ( |
|
|
ImageSearchResult, |
|
|
retrieve_similar_visuals, |
|
|
search_by_image_url, |
|
|
search_by_image_bytes, |
|
|
TOOL_DEFINITION as VISUAL_TOOL_DEFINITION, |
|
|
) |
|
|
from app.mcp.tools.graph_tool import ( |
|
|
PlaceResult, |
|
|
PlaceDetails, |
|
|
NearbyPlace, |
|
|
Review, |
|
|
AVAILABLE_CATEGORIES, |
|
|
find_nearby_places, |
|
|
get_place_details, |
|
|
get_nearby_by_relationship, |
|
|
get_same_category_places, |
|
|
get_location_coordinates, |
|
|
TOOL_DEFINITION as GRAPH_TOOL_DEFINITION, |
|
|
) |
|
|
from app.mcp.tools.social_tool import ( |
|
|
SocialSearchResult, |
|
|
search_social_media, |
|
|
TOOL_DEFINITION as SOCIAL_TOOL_DEFINITION, |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TOOL_DEFINITIONS = [ |
|
|
TEXT_TOOL_DEFINITION, |
|
|
VISUAL_TOOL_DEFINITION, |
|
|
GRAPH_TOOL_DEFINITION, |
|
|
SOCIAL_TOOL_DEFINITION, |
|
|
] |
|
|
|
|
|
|
|
|
class MCPTools: |
|
|
""" |
|
|
MCP Tools container implementing the 3 core tools for MMCA Agent. |
|
|
""" |
|
|
|
|
|
TOOL_DEFINITIONS = TOOL_DEFINITIONS |
|
|
AVAILABLE_CATEGORIES = AVAILABLE_CATEGORIES |
|
|
|
|
|
|
|
|
async def retrieve_context_text(self, db, query, limit=10, threshold=0.3): |
|
|
"""Semantic search in text descriptions.""" |
|
|
return await retrieve_context_text(db, query, limit, threshold) |
|
|
|
|
|
|
|
|
async def retrieve_similar_visuals(self, db, image_url=None, image_bytes=None, limit=10, threshold=0.2): |
|
|
"""Visual similarity search using image embeddings.""" |
|
|
return await retrieve_similar_visuals(db, image_url, image_bytes, limit, threshold) |
|
|
|
|
|
async def search_by_image_url(self, db, image_url, limit=10): |
|
|
"""Search places by image URL.""" |
|
|
return await search_by_image_url(db, image_url, limit) |
|
|
|
|
|
async def search_by_image_bytes(self, db, image_bytes, limit=10): |
|
|
"""Search places by uploading image bytes.""" |
|
|
return await search_by_image_bytes(db, image_bytes, limit) |
|
|
|
|
|
|
|
|
async def find_nearby_places(self, lat, lng, max_distance_km=5.0, category=None, limit=10): |
|
|
"""Find nearby places using Neo4j spatial query.""" |
|
|
return await find_nearby_places(lat, lng, max_distance_km, category, limit) |
|
|
|
|
|
async def get_place_details(self, place_id, include_nearby=True, include_same_category=True, nearby_limit=5): |
|
|
"""Get complete place details with photos, reviews, and relationships.""" |
|
|
return await get_place_details(place_id, include_nearby, include_same_category, nearby_limit) |
|
|
|
|
|
async def get_same_category_places(self, place_id, limit=5): |
|
|
"""Get other places in the same category.""" |
|
|
return await get_same_category_places(place_id, limit) |
|
|
|
|
|
async def geocode_location(self, location_name, country="Vietnam"): |
|
|
"""Geocode a location using OpenStreetMap Nominatim.""" |
|
|
return await geocode_location(location_name, country) |
|
|
|
|
|
async def get_location_coordinates(self, location_name): |
|
|
"""Get coordinates for a location (Neo4j + OSM fallback).""" |
|
|
return await get_location_coordinates(location_name) |
|
|
|
|
|
|
|
|
async def search_social_media(self, query: str, limit: int = 10, freshness: str = "pw", platforms: list[str] = None) -> list[SocialSearchResult]: |
|
|
"""Search for social media content (news, trends).""" |
|
|
return await search_social_media(query, limit, freshness, platforms) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mcp_tools = MCPTools() |
|
|
|
|
|
|
|
|
|
|
|
_all_ = [ |
|
|
"MCPTools", |
|
|
"mcp_tools", |
|
|
"TextSearchResult", |
|
|
"ImageSearchResult", |
|
|
"PlaceResult", |
|
|
"PlaceDetails", |
|
|
"NearbyPlace", |
|
|
"Review", |
|
|
"retrieve_context_text", |
|
|
"retrieve_similar_visuals", |
|
|
"find_nearby_places", |
|
|
"get_place_details", |
|
|
"geocode_location", |
|
|
"get_location_coordinates", |
|
|
"TOOL_DEFINITIONS", |
|
|
"AVAILABLE_CATEGORIES", |
|
|
] |
|
|
|