Skip to main content
Glama
Reese-max

Travel Planning MCP

by Reese-max

Travel Planning MCP

AI-readable and AI-writable travel planning infrastructure built around a canonical trip model, constraint-aware planning, versioned proposals, explicit human approval, and retry-safe writes.

What this project is

Instead of asking an AI to rewrite an itinerary as free-form text, this project gives GPT, Claude, Gemini, Codex, and other agents a structured Travel Planning API + MCP server.

Agents can:

  • discover trips and read a complete trip context;

  • read normalized places, reservations, and constraints;

  • inspect which data providers are live vs demo/estimated;

  • search places and calculate routes through provider ports;

  • propose itinerary changes without directly overwriting the canonical trip;

  • simulate and validate schedule/constraint effects;

  • apply a change only after a separate human/operator approval step;

  • inspect version history and audit events.

Related MCP server: trip-planner-mcp

Core safety invariant

AI agents never receive a raw update_trip_json capability.

Trip vN
  -> AI reads TripContext
  -> AI creates ChangeProposal
  -> system simulates + validates
  -> human/operator approval receipt
  -> apply-time revalidation
  -> Trip vN+1

The MCP tool surface intentionally has no approval tool. Approval is performed through a separate operator-controlled REST endpoint protected by APPROVAL_API_KEY.

Additional protections include:

  • Reservation.fixed === true protection;

  • fixed reservations cannot be reintroduced as new unlocked itinerary items;

  • persistence-level fixed-reservation lock/time invariants;

  • locked itinerary items;

  • hard vs soft constraints;

  • schedule-overlap detection;

  • stale base_trip_version rejection;

  • revalidation at approval and immediately before apply;

  • explicit approval receipts;

  • immutable trip version history;

  • audit events for proposal lifecycle and rollback;

  • admin rollback disabled by default on MCP.

Retry-safe mutation model

REST writes support Idempotency-Key. The in-memory implementation fingerprints the request and stores the first successful response.

  • proposal creation supports an optional idempotency key;

  • apply and rollback require an idempotency key;

  • approval/rejection support idempotent retries when a key is supplied;

  • retrying the same request replays the first result instead of executing twice;

  • reusing a key with a different payload returns a conflict;

  • concurrent same-key requests are serialized inside one process.

A future durable store must enforce (scope, key) uniqueness transactionally across application instances.

Five canonical schemas

The canonical data layer uses JSON Schema Draft 2020-12:

  • Trip

  • Place

  • Reservation

  • Constraint

  • ChangeProposal

See schemas/ and docs/data-model.md.

Provider and persistence ports

The service layer is moving behind provider-independent ports:

TravelStore
  -> MemoryStore today
  -> PostgreSQL / SQLite later

PlaceProvider
  -> DemoPlaceProvider today
  -> Google Places / OSM / tourism data later

RouteProvider
  -> DemoRouteProvider today
  -> Google Routes / TDX / routing engine later

Provider descriptors include a live flag. AI clients can call get_provider_status or GET /v1/providers before treating route/place data as live facts.

Current MCP tools

Read

  • get_provider_status

  • list_trips

  • get_trip

  • get_trip_context

  • get_place

  • get_reservation

  • get_constraints

  • get_trip_audit

  • get_change_proposal

Planning

  • search_places

  • calculate_route

  • create_change_proposal

  • validate_change_proposal

Mutation

  • apply_change_proposal — succeeds only when an external approval receipt already exists

  • rollback_trip — disabled unless ENABLE_ADMIN_MCP_WRITES=true

There is deliberately no MCP approve_change_proposal tool.

REST API

A lightweight Node HTTP API exposes the same canonical service layer.

Current endpoints include:

GET  /health
GET  /v1/providers
GET  /v1/trips
GET  /v1/trips/:tripId
GET  /v1/trips/:tripId/context
GET  /v1/trips/:tripId/constraints
GET  /v1/trips/:tripId/audit
POST /v1/trips/:tripId/proposals
POST /v1/trips/:tripId/rollback

GET  /v1/places/search?q=...
GET  /v1/places/:placeId
GET  /v1/reservations/:reservationId
POST /v1/routes/estimate

GET  /v1/proposals/:proposalId
POST /v1/proposals/:proposalId/validate
POST /v1/proposals/:proposalId/approve
POST /v1/proposals/:proposalId/reject
POST /v1/proposals/:proposalId/apply

The full contract is in openapi/openapi.yaml.

Authentication model

The development server binds to 127.0.0.1 by default.

  • TRAVEL_API_KEY: Bearer credential for travel API access. It becomes mandatory when binding to a non-loopback host.

  • APPROVAL_API_KEY: separate operator credential for approve/reject/apply/rollback REST calls.

  • ENABLE_ADMIN_MCP_WRITES: enables MCP rollback only when explicitly set to true.

Never give APPROVAL_API_KEY to an ordinary AI client. The separation prevents a planner from self-approving its own proposal.

See .env.example and docs/security-model.md.

Architecture

GPT / Claude / Gemini / Codex
            |
        MCP tools
            |
            v
    Canonical service layer  <---->  REST API / approval UI
            |
   +--------+---------+
   |        |         |
TravelStore Planner  Validator
   |        |         |
   +--------+---------+
            |
      Provider Ports
       |          |
 PlaceProvider  RouteProvider
       |          |
   Adapters / external APIs

The canonical layer is provider-independent. Google Maps, TDX, OSM, flight providers, calendar services, and future travel applications should connect through adapters rather than leaking provider-specific payloads into Trip.

Development

Requires Node.js 20+.

npm install
npm run check
npm run build

Run the local MCP stdio server:

npm run dev:mcp

Run the REST API:

cp .env.example .env
npm run dev:api

Environment files are not loaded automatically by the current bootstrap server, so export the values in your shell or process manager when needed.

Example local read:

curl http://127.0.0.1:8787/v1/providers \
  -H "Authorization: Bearer $TRAVEL_API_KEY"

Example operator approval:

curl -X POST http://127.0.0.1:8787/v1/proposals/<proposal-id>/approve \
  -H "Authorization: Bearer $TRAVEL_API_KEY" \
  -H "X-Approval-Key: $APPROVAL_API_KEY" \
  -H "Idempotency-Key: approve-<proposal-id>-v1" \
  -H "Content-Type: application/json" \
  -d '{"actor_id":"human-reviewer","note":"Reviewed itinerary diff"}'

Example retry-safe apply:

curl -X POST http://127.0.0.1:8787/v1/proposals/<proposal-id>/apply \
  -H "Authorization: Bearer $TRAVEL_API_KEY" \
  -H "X-Approval-Key: $APPROVAL_API_KEY" \
  -H "Idempotency-Key: apply-<proposal-id>-v1"

The response includes Idempotent-Replayed: true when an earlier successful result was replayed.

Current limitations

This is still an MVP foundation:

  • persistence and idempotency records are in-memory;

  • place search uses demo data;

  • route calculation is an explicitly labeled estimate, not live routing;

  • no real weather/transit/flight/calendar provider is connected yet;

  • REST auth is bootstrap API-key auth, not user OAuth/ACL;

  • remote Streamable HTTP MCP transport is not yet enabled.

These limitations are deliberate so the canonical model and safety boundary stay stable before provider integrations are added.

Roadmap

See docs/roadmap.md.

The next major steps are a durable TravelStore, real Places + Routes adapters, weather/transit/flight context, and remote MCP transport.

License

MIT

Available Tools

15 tools
apply_change_proposalA

Apply a successfully validated proposal only after an external human-controlled surface has attached an explicit approval receipt. This MCP server cannot approve proposals.

ParametersJSON Schema
NameRequiredDescriptionDefault
proposal_idYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does disclose the approval requirement and the server's inability to approve, but it omits what applying actually does (e.g., side effects, reversibility, return value). For a mutation tool, 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action and the critical precondition. No filler or redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and only one parameter, the description is too thin. It lacks information on what the tool returns, error conditions, and the precise effect of applying a proposal. It also doesn't explicitly direct the agent to validate first, though 'successfully validated' implies it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, and the description does not explain proposal_id at all—no guidance on how to obtain it, what it refers to, or any constraints beyond the schema's format. The description adds no semantic value for the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('apply') on a specific resource ('change proposal') and includes a critical precondition (approval receipt). It distinguishes itself from siblings like validate_change_proposal and create_change_proposal by the action and the approval condition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use this tool ('only after an external human-controlled surface has attached an explicit approval receipt') and clarifies that the server cannot approve, guiding the agent to obtain approval elsewhere. It also implies that validation must have succeeded, effectively routing the agent to validate_change_proposal first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

calculate_routeA

Calculate a route through the configured RouteProvider. Provider metadata/source must be inspected before treating the result as live data.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYes
to_place_idYes
from_place_idYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the disclosure burden. It warns that the result may not be reliable as live data until provider metadata/source is inspected, which is useful. However, it does not mention side effects, errors, latency, or what kind of response is returned, leaving meaningful gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with no filler. The core action is front-loaded first, followed by the critical caveat about provider metadata. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity of three required parameters, the description is reasonably complete, and the freshness caveat is important. However, with no output schema and no annotations, it leaves the result shape, failure modes, and the exact relationship to provider-status checking underspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage and the description adds no parameter-level meaning. It does not explain from_place_id, to_place_id, or mode beyond what their names and the enum already imply. The self-descriptive schema helps, but the description itself does not compensate for the low coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Calculate a route through the configured RouteProvider.' This distinguishes it from sibling tools like list_trips or get_trip that retrieve existing data rather than compute a new route. It does not explicitly contrast with alternatives, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context for using the tool by requiring provider metadata/source inspection before treating results as live data. It does not state exclusions or name alternative tools, but the instruction gives practical guidance on when extra verification is needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_change_proposalA

Create an auditable draft proposal against the current trip version. This does not modify the canonical trip.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNo
titleNo
reasonNo
summaryNo
trip_idYes
actor_idNo
operationsYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral burden. It discloses the key non-destructive behavior ('does not modify the canonical trip') and mentions 'auditable,' implying recording. However, it does not mention potential side effects, prerequisites like a valid trip, or any return value, leaving notable gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler; the core purpose and behavioral caveat are front-loaded. Every word earns its place, making it appropriately concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of 7 parameters and a nested operations schema, the description is too sparse. It omits how to construct operations, what model/reason/summary mean, and what the tool returns. With no output schema or annotations, this leaves critical gaps for correct usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description does not explain any of the 7 parameters. It gives no guidance for constructing the operations array or the meaning of fields like model, actor_id, reason, or summary, leaving the agent without essential information to call the tool correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Create an auditable draft proposal against the current trip version.' It clearly differentiates from siblings like apply_change_proposal by noting that it 'does not modify the canonical trip.' This is a precise, unambiguous purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context by indicating this creates a draft proposal and explicitly states it does not modify the canonical trip, which implies when not to use it. However, it does not explicitly name alternatives like apply_change_proposal or validate_change_proposal, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_change_proposalC

Read one proposal, impact estimate, approval receipt, and validation status.

ParametersJSON Schema
NameRequiredDescriptionDefault
proposal_idYes

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full behavioral burden. It only says 'Read', implying a non-destructive operation, but does not disclose behavior such as error handling, authorization requirements, or whether it returns partial data. The mention of 'impact estimate, approval receipt, and validation status' gives a hint of return fields, but no details on behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that clearly states the primary action ('Read one proposal') and then lists associated data types. It is efficient with no redundancy, though the listed items could be more precise or structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description should explain what is returned, but it only vaguely hints at 'impact estimate, approval receipt, and validation status' without detailing the response structure. It also lacks usage context, prerequisites, or behavior, making it incomplete for an agent to fully understand the tool's functionality.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not add any meaning to the 'proposal_id' parameter beyond what the schema already provides (UUID format and pattern). The description does not explain the parameter's purpose, format, or any constraints, so the agent gains no additional understanding from the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Read' and the resource 'proposal', indicating a read operation. It mentions specific aspects (impact estimate, approval receipt, validation status) that hint at the content, distinguishing it from sibling tools like validate_change_proposal or apply_change_proposal, though it does not explicitly name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives. The description does not mention any prerequisites, contexts, or exclusions, leaving the agent to infer that this is for reading a proposal, but without explicit routing to sibling tools like validate_change_proposal or create_change_proposal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_constraintsA

Read all hard and soft constraints attached to a trip.

ParametersJSON Schema
NameRequiredDescriptionDefault
trip_idYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of indicating side effects. The word 'Read' clearly signals a non-mutating operation, and 'all hard and soft constraints' defines the scope. However, it does not disclose output format, error behavior, or what happens if the trip_id does not exist, so behavioral transparency is only partially addressed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, direct sentence with no filler. It front-loads the action and resource, and every word contributes essential meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple read tool with one parameter and no output schema, so the description is mostly sufficient for an agent to call it correctly. It identifies the resource and action clearly, but it omits any mention of return shape or edge-case behavior. Given the low complexity, this is close to complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema for trip_id provides type, format, and pattern but no description, so schema description coverage is 0%. The description adds some semantic context by linking the trip_id to 'a trip' whose constraints are read, but it does not explicitly explain the parameter's role or behavior for invalid IDs. For a single obvious parameter, this is adequate but minimal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Read') and a specific resource ('all hard and soft constraints attached to a trip'), which clearly distinguishes it from sibling getters like get_trip, get_trip_context, and get_trip_audit. The scope is immediately understandable and not a tautology.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not state when to use this tool versus alternatives such as get_trip_context or get_trip_audit. There is no explicit when-to-use, when-not-to-use, or mention of a better alternative for related needs, leaving the agent to infer the intended use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_placeC

Read one normalized place through the configured PlaceProvider.

ParametersJSON Schema
NameRequiredDescriptionDefault
place_idYes

TDQS

C2.9/5.0
Behavior2/5

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 says 'Read' implying a safe read operation, but it does not disclose what 'normalized' means, whether the place is cached, what happens if the place_id is not found, or any provider-specific behavior. Minimal behavioral context beyond the verb.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, no waste, and the key action and resource are front-loaded. It is appropriately sized for a simple read tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool with one parameter, the description is minimal but lacks any mention of return value, error behavior, or provider-specific nuances. Since there is no output schema and no annotations, the description should provide more context about what 'normalized' means and what the agent can expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does not explain the place_id parameter beyond the schema's uuid format. However, with only one parameter named place_id, the meaning is fairly self-evident. The description adds no semantic detail about the parameter, so a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Read') and resource ('one normalized place') and references the configured PlaceProvider, which distinguishes it from sibling tools like search_places and get_trip. It is clear but does not explicitly differentiate from all siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. It does not mention that search_places is for finding places or that get_trip_context might be relevant. The context is implied by the name and description but not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_provider_statusA

Describe the configured place and route providers so AI clients can distinguish demo estimates from live data.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full behavioral burden. The word 'Describe' clearly implies a read-only informational operation, which is helpful, but the description does not explicitly state that there are no side effects, nor does it describe the output structure or status value semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence with no filler. It front-loads the action and resource, then states the purpose, making it easy for an agent to scan and understand.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter status tool, the description provides enough context to invoke it appropriately: it identifies the resource and the decision it supports. The main gap is the lack of explicit output format, but the tool's simplicity and lack of required inputs keep that gap minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero properties and 100% schema description coverage, so the description does not need to explain parameters. The phrase 'configured' adds a small amount of scope clarification by indicating the tool reports current configuration rather than arbitrary data.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Describe the configured place and route providers.' It also states a clear purpose ('so AI clients can distinguish demo estimates from live data') that makes the tool's role obvious and distinct from the sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The purpose clause gives a clear usage context: use this tool when AI clients need to know whether estimates are demo or live. It does not explicitly list exclusion cases or alternatives, but no sibling appears to provide the same status/configuration role, so the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_reservationB

Read a reservation. Confirmed fixed reservations are protected from direct AI mutation.

ParametersJSON Schema
NameRequiredDescriptionDefault
reservation_idYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It adds a meaningful caveat that confirmed fixed reservations are protected from direct AI mutation, but does not disclose return format, errors, or permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two terse sentences, front-loaded with the core action and followed by a relevant caveat. No filler or redundant restatement of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool this is mostly adequate, but there is no output schema and no description of what the reservation read returns. The protection note is useful, yet the lack of usage guidance and return semantics leaves gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should compensate for parameter meaning, but it does not mention reservation_id at all. The schema itself fully constrains the UUID, yet the description adds no context beyond the property name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads a reservation, which is a specific verb+resource pair. It distinguishes from sibling tools by resource type, though it does not explicitly contrast with get_trip or get_place.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given for when to use this tool versus alternatives like get_trip or get_trip_context. The mutation-protection sentence is a behavioral warning, not usage direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tripA

Read the canonical trip and available version numbers. This tool never mutates trip state.

ParametersJSON Schema
NameRequiredDescriptionDefault
trip_idYes
versionNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and explicitly discloses a key behavioral trait: 'This tool never mutates trip state.' This directly assures the agent of no side effects. It does not cover errors, auth, or rate limits, but the primary read-only behavior is clearly stated, which is strong for a read tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two short, purposeful sentences with zero fluff. It front-loads the action and resource, then adds the critical non-mutation invariant. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and 0% parameter descriptions, this brief description leaves key questions unresolved: the semantics of the optional version parameter, the exact response shape, and how 'available version numbers' are returned. For a simple read tool, some details can be inferred, but the version ambiguity makes it incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It clarifies that trip_id is the identifier for the canonical trip, but the 'version' parameter is unexplained – likely to request a specific version, yet the description mentions 'available version numbers' as output, creating ambiguity about the parameter's role. This leaves a meaningful gap for a tool with only two parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Read'), a precise resource ('canonical trip'), and an output aspect ('available version numbers'), and explicitly distinguishes itself from mutation siblings by asserting non-mutation. This makes it immediately clear what the tool does and how it differs from tools like apply_change_proposal or rollback_trip.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives such as list_trips, get_trip_context, or get_trip_audit. The description only implies that you use it to read the canonical trip, but offers no exclusion criteria or routing to siblings, leaving an agent to infer the appropriate context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_trip_auditA

Read the in-memory audit trail for proposal validation, approval, application, rejection, and rollback events.

ParametersJSON Schema
NameRequiredDescriptionDefault
trip_idYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. 'Read' signals a non-mutating operation and 'in-memory' adds useful ephemerality context. However, it does not disclose error behavior, authorization needs, or whether the audit trail can be empty or cleared, so transparency is partial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. It states the action, the resource, the storage medium, and the relevant event types efficiently, with every element earning its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one self-explanatory required parameter and no output schema, the description provides enough context to infer the tool's purpose and call shape. It lacks explicit return-format or not-found behavior, but these are minor for such a straightforward retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not compensate by explaining that trip_id identifies the trip whose audit trail is returned. The parameter name makes this somewhat inferable, but the description adds no explicit meaning beyond the schema's property definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Read') and a clearly scoped resource ('in-memory audit trail'), and enumerates the event categories covered. It distinguishes itself from sibling read tools like get_trip and get_trip_context, which target current trip state rather than audit history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: call this tool when you need the audit history of proposal lifecycle events for a trip. However, the description does not explicitly state when not to use it or how it compares with alternatives such as get_trip_context, get_change_proposal, or validate_change_proposal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_trip_contextC

Read an AI-friendly aggregate containing the trip plus referenced places, reservations, constraints, and available versions.

ParametersJSON Schema
NameRequiredDescriptionDefault
trip_idYes
versionNo

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose safety and behavioral details. It does not mention whether this is a read-only operation (though 'Read' implies it), or any side effects, limitations, or performance considerations. It does not describe return format or error behavior, which is important for a tool with no output schema. The basic read-only nature is implied but not explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the main action ('Read an AI-friendly aggregate'). It is efficient and to the point, with no redundancy. It could be improved by adding a brief usage note, but it is appropriately succinct.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is moderately complex (aggregate of multiple entity types), yet the description only summarizes the content. There is no output schema to clarify return structure, and the description does not explain the 'version' parameter or any pagination/limits. Given the richness of the aggregate, an agent would need more details to use it correctly, especially regarding the 'version' parameter and what 'AI-friendly' implies.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning the schema provides no descriptions for the parameters. The tool description does not explain either parameter. 'trip_id' is obvious as an identifier but lacks format or usage details. 'version' is undocumented—its meaning (which version of the trip context?) is unclear, and the description does not clarify. With zero schema coverage and no explanation in the description, this is a significant gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it reads a trip aggregate including places, reservations, constraints, and versions. It uses a specific verb ('read') and resource ('trip aggregate'), distinguishing it from tools like get_trip, get_place, etc. However, it could be more explicit about how it differs from get_trip, as both seem to fetch trip data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use when you need a comprehensive snapshot of trip context, but does not give explicit when-to-use guidance or contrast with alternatives like get_trip. Sibling tools exist, but the description does not mention them, leaving the agent to infer when this aggregate is preferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tripsA

List canonical trips visible to the configured store. Returns lightweight trip summaries only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that the tool returns lightweight summaries and only canonical trips, but omits details like ordering, pagination, or error behavior. For a simple list operation this is adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with zero fluff. The primary purpose is front-loaded, and the return-type qualifier is included efficiently. Every word contributes to understanding the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains what the tool does and the nature of its output ('lightweight summaries'), but lacks specifics about the return structure (no output schema exists). It also doesn't mention potential volume, sorting, or any operational constraints. For a list tool, this is a moderate gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema trivially covers all inputs. The description correctly avoids repeating parameter info, and the baseline for 0-param tools is 4. No additional parameter semantics are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (list) and resource (canonical trips), with a scope qualifier ('visible to the configured store'). It further differentiates from siblings like get_trip by specifying 'lightweight trip summaries only,' making the tool's purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context (listing all canonical trips for the store) but does not explicitly say when to use this versus other tools like get_trip or search_places. The distinction is implied by the verb 'list' and the lightweight summary note, but no direct alternatives or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rollback_tripD

Administrative rollback. Disabled by default. Operators must explicitly enable admin MCP writes in the server environment.

ParametersJSON Schema
NameRequiredDescriptionDefault
trip_idYes
actor_idNomcp-admin
target_versionYes

TDQS

D1.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions that the tool is an administrative rollback requiring an explicit server-side enable flag, but it does not disclose that this is a mutating operation that likely overwrites trip state, whether it is reversible, whether it requires audit logging, or what side effects it has on the target trip.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, but brevity here is under-specification rather than conciseness. The first sentence, 'Administrative rollback,' contributes little beyond the tool name, while the second sentence provides an environment prerequisite but does not front-load the core purpose or required inputs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a mutating administrative tool with three parameters, no annotations, and no output schema, so the description must explain behavior, prerequisites, and parameter semantics. It only notes that admin MCP writes must be enabled; it omits what rollback does to the trip, how target_version is interpreted, whether the operation is destructive, and what success/failure looks like.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description names none of the three parameters (trip_id, target_version, actor_id). The word 'rollback' weakly implies a target version, but the description does not clarify how target_version is used, what actor_id represents, or what constraints apply to trip_id. The description adds no substantive parameter meaning beyond the schema's raw fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description says 'Administrative rollback,' which largely restates the tool name 'rollback_trip' and adds only the vague modifier 'administrative.' It does not state the resource being rolled back, the action's effect, or how it differs from siblings like apply_change_proposal. This is closer to a tautology than a clear purpose statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says the tool is 'Disabled by default' and that operators must enable admin MCP writes, which is a prerequisite rather than usage guidance. It provides no explicit when-to-use guidance, no exclusions, and no mention of alternatives such as apply_change_proposal or validate_change_proposal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_placesC

Search the configured PlaceProvider. Provider metadata is included so clients can distinguish demo vs live data.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It adds one useful detail—provider metadata lets clients distinguish demo vs live data—but omits read-only status, result shape, pagination, and error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One clean sentence, front-loaded with the verb and resource. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations and no output schema, this description is thin: it doesn't say what a search returns, how matches are ranked, or how limit interacts with provider behavior. The provider-metadata mention is helpful but not sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description never mentions 'query' or 'limit'. It adds no meaning beyond the raw JSON Schema types and defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Search the configured PlaceProvider,' giving a specific verb and resource. It doesn't explicitly contrast with sibling get_place, but the search semantics are immediately clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use search_places versus get_place or get_provider_status, and no alternatives or exclusions are mentioned. 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.

validate_change_proposalA

Simulate and validate a proposal against version conflicts, schedule overlaps, locked/fixed items, and supported constraints.

ParametersJSON Schema
NameRequiredDescriptionDefault
proposal_idYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of disclosing behavior. The verb 'simulate' usefully signals that this is a non-applying validation rather than an actual change, but side effects, return format, and error behavior are not mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, dense sentence that front-loads the action and specific validation targets. Every word contributes purpose and scope; there is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple single-parameter interface and lack of output schema, the description gives the essential call intent but omits what the validation result looks like and whether the proposal must already exist. It is adequate for a basic understanding but not fully complete for autonomous invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. The phrase 'a proposal' identifies proposal_id as the target object to validate, providing minimal semantic grounding. However, no additional meaning is given about the expected proposal state or how the ID relates to the validation process beyond the schema's UUID format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verbs 'Simulate and validate' with a clear resource ('a proposal') and enumerates the exact validation dimensions: version conflicts, schedule overlaps, locked/fixed items, and supported constraints. It clearly distinguishes this tool from sibling operations like create_change_proposal, get_change_proposal, and apply_change_proposal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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 is provided, nor are alternatives named. The words 'simulate and validate' imply this is a pre-apply dry-run, but the intended placement in the workflow is left to the agent to infer.

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.

  1. 15 tool updatesv0.3.0
    • First observedapply_change_proposal
    • First observedcalculate_route
    • First observedcreate_change_proposal
    • First observedget_change_proposal
    • First observedget_constraints
    • First observedget_place
    • First observedget_provider_status
    • First observedget_reservation
    • First observedget_trip
    • First observedget_trip_audit
    • First observedget_trip_context
    • First observedlist_trips
    • First observedrollback_trip
    • First observedsearch_places
    • First observedvalidate_change_proposal

TDQS

B3.2/5.0

Scored across 15 tools

Disambiguation4/5

Most tools cleanly map to distinct resources or actions, and the get_* read tools are generally easy to separate. get_trip_context intentionally overlaps with get_trip/get_place/get_reservation/get_constraints as an aggregate view, but its description clarifies that distinction.

Naming Consistency5/5

Tool names consistently follow a snake_case verb_noun pattern: get_, list_, search_, calculate_, validate_, create_, apply_, rollback_. The change-proposal family is especially predictable because every stage uses the same verb-first structure.

Tool Count5/5

At 15 tools, the set sits comfortably within the ideal range and each tool earns its place: reads, search, route calculation, proposal lifecycle, audit, and admin rollback are all represented. There is no obvious bloat or redundancy.

Completeness4/5

The surface covers trip/place/reservation/constraint reads plus a full validate-create-apply proposal workflow, audit trail, and rollback capability. Minor gaps exist around listing, updating, or deleting change proposals, but the core planning workflow is well supported and the mutation restrictions appear intentional.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers