Process.sequential. LLM: OpenRouter openai/gpt-4.1-mini via CrewAI's LLM class.
search_flight_tool, get_exchange_rate_tool, estimate_destination_costs_tool — are what I built for the squad. Everyone else's part (agent logic, MCP integration into CrewAI, the Gradio UI, overall architecture) is credited to the rest of the team.
departure_token to fetch matching returns.
Process.sequential made tool use consistent — the Planner only ever sees clean, structured data from the two upstream agents, never touching a tool itself.
Retry| Decision | What the naive approach gets wrong | Why this solution is better |
|---|---|---|
| MCP as a separate module | Baking tool logic directly into agent code ties tool dependencies and runtime to the crew process | MCP server kept decoupled so it could be reused by another client or deployed independently as a remote HTTP server later. |
| Sequential over hierarchical process | Hierarchical mode routed tasks through a manager step that didn't reliably invoke MCP tools | Direct sequential process made tool use consistent across every run. |
| USD triangulation for FX | Calling the exchange-rate API once per currency pair burns through a 1,000-request/month free tier fast | One call fetches all ~170 USD-based rates; any pair is computed locally and cached for an hour. |
| Scraping Numbeo instead of its paid API | Numbeo's paid API costs real money for a capstone project with no revenue | A targeted scrape of the public cost-of-living page avoids that cost, accepting the trade-off that the tool depends on Numbeo's HTML structure staying stable. |
| Threading lock around MCP calls | CrewAI 1.10's parallel tool execution raced the stdio transport, corrupting concurrent tool calls | A lock serializes MCP calls, patched at the integration layer rather than waiting on an upstream CrewAI fix. |
| Planner never invents missing data | Silently filling gaps with plausible numbers looks complete but misleads the traveler on real spend | Thin or missing API data is explicitly flagged as an assumption or limitation in the final output instead. |