Hello everyone. I build AI automations using n8n. This is a portfolio project of mine—created as an assignment for an AI automation course, not as a paid or client project. I tested the entire setup by asking real questions in the chat and have recorded a demo video.
Problem:
Rental listings in Dubai are scattered across various portals. Finding answers to questions like “What is available in Al Furjan?”, “Which property has the lowest rent?”, or “How many listings are there in Marina?” requires a significant amount of manual searching. The objective was to automatically collect and clean these listings, store them in a database, and then enable users to retrieve information by asking questions in plain, natural language.
How it works:
- It periodically runs Apify’s PropertyFinder scraper, retrieving up to 20 rental apartment listings in Dubai each time.
- It waits 60 seconds for the scraper to run, then fetches the resulting dataset.
- An AI agent extracts five specific data points from each listing: title, area, price, contact information, and the listing URL. A Structured Output Parser ensures consistent formatting.
- It stores the listings in Airtable. By matching listing URLs, it performs an “upsert” operation, preventing duplicate entries.
- An MCP server exposes the Airtable data through seven distinct tools.
- An AI assistant (acting as an MCP client) answers natural language queries—such as requests for new listings, searches by area or budget, total counts, breakdowns by area, or the identification of the most affordable listings.
Structure:
Three workflows:
- Workflow 1, Data Collection: Schedule Trigger → Execute an Apify actor via an HTTP Request → Wait → Retrieve the dataset → Clean the data using an AI Agent (with an OpenAI Chat Model and a Structured Output Parser) → Upsert into Airtable.
- Workflow 2, MCP Server: An MCP Server Trigger featuring 7 Airtable tools:
latest_listings,search_listings_by_location,search_listings_by_budget,count_listings,count_listings_by_location,cheapest_listing, andall_listings. - Workflow 3, AI Assistant: Chat Trigger → AI Agent, utilizing an OpenAI Chat Model and an MCP Client. The MCP Client is connected to Workflow 2.
What I learned:
- Instead of having one large tool that returns all listings at once, I created smaller, specialized tools for different types of queries.
- For instance, the
count_listingstool provides only the total number of listings. - When searching by location or budget, the system displays the first five results; the full list is provided only when the user explicitly requests it.
- This approach reduces token usage, lowers costs, and ensures that responses remain concise and clear.
- The agent is instructed to rely exclusively on data retrieved via MCP tools; consequently, if no matches are found, it does not fabricate listings. Instead, it informs the user that nothing was found and asks whether they would like to adjust their budget to broaden the search.
Current limitations:
- It waits for a fixed 60 seconds instead of verifying whether the Apify task has been completed.
- It uses a single search link and retrieves a maximum of 20 listings per run.
- It converts USD to AED using a fixed exchange rate (1 USD = 3.67 AED) specified in the prompt, rather than using real-time, live rates.
- When searching by area or budget, it displays only the first 5 results.
Sanitized JSON for three workflows is available on GitHub; feel free to import and explore them: GitHub - jamilur0101/dubai-real-estate-lead-generation-mcp-assistant: AI-powered Dubai real estate lead generation and MCP assistant using n8n, Apify, Airtable, OpenAI, and MCP for property scraping and natural-language listing queries. · GitHub
A question:
How do you organize tools within an MCP server? Do you prefer having many small, specialized tools, or a smaller number of larger, more comprehensive tools?


