AI Agents7 min read
Building a Romanian Market AI Assistant with Google ADK, Real-Time Search, and MCP Reservation Tools
A multi-agent personal assistant that finds Bucharest restaurants via Google Search grounding and completes reservations on ialoc.ro through a custom MCP server
- Google ADK
- Gemini 2.5 Flash
- MCP
- Google Search
- FastAPI
- WebMCP
- Cloud Run
Ask any general-purpose AI assistant for the best restaurant in Floreasca for a romantic dinner and you get a hallucinated list with wrong opening hours and outdated reviews. The problem isn't the AI — it's the missing real-time context. This assistant solves it with two things: Google Search grounding for live local knowledge, and a direct integration with ialoc.ro (Romania's main reservation platform) for completing actual bookings.
Multi-Agent Architecture
User: "Vreau un restaurant romantic în Floreasca, vineri seara, 2 persoane"
↓
Root Personal Assistant (Gemini 2.5 Flash, ADK)
├── Extracts intent: occasion=romantic, area=Floreasca, date=Friday, guests=2
└── Routes to specialist sub-agents
↓
Restaurant Finder Sub-Agent
├── Google Search Tool (real-time, 2025 reviews)
├── 3 search queries: cuisine+area, ratings+occasion, dietary options
└── Returns: ranked restaurants with address, price, vibe, phone
↓
User confirms restaurant choice
↓
Reservation Sub-Agent
├── make_ialoc_reservation(restaurant_id, date, time, guests, name, phone)
├── Calls ialoc.ro API with extracted parameters
└── Returns: confirmation number or alternative time slotsGoogle Search Grounding in ADK
ADK provides Google Search as a built-in tool. The key is the search strategy — the sub-agent uses structured multi-query search to get current, specific results:
1from google.adk.agents import LlmAgent
2from google.adk.tools import google_search
3
4restaurant_finder = LlmAgent(
5 name="restaurant_finder",
6 model="gemini-2.5-flash",
7 tools=[google_search], # Built-in ADK Google Search tool
8 instruction="""You are a Bucharest restaurant specialist.
9When finding restaurants, always search for:
101. "{cuisine} restaurant {area} Bucharest 2025" — for current options
112. "top rated restaurants {area} București {occasion} reviews" — for quality signals
123. "{dietary_restriction} friendly {area} Bucharest" — if dietary needs mentioned
13
14Evaluate results on: recent reviews (2024-2025), price level, vibe match to occasion.
15Return: restaurant name, address, price range, phone, standout detail, booking link.
16Always cite where you found the information (source URL and date if available).
17""",
18)Custom MCP Tool for ialoc.ro
1from google.adk.tools import FunctionTool
2import httpx
3
4async def make_ialoc_reservation(
5 restaurant_id: str,
6 date: str, # YYYY-MM-DD
7 time: str, # HH:MM (24h)
8 guests: int,
9 name: str,
10 phone: str,
11 notes: str = "",
12) -> dict:
13 """Make a restaurant reservation on ialoc.ro.
14
15 Args:
16 restaurant_id: ialoc.ro restaurant identifier
17 date: Reservation date in YYYY-MM-DD format
18 time: Reservation time in HH:MM format (24-hour)
19 guests: Number of guests
20 name: Guest name for the reservation
21 phone: Contact phone number
22 notes: Optional special requests
23
24 Returns:
25 dict with confirmation_id and status, or available_slots if not available
26 """
27 async with httpx.AsyncClient() as client:
28 response = await client.post(
29 f"https://api.ialoc.ro/v1/reservations",
30 headers={"Authorization": f"Bearer {IALOC_API_KEY}"},
31 json={
32 "restaurant_id": restaurant_id,
33 "date": date,
34 "time": time,
35 "guests": guests,
36 "guest_name": name,
37 "guest_phone": phone,
38 "notes": notes,
39 }
40 )
41
42 data = response.json()
43
44 if response.status_code == 201:
45 return {
46 "status": "confirmed",
47 "confirmation_id": data["reservation_id"],
48 "message": f"Reservation confirmed for {guests} guests on {date} at {time}"
49 }
50 elif response.status_code == 409: # Conflict — slot taken
51 return {
52 "status": "unavailable",
53 "available_slots": data.get("available_times", []),
54 "message": "That time is not available. Here are alternatives:"
55 }
56 else:
57 raise Exception(f"Reservation failed: {data.get('error', 'Unknown error')}")
58
59reservation_tool = FunctionTool(make_ialoc_reservation)WebMCP Frontend — Making ialoc.ro Tools Available to Any AI
Beyond the ADK agent, we also built a React + TypeScript WebMCP app that exposes ialoc.ro as a tool surface accessible from Chrome's native AI context. Any WebMCP-compatible AI agent running in Chrome can invoke reservations without a custom integration:
1// ialoc-mcp/src/tools.ts — registers ialoc.ro as WebMCP tools
2export function registerIalocTools() {
3 navigator.modelContext.registerTool('searchRestaurants', {
4 description: 'Search for restaurants on ialoc.ro',
5 parameters: {
6 area: { type: 'string', description: 'Bucharest neighborhood (e.g., Floreasca, Dorobanți)' },
7 cuisine: { type: 'string', description: 'Cuisine type (e.g., Italian, Romanian, Asian)' },
8 guests: { type: 'number' },
9 },
10 execute: async ({ area, cuisine, guests }) => {
11 const resp = await fetch(`/api/restaurants?area=${area}&cuisine=${cuisine}&guests=${guests}`)
12 return resp.json()
13 }
14 })
15
16 navigator.modelContext.registerTool('makeReservation', {
17 description: 'Make a restaurant reservation on ialoc.ro',
18 parameters: {
19 restaurant_id: { type: 'string' },
20 date: { type: 'string', description: 'YYYY-MM-DD' },
21 time: { type: 'string', description: 'HH:MM' },
22 guests: { type: 'number' },
23 name: { type: 'string' },
24 phone: { type: 'string' },
25 },
26 execute: async (params) => {
27 const resp = await fetch('/api/reservations', { method: 'POST', body: JSON.stringify(params) })
28 return resp.json()
29 }
30 })
31}Preference Dimensions
- Cuisine: Italian, Romanian traditional, Asian, French, fusion, and more
- Budget: buget redus / mediu / fine dining (understood in Romanian naturally)
- Occasion: romantic, business, family, birthday, casual — affects vibe recommendations
- Neighborhood: specific Bucharest areas (Floreasca, Dorobanți, Centru, Titan, etc.)
- Dietary: vegetarian, vegan, gluten-free, halal — triggers dedicated search query
- Google Search grounding (2025 reviews, current hours)
- Real-time
- Sub-agents (finder + reservation)
- 2
- Natural language understood natively
- Romanian
- ialoc.ro tools available to any Chrome AI agent
- WebMCP