MCP
A hosted MCP server for agents that speak the Model Context Protocol (Claude Code, Cursor, Claude Desktop and others): thirteen tools shaped around the questions dispatch and flight planning ask, over the same data, rules and keys as the REST API.
- URL:
https://api.bravoecho.ai/mcp. Streamable HTTP, stateless: each POST gets one JSON answer; there is no session and no server stream (GET is 405). - Auth: the same organisation key as
/v1, asAuthorization: Bearer $BRAVOECHO_KEY. A missing or invalid key is a 401 withWWW-Authenticate: Bearer. - What counts: each
tools/callthat reaches a tool is one request, like one/v1call, whatever the tool answers, and shows in the console's usage asMCP <tool>. Connecting (initialize),tools/list,pingand notifications are free and never refused for quota; so is a call naming a tool that does not exist. Only the RAIM tools (raim_route_check,raim_predict) and the RAIM part offlight_briefingare counted; the others are beta, recorded and free.flight_briefingcounts one request per part it runs, asPOST /v1/briefingdoes, shown asMCP flight_briefing (raim)and so on. At the monthly cap a RAIM tool call is refused with HTTP 429quota_exceeded, as on/v1. The per-minute rate limit covers every request. - Flight: the route tools (and
flight_briefing) take the whole flight object (see Flight object) exactly asPOST /v1/raim/route,/v1/notams/routeand/v1/weather/routedo, so one object goes to all three unchanged: each uses what it needs, accepts the rest and refuses what the endpoint refuses, with the same error. A waypoint may also give an airport code inidinstead oflatandlon. - Answers: a lead sentence, then compact JSON, typically 1 to 12 KB. For the route tools the lead is the endpoint's
summary, for points a one-line verdict, for airport weather one line per airport; show it to people as it is. Times are UTC. A failure is a tool error (isError: true) whose text is the API's error,{"error": code, "message": text}.
Tools:
raim_route_check: RAIM along a flight.routeas filed orwaypoints,departure,speed_kt,window_minutes(default 60 here: how far the departure may slip each side),step_seconds,profile, and for a route stringcruise_florcruise_alt_m(cruise_fl: 350flies at 10,668 m) andphaseorhal_nm; waypoints carry their level asalt_m,alt_ftorfl, flown in metres, andcodesare accepted and not used. Returns the verdict, the planned flight's outages with time and place, the departure window with its clean and blocked ranges, the fixes with their times and the per-fix window failures. AsPOST /v1/raim/route.flight_briefing: RAIM, NOTAMs, weather and airspace for one flight in one call, asPOST /v1/briefingin its compact form: the same flight object as the route tools,parts(default all four),window_minutes(default 60 here) andprofilefor the RAIM part,alternatesfor the weather part. The lead is the four summaries, RAIM first; then the RAIM dispatch verdict, outages and departure window, the first 30 NOTAMs along the route with their full text and place on the route (notams_omittedcounts the rest;notams_along_routefilters and lists more), the weather hazards and aerodromes, and the airspace entered (the first 25;airspace_along_routelists more). Each part counts as one request of its service; today only the RAIM part is counted.raim_predict: RAIM at 1 to 100 points,window_minutes(default 60) each side of each point's time. A point may give an airport code inidinstead oflatandlon. AsPOST /v1/raim/predict.notams_along_route: NOTAMs along a route string or waypoints, in force betweenfromandto, or fromdepartureto the arrival atspeed_kt, with an optional flight level band (fl_from,fl_to),categoriesandq. Withoutfromandto, waypoint times ordepartureandspeed_ktgive the window. Levels (alt_m,alt_ft,fl,cruise_fl,cruise_alt_m) and RAIM'sphaseandhal_nmare accepted and not used. The lead is the API'ssummary, then what the list shows. Lists 25 by default (limitup to 100): the ones placed on the track and airspace, hazard and runway notices first, in order along the track with placement and chainage, text cut to its start; the counts cover every match. AsPOST /v1/notams/route.notams_search: NOTAMs bylocation,fir,bbox,lat/lon/radius_nm,number,qorcategories, in force betweenfromandtoor the live set, newest first. A search bynumberreturns the whole text. AsGET /v1/notams.weather_along_route: weather along a flight:routeas filed orwaypoints,departure,speed_kt, the cruise level (cruise_florcruise_alt_m) for a route string,alternates, and optionallyhalf_width_nm,pireps,as_of. RAIM'sphaseandhal_nm, at the top level or on waypoints, are accepted and not used. A waypoint may give an airport code inidinstead oflatandlon: it is that aerodrome, and as the first or last point it sits at field elevation when another point has a level. The lead is the API'ssummary; then the hazards that affect the flight with their spans in NM, time and level, the ones in the corridor that are clear and why, the count of unplaced ones, the aerodromes (METAR and TAF text and categories for the time the aircraft is there), pilot reports, the flight as placed, the route's notes and the archive's caveats. Long lists are cut with a count of what was left out. AsPOST /v1/weather/route.weather: METAR and TAF for 1 to 20 airports (ICAO, IATA or FAA codes), the latest or at a time (at: the latest METAR observed at or before it and the TAF in force then). One line per airport, then per airport the decoded METAR and TAF (with its worst group, over its validity or atat) and their text, the codes with nothing found or read as another station, and the archive's caveats. AsGET /v1/weather/metarandGET /v1/weather/taf, in one call and one request.winds_along_route: the wind and temperature at the flight's levels and times (United States, Alaska, Hawaii, the Pacific; FB forecasts): the same flight object,step_nm(default 50 here),tas_ktandas_of. The lead is the API'ssummary; then the totals (average headwind component, strongest wind, ISA deviation, with tas_kt the times), the legs from fix to fix, the samples along the track (up to 60), the forecasts used and the caveats. AsPOST /v1/weather/winds/route.airspace_along_route: the special use airspace, Class B, C and D airspace and TFRs a flight enters (United States): the same flight object as the other route tools,half_width_nm(default 5) andkinds. The lead is the API'ssummary; then the airspaces entered in order along the track with their limits as published and the stretches where the aircraft is inside (NM, times, levels), times of use and, for a TFR, its NOTAM number, rule, effective times and text; the ones near the track with why the flight stays out (clear_by); TFRs with no published shape, each with itsscope(an ARTCC the route passes through, or national); the flight as placed; the sources and caveats. AsPOST /v1/airspace/route.mass_and_balance: weight and centre of gravity at ramp, takeoff, landing and zero fuel from the aircraft data you give, checked against its limits and envelopes. AsPOST /v1/planning/mass-balance, the same request; the lead is its summary.navlog: the legs of a flight with course and heading, true and magnetic, wind, ground speed, time, fuel and ETA, and the fuel plan, from the aircraft performance you give and the winds aloft. AsPOST /v1/planning/navlog, the same request; the lead is its summary.airport: one airport by ICAO, IATA, GPS or local code, with runways and frequencies. AsGET /v1/airports/{code}.resolve_route: the points a route string stands for, with its notes and the AIRAC cycle used. AsGET /v1/routes/resolve.
Claude Code:
claude mcp add --transport http bravoecho https://api.bravoecho.ai/mcp --header "Authorization: Bearer $BRAVOECHO_KEY"
Cursor (~/.cursor/mcp.json) and other clients whose configuration takes a URL and headers:
{
"mcpServers": {
"bravoecho": {
"url": "https://api.bravoecho.ai/mcp",
"headers": { "Authorization": "Bearer <key>" }
}
}
}
Claude Desktop (claude_desktop_config.json), through the mcp-remote bridge (needs Node.js):
{
"mcpServers": {
"bravoecho": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://api.bravoecho.ai/mcp", "--header", "Authorization:${AUTH_HEADER}"],
"env": { "AUTH_HEADER": "Bearer <key>" }
}
}
}
Keep the key in the client's configuration or environment, never in a repository.