Google Flights Policy Recommender (MCP)
The Google Flights Policy Recommender (MCP) server searches Google Flights, evaluates results against corporate travel policies and personal preferences, and guides users through booking — without ever completing a purchase or payment.
Search Flights: Look up flights by origin, destination, dates, cabin class, and number of adults, returning structured options with airline, times, stops, and price.
Check Policy Compliance: Evaluate a specific flight against a travel policy file, returning compliance status, any violations, and whether manager approval is required.
Find Compliant Flights: Combines search and policy evaluation in one step — filters out non-compliant results and returns only policy-compliant options sorted by price, with a summary of rejected flights and reasons.
Rank by Preferences: Sort results based on personal preferences such as cheapest, fastest, nonstop, airline alliance, or red-eye avoidance.
Start Booking: Re-validates a chosen flight against policy, then navigates Google Flights through fare selection and auto-fills traveler details (name, email, phone, passport info, frequent flyer number, etc.). Always stops before any payment field or purchase button, handing control back to the user. Refuses to proceed with out-of-policy flights unless explicitly acknowledged.
Close Browser: Ends the Playwright browser session when the booking workflow is complete.
Searches Google Flights, labels results as in-policy or out-of-policy against a travel policy file, and ranks them by preferences (nonstop, alliance, red-eye avoidance, cheapest/fastest/balanced). Provides a Google Flights link to complete booking.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Google Flights Policy Recommender (MCP)Find flights from LAX to ORD on March 15"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Corp Travel MCP
A remote MCP server that searches Google Flights, labels every result in-policy or out-of-policy against a travel policy file, and ranks them by your travel preferences — nonstop, airline alliance, red-eye avoidance, cheapest/fastest/balanced. It never visits an airline or OTA site and never attempts to book anything: it hands you a ranked, labeled list and a Google Flights link to complete the booking yourself.
Built as a technology demonstration of policy-aware flight recommendations.
This repository is one of three independently deployed MCPs in the
tarun-mcp-suite, alongside
gsuite and
simplefin.
There's also a local, browser-driven server in this repo that can drive a booking up to (but never through) payment — see local-server/README.md.
Connect it to claude.ai
The live deployment:
https://corp-travel-mcp-508362522869.us-central1.run.app/mcpIn claude.ai, go to Settings → Connectors → Add custom connector.
URL: paste the URL above.
Auth: choose OAuth. Leave the Client ID / Client Secret fields blank — this server supports dynamic client registration, so claude.ai registers itself automatically; nothing to fill in by hand.
Save. claude.ai will prompt you to connect — sign in with your
@routespring.com(or@gallop.ai) Google account. Any other domain is rejected.Try asking it to find a flight (see docs/examples.md).
Running your own separate deployment instead? See
docs/advanced-build.md for deploying it (Docker,
Fly.io/Render/Cloud Run) and setting up your own Google OAuth client — or
use the simpler username/password (Basic Auth) option claude.ai also offers,
where the password is the deployment's MCP_BEARER_TOKEN.
Related MCP server: fli
Change the default policy & config
Two files drive every recommendation: policy (hard/soft rules — fare caps, cabin class, blocked airlines) and preferences (personal taste — nonstop, alliance, cheapest vs. fastest). Full schema for both: docs/advanced-usage.md.
Change the deployment's default — edit
policy.json/user_preferences.jsonand redeploy, or set thePOLICY_JSON/PREFERENCES_JSONenv vars directly (no rebuild needed). This changes results for everyone using that deployment — see docs/advanced-build.md for exact commands.Use your own policy without changing the shared default — keep a personal
policy.json/user_preferences.jsonand just mention it ("use my policy for this"); the assistant reads it and passes it in for that call only. This is also how multiple colleagues share one deployment with different policies — see docs/advanced-usage.md.
More
docs/examples.md — worked examples: a search, checking the active policy, bringing your own policy, booking.
local-server/README.md — the browser-driven server that can autofill a booking up to payment.
docs/advanced-build.md — deploying, Google OAuth setup, running it locally.
docs/advanced-usage.md — full policy/preferences schema, the multi-colleague pattern, known limitations, safety boundary.
Available Tools
5 toolscheck_policyCheck a flight against a travel policyA
Evaluates a specific flight (by id from the last search_flights call) against a policy JSON file and returns compliance, violations, and whether it needs approval.
| Name | Required | Description | Default |
|---|---|---|---|
| flightId | Yes | A flight id returned by search_flights | |
| policyPath | No | Path to the policy JSON file | ./policy.json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully convey behavior. It states what the tool returns but does not specify side effects (likely none), permissions, or rate limits. It adds some behavioral context beyond schema but could be more explicit about non-modification.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, well-structured sentence that front-loads the key purpose and outputs. No redundancy or unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately lists the main return values (compliance, violations, approval). It does not detail error conditions or return format, but it covers the essential outputs for an intermediate-complexity tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description adds value by clarifying that flightId must come from the last search_flights call. The default policyPath is also noted in the schema, but the description reinforces it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it evaluates a specific flight from search_flights against a policy, returning compliance/violations/approval status. It distinguishes itself from find_compliant_flights and other siblings by focusing on a single flight vs. policy compliance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly ties the flight ID to the last search_flights call, giving clear context for when to use. It does not provide explicit when-not-to-use or alternatives, but the prerequisite is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_browserClose the browser sessionA
Closes the Playwright browser opened by this server. Call when done with a booking session.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It states the tool closes the browser, which is simple and expected. However, it does not mention error handling if no browser is open, nor any side effects like invalidating handles.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with a brief usage instruction, highly concise and front-loaded with the action. Every word is necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, no output schema, and no annotations, the description covers the basic purpose and usage. However, it lacks details about error states or idempotency, which would be useful for a complete understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters and 100% coverage, so the description does not need to add parameter details. The baseline is 4, and no additional info is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Closes the Playwright browser') and the resource ('opened by this server'). It distinguishes itself from siblings like start_booking by implying it is the teardown step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Call when done with a booking session,' providing clear context. While it doesn't mention when not to use it, the simplicity of the tool makes this sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_compliant_flightsSearch and filter by policy in one stepA
Searches Google Flights and evaluates every result against a policy file, returning only compliant options (plus a summary of how many were rejected and why), sorted by price.
| Name | Required | Description | Default |
|---|---|---|---|
| cabin | No | economy | |
| adults | No | ||
| origin | Yes | Origin city or airport, e.g. 'New York' or 'JFK' | |
| departDate | Yes | Departure date, YYYY-MM-DD | |
| policyPath | No | ./policy.json | |
| returnDate | No | Return date, YYYY-MM-DD. Omit for one-way | |
| destination | Yes | Destination city or airport, e.g. 'Los Angeles' or 'LAX' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description provides good behavioral context: it performs a search, applies policy filtering, and returns a summary. However, it does not disclose potential rate limits, authentication needs, or behavior if the policy file is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single informative sentence that packs key details. It is front-loaded but could be improved with structured bullet points. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and 7 parameters, the description covers core functionality but lacks return value structure details. It mentions a summary of rejections but no specifics. Sibling differentiation is absent, leaving some gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 57% (4 of 7 parameters have descriptions). The description itself does not add significant parameter details beyond the schema, such as mentioning policyPath. Baseline 3 is appropriate as schema does moderate work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches Google Flights, evaluates against a policy file, returns only compliant options with a rejection summary, sorted by price. This specific verb+resource+output distinguishes it from siblings like search_flights.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when policy compliance is needed, but lacks explicit when-to-use or when-not-to-use guidance. Siblings like search_flights and check_policy suggest alternatives, but no comparison is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_flightsSearch Google FlightsA
Searches Google Flights for a route and returns structured flight options (airline, times, stops, price). Does not check policy or book anything.
| Name | Required | Description | Default |
|---|---|---|---|
| cabin | No | economy | |
| adults | No | ||
| origin | Yes | Origin city or airport, e.g. 'New York' or 'JFK' | |
| departDate | Yes | Departure date, YYYY-MM-DD | |
| returnDate | No | Return date, YYYY-MM-DD. Omit for one-way | |
| destination | Yes | Destination city or airport, e.g. 'Los Angeles' or 'LAX' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes basic behavior (search, return options) and limitations (no policy/booking). With no annotations, it should disclose more (e.g., read-only, API dependencies).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, no unnecessary words. Efficient and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Mentions return structure (airline, times, stops, price) since no output schema. Lacks pagination or error details, but adequate for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 67% parameter descriptions. The description adds no extra parameter guidance; it only mentions output fields. Baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it searches Google Flights and returns structured flight options. Distinct from sibling tools like check_policy and start_booking.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says it does not check policy or book anything, clarifying its scope. However, it doesn't explicitly direct to find_compliant_flights for policy-compliant searches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_bookingStart booking a flight (stops before payment)A
Re-validates the chosen flight against policy, then drives Google Flights through fare selection to the airline/OTA site and best-effort fills traveler details. ALWAYS stops before any payment field or purchase button — it never enters payment info or completes a purchase. Returns a report of what was filled, what wasn't, and the URL/screenshot where a human needs to take over. If the flight is out of policy, booking is refused unless acknowledgeOutOfPolicy is explicitly set to true.
| Name | Required | Description | Default |
|---|---|---|---|
| flightId | Yes | A flight id returned by search_flights | |
| traveler | Yes | ||
| fareChoice | No | Which fare tile to pick on the airline's booking-options panel | cheapest |
| policyPath | No | ./policy.json | |
| acknowledgeOutOfPolicy | No | Must be explicitly true to proceed with a flight that fails policy checks |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully covers behavior: it never enters payment info, re-validates policy, best-effort fills details, and returns a report. It also explains the out-of-policy refusal condition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, no wasted words. Each sentence adds critical information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's workflow, return value (report with URL/screenshot), and policy interaction. Without an output schema, it provides sufficient expectations for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds context beyond the schema for key parameters like fareChoice (explains fare tile selection) and acknowledgeOutOfPolicy (explains its role in overriding policy refusal). For traveler and flightId, it supplements the schema by describing their roles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool re-validates the flight, fills traveler details, and stops before payment. This differentiates it from sibling tools like check_policy or search_flights, which handle specific sub-tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (after selecting a flight, before payment) and conditions for refusal (out-of-policy without acknowledgeOutOfPolicy). It does not explicitly mention alternatives but implies that a human must take over after this step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
5 tool updates
v0.1.0- First observed
check_policy - First observed
close_browser - First observed
find_compliant_flights - First observed
search_flights - First observed
start_booking
TDQS
Tools have distinct purposes, but find_compliant_flights and search_flights overlap in functionality; descriptions clarify the difference.
All tool names follow a consistent verb_noun pattern with snake_case, e.g., check_policy, search_flights.
5 tools cover the core workflow (search, filter, check, book, cleanup) without excess or deficiency.
The tool set covers the full booking initiation workflow, but lacks policy management tools (create/edit policy files) which could be added.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Google Flights itineraries with fares, legs, carbon emissions and price history, as JSON.
Personal AI travel agent. Points optimization, live flight/hotel/award search, trip planning.
whentofly: flexible-date economy/business flight search + price-level context for AI agents
Flight Intelligence MCP — search, cheapest dates, multi-city, airline compare via Google Flights
Related MCP Servers
- AlicenseAqualityDmaintenanceIntegrates Google Flights data into AI workflows for natural language flight searches, price comparisons, flexible date searches, and multi-city itinerary planning with support for various cabin classes and passenger types.94MIT
- AlicenseNot gradedqualityCmaintenanceEnables flight search and fare calendar exploration by interacting with Google Flights' API, supporting detailed filters for origin, destination, dates, cabin class, airlines, and more.3,138MIT
- AlicenseAqualityFmaintenanceConnects AI agents to Google Flights data, enabling retrieval of flight information, cheapest options, time-filtered flights, and best recommendations.429MIT
- AlicenseAqualityCmaintenanceSearch Google Flights for one-way, round-trip and multi-city fares, with offline airport lookup and nearby-airport resolution.6MIT
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/tarun101/corp-travel'
If you have feedback or need assistance with the MCP directory API, please join our Discord server