ts-travel-mcp-server
Enables Google Gemini to search flights, manage bookings, and interact with the travel booking system through MCP tools.
Click on "Deploy 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., "@ts-travel-mcp-serverSearch for flights from New York to Los Angeles"
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.
Quick Start Guide
New to MCP? Start here! This guide gets you up and running in minutes.
For detailed documentation, see PROJECT_WALKTHROUGH.md.
What We're Building
A complete full-stack travel booking application with:
Backend (MCP Server)
TypeScript MCP server with 8 tools
Mock flight database with real-time state
Booking system with state persistence
Multi-client support (Claude, Codex, Gemini)
Frontend (Web App)
Beautiful React UI with modern design
Flight search interface
Booking management dashboard
Email confirmation preview
Real-time state updates
Fully responsive design
Documentation
Comprehensive guides (see PROJECT_WALKTHROUGH.md)
Setup guides for all AI clients
In-depth code walkthroughs
Architecture explanations
Related MCP server: Agentic MCP Itinerary
Prerequisites
Before you begin, make sure you have:
Node.js (v18 or higher) - Download
npm (comes with Node.js)
Git (optional, for cloning)
Optional but recommended:
An AI client configured (Claude Desktop, Codex CLI, or Gemini CLI)
Basic familiarity with TypeScript/JavaScript
️ Project Structure
travel-mcp-server/
│
├── BACKEND MCP SERVER
│ ├── index.ts # Main MCP server (tool definitions & handlers)
│ ├── database.ts # Business logic & data management
│ ├── package.json # Dependencies & scripts
│ ├── tsconfig.json # TypeScript configuration
│ ├── api-server.js # Standalone API server (optional)
│ │
│ ├── data/ # Mock data files
│ │ ├── flights.json # Flight data
│ │ └── bookings.json # Booking records
│ │
│ └── dist/ # Build output (generated by `npm run build`)
│ ├── index.js # Compiled MCP server (used by AI clients)
│ ├── database.js # Compiled database functions
│ └── data/ # Copied data files
│ ├── flights.json
│ └── bookings.json
│
└── FRONTEND WEB APP
├── src/ # React application
│ ├── App.jsx # Main React component
│ ├── main.jsx # React entry point
│ ├── App.css # Styles
│ ├── FlightSearch.jsx # Search interface
│ ├── FlightList.jsx # Flight display
│ ├── BookingForm.jsx # Booking form
│ ├── BookingsList.jsx # Bookings display
│ └── MockEmailModal.jsx # Email confirmation modal
│
├── index.html # HTML entry point
└── vite.config.js # Vite build configurationGetting Started
Step 1: Install Dependencies
# Navigate to project directory
cd travel-mcp-server
# Install all dependencies
npm installWhat this does: Installs TypeScript, MCP SDK, React, Vite, and all required packages.
Step 2: Build the Backend
# Compile TypeScript to JavaScript
npm run buildWhat this does: Compiles index.ts and database.ts into dist/index.js and dist/database.js that AI clients will use.
Expected output:
✓ Built successfullyStep 3: Choose Your Setup Path
You have three options (choose what fits your needs):
Quick Start: Web App Only
Perfect for learning and demos - no AI client setup needed!
Terminal 1: Start API Server
npm run apiTerminal 2: Start Web App
npm run dev:webOpens at http://localhost:3000 - you're ready to go!
AI Integration: MCP Server Only
Perfect for AI CLI integration:
Configure your AI client (choose one):
Claude Desktop → See PROJECT_WALKTHROUGH.md - Claude Desktop Integration
Gemini CLI → See PROJECT_WALKTHROUGH.md - Google Gemini Integration
Codex CLI → See
temp_docs/CODEX_CONFIG.md
Test it:
Open your AI client
Try: "Search for flights from New York to Los Angeles"
Full Stack: Both Web App + MCP Server
Perfect for complete demonstrations:
Terminal 1: MCP Server
npm startTerminal 2: Web App
npm run dev:webTerminal 3: AI Client
Open Claude Desktop, Codex CLI, or Gemini CLI
Both web UI and AI client see the same data!
Tip: For detailed setup instructions, see PROJECT_WALKTHROUGH.md - Integrating with AI Clients
Understanding the Project
How It Works
┌─────────────┐ stdin ┌───────────────┐
│ AI Client │ ─────────────────────> │ MCP Server │
│ (Claude) │ <───────────────────── │ (index.js) │
└─────────────┘ stdout └───────────────┘
│
▼
┌─────────────┐
│ database.js │
│ (functions) │
└─────────────┘The Flow:
AI client sends request via stdin
MCP server processes request
Calls business logic functions
Returns formatted response via stdout
Learn more: See PROJECT_WALKTHROUGH.md - MCP with Stdio Implementation for detailed explanation
Key Concepts
MCP Tools: 8 tools that AI clients can call (search, book, cancel, etc.)
State Persistence: Bookings and seat availability persist across sessions
Business Logic: All logic in
database.ts, tools inindex.tsMock Data: JSON files in
data/directory
Learn more: See PROJECT_WALKTHROUGH.md - Creating MCP Tools for how tools work
Web App Features
Flight Search
Search flights by departure/arrival cities
Quick demo button for NYC → LAX
Results sorted by price
Real-time availability
Flight Display
Beautiful flight cards with airline branding
Shows airline, times, duration, stops, price
Availability indicator (seats remaining)
Quick "Book Now" button
Booking System
Passenger name & email form
Input validation
Real-time availability update
Instant booking confirmation
Email Confirmations
Mock email preview modal
Shows complete booking details
Professional email template
Dismissable modal
Booking Management
View all bookings in one place
Cancel anytime
Seat automatically released on cancel
Real-time updates across all views
Beautiful Design
Modern gradient headers
Responsive cards
Smooth animations
Color-coded status (confirmed/pending/cancelled)
Mobile-friendly responsive design
State Persistence Demo
This is the key teaching moment - demonstrating real backend state management!
Try This Flow:
1. Search flights
→ FL004 shows 22 seats available
2. Book FL004
→ Backend decreases availability
→ FL004 now has 21 seats
3. Search again
→ FL004 still shows 21 seats
→ Change persisted!
4. Cancel the booking
→ FL004 back to 22 seats
→ Seat released!What This Demonstrates:
Real backend state - Not just frontend state
Mutations and updates - Data actually changes
Data consistency - Same data across all views
Business logic execution - Rules enforced server-side
Learn more: See PROJECT_WALKTHROUGH.md - API Functions and Business Logic to understand how state management works
Next Steps
Learn More
PROJECT_WALKTHROUGH.md - Complete documentation with:
How MCP tools are created
Business logic implementation
Function dependencies
Stdio communication details
Full AI client integration guides
Explore the Code
index.ts- MCP server and tool definitionsdatabase.ts- Business logic and data managementsrc/- React components for the web app
Troubleshooting
Web app won't start?
Check Node.js version:
node --version(need v18+)Delete
node_modulesandpackage-lock.json, thennpm install
MCP server not working?
Check that
dist/index.jsexists afternpm run buildVerify AI client configuration path is absolute
Need help?
Check PROJECT_WALKTHROUGH.md - Troubleshooting section
Review AI client configuration guides in PROJECT_WALKTHROUGH.md
Quick Reference
Task | Command |
Install dependencies |
|
Build backend |
|
Start MCP server |
|
Run web app |
|
View docs |
Ready to dive deeper? → PROJECT_WALKTHROUGH.md has everything you need!
Available Tools
9 toolsbook_flightB
Book a flight for a passenger. Returns booking confirmation with booking ID.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Email address for confirmation | ||
| flightId | Yes | Flight ID to book | |
| passengerName | Yes | Full name of the passenger |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the return value ('booking confirmation with booking ID'), but for a mutation tool it omits critical context such as payment requirements, authentication needs, idempotency, or whether booking is reversible.
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 short sentences, front-loaded with the action and followed by the return value. Every sentence earns its place with no redundancy or filler.
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?
For a simple three-parameter mutation tool, the description covers the core action and return value. However, with no annotations and no output schema, it should mention at least basic prerequisites or side-effect expectations to be fully complete.
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 100%, so the schema already documents all three parameters fully. The description adds no additional parameter meaning, syntax, or constraints beyond what the schema provides, making the baseline of 3 appropriate.
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?
States a specific verb and resource ('Book a flight') and mentions the passenger target, which distinguishes it from search_flights, get_flight_details, and cancel_booking. However, it does not explicitly name alternatives or clarify how it relates to adjacent booking tools like get_booking_details.
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 provides no when-to-use guidance, prerequisites, or alternatives. It does not state that a flight must be found first (e.g., via search_flights) or that a booking ID is required for follow-up operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_bookingA
Cancel a booking and release the seat.
| Name | Required | Description | Default |
|---|---|---|---|
| bookingId | Yes | Booking ID to cancel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses that a seat is released, which is a useful side effect. However, it does not cover permissions required, whether cancellation is reversible, or any rate limits. This is adequate but with clear gaps.
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 that is front-loaded and contains no waste. Every word earns its place.
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?
For a simple one-parameter mutation tool with no output schema and no annotations, the description is minimally adequate. It states the action and one effect but omits important behavioral context such as permissions, irreversibility, and error conditions.
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 100%, so the single parameter bookingId is fully documented in the schema. The description adds no additional parameter meaning. Baseline 3 is appropriate when the schema does the heavy lifting.
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 states a specific verb and resource: 'Cancel a booking'. It also adds the outcome 'release the seat', which clarifies the effect. However, it does not differentiate from the sibling 'remove_booking', which likely serves a similar purpose.
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?
Usage is implied by the name and description, but there is no explicit guidance on when to use this tool versus alternatives like remove_booking. The description provides clear context but no exclusions or routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_booking_detailsC
Get details about a specific booking.
| Name | Required | Description | Default |
|---|---|---|---|
| bookingId | Yes | Booking ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must convey behavioral traits. It doesn't disclose whether the operation is read-only, what error occurs for invalid IDs, or what data is returned. For a retrieval tool, the read-only nature is implied but not stated.
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, concise sentence with no waste. The purpose is front-loaded, though more context could be added without verbosity.
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?
For a one-parameter retrieval tool with no annotations or output schema, the description is minimal. It lacks details on return format, error handling, and differentiation from list_all_bookings.
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 100%, so the schema fully documents the single required bookingId parameter. The description adds no parameter information beyond the schema baseline.
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?
States a clear verb (get) and resource (booking details) for a specific booking. It does not differentiate from list_all_bookings, but the singular 'specific booking' implies a single-record lookup.
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?
No guidance on when to use this versus list_all_bookings or other siblings. The agent must infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cheapest_flightC
Get the cheapest available flight for a specific route.
| Name | Required | Description | Default |
|---|---|---|---|
| arrival | Yes | Arrival city | |
| departure | Yes | Departure city |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not disclose whether the result is always a single flight, what happens when no flights exist, whether dates are considered, or any rate limits. For a query tool with zero annotation coverage, this is a significant gap.
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, efficient sentence with no wasted words. The purpose is front-loaded and immediately 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?
For a tool with no annotations, no output schema, and no behavioral details, the description is insufficient. It should explain return behavior, date handling, or how 'cheapest' is determined, especially given the array of sibling flight tools.
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 100%, with both departure and arrival documented. The description adds no format details or meaning beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.
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?
States a specific verb (get) and resource (cheapest available flight) plus route scope. It distinguishes itself from search_flights by emphasizing cheapest, though it doesn't name the sibling explicitly. Clear but lacks direct sibling differentiation.
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?
No explicit when-to-use or when-not-to-use guidance. The description implies filtering for lowest price but doesn't state when to prefer this over search_flights or other alternatives. No exclusions or conditions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_flight_detailsC
Get detailed information about a specific flight.
| Name | Required | Description | Default |
|---|---|---|---|
| flightId | Yes | Flight ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a read operation via 'Get' but says nothing about what 'detailed information' includes, whether the flight must exist, error behavior for bad IDs, or any auth requirements.
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 front-loaded sentence with zero filler, which is appropriate for a simple lookup tool. It is efficient, though its brevity is partly the source of the guidance and transparency gaps.
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?
For a low-complexity, single-parameter read tool the description is minimally adequate, but with no output schema and no annotations an agent gets no sense of what the returned 'details' contain. It covers the call mechanics but not the value or limits of the result.
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 100%, so the single flightId parameter is documented in the schema, setting the baseline at 3. The description adds no meaning beyond that, but with only one simple required parameter there is little to add.
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?
States a specific verb ('Get detailed information') and resource ('a specific flight'), so the operation is unambiguous. However, it does not distinguish itself from siblings like search_flights or get_cheapest_flight, which also return flight data, leaving the agent to infer the difference.
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?
There is no when-to-use guidance, no mention of prerequisites, and no reference to alternatives such as search_flights for discovery or get_cheapest_flight for price comparison. The agent must guess when this lookup is preferable to its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_all_bookingsB
List all bookings made in the system.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full behavioral burden. Beyond 'list all', it doesn't disclose ordering, pagination, or that it returns every booking with no filtering options. For a 0-param listing tool this is thin.
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?
Single sentence, front-loaded verb+resource, zero waste.
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?
Schema is empty and no output schema, so description should clarify what's returned. It says 'all bookings' but missing return shape and pagination concerns leave an agent guessing about volume.
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?
Zero parameters, so baseline 4 applies. Description correctly conveys no filters are accepted ('all bookings').
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?
States a clear verb (List) and resource (bookings) with scope ('all bookings made in the system'). Distinguishable from sibling get_booking_details which retrieves one booking, but doesn't explicitly contrast with it.
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?
No when-to-use guidance, no alternatives mentioned, no prerequisites. An agent must infer that this is a read-only listing tool with no filters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_bookingA
Remove a cancelled booking from the system. This permanently deletes the booking from the list. Only works for bookings that have been cancelled.
| Name | Required | Description | Default |
|---|---|---|---|
| bookingId | Yes | Booking ID to remove (must be cancelled) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the key trait that the deletion is permanent and that it requires a cancelled booking, but says nothing about permissions, error behavior on non-cancelled bookings, or reversibility guarantees.
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 short sentences, each earning its place: the action, the disambiguation of what 'remove' means (permanent deletion), and the precondition. The critical constraint is front-loaded and there is no filler.
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?
For a single-parameter tool with no output schema, the description covers the action, its irreversible nature, and the precondition. It is nearly complete; only error/failure behavior for non-cancelled bookings is unaddressed.
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 100% and the single parameter is fully documented in the schema, so baseline is 3. The description's 'must be cancelled' constraint only echoes what the schema already states for bookingId, adding no new syntax or format detail.
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?
States a specific verb and resource ('Remove a cancelled booking') and clarifies the effect ('permanently deletes the booking from the list'). It implicitly distinguishes itself from cancel_booking by requiring the booking to already be cancelled, but never names that sibling or the workflow explicitly.
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?
Provides a clear precondition for use ('Only works for bookings that have been cancelled'), which tells the agent when this tool is applicable. It does not state explicit exclusions or name alternatives such as cancel_booking as the preceding step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_flightsC
Search for available flights between two cities. Returns a list of flights sorted by price by default.
| Name | Required | Description | Default |
|---|---|---|---|
| sortBy | No | Sort results by price (default), duration, or number of stops | |
| arrival | Yes | Arrival city (e.g., 'Los Angeles', 'LAX') | |
| departure | Yes | Departure city (e.g., 'New York', 'JFK') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses only the return shape (a list) and default sort; it says nothing about pagination, result limits, auth needs, rate limits, or whether dates are required for a meaningful search.
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 short, front-loaded sentences with no waste. Slightly under-specified rather than padded, so it is efficiently sized.
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?
A simple three-parameter read tool with no output schema, so the description need not explain return values in detail, but it omits any result-shape or pagination detail beyond 'a list', and the lack of date parameters vs. the search intent is left unaddressed.
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 100%, so the schema already documents departure, arrival, and the sortBy enum. The description's mention of 'sorted by price by default' merely restates what the sortBy schema description already says, adding no new parameter meaning.
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?
States a specific verb ('Search') and resource ('flights between two cities'), and adds the default ordering. However, it does nothing to distinguish itself from the sibling get_cheapest_flight, which an agent must disambiguate.
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 gives no when-to-use guidance, no indication of when to prefer get_cheapest_flight or get_flight_details, and no prerequisites (e.g., date parameters are conspicuously absent despite the schema being required to have any).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_confirmation_emailB
Send a booking confirmation email to the passenger (mock implementation).
| Name | Required | Description | Default |
|---|---|---|---|
| bookingId | Yes | Booking ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the '(mock implementation)' trait, signaling no real email is sent, which is real value beyond the schema; however it says nothing about idempotency, behavior on an invalid bookingId, or error/return semantics.
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 short sentence with zero waste; the action and target are front-loaded and the parenthetical mock note is compact. Nothing needs trimming.
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?
For a simple one-parameter tool with no output schema and no annotations, the description covers the essential purpose and the mock nature, but omits error behavior and whether calling it is idempotent or conditional on booking state.
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 single parameter (bookingId) has 100% schema description coverage, so the schema already documents it fully. The description adds no format, source, or validation meaning beyond what the schema provides, so the baseline of 3 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?
The description states a specific verb ('Send') and resource ('booking confirmation email') with the target recipient ('passenger'), which is enough for an agent to identify it accurately. It does not name or contrast itself with any sibling tool, though its purpose is naturally distinct from the booking/flight search siblings.
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?
There is no guidance on when this tool should be invoked, no prerequisite (e.g., must follow a successful book_flight or a confirmed booking), and no exclusions or alternatives mentioned. The agent must infer that it belongs after a booking is created.
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.
9 tool updates
v1.0.0- First observed
book_flight - First observed
cancel_booking - First observed
get_booking_details - First observed
get_cheapest_flight - First observed
get_flight_details - First observed
list_all_bookings - First observed
remove_booking - First observed
search_flights - First observed
send_confirmation_email
TDQS
Scored across 9 tools
Most tools target distinct operations (search, book, cancel, remove, email). However, search_flights and get_cheapest_flight overlap heavily since the latter is essentially a sorted subset of the former, and remove_booking vs cancel_booking could be confused without careful reading. Overall the descriptions help clarify boundaries.
All tool names use consistent snake_case with a verb_noun pattern (search_flights, book_flight, get_booking_details, cancel_booking, remove_booking, send_confirmation_email). No mixed conventions or vague verbs. Very predictable.
9 tools is well-scoped for a flight booking domain. Each tool serves a clear purpose in the search-book-manage lifecycle, with no redundant or filler tools. Count is neither too thin nor bloated.
Core lifecycle is covered: search, cheapest, book, get flight/booking details, list bookings, cancel, remove, and confirm email. Minor gaps include no tool to modify or update an existing booking (e.g. change flight/date) and limited search filtering, but agents can work around these.
Maintenance
Related MCP Connectors
Flight search MCP server providing search, pagination, and itinerary details for AI assistants.
Search and compare flight offers through a cache-aware Streamable HTTP MCP server for AI agents.
Corporate travel booking and expense management for TripGain, exposed as an MCP server.
Skiplagged MCP Server for flight search, hotel booking, and travel planning
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA proof-of-concept MCP server that allows LLM agents to query live flight booking information via Amadeus, including cheapest tickets, destinations, and airline routes.1-
- FlicenseNot gradedqualityDmaintenanceAn MCP server that orchestrates parallel searches for flights, hotels, and activities to generate travel itineraries. It features persistent state management via LangGraph and SQLite while ensuring the total cost remains within a specified budget.-
- FlicenseAqualityDmaintenanceAn AI-powered travel planner MCP server enabling flight and hotel search, weather forecasts, point-of-interest discovery, itinerary generation, and budget management.8-
- FlicenseNot gradedqualityBmaintenanceMulti-domain MCP server enabling AI agents to plan and execute vacation travel and birthday party logistics via local tool pipelines.-