simconnect-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@simconnect-mcpList all L-vars registered by the currently loaded aircraft."
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.
SimConnect MCP Server
An MCP (Model Context Protocol) server that connects AI coding agents to Microsoft Flight Simulator via SimConnect. This server is built for add-on development — full read/write access to SimVars, L-vars, events, calculator code execution, and embedded documentation.
What It Does
Read/write any SimVar — altitude, heading, speed, autopilot settings, engine parameters, and 1,080+ more from a comprehensive built-in catalog, with unit selection and honest failures on a rejected write
Read/write L-vars — aircraft-specific local variables used by add-on developers (Fenix A320, FlyByWire A32NX, PMDG, etc.), including live enumeration of what the loaded aircraft has actually registered
PMDG 777 and 737 NG3 native SDK support — direct access to all aircraft data fields and control events via the PMDG SDK Client Data Areas, plus CDU screen reading with colors/formatting
Trigger events — toggle switches, set autopilot modes, control lights, fire custom MobiFlight events
Execute RPN calculator code — run arbitrary Reverse Polish Notation code directly in the sim
Search and discover variables — searchable catalogs of SimVars, events, and aircraft-specific L-vars with human-readable names and valid values
Facilities lookup — nearby airports sorted by distance and detail lookup for a specific airport, waypoint, NDB or VOR by ICAO identifier, read directly from SimConnect's facility subscription
Flight and scenario tools — load and save
.FLTflights, load a.PLNflight plan, and spawn an AI aircraft or object, for scripting test scenarios instead of setting them up by handEmbedded documentation — SimConnect reference docs served as MCP resources, available offline
Aircraft-specific catalogs — pre-built variable databases with panel groupings, display names, and value descriptions. Ships with 1,607 PMDG 777 variables (777-200LR/200F/300ER/F) and 1,861 PMDG 737 NG3 variables (-600/700/800/900 incl. BBJ/BDSF/BCF).
HubHop integration — search the MobiFlight HubHop community preset database directly as an MCP tool, or use the built-in client to generate and extend L-var catalogs for any supported aircraft
Related MCP server: DCS Lua Runner MCP Server
Prerequisites
Microsoft Flight Simulator (MSFS 2020 or 2024) running on the same machine
uv — provides
uvx, which fetches the server and its Python runtime for youMobiFlight WASM Module (optional, for L-var support) — install in your MSFS Community folder. Download from MobiFlight
Installation
Published on PyPI as simconnect-mcp,
and listed in the MCP Registry as
io.github.robin24/simconnect-mcp.
Once uv is installed, no separate install step is
needed — uvx fetches and runs the server on demand:
uvx simconnect-mcpThat starts the server on stdio, which is what an MCP client does for you. Run it by hand only to check that it starts; press Ctrl+C to stop.
To pin a version, use uvx simconnect-mcp@1.0.1.
From source (for development)
git clone https://github.com/robin24/simconnect-mcp.git
cd simconnect-mcp
# Creates the virtual environment and installs the dev group too
uv syncConfiguring as an MCP Server
Claude Code
Via CLI:
claude mcp add --transport stdio simconnect -- uvx simconnect-mcpOr to make it available across all projects:
claude mcp add --transport stdio --scope user simconnect -- uvx simconnect-mcpVia JSON (~/.claude/settings.json or project-level .claude/settings.json):
{
"mcpServers": {
"simconnect": {
"command": "uvx",
"args": ["simconnect-mcp"]
}
}
}OpenAI Codex CLI
Via CLI:
codex mcp add simconnect -- uvx simconnect-mcpVia JSON:
{
"mcpServers": {
"simconnect": {
"command": "uvx",
"args": ["simconnect-mcp"]
}
}
}Gemini CLI
Via CLI:
gemini mcp add --transport stdio simconnect -- uvx simconnect-mcpVia JSON (~/.gemini/settings.json):
{
"mcpServers": {
"simconnect": {
"command": "uvx",
"args": ["simconnect-mcp"]
}
}
}MCP Inspector (Interactive Testing)
uv run mcp dev src/simconnect_mcp/server.pyNote: To run a local checkout instead of the published package, replace
uvx simconnect-mcpwithuv run --directory /path/to/simconnect-mcp simconnect-mcp, using the absolute path to your clone.
Tools (32)
Every tool is prefixed msfs_, carries explicit readOnlyHint/destructiveHint annotations, and returns a typed result or a structured error — never a fabricated success. The tables below are generated from the live server (name, kind, and title come straight from each tool's ToolAnnotations); descriptions are the one-line summary from the tool's own docstring:
uv run python -c "
import asyncio
from simconnect_mcp.server import mcp
async def m():
for t in sorted(await mcp.list_tools(), key=lambda x: x.name):
kind = 'read' if t.annotations.readOnlyHint else 'write'
print(f'| \`{t.name}\` | {kind} | {t.annotations.title} |')
asyncio.run(m())"Connection (3)
Tool | Kind | Description |
| write | Establish a SimConnect connection to MSFS |
| write | Close the SimConnect connection to MSFS |
| read | Check connection state, whether the sim is running/paused |
SimVar Operations (6)
Tool | Kind | Description |
| read | Read a SimVar value by name, in the requested unit |
| write | Write a value to a settable SimVar — fails honestly rather than reporting success on a rejected write |
| read | Read several SimVars in one call; one failing entry doesn't abort the rest |
| read | Search the SimVar catalog by keyword |
| read | List every SimVar category with its variable count |
| read | Sample a SimVar over time, returning a time series for debugging |
Units: msfs_get_simvar (and msfs_set_simvar) accept an optional unit argument and always report the unit actually used in the result. Omit unit and the bundled SimVar catalog supplies a sensible default for that variable; for a variable the catalog doesn't know, the default is "number".
Event Operations (3)
Tool | Kind | Description |
| write | Fire a SimConnect event, with an optional parameter |
| read | Search SimConnect events by keyword, optionally filtered by category |
| write | Fire a custom event as a key event through the MobiFlight WASM module |
L-Var Operations (6)
Tool | Kind | Description |
| read | Read an L-var (local variable) value from the current aircraft |
| write | Write a value to an L-var on the current aircraft |
| read | Enumerate the L-vars the currently loaded aircraft has registered |
| write | Execute RPN calculator code in the simulator |
| read | Search known aircraft L-vars by keyword across the bundled catalogs |
| read | Browse the aircraft L-var catalogs — list catalogs, the panels in one, or the variables on one panel |
msfs_list_lvars asks the MobiFlight WASM module to enumerate what the aircraft has actually registered, live — but the module caps its reply at 1000 names and still reports the list as complete when it truncates. A busy add-on setup (GSX and similar) can crowd the aircraft's own variables out of the response entirely; watch for truncated: true. Treat the catalogs and the live listing as a starting point, not a guaranteed inventory — msfs_get_lvar reads any name you supply, whether or not it surfaced in either one.
Aircraft State (1)
Tool | Kind | Description |
| read | Read a snapshot of the current aircraft state (position, speed, attitude, and key systems in one call) |
Facilities (2)
Tool | Kind | Description |
| read | List airports near a point, nearest first |
| read | Look up one airport, waypoint, NDB or VOR by ICAO identifier |
Airports are world-wide (SimConnect returns the full 85,249-airport list, cached after the first collection). Waypoints, NDBs and VORs are scoped to wherever the aircraft currently is, so they are re-collected on every call rather than cached — a cached navaid list would keep answering for the aircraft's previous position after a reposition or a flight.
Utilities (2)
Tool | Kind | Description |
| write | Display a text overlay message in the simulator (debug feedback) |
| write | Reposition the aircraft (test scenario setup) |
PMDG 777 / 737 NG3 (3)
Tool | Kind | Description |
| read | Read a PMDG aircraft data field by name — switches, MCP values, fuel qty, FMC data (777 or 737 NG3) |
| read | Read a PMDG CDU screen as text rows with per-cell color and formatting |
| write | Send a PMDG control event — toggle a switch, press a button, set a selector (777 or 737 NG3) |
These tools use the PMDG SDK Client Data Areas for direct binary access to the aircraft state — bypassing the MobiFlight L-var bridge. The right SDK (777 or 737 NG3) is auto-detected from the loaded aircraft, or can be forced with the variant argument. Requires EnableDataBroadcast=1 and EnableCDUBroadcast.N=1 in the aircraft's options.ini (777_Options.ini or 737NG3_Options.ini). The 777 has three CDUs (Capt/Center/F-O); the 737 NG3 has two (Capt/F-O). See PMDG 777 SDK Reference and PMDG 737 NG3 SDK Reference for details.
HubHop (2)
Tool | Kind | Description |
| read | Search the MobiFlight HubHop community preset database |
| read | List the aircraft that HubHop has presets for |
Unlike every other tool, these two reach HubHop's HTTP API rather than the simulator, so they work with MSFS closed. The first call downloads and caches the full preset database (~17 MB); later calls in the same server process are served from that in-memory cache, which both tools share and which re-fetches on its own every 6 hours. Either tool accepts refresh=true to force an immediate re-fetch.
Flight and Scenario (4)
Tool | Kind | Description |
| write | Load a saved flight, replacing the current one |
| write | Save the current flight to a |
| write | Load a |
| write | Spawn an AI aircraft or object at a position — reports whether SimConnect accepted the request, which is not the same as the object existing (MSFS ignores an unmatched title silently) |
These wrap the underlying SimConnect flight/scenario file operations for scripting test setups (e.g. "load this approach", "save the current state", "spawn traffic nearby") rather than driving them by hand in the sim's own UI. msfs_create_ai_object is confirmed live end-to-end — spawned, verified to answer a targeted SimVar request, then removed again — by tests/live/test_live_flight.py. msfs_save_flight was also confirmed live, including the multi-second post-save SimConnect stall documented in CLAUDE.md's Known Sim Behaviours; its own live tests were retired in the 2026-08-29 live-suite trim once that finding was captured there, since what remained (the overwrite-guard logic) is pure Python already covered by tests/test_flight.py's mocks. msfs_load_flight and msfs_load_flight_plan are mock-only by design — see tests/live/test_live_flight.py's module docstring for why. See Running the live tests below.
Variable Catalogs
The server ships with comprehensive variable catalogs for search and discovery, so that AI agents can find the right variable names without guessing.
SimVar Catalog (1,080+ variables)
The built-in SimVar catalog covers all documented MSFS simulation variables across 25 categories:
Category | Vars | Category | Vars |
Aircraft Engine | 112 | Aircraft Avionics | 122 |
Aircraft Fuel | 48 | Miscellaneous | 162 |
Aircraft Controls | 50 | Landing Gear | 54 |
Autopilot | 39 | Flight Instrumentation | 45 |
Aircraft Lights | 25 | Aircraft Position and Speed | 46 |
Camera | 34 | Radio Navigation | 66 |
Services | 42 | Aircraft Electrics | 47 |
Flight Model | 11 | Aircraft Systems | 24 |
Environment | 14 | and more... |
The catalog is sourced from both the SimConnect Python package and the official MSFS SDK documentation, ensuring complete coverage including camera controls, ground services, circuit breakers, GPS/NAV/COM radios, and flight model variables.
Aircraft L-Var Catalogs
L-var catalogs provide searchable, human-readable databases for specific aircraft add-ons. The server picks one in three steps, and tells you in the result message which step answered — the three carry very different confidence:
Probe the PMDG SDK client data area. Authoritative, and independent of what the aircraft calls itself. This is the step that matters, because PMDG airframes do not identify themselves as PMDG: a real PMDG 737-800 reports
TITLEas737-800 PAX SSW TC, with no vendor name anywhere in it. Matching titles alone never worked for them.Match
title_patternagainstTITLE/ATC_MODEL. The fallback, and the only mechanism available to a catalog you supply yourself.Search every catalog and say so. Results then carry a
Catalogcolumn so you can see which aircraft each row belongs to, rather than reading another aircraft's variables as if they were yours.
Pass catalog=<key> to scope a search explicitly, or call msfs_browse_lvar_catalog with no arguments to list the available keys.
The obvious shortcut — broadening
title_patternto737— is deliberately not taken. It would match the iFly 737 MAX and Asobo's own 737 just as happily, and hand their users a PMDG catalog for an aircraft that isn't a PMDG. An honest "no catalog detected" beats a confidently wrong one.
Included catalogs:
Aircraft | Variables | Panels | Source |
PMDG 777 (all variants) | 1,607 | 28 | SDK header parse + HubHop |
PMDG 737 NG3 (-600/700/800/900/BBJ/BDSF/BCF) | 1,861 | 27 | SDK header parse + HubHop |
Each variable includes a display name, category, writability flag, and (where applicable) a map of valid values.
No Fenix catalog ships — a prior fenix_a320.json (1,433 plain L-vars) was removed in favor of HubHop's own broader, community-maintained FenixSim coverage (2,273 presets, current the moment Fenix ships an update, where a bundled snapshot would only go stale). Search it live with msfs_search_hubhop(vendor="FenixSim"), or regenerate a local catalog file with the HubHop client below and drop it into src/simconnect_mcp/data/ — every *.json there is auto-discovered on startup, so it works immediately with no code change.
Adding New Aircraft Catalogs
The fastest way to add a new aircraft is via the built-in HubHop client:
# See what's available
python -m simconnect_mcp.data.hubhop --list-vendors
# Generate a catalog (example: FlyByWire A32NX)
python -m simconnect_mcp.data.hubhop \
--vendor "FlyByWire Simulations" \
--aircraft "A320neo" \
--aircraft-name "FlyByWire A32NX" \
--title-pattern "A32NX" \
-o fbw_a32nx.jsonOr update an existing one:
python -m simconnect_mcp.data.hubhop --vendor FenixSim --merge fenix_a320.jsonYou can also use the Python API:
from simconnect_mcp.data.hubhop import HubHopClient
client = HubHopClient()
presets = client.fetch_presets(vendor="FlyByWire Simulations", aircraft="A320neo")
catalog = client.build_catalog(presets, aircraft="FlyByWire A32NX", title_pattern="A32NX")
client.save_catalog(catalog, "fbw_a32nx.json")Or create catalogs manually by placing a JSON file in src/simconnect_mcp/data/. All *.json files are auto-discovered on startup. See docs/extending-catalogs.md for the full guide, JSON schema, and best practices.
Resources
URI | Type | Content |
|
| SimConnect architecture and key concepts |
|
| SimVar reference by category |
|
| Event reference by category |
|
| RPN calculator syntax guide |
|
| L-var usage for add-on development |
|
| Common pitfalls and performance tips |
|
| PMDG SDK reference; |
|
| Live connection status |
|
| Current aircraft title, type, and position |
Prompts
Prompt | Purpose |
| Step-by-step guide for debugging a misbehaving SimVar |
| Enumerate and categorize all L-vars on current aircraft |
| Generate add-on starter code by type |
| Translate natural language to RPN calculator code |
| Review SimConnect code for common issues |
Project Structure
src/simconnect_mcp/
├── server.py # FastMCP instance, lifespan, tool registration
├── connection.py # SimConnectManager singleton + native set_lvar
├── dispatch.py # SimConnectDispatcher — owns the SimConnect dispatch loop
├── simvar_access.py # SimVarAccessor — generic SimVar reads/writes via data definitions
├── facilities.py # Facility (*_LIST) message parsing and accumulation
├── pmdg.py # PMDG 777 SDK structs, CDU rendering, data manager
├── pmdg_ng3.py # PMDG 737 NG3 SDK structs, CDU rendering, data manager
├── tools/
│ ├── __init__.py # @handle_simconnect_errors, @require_connection decorators
│ ├── connection_tools.py # connect_to_sim, disconnect_from_sim, get_connection_status
│ ├── simvars.py # SimVar CRUD via SimVarAccessor (1,080+ vars in the catalog)
│ ├── events.py # Event trigger/search + built-in catalog
│ ├── lvars.py # L-var read/write/search/enumerate/browse catalogs/calculator code
│ ├── pmdg.py # PMDG tools — auto-dispatch to 777 or 737 NG3
│ ├── aircraft.py # get_aircraft_snapshot — combined state snapshot
│ ├── facilities.py # Airport/navaid lookup on top of facilities.py
│ ├── flight.py # load/save flight, load flight plan, spawn AI object
│ ├── hubhop.py # HubHop preset search, exposed as MCP tools
│ ├── utilities.py # send_sim_text, set_aircraft_position
│ ├── models.py # Shared Pydantic result/error models
│ └── formatting.py # Pagination and markdown-table helpers
├── data/
│ ├── catalog.py # L-var catalog loader and search engine
│ ├── simvar_catalog.py # SimVar catalog loader, unit resolution, string-var detection
│ ├── hubhop.py # MobiFlight HubHop API client (CLI + library), in-memory cache
│ ├── pmdg_777.json # PMDG 777 catalog (1,607 vars, 28 panels)
│ ├── pmdg_737.json # PMDG 737 NG3 catalog (1,861 vars, 27 panels)
│ └── simvars_catalog.json # Built-in SimVar catalog (1,080+ vars, 25 categories)
├── vendor/ # Byte-faithful to upstream except two documented local changes
│ ├── simconnect_mobiflight.py # unmodified
│ └── mobiflight_variable_requests.py # log-level demotion + response-channel routing
└── docs/ # Embedded documentation, served as MCP resources
├── overview.md, simvars.md, events.md, rpn.md, lvars.md, best_practices.md
├── pmdg_777.md # PMDG 777 SDK reference
└── pmdg_737.md # PMDG 737 NG3 SDK referenceThe PMDG catalogs are regenerated from the SDK headers via scripts/parse_pmdg_sdk.py — it auto-detects the struct name and CDU count, so the same script handles both 777 and 737 NG3.
Development
# Run the mocked test suite (no MSFS required; live tests are deselected by default)
uv run pytest
# Run tests with verbose output
uv run pytest -v
# Run only specific test files
uv run pytest tests/test_hubhop.py # HubHop client tests
uv run pytest tests/test_simvars.py # SimVar catalog tests
# Lint
uv run ruff check src/ tests/Tests mock SimConnect so the suite above runs without MSFS. tests/conftest.py provides a mock SimConnect with realistic SimVar values.
Running the Live Tests
A second suite under tests/live/ exercises the real SimConnect DLL and is marked @pytest.mark.live. pyproject.toml deselects it by default (addopts = "-m 'not live'"), so it never runs on a machine without MSFS — including CI.
This suite is deliberately small and stays that way on purpose: a test belongs here only if a self-consistent mock could agree with itself regardless of whether the code is right — for example, a round trip that writes and reads back a single L-var name proves nothing about encoding, because a mangled datum name would make the write and the read-back agree with each other on the wrong variable (see test_two_distinct_lvars_do_not_collide in tests/live/test_live_lvars.py). What's left after that filter is real DLL/DLL-adjacent behaviour a mock can only assume rather than verify: unit conversion against the physical constant, wire-decode of structs whose third-party bindings this project has already caught wrong once, which real SimVars/events actually accept a write versus reject or silently ignore it, undocumented MobiFlight/WASM protocol quirks, and whether a real PMDG's binary client-data area answers a probe the way its struct decode expects.
Where a live finding can instead be frozen into a committed fixture and replayed offline, that's preferred over a live test: tests/fixtures/facilities/ holds real SimConnect wire bytes captured once, replayed by the mocked tests/test_facilities_parsing.py on every run, with no simulator and no flakiness — it pins the same discovery deterministically instead of depending on whatever aircraft happens to be loaded that day.
uv run pytest -m liveRequires MSFS running with an aircraft loaded; a test whose connection attempt fails is skipped rather than failed (see tests/live/conftest.py's live_manager fixture). tests/live/test_live_pmdg.py's tests need a real PMDG 737/777 loaded and skip — rather than fail — when the loaded aircraft doesn't look like one (see that file's gate in tests/live/conftest.py).
License
Copyright (C) 2025-2026 Robin Kipp
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See LICENSE.txt for the full text.
This project is AGPL-3.0 because it depends on Python-SimConnect, which is itself AGPL-3.0 licensed.
The vendored MobiFlight bridge in src/simconnect_mcp/vendor/ is a separate
work, MIT licensed by Koseng — see
src/simconnect_mcp/vendor/MOBIFLIGHT_LICENSE.
Available Tools
32 toolsmsfs_browse_lvar_catalogBrowse L-Var CatalogsARead-onlyIdempotent
Browse the aircraft L-var catalogs.
Three levels, narrowing as you supply arguments:
no catalog resolved -- every available aircraft catalog
catalog only -- the panels in that catalog
catalog+panel -- the variables on that panel, with their valid values
With no 'catalog', the loaded aircraft is auto-detected: PMDG's own client-data-area probe first (authoritative -- confirms which SDK is actually running, independent of what TITLE/ATC_MODEL say), then every catalog's own title_pattern matched against TITLE/ATC_MODEL (the only mechanism for a third-party catalog dropped into data/). A successful detection acts as if that catalog had been passed explicitly, and 'message' names which of the two resolved it -- a probed detection is a materially stronger signal than a title-text match. When detection fails entirely, 'catalog' comes back None, 'message' explains why, and (with 'panel' also given) the panel is looked up across every catalog -- the first match is returned, but that is a guess, not a detection, and 'message' says so.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results | |
| panel | No | Panel name to open, e.g. 'Signs', 'FCU', 'Electrical'. Omit to list the panels in the catalog. | |
| offset | No | Results to skip | |
| catalog | No | Catalog key, e.g. 'pmdg_737', 'pmdg_777'. Omit to auto-detect from the loaded aircraft, or to list all available catalogs. | |
| response_format | No | 'markdown' for a table, 'json' for rows | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses subtle behavior: the two-stage auto-detection (client-data-area probe vs title_pattern match), what a successful detection means, and that a fallback cross-catalog panel lookup is 'a guess, not a detection.' This is exactly the kind of non-obvious behavior an agent needs to trust the result.
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 dense but organized: a one-sentence summary, a bulleted list of levels, then a focused explanation of auto-detection edge cases. Every sentence contributes behavioral or usage information; 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 tool with no required parameters and rich schema/output schema, the description covers the full decision space: all three narrowing levels, auto-detection success/failure, and the reliability caveat on fallback matches. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning for the two key parameters: catalog and panel define the three browse levels, and the auto-detection semantics explain what omitting catalog does. It doesn't add detail for limit/offset/response_format, but the schema already covers those.
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 opens with a specific verb and resource, 'Browse the aircraft L-var catalogs,' then defines three concrete output levels (all catalogs, panels in a catalog, variables on a panel). This distinguishes it from sibling tools like msfs_list_lvars or msfs_search_lvars, which operate on L:vars directly rather than the catalog hierarchy.
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?
It gives explicit usage context: no catalog lists catalogs, catalog only lists panels, catalog+panel lists variables, and it explains auto-detection and fallback behavior. It falls short of a 5 because it never explicitly names alternative tools or states when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_connectConnect to MSFSAIdempotent
Establish SimConnect connection to MSFS.
Must be called before using any other tools. Automatically attempts to load MobiFlight WASM extension for L-var support.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses an important side effect: it automatically attempts to load the MobiFlight WASM extension for L-var support. It also clarifies the ordering requirement. It does not describe failure behavior or the effect of calling it when already connected, but the idempotentHint annotation covers re-invocation safety.
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 two short sentences with no filler. The primary action is front-loaded, and the prerequisite and automatic WASM behavior each earn their place. This is concise without losing necessary guidance.
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 zero-parameter connection tool with an output schema and informative annotations, the description provides the essential invocation context: it must precede all other tools and it automatically handles WASM loading. No additional parameter or return-value detail is needed.
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 tool has zero parameters and a fully covered schema, so there is no parameter information that the description needs to add. The baseline of 4 applies because the invocation surface is fully described by the empty schema.
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 uses a specific verb and resource, 'Establish SimConnect connection to MSFS,' which clearly identifies the operation. It is further differentiated from siblings like msfs_disconnect and msfs_get_connection_status by its explicit connect action and the stated prerequisite that it must be called before any other tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it: 'Must be called before using any other tools.' This gives clear context for invocation. It does not explicitly name alternatives or exclusion cases, but siblings such as msfs_disconnect are obvious, and the strong prerequisite guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_create_ai_objectCreate AI ObjectADestructive
Spawn an AI aircraft or object at a position.
Useful for building traffic or collision-avoidance test scenarios. The
title must match an installed aircraft exactly. When it does, SimConnect
confirms the object was actually created with an ASSIGNED_OBJECT_ID
reply, and object_id on the result carries it -- also the id
SimConnect_AIRemoveObject would need to remove it again. When the title
matches nothing installed, MSFS ignores the request silently: no error,
no reply, so object_id stays null. Treat that null as "not confirmed
to exist," not as a definite failure of this call -- a request registry
being briefly slow to answer, or a connection with none at all (the
plain SimConnect fallback), leaves the same null for a different reason;
see message for which applies.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Exact aircraft or object title as MSFS knows it, e.g. 'Boeing 747-8i Asobo' | |
| heading | No | Heading in degrees true | |
| airspeed | No | Airspeed in knots | |
| latitude | Yes | Latitude | |
| longitude | Yes | Longitude | |
| on_ground | No | Place the object on the ground | |
| altitude_ft | No | Altitude in feet |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond annotations: silent ignore when the title matches nothing, no reply/error, null object_id meaning 'not confirmed to exist' rather than definite failure, and the separate causes for null. It also explains that object_id is the handle needed for SimConnect_AIRemoveObject. This is exactly the kind of non-obvious behavior an agent needs.
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 front-loaded with a one-sentence purpose, then a compact use-case statement, and then a focused edge-case explanation. The longer section about null object_id is justified because misinterpreting it would lead an agent to report a false failure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description does not need to redefine return values, yet it explains the meaning of object_id and message, clarifies the not-installed case, and gives removal context. For a spawn tool with non-obvious failure modes, this is 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?
The schema already documents all 7 parameters (100% coverage), so the baseline is 3. The description adds meaningful parameter-specific context for 'title' by emphasizing that it must match an installed aircraft exactly and linking the resulting object_id to removal. Other parameters need no further explanation.
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 precise action ('Spawn an AI aircraft or object at a position') and a clear resource. The 'AI' qualifier distinguishes it from actions on the user aircraft (e.g., msfs_set_aircraft_position) and from loading flights or events, so an agent can tell it apart from 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?
Gives an explicit use case ('building traffic or collision-avoidance test scenarios') and a hard prerequisite: the title must exactly match an installed aircraft. It does not name alternatives or when-not-to-use, but the context is clear and the tool's role is unique among the listed siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_disconnectDisconnect from MSFSAIdempotent
Close the SimConnect connection to MSFS.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false, which implies a mutating but safe operation. The description adds no extra context like 'subsequent connection-dependent tools will fail until reconnected' or 'this aborts ongoing operations.' While not contradicting annotations, it fails to disclose the operational impact of closing the connection beyond the literal action.
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, precise sentence with no filler. The action is front-loaded and immediately clear. Every word earns its place; nothing is redundant or confusing.
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 no-parameter, single-action tool, the description is mostly sufficient. It lacks an explicit statement about side effects (e.g., affecting other tools) or return behavior, but the output schema exists and annotations cover safety. Given the simplicity, the gap is minor and a 4 is appropriate.
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?
With zero parameters, the schema trivially covers everything. The description adds no parameter details because none exist. Baseline of 4 applies per guidelines—the tool is inherently simple and no additional parameter explanation is needed.
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 ('Close') and a precise resource ('the SimConnect connection to MSFS'). It clearly distinguishes itself from siblings like msfs_connect (the counterpart) and status tools. The agent knows exactly what action this performs.
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 context is clear: this is the disconnect counterpart to msfs_connect. Though it doesn't explicitly list when to use it vs alternatives, the pairing with msfs_connect and the absence of any other disconnect tool make the usage obvious. Minor gap: no guidance on prerequisites (e.g., must be connected first).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_execute_calculator_codeExecute RPN CodeADestructive
Execute RPN calculator code in the simulator.
Runs arbitrary RPN (Reverse Polish Notation) calculator code via the MobiFlight WASM bridge. Can read or write any variable type and perform complex operations. Requires the MobiFlight WASM extension.
The 'auto' mode's heuristic -- code starts with '(', ends with ')', and contains no '(>' -- misclassifies compound read expressions such as '(L:A) (L:B) max' as an execute, because they don't end in ')'. Pass mode='read' explicitly for those.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | RPN calculator code, e.g. '(A:PLANE ALTITUDE, feet)' to read a SimVar, '(L:MyCustomVar) 1 + (>L:MyCustomVar)' to increment an L-var, or '1 (>K:PARKING_BRAKES)' to trigger an event. | |
| mode | No | 'read' returns a value, 'execute' runs the code for effect. 'auto' guesses from the syntax, which is unreliable for compound expressions. | auto |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and non-read-only, and the description complements them by disclosing that it can read or write any variable type, execute arbitrary code, and that the auto mode has a known misclassification heuristic. This adds meaningful behavioral context beyond the annotations without contradicting them.
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?
Every sentence in the description earns its place: purpose, capability, prerequisite, and a critical mode-selection caveat. It is front-loaded with the core action and remains focused despite covering an important edge case.
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?
Combined with the rich input schema, annotations, and an output schema, the description provides everything an agent needs: what the tool does, the required extension, the arbitrary read/write capability, and precise guidance for the mode parameter. No critical operational detail is missing.
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 both parameters are already well documented with examples. The description adds extra semantic value by explaining the failure mode of mode='auto' and giving a concrete recommendation to pass mode='read' explicitly for expressions like '(L:A) (L:B) max'.
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 ('Execute'), a clearly defined resource ('RPN calculator code in the simulator'), and distinguishes this tool as a general-purpose bridge that can read or write any variable type. This differentiates it from narrower siblings like msfs_get_simvar or msfs_set_lvar.
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 clear context: it runs arbitrary RPN code, requires the MobiFlight WASM extension, and explicitly warns when to override the auto mode with mode='read' for compound read expressions. It does not name specific alternative tools, but the usage context is strong enough for an agent to choose it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_get_aircraft_snapshotGet Aircraft SnapshotARead-onlyIdempotent
Read a snapshot of the current aircraft state.
Narrow with 'sections' to keep the response small -- for example sections=['position'] for a position fix, or ['engines', 'systems'] when debugging a systems issue. All variables across the chosen sections are read in a single batched call.
| Name | Required | Description | Default |
|---|---|---|---|
| sections | No | Sections to include: identity, position, engines, systems, autopilot, environment. Omit for all of them. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that all variables across chosen sections are read in a single batched call, which is useful context, but it doesn't disclose other traits like potential response size limits or rate implications. The added value over annotations is moderate.
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 two short paragraphs, front-loaded with the core purpose followed by usage guidance. Every sentence earns its place: the purpose is stated, then examples, then the batched-call note. No fluff or redundancy.
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 snapshot tool with an output schema (indicated by has output schema: true), the description covers how to invoke it and why one might narrow sections. It lacks details about the response structure, but that is presumably covered by the output schema, so this is a minor gap. The description is sufficient for safe and effective use.
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 schema description already fully documents the 'sections' parameter (100% coverage), including valid section names and the default of all. The description adds practical, concrete use cases via examples, going beyond the schema by showing how to apply the parameter for specific scenarios, which enhances understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads a snapshot of the current aircraft state, with a specific verb and resource. It is distinct from siblings like get_simvar because it covers multiple sections, but it does not explicitly name any alternative tools, so differentiation relies on the reader's understanding of the tool landscape.
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 practical usage examples (e.g., sections=['position'] for a position fix, ['engines', 'systems'] for systems issues) and notes the batched-call efficiency. However, it does not explicitly state when to prefer this tool over similar ones like get_simvars_bulk or get_simvar, leaving the selection criteria implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_get_connection_statusGet Connection StatusARead-onlyIdempotent
Check SimConnect connection state, whether sim is running/paused.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds meaningful behavioral context by specifying that the tool also reports whether the sim is running or paused, which is beyond the tool name alone.
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, concise sentence that immediately states the tool's purpose. It contains no filler, no redundant restating of the title, and is easily scannable by an agent.
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 zero-parameter, read-only status-checking tool with output schema and annotations covering safety, the description is complete. It tells the agent exactly what condition is being inspected, and nothing else is needed to invoke the tool correctly.
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?
This tool has zero parameters, and the schema coverage is complete at 100%. The description is not required to explain parameters, and it correctly avoids mentioning any.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: checking SimConnect connection state and whether the sim is running or paused. It uses a specific verb ('Check') and resource, and it is easily distinguished from its siblings like msfs_connect and msfs_disconnect, which perform actions rather than report state.
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 explicit guidance about when to use this tool versus alternatives such as msfs_connect or msfs_disconnect. The intended context is implied by the tool's name and description, but there is no stated when-to-use, prerequisite, or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_get_facility_infoGet Facility InfoARead-onlyIdempotent
Look up one airport, waypoint, NDB or VOR by ICAO identifier.
Only facilities the sim currently has loaded are visible. Airports are the exception: SimConnect's airport facility list is the complete worldwide set (measured live -- see module docstring), not scoped to the aircraft's location, so an airport miss means the identifier is wrong rather than out of range.
| Name | Required | Description | Default |
|---|---|---|---|
| icao | Yes | ICAO identifier, e.g. 'KJFK', 'EGLL', 'SEA' | |
| facility_type | No | Kind of facility to look up: one of 'airport', 'waypoint', 'ndb', or 'vor' | airport |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent hints, the description reveals important behavior: facility visibility depends on the sim's loaded set, airports are a complete worldwide list, and a miss for airports indicates a wrong identifier rather than an out-of-range result. This adds meaningful operational nuance not in the annotations.
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 focused sentences with the primary action front-loaded and no filler. The exception and its operational implication are stated efficiently, and every sentence contributes to correct usage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core lookup action, the loaded-facility scope, the airport exception, and the interpretation of misses. With an output schema present, no additional return-value detail is needed. The tool is fully understandable from the description alone.
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 both parameters have clear descriptions. The tool description does not add extra meaning to the parameters, but it is not required because the schema already documents them sufficiently. Baseline 3 is 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?
The description states a specific action ('look up'), a resource ('airport, waypoint, NDB or VOR'), and an identifier type ('ICAO identifier'). It clearly defines the tool's scope and distinguishes it from general sim variable or event tools among the 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?
The description gives clear context: facilities must currently be loaded, with airports as an exception. It also explains how to interpret an airport miss, which is practical usage guidance. It does not explicitly name alternatives or state when not to use the tool, but the lookup use case is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_get_lvarRead L-VarARead-onlyIdempotent
Read an L-var (local variable) value from the current aircraft.
L-vars are aircraft-specific local variables used by add-on developers. Requires the MobiFlight WASM extension.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | L-var name, e.g. 'A32NX_EFIS_L_OPTION', 'WT_CJ4_HDG_ON'. The 'L:' prefix and RPN wrapping are added automatically if missing. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, openWorldHint, idempotentHint, and non-destructiveness. The description adds the prerequisite that the MobiFlight WASM extension must be present and limits the read to the current aircraft, but it doesn't describe failure behavior when the extension or variable is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences front-load the core read action, then add a definition and a prerequisite. No filler or repetition of schema/annotation content.
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?
With one simple parameter, an output schema, and safety annotations, the description covers the essential context: what L-vars are, that it reads the current aircraft, and the extension requirement. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents the name parameter with examples and auto-prefixing behavior at 100% coverage, so the description adds little parameter-level meaning. The conceptual L-var definition is helpful but not needed to understand the single parameter.
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 action 'Read an L-var (local variable) value' and scopes it to 'the current aircraft', distinguishing it from simvar readers and from msfs_set_lvar. The additional sentence defines what L-vars are, removing ambiguity.
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?
Gives clear context for when to use it: L-vars are aircraft-specific add-on variables, and it requires the MobiFlight WASM extension. It does not explicitly name alternatives such as msfs_get_simvar or msfs_search_lvars, so it lacks an explicit when-not-to-use statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_get_nearby_airportsGet Nearby AirportsARead-onlyIdempotent
List airports near a point, nearest first.
Filters SimConnect's airport facility list by great-circle distance from the given (or current) position. That list is not scoped to the aircraft's location at all -- measured live, it is the entire world (85,249 airports) regardless of where the aircraft is -- so a radius that finds nothing means there is genuinely no airport that close, not that the sim "hasn't loaded" one. The distance filter always runs over the complete list before pagination, so a later page can never miss a match an earlier page's filtering already found.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results | |
| offset | No | Results to skip, for paging | |
| latitude | No | Centre latitude. Defaults to the aircraft's position. | |
| longitude | No | Centre longitude. Defaults to the aircraft's position. | |
| radius_nm | No | Search radius in nautical miles | |
| response_format | No | 'markdown' for a table, 'json' for rows | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations like readOnlyHint and openWorldHint, the description discloses that the underlying list is the entire live world dataset (85,249 airports), that distance filtering always runs before pagination, and that an empty radius result is a true negative. This preempts common misconceptions and goes well beyond what annotations alone convey.
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 front-loaded with the core purpose in the first sentence, and each subsequent sentence adds non-redundant behavioral context about data scope, false negatives, and pagination. It is appropriately sized for the complexity of the behavior it clarifies and contains 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?
Given the rich input schema, output schema, and annotations, the description covers all essential operational concerns: the spatial filter, default position behavior, data source scope, result ordering, and pagination guarantees. No critical usage information needed to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents every parameter (100% coverage), so the baseline is 3. The description adds meaningful semantic value by explaining that the radius is interpreted over a complete worldwide list and that filtering happens before pagination, clarifying the behavior of radius_nm, offset, and limit beyond their schema descriptions.
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 first sentence, 'List airports near a point, nearest first,' names a specific verb, resource, and ordering. The second sentence adds the algorithmic basis (great-circle distance over SimConnect's airport facility list), making the purpose unmistakable and distinct from sibling facility search tools.
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 clear operational context: searches are relative to a given or current position, and an empty result genuinely means no airport exists within radius rather than a SimConnect loading failure. It does not explicitly name alternatives or exclusions, but the domain is specific enough that no competing sibling tool is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_get_pmdg_cduRead PMDG CDU ScreenARead-onlyIdempotent
Read a PMDG CDU screen (777 has 3 CDUs, 737 NG3 has 2).
Returns the CDU display as text rows and an optional structured grid with per-cell color and formatting information.
Requires EnableCDUBroadcast.N=1 in the aircraft's options.ini.
| Name | Required | Description | Default |
|---|---|---|---|
| cdu | No | CDU unit number. 777: 0=left (Captain), 1=center, 2=right (F/O). 737 NG3: 0=Captain, 1=F/O. | |
| variant | No | Optional aircraft SDK variant. Defaults to auto-detect. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the agent knows it's a safe read operation. The description adds the prerequisite (EnableCDUBroadcast.N=1) and the return format (text rows + optional grid), which are not in annotations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The primary function is front-loaded in the first sentence, and the second sentence covers returns and a critical prerequisite. Extremely efficient.
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 read-only operation with full schema coverage and an output schema, the description covers the essential context: what the tool does, which aircraft variants are supported, the return format, and a required configuration. Missing details like exact output structure are covered by the output schema. Overall, complete enough for an agent to select and call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage with detailed descriptions for both parameters (cdu with per-variant mapping, variant with auto-detect). The tool description does not add any parameter-specific information beyond what the schema already contains. Since schema coverage is complete, the description adds no extra semantics, so a baseline of 3 is 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?
Clearly states the verb 'read' and the resource 'PMDG CDU screen', and differentiates from siblings like msfs_get_pmdg_var by specifying it's for the CDU screen. Also provides variant-specific context (777 vs 737) which prevents confusion.
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 context: reading the CDU screen. It mentions the number of CDUs per variant, which helps an agent know which unit to request. However, it does not explicitly name alternative tools or state when not to use it (e.g., when reading raw variables). The prerequisite (EnableCDUBroadcast.N=1) is a form of guidance. Overall, the context is sufficient but lacks explicit exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_get_pmdg_varRead PMDG VariableARead-onlyIdempotent
Read a PMDG aircraft data field by name (777 or 737 NG3).
Uses the PMDG SDK data broadcast to read switch positions, annunciators, knob positions, MCP values, fuel quantities, FMC data, and more.
Requires EnableDataBroadcast=1 in the aircraft's options.ini
(777_Options.ini or 737NG3_Options.ini).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Variable name from the PMDG catalog. Use msfs_search_lvars() to discover available variables. Examples: 'ELEC_Battery_Sw_ON', 'MCP_IASMach', 'FUEL_QtyCenter'. | |
| variant | No | Optional aircraft SDK variant. When omitted, it is auto-detected from the loaded aircraft. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already communicate read-only, idempotent, non-destructive behavior. The description adds valuable context beyond those annotations by explaining the PMDG SDK data broadcast mechanism and the options.ini prerequisite, which is exactly the kind of deployment detail an agent cannot infer from hints alone.
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 tightly structured and front-loaded: the core read operation, the supported aircraft, and the critical configuration requirement. Every sentence carries distinct information with 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?
Given that an output schema exists, annotations cover safety, and the input schema is fully documented, the description is mostly complete. It supplies the key environmental prerequisite and data categories, though it could briefly mention when not to use it in favor of a non-PMDG read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers both parameters fully, including the name description, examples, and variant enum, so the baseline is 3. The description adds little parameter-specific meaning beyond reinforcing that the data field is read by name and applies to 777/737 variants.
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 begins with a specific verb and resource: 'Read a PMDG aircraft data field by name (777 or 737 NG3)'. It also enumerates what can be read (switch positions, annunciators, MCP values, fuel, FMC data), making the tool's scope clear and distinct from generic simvar/lvar readers.
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?
It gives clear operational context, including the requirement that 'EnableDataBroadcast=1' must be set in the aircraft's options.ini. However, it does not explicitly compare against sibling tools like msfs_get_lvar or msfs_get_simvar, so an agent must infer when this PMDG-specific tool is preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_get_simvarRead SimVarARead-onlyIdempotent
Read a SimVar value by name, in the requested unit.
Returns the value together with the unit it was actually read in. Use msfs_search_simvars first if you are unsure of the exact name or units.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | SimVar name, e.g. 'PLANE_ALTITUDE' or 'AIRSPEED_INDICATED' | |
| unit | No | Unit to read in, e.g. 'feet', 'meters', 'knots'. Defaults to the catalog unit for this variable. | |
| index | No | Index for indexed SimVars such as engine number. Index 0 is valid. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds a useful behavioral detail beyond annotations: 'Returns the value together with the unit it was actually read in,' clarifying output flexibility. No contradiction exists.
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, purposeful sentences front-load the core action and then add return behavior and a practical usage hint. No filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations, complete schema descriptions, and an output schema, the description is sufficient for a single-value read tool. It could mention batch or watch alternatives to fully orient the agent among siblings, but nothing essential to making a correct call is missing.
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 each parameter (name, unit, index) already has descriptive text with examples and defaults. The tool description essentially repeats the purpose covered by the schema without adding new parameter-level semantics.
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 clear action and resource: 'Read a SimVar value by name, in the requested unit.' This clearly identifies a single-value read operation and is distinct from the set/search lvar siblings, but it doesn't explicitly differentiate from the closely related msfs_get_simvars_bulk or msfs_watch_simvar.
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?
It provides actionable routing: 'Use msfs_search_simvars first if you are unsure of the exact name or units.' This is useful and context-specific, though it stops short of naming other alternatives such as get_simvars_bulk for batch reads or watch_simvar for continuous reads.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_get_simvars_bulkRead Multiple SimVarsARead-onlyIdempotent
Read several SimVars in one call.
Results are keyed by 'NAME' or 'NAME:index'. A failure on one variable does not abort the others -- that entry carries an 'error' instead.
| Name | Required | Description | Default |
|---|---|---|---|
| variables | Yes | Variables to read. Each dict takes 'name' and optional 'unit' and 'index'. Example: [{"name": "PLANE_LATITUDE"}, {"name": "ENG_N1_RPM", "index": 1, "unit": "percent"}]. At most 100 entries per call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds genuinely useful behavioral context beyond annotations: results are keyed by 'NAME' or 'NAME:index', and a failed variable does not abort the batch but carries an 'error' entry. This helps the agent anticipate partial failures.
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 with no filler: the first states the core action, the second provides the critical failure/result behavior. The most important information is front-loaded and every sentence 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?
Given the one-parameter schema, rich schema descriptions, and output schema, the description plus structured data fully support correct invocation. The partial-failure and keying behavior are explicitly covered. Missing only an explicit routing note about when to prefer this over the single-read sibling, which is not essential.
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 detailed documentation of the 'variables' parameter including accepted keys, an example, and a max of 100 entries. The tool description adds no additional parameter meaning, 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, resource, and batching intent: 'Read several SimVars in one call.' It is clearly distinguishable from the singular msfs_get_simvar tool by the plural and batching wording, though it does not explicitly name or contrast that sibling.
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 batching language implies it should be used when multiple SimVars are needed in one call, but there is no explicit when-to-use guidance, no mention of when not to use it, and no alternative tool names. The agent must infer the choice between this and msfs_get_simvar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_list_hubhop_aircraftList HubHop AircraftARead-onlyIdempotent
List the aircraft that HubHop has presets for.
Use this to find the exact vendor and aircraft spelling to pass to msfs_search_hubhop -- HubHop matches those filters exactly, so getting the spelling from here first avoids a filtered search that silently finds nothing because of a mismatched name.
Like msfs_search_hubhop, the first call in this server's session downloads the full preset database (roughly 32,000 presets, ~17 MB), which can take several seconds; the two tools share the same in-memory copy afterwards, refreshed automatically every 6 hours. Pass refresh=True to force an immediate re-fetch instead of waiting on that. Requires internet access.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results | |
| offset | No | Results to skip, for paging | |
| vendor | No | Restrict to one vendor, e.g. 'FenixSim' | |
| refresh | No | Bypass the cached preset database and re-fetch from HubHop before listing. Use this if an aircraft was added to HubHop recently and is not showing up. | |
| response_format | No | 'markdown' for a table, 'json' for rows | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations already declare readOnlyHint, openWorldHint, and idempotentHint, the description adds substantial behavioral context: the first call downloads ~32,000 presets (~17 MB), takes several seconds, the two tools share the same in-memory copy, and it refreshes every 6 hours. It also explains refresh=True and notes the internet requirement—none of which is available from annotations or schema alone.
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 longer than average, but every sentence carries distinct information: purpose, use case, caching behavior, refresh option, and network requirement. There is no redundancy, and the most decision-relevant guidance is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, sibling differentiation, data loading behavior, refresh semantics, and operational prerequisites. With an output schema present and parameter coverage at 100%, nothing an agent needs to correctly select and invoke this tool is missing.
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 baseline is 3; the schema already documents all five parameters. The description adds value by explaining that vendor spellings must be exact for msfs_search_hubhop, reinforcing the vendor parameter's semantics, and by tying refresh=True to the cached database behavior described for the session.
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 opens with 'List the aircraft that HubHop has presets for,' naming a specific verb, resource, and scope. It additionally differentiates the tool from msfs_search_hubhop by framing it as the spelling source for that search tool, so an agent can immediately tell the two apart.
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 second sentence gives explicit guidance: use this tool to find exact vendor and aircraft spelling before calling msfs_search_hubhop, because HubHop matches filters exactly and a mismatched name would silently return nothing. This directly addresses when and why to use it, and the sibling relationship is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_list_lvarsList Aircraft L-VarsARead-onlyIdempotent
Enumerate the L-vars registered by the currently loaded aircraft.
Asks the MobiFlight WASM module for its L-var list and collects the response. The module caps its reply at 1000 names but still reports the list as complete when it does -- see 'truncated' in the result, which is set whenever that cap was hit. A busy add-on setup (e.g. GSX) can crowd an aircraft's own L-vars out of a capped response entirely; msfs_get_lvar reads any name directly regardless of whether it showed up here.
Returns bare names only -- no description, category, or writability per variable, unlike msfs_search_lvars' catalogued rows. Use msfs_search_lvars / msfs_browse_lvar_catalog for aircraft with a bundled catalog when that detail is what you need; use this tool for aircraft that have none, or to see everything currently registered regardless of catalog coverage.
Internally sends a harmless no-op RPN command immediately before the WASM request, to re-arm the module against a quirk where it otherwise gives no response to a request byte-identical to the one it just answered (see _send_list_request's own docstring below for the full story). This creates no variable and has no effect on the aircraft, so calling this repeatedly is safe -- but the underlying quirk is a third-party module behavior this project does not control, so NO_LVARS_RETURNED below stays the honest report for the rare case where even the re-arm doesn't help, rather than this call ever assuming success. Requires the MobiFlight WASM extension.
A listing that stops without the module's end-of-list marker returns LVAR_LIST_INCOMPLETE rather than the names collected so far: an arbitrary prefix of the list is indistinguishable from a complete listing of that size once returned, so it is refused the same way msfs_get_nearby_airports refuses a timed-out facility collection.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results | |
| offset | No | Results to skip | |
| filter_prefix | No | Only return names starting with this prefix, e.g. 'A32NX', 'WT_CJ4', 'XMLVAR'. Case-insensitive. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint, idempotentHint, and openWorldHint annotations, the description adds substantial behavioral context: the 1000-name cap and 'truncated' flag, the risk of add-on crowding, the internal no-op RPN re-arm quirk, and explicit failure modes like NO_LVARS_RETURNED and LVAR_LIST_INCOMPLETE. Nothing contradicts the annotations.
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 long but front-loaded with the core purpose and packed with necessary caveats. Some internal-mechanism detail, such as the RPN re-arm story, could be tightened, but it earns its place by explaining a real behavioral quirk that could otherwise confuse an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers prerequisites (MobiFlight WASM), result semantics (truncation, incomplete responses), failure modes, and sibling alternatives. Since an output schema exists, the lack of a full return-structure listing is not a gap; the description provides everything needed to invoke and interpret this tool correctly.
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 limit, offset, and filter_prefix all documented in the input schema. The tool description does not add parameter-specific detail beyond the schema, so the baseline of 3 is appropriate; it neither improves nor harms parameter understanding.
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 opens with a specific verb and resource: 'Enumerate the L-vars registered by the currently loaded aircraft.' It clearly differentiates this from siblings like msfs_search_lvars and msfs_get_lvar by noting it returns bare names only and that msfs_get_lvar can read any name directly.
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 explicit selection guidance: use msfs_search_lvars / msfs_browse_lvar_catalog when catalogued detail is needed, and use this tool for aircraft without a catalog or to see everything currently registered. It also notes when msfs_get_lvar is the better fallback, making the usage boundary unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_list_simvar_categoriesList SimVar CategoriesARead-onlyIdempotent
List every SimVar category with its variable count.
Use this to discover category names for the 'category' filter on msfs_search_simvars.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by confirming the output includes every category and associated variable counts, which goes beyond simple restating of the tool name.
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 fully convey purpose and usage without redundancy. The main capability is front-loaded, and the second sentence earns its place by connecting output to a sibling operation.
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?
With no parameters, rich annotations, and an output schema present, the description provides all necessary context: what the tool returns, that the result is exhaustive, and how it should be used in relation to msfs_search_simvars. Nothing essential is missing.
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 tool has zero parameters and the schema is empty, so the baseline is 4. The description does not need to explain parameter meaning because there is nothing to parameterize; it correctly focuses on output semantics instead.
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: "List every SimVar category with its variable count." This clearly identifies what the tool does and differentiates it from sibling tools such as msfs_search_simvars and msfs_list_lvars, since it targets category metadata rather than variable values or lvars.
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 an explicit use case: "Use this to discover category names for the 'category' filter on msfs_search_simvars." This directly ties the tool to a downstream workflow and names the relevant sibling. It does not list when-not-to-use exclusions, but the context is clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_load_flightLoad Saved FlightADestructiveIdempotent
Load a saved flight, replacing the current one.
Use this to restore a known starting state before a test run. The current flight is discarded without prompting.
Does not return as soon as the load call succeeds -- it waits for MSFS to resume answering SimConnect first (bounded; see _wait_for_sim_responsive and msfs_save_flight's docstring for the measurement behind this). FlightLoad's own stall was short in the one round trip measured live (~0.9s), but a heavier scenery load could take much longer, so this does not assume load is always cheap.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to a .FLT file, e.g. 'C:\Users\you\Documents\approach-test.FLT' |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations: it warns that the current flight is discarded without prompting, explains that the call blocks until SimConnect responds again, notes the wait is bounded, and cautions that load time can vary. No contradiction with annotations exists.
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 front-loaded with the core purpose and remains focused. The additional paragraphs about blocking behavior and measured timing earn their place, though the internal references like `_wait_for_sim_responsive` add a slight implementation-detail flavor.
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 destructive tool with a rich annotation set and an output schema, the description is complete. It covers purpose, use case, blocking semantics, timing expectations, and the no-prompt discard behavior. Nothing essential is missing for correct invocation.
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 schema already documents the `path` parameter as an absolute path to a .FLT file. The description adds context about saved flights but not new parameter-level semantics, so the baseline 3 is 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?
The description opens with a specific action and resource: loading a saved flight and replacing the current one. The .FLT file reference and 'saved flight' language distinguish it from the sibling msfs_load_flight_plan, and the replacement behavior is unique among the sibling set.
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?
It explicitly states when to use it: 'restore a known starting state before a test run.' It does not name alternatives or say when not to use it, but the context is clear and the destructive consequence is called out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_load_flight_planLoad Flight PlanADestructiveIdempotent
Load a .PLN flight plan into the aircraft's GPS or FMS.
The aircraft is not repositioned; only the plan is loaded.
Does not return as soon as the load call succeeds -- see msfs_save_flight's docstring and _wait_for_sim_responsive for why this waits (bounded) for MSFS to resume answering SimConnect first.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to a .PLN flight plan |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by disclosing two non-obvious behaviors: the aircraft is not repositioned, and the tool deliberately waits for MSFS to resume answering SimConnect before returning. It also points to a cross-reference for the reasoning. This is valuable behavioral context that annotations alone do not provide.
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 compact and front-loaded with the primary action, followed by two essential behavioral clarifications. Every sentence earns its place, and the structure makes the most important facts immediately visible. No filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single required parameter, an available output schema, and annotations covering read-only/destructive characteristics, the description is complete enough for safe invocation. It adds the critical waiting behavior and non-repositioning guarantee. No essential information for calling the tool correctly is missing.
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%; the path parameter is already documented as 'Absolute path to a .PLN flight plan.' The description repeats the .PLN detail but adds no new format, validation, or example information. Baseline 3 is appropriate because the schema carries the 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?
The description states a specific verb and resource: 'Load a .PLN flight plan into the aircraft's GPS or FMS.' It also clarifies scope with 'The aircraft is not repositioned,' which distinguishes it from msfs_load_flight. This lets the agent identify the tool without inspecting the schema.
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 no-repositioning statement gives clear context for when to use this tool instead of a flight-loading sibling. It does not name alternatives explicitly, but it implies the distinction well. The reference to msfs_save_flight's docstring also guides the agent on the waiting behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_save_flightSave Current FlightA
Save the current flight to a .FLT file.
Capture a known state so a later msfs_load_flight call can restore it. Refuses to replace an existing file unless overwrite=True.
The library's sm.save_flight() ends with an unconditional return False,
so its return value says nothing about success -- this checks whether
the file was actually written instead. Its body also reads the file
straight back (flight_to_dic) immediately after issuing an asynchronous
FlightSave; if MSFS has not finished writing yet, that read-back can
raise rather than return False. Both a clean return and a raised
exception are followed by the same polling existence check below, since
the file on disk is the only signal either path can be trusted to leave
behind.
Does not return once the file appears, either. MSFS keeps SimConnect
entirely unresponsive for a further ~14s (measured live) while it
actually finishes the save; this waits that out too, bounded, so a
caller never gets status: "ok" while the sim still cannot answer
anything -- see _wait_for_sim_responsive's docstring for the full
measurement and why the wait is structured the way it is.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path for the .FLT file to write | |
| title | Yes | Flight title shown in MSFS | |
| overwrite | No | Replace the file at `path` if one already exists there | |
| description | No | Flight description |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses non-obvious library quirks: save_flight() unconditionally returns False, an immediate read-back can raise, success is verified by polling the file, and MSFS may remain unresponsive for ~14 seconds. These details far exceed what the annotations provide and help the agent interpret status correctly.
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 front-loaded with a clear one-sentence purpose, and the later paragraphs contain valuable implementation caveats. However, the level of internal library detail is dense and could be tightened without losing essential guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 100% parameter coverage, the annotations, and the existence of an output schema, the description covers all essential operational context: error behavior, overwrite safety, waiting semantics, and success signaling. Nothing critical is missing for an agent to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already well documented. The description reinforces the overwrite parameter's meaning ('Refuses to replace an existing file unless overwrite=True') but does not add much semantic detail beyond that.
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 names the specific action ('Save the current flight to a .FLT file'), identifies the file format, and explains that the state is captured for a later msfs_load_flight call. This clearly distinguishes it from sibling tools such as msfs_load_flight and msfs_load_flight_plan.
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?
It explicitly states the tool's use case—persisting a known flight state—and references the companion load tool. It also conveys overwrite behavior, but it does not explicitly state when not to use it or name alternatives to avoid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_search_eventsSearch EventsARead-onlyIdempotent
Search SimConnect events by keyword, optionally filtered by category.
Spans the library's full 994-event catalog, not just the builtin fallback list. Results are paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results | |
| offset | No | Results to skip, for paging | |
| keyword | Yes | Search term, e.g. 'autopilot', 'light', 'engine' | |
| category | No | Restrict to one category, e.g. 'Autopilot' | |
| response_format | No | 'markdown' for a compact table, 'json' for rows | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so no safety contradiction exists. The description adds meaningful behavioral context: it claims the search spans the full 994-event catalog (not just the builtin fallback list) and that results are paginated, both of which inform how an agent should call and handle results.
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 short, front-loaded with the main purpose, and every sentence earns its place: the first states the core behavior and the second adds catalog scope and pagination behavior. There is no redundant or vague 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 search tool with rich annotations, a complete input schema, and an output schema, the description covers the essential behavioral details an agent needs: the resource being searched, optional filtering, catalog breadth, and pagination. It could have explicitly mentioned the response_format option or given examples, but these are already available in the schema, so the description is adequately 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?
With 100% schema description coverage, the baseline is 3 because the schema already documents all parameters. The description adds little beyond what the schema provides, though it does reinforce 'optionally filtered by category' and mentions pagination, which maps to the limit and offset parameters. No parameter details are contradicted or left unclear.
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 an explicit action ('Search'), a specific resource ('SimConnect events'), and the main input ('by keyword, optionally filtered by category'). It also distinguishes the tool from sibling search tools like msfs_search_simvars and msfs_search_lvars by naming its resource, and clarifies it covers the full 994-event catalog rather than only the builtin fallback list.
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 clear context for when the tool is appropriate: searching events by keyword with optional category filtering, and it notes that the full catalog is searched, not just the fallback list. It does not explicitly name alternatives or exclusion conditions, but the purpose is explicit enough that an agent can select it over trigger-oriented or simvar-search siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_search_hubhopSearch HubHop PresetsARead-onlyIdempotent
Search the MobiFlight HubHop community preset database.
HubHop covers far more aircraft than the bundled catalogs, so this is
the place to look when msfs_search_lvars finds nothing for the loaded
aircraft. Each result's code field holds RPN -- typically (>K:...)
or (>H:...) -- that you can pass directly to
msfs_execute_calculator_code or msfs_trigger_custom_event, so a match
here is immediately actionable, not just informational.
The first call in this server's session downloads the full preset database (roughly 32,000 presets, ~17 MB) and keeps it in memory; that call alone can take several seconds. This is expected, not a hang. Later calls, including to msfs_list_hubhop_aircraft, reuse the same in-memory copy and return quickly, for up to 6 hours -- after that the next call re-fetches automatically, since HubHop is a community database that keeps growing. Pass refresh=True to force an immediate re-fetch instead of waiting on that, e.g. right after publishing a new preset yourself.
Requires internet access. Supply at least one of query, vendor, aircraft or system -- the database is too large to browse unfiltered.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results | |
| query | No | Text to match against preset labels and RPN code, e.g. 'autopilot', 'landing light' | |
| offset | No | Results to skip, for paging | |
| system | No | System, e.g. 'Autopilot', 'Lights', 'Electrical' | |
| vendor | No | Vendor name, e.g. 'FenixSim', 'PMDG', 'Asobo' | |
| refresh | No | Bypass the cached preset database and re-fetch from HubHop before searching. Use this if you just added or changed a preset on HubHop and want to see it immediately, rather than waiting for the normal cache refresh. | |
| aircraft | No | Aircraft model, e.g. 'A320', 'B737-800' | |
| response_format | No | 'markdown' for a table, 'json' for rows | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent/destructive annotations, the description discloses first-call latency from downloading ~32,000 presets, 6-hour memory caching, automatic re-fetch behavior, the need for internet access, and that returned RPN code is directly executable. This is exactly the kind of operational context annotations cannot convey.
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 long but tightly organized into purpose, differentiation, performance/cache behavior, and constraints. Every sentence provides actionable guidance—there is no filler, and the most decision-relevant facts are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 optional params, no required fields, output format choice, external network dependency), the description covers all critical operational aspects: when to use it, what to expect on first call, how caching works, how to force refresh, and what to do with the results. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds extra meaning by explaining the minimum filter requirement across query/vendor/aircraft/system, detailing when to use refresh=True ('right after publishing a new preset yourself'), and clarifying the semantic value of the code field in results.
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 opens with a specific verb and resource: 'Search the MobiFlight HubHop community preset database.' It also differentiates the tool from siblings by stating HubHop 'covers far more aircraft than the bundled catalogs' and framing it as the fallback when msfs_search_lvars finds nothing.
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 explicitly tied to a condition: 'this is the place to look when msfs_search_lvars finds nothing for the loaded aircraft.' It also gives a hard constraint, 'Supply at least one of query, vendor, aircraft or system,' and explains the cache/refresh behavior so the agent knows when refresh=True is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_search_lvarsSearch L-VarsARead-onlyIdempotent
Search known aircraft L-vars by keyword.
Searches the embedded L-var catalog for the current aircraft, or every known aircraft catalog if none is loaded or auto-detected. Results are paginated. Auto-detection tries, in order: PMDG's own client-data-area probe (authoritative -- confirms which SDK the aircraft is actually running, independent of what TITLE/ATC_MODEL say), every catalog's own title_pattern matched against TITLE/ATC_MODEL (the only mechanism for a third-party catalog dropped into data/), then honest absence.
When no aircraft catalog could be auto-detected and 'catalog' was not given, this searches every catalog ('filters.catalog' reads "all") and 'message' explains how to scope the search instead. Otherwise, 'message' still discloses how the catalog was resolved -- a probed detection is a materially stronger signal than a title-text match, and a caller deciding how much to trust the result should be able to tell them apart. When the search was not scoped to one confirmed catalog, the markdown table also carries a 'Catalog' column per row -- with the Fenix catalog removed, every bundled catalog is PMDG, so a table of PMDG variables must not render as if it were confirmed for whatever aircraft is actually loaded.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results | |
| offset | No | Results to skip, for paging | |
| prefix | No | Filter by the catalog's variable-type prefix, matched exactly against each entry's 'prefix' field, e.g. PMDG's 'MCP', 'ELEC', 'EVT'. A catalog you build yourself (see msfs_browse_lvar_catalog) may use a different convention -- browse a panel first if you're unsure what a given catalog uses. | |
| catalog | No | Explicit catalog key to search, e.g. 'pmdg_737', 'pmdg_777', overriding auto-detection. Use this when the loaded aircraft isn't auto-detected, or to search a specific aircraft's catalog regardless of what's loaded. Call msfs_browse_lvar_catalog() with no arguments for the full list of keys currently bundled or dropped into data/ locally. | |
| keyword | Yes | Search term, e.g. 'seatbelt', 'autopilot', 'heading', 'fuel' | |
| category | No | Filter by panel/system category, e.g. 'Signs', 'FCU', 'Electrical' | |
| writable_only | No | Only return variables that can be written to | |
| response_format | No | 'markdown' for a compact table, 'json' for rows | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent annotations, the description discloses pagination, the ordered auto-detection strategy, the authoritative PMDG probe vs title-text match distinction, how 'message' explains resolution, and the conditional 'Catalog' column in markdown output. This is far more behavioral disclosure than annotations provide.
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 long but tightly structured: purpose first, then scope, pagination, auto-detection, fallback behavior, and trust caveats. Every sentence contributes decision-relevant detail rather than filler, and the front-loaded opening gives immediate orientation.
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?
Combined with a fully described input schema and an output schema, the description covers catalog resolution, trust calibration, pagination, scoping behavior, and result-format caveats. An agent has enough context to select parameters correctly and interpret the response appropriately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the schema already documents each parameter well. The description adds non-schema meaning by explaining that an unspecified catalog resolves to 'all' when no auto-detection succeeds, and that results are paginated, which enriches the semantics of catalog, limit, and offset.
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 opens with 'Search known aircraft L-vars by keyword' — a specific verb, resource, and search intent. It further clarifies scope ('current aircraft or every known aircraft catalog') which distinguishes it from list and browse siblings without ambiguity.
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 clear context on when the search spans all catalogs, and the schema's catalog/prefix parameters point to msfs_browse_lvar_catalog for discovering keys and conventions. However, it does not explicitly contrast this tool against siblings like msfs_list_lvars or msfs_search_simvars, so exclusion conditions are left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_search_simvarsSearch SimVarsARead-onlyIdempotent
Search the SimVar catalog by keyword.
Returns each variable's units and whether it is settable, so you can call msfs_get_simvar or msfs_set_simvar with the right arguments. Results are paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results | |
| offset | No | Results to skip, for paging | |
| keyword | Yes | Search term, e.g. 'altitude', 'engine' | |
| category | No | Restrict to one category, e.g. 'Aircraft Position' | |
| response_format | No | 'markdown' for a compact table, 'json' for rows | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds useful behavioral context beyond the annotations by noting that results include units, settable status, and pagination, which helps the agent understand what to expect from the call.
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 compact and front-loaded: the main action is stated in the first sentence, followed by return-value purpose and pagination detail in two short sentences. 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 search tool with a detailed input schema, a present output schema, and rich annotations, the description is complete. It explains the core operation, the key returned fields, and pagination, while leaving parameter formatting and response-shape details to the schema where they are already well documented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with each parameter already described clearly, including examples for keyword and category. The description adds no new parameter-level detail, but it reinforces the overall purpose of returning units and settable flags, which is enough to meet the baseline for high schema coverage.
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 opens with a specific verb and resource: 'Search the SimVar catalog by keyword.' It clearly distinguishes this tool from sibling get/set and event/LVar search tools by stating it returns units and settable status, which directly supports msfs_get_simvar and msfs_set_simvar.
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 clear context for when to use the tool: before calling msfs_get_simvar or msfs_set_simvar, to obtain the right arguments. It does not explicitly list alternatives or exclusions, but the SimVar-specific scope and stated purpose make the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_send_pmdg_eventSend PMDG EventADestructive
Send a PMDG control event (777 or 737 NG3).
Triggers cockpit controls (switches, buttons, knobs) using the PMDG SDK event system. Use msfs_search_lvars() to find events — look for entries with an 'events' field.
| Name | Required | Description | Default |
|---|---|---|---|
| variant | No | Optional aircraft SDK variant. When omitted, the variant is detected from the loaded aircraft; if detection fails, the event name is looked up in both catalogs and the first match wins (PMDG 777 takes priority on ambiguity). | |
| parameter | No | Optional position value. For toggle switches, omit this. For selectors, pass the desired position (0, 1, 2, etc). | |
| event_name | Yes | PMDG event name (e.g., 'EVT_OH_ELEC_BATTERY_SWITCH'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, and the description adds meaningful behavioral context by specifying that it triggers switches, buttons, and knobs in the cockpit via the PMDG SDK. There is no contradiction; the added detail helps the agent understand that calling this tool can change aircraft state.
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 three sentences with no filler. It front-loads the core purpose, gives the relevant aircraft variants, and ends with actionable discovery guidance. Every sentence contributes information the agent needs.
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 relatively simple three-parameter tool, the description plus rich schema and annotations cover the essential knowledge: what the tool does, how to find valid event names, how parameters behave, and the mutating/destructive nature. The output schema further reduces the need for return-value documentation.
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 baseline is 3. The description adds value by pointing to event discovery via msfs_search_lvars(), but it does not elaborate on parameter semantics; the schema already thoroughly describes variant detection, parameter position values, and event_name examples.
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 names a specific verb and resource: sending a PMDG control event for the 777 or 737 NG3, and clarifies it triggers cockpit controls via the PMDG SDK. This distinguishes it from generic event tools like msfs_trigger_event and from PMDG read tools like msfs_get_pmdg_var.
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 one useful prerequisite: find events using msfs_search_lvars() and look for an 'events' field. However, it does not explicitly state when to prefer this tool over sibling alternatives such as msfs_trigger_event or msfs_trigger_custom_event, nor does it explain why PMDG events require a dedicated tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_send_sim_textShow Text In SimA
Display a text overlay message in the simulator (debug feedback).
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text message to display in the sim | |
| color | No | One of white, red, green, blue, yellow, magenta, cyan, black | white |
| duration_s | No | How long to display it, in seconds |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover non-read-only, non-idempotent, non-destructive behavior; the description adds that it is an overlay message for debug feedback but does not disclose details such as whether new messages replace old ones or whether appearance settings affect behavior beyond the parameters. It does not contradict annotations, but it adds only modest behavioral context.
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 front-loaded sentence with no filler. Every word adds value: it states the action, the target resource, and the intended use case.
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 tool with a complete input schema, an output schema, and useful annotations, the description carries enough context to invoke the tool correctly. It could be stronger by explicitly stating that the message is transient and purely visual, but the combination of description, schema, and annotations covers the essentials.
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 all parameters (text, color, duration_s) already clearly documented in the input schema. The description adds only the 'debug feedback' intent and no parameter-specific meaning, so the baseline of 3 is 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?
The description uses the specific verb 'Display' and names the exact resource ('text overlay message in the simulator'), making the tool's function immediately obvious. The phrase 'debug feedback' reinforces intent, and the described action is unique among the sibling tools listed, so an agent can distinguish it without opening the schema.
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 parenthetical '(debug feedback)' gives clear situational context: this tool is for displaying temporary informational messages during debugging. It does not explicitly mention when not to use it or name alternatives, but no sibling tool provides the same text-overlay capability, so the context is sufficient for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_set_aircraft_positionReposition AircraftADestructiveIdempotent
Reposition the aircraft (test scenario setup).
Uses SimConnect's SIMCONNECT_DATA_INITPOSITION, which repositions the aircraft atomically. Writing PLANE_LATITUDE/LONGITUDE individually, as this used to, is unreliable and cannot set the on-ground state.
The response reports the position read back from the sim after the
move, in latitude/longitude/etc -- never the request, which is
echoed separately under requested for comparison. A field the
read-back could not confirm is null (and listed in unverified), not
silently replaced by what was asked for. status still reports "ok"
since the reposition command itself may well have succeeded even if the
confirming read did not; check unverified/warning for that.
| Name | Required | Description | Default |
|---|---|---|---|
| bank | No | Bank in degrees | |
| pitch | No | Pitch in degrees | |
| heading | No | Target heading in degrees true. Omit to keep the current heading. | |
| airspeed | No | Target airspeed in knots (0 for a stationary placement) | |
| altitude | No | Target altitude in feet. Omit to keep the current altitude. | |
| latitude | Yes | Target latitude, degrees | |
| longitude | Yes | Target longitude, degrees | |
| on_ground | No | Place the aircraft on the ground at the position |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say the operation is not read-only, open-world, idempotent, and destructive. The description goes far beyond this: it discloses atomicity, that the reported position is a read-back rather than the request, that unconfirmed fields are null and listed in `unverified`, and that `status` may still say 'ok' even when the read-back did not confirm the move. This is exactly the kind of behavioral context an agent needs.
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 well structured: purpose first, then implementation rationale, then response-reading caveats. It is slightly verbose but every sentence conveys a distinct and useful fact; the depth is justified by the non-obvious 'ok' read-back behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 8-parameter schema with 100% coverage and a true output schema, the description does not need to repeat parameter docs. It supplies the remaining essential context: when it is meant for (test setup), the atomic method, the old pitfall, and how to interpret the response. An agent has everything needed to invoke it and trust 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 input schema fully documents each parameter. The description adds no per-parameter semantics beyond mentioning that the on-ground state can be set; it mostly explains output behavior, which belongs to response semantics rather than parameter semantics. Baseline 3 is 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?
The first sentence uses a specific verb and resource: 'Reposition the aircraft (test scenario setup).' It also clarifies the implementation (SIMCONNECT_DATA_INITPOSITION, atomic) and contrasts with the unreliable individual variable-writing approach, distinguishing it from sibling msfs_set_simvar-style tools.
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?
It gives clear context: test scenario setup for aircraft repositioning, and warns that the previous method of writing PLANE_LATITUDE/LONGITUDE individually is unreliable and cannot set on-ground state. It does not enumerate all alternatives or give explicit when-not-to-use conditions, so I deduct slightly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_set_lvarWrite L-VarADestructiveIdempotent
Write a value to an L-var on the current aircraft.
Uses native SimConnect data definitions (AddToDataDefinition + SetDataOnSimObject), which works with proprietary aircraft like the Fenix A320/A321. Does NOT require MobiFlight and does NOT use the MobiFlight RPN set() command.
Reads the variable back afterwards and reports 'verified': true if the value landed, false if it did not, null if the read-back could not be completed. A false or null is never reported as success.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | L-var name; the 'L:' prefix is optional | |
| value | Yes | Numeric value to write |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal mutation, idempotence, and open-world effects. The description adds substantial behavior beyond that: it reveals the native SimConnect mechanism, the compatibility with Fenix aircraft, and the crucial verification semantics ('verified': true/false/null with 'false or null is never reported as success'). This is exactly the kind of non-obvious behavioral context an agent needs when deciding whether to trust the result of a write.
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 tight paragraphs, each carrying a distinct purpose: the core action, the implementation/compatibility detail, and the verification semantics. There is no filler or repetition. The primary purpose is front-loaded, and every sentence 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?
With an output schema present, the description does not need to enumerate return fields beyond the critical 'verified' semantics it already explains. Two required parameters are fully documented in the schema, and the description covers the operational context (current aircraft, Fenix compatibility, no MobiFlight). Nothing an agent needs to call this tool correctly is missing.
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%; both parameters ('name' and 'value') already have clear descriptions in the input schema. The tool description restates the operation but adds no new meaning about the parameters themselves, so baseline 3 is 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?
The description states a specific action ('Write'), resource ('L-var'), and scope ('on the current aircraft'), and it further distinguishes itself by explicitly noting it does not use MobiFlight RPN, separating it from sibling tools like msfs_execute_calculator_code. The L-var vs simvar distinction is carried by the name and reinforced by the description. This is a clear, unambiguous 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?
The description provides concrete usage context: it works with proprietary aircraft like the Fenix A320/A321 and does NOT require MobiFlight. This implies when to prefer this tool over MobiFlight-based approaches. It does not explicitly name alternatives such as msfs_set_simvar or state exclusions, but the 'does NOT require MobiFlight' clause gives sufficient selection guidance for an agent comparing siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_set_simvarWrite SimVarADestructiveIdempotent
Write a value to a settable SimVar.
Fails with a specific error if the sim rejects the write, rather than reporting success. Check the 'settable' flag with msfs_search_simvars first.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | SimVar name; must be settable | |
| unit | No | Unit the value is expressed in. Defaults to the catalog unit. | |
| index | No | Index for indexed SimVars. Index 0 is valid. | |
| value | Yes | Value to write |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds a meaningful behavioral detail beyond the annotations: it fails with a specific error if the sim rejects the write, rather than reporting success. This helps an agent understand failure semantics. The annotations already cover read-only, destructive, idempotent, and open-world traits, so the description supplements rather than repeats them.
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 two short sentences with no filler. The main action is front-loaded, and the error behavior and prerequisite are provided in the second sentence, both earning their 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?
The description covers the core operation, a key precondition, and failure behavior, while the annotations and output schema handle safety and return shape. It does not mention a requirement to be connected to the simulator, but that is likely implied by the tool family and sibling msfs_connect.
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 input schema already documents all four parameters well. The description adds no additional parameter-level meaning beyond the schema, making the baseline 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?
The description opens with the specific verb 'Write' and resource 'settable SimVar', which clearly identifies the operation and distinguishes it from sibling tools like msfs_set_lvar. The 'settable' qualifier adds precision about which SimVars are valid targets.
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 explicit guidance: check the 'settable' flag with msfs_search_simvars before writing. This provides a clear precondition and context for correct use, though it does not name alternative tools or explicit when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_trigger_custom_eventTrigger Custom EventADestructive
Fire a custom event as a key event through the MobiFlight WASM module.
Requires the MobiFlight WASM module. The event is delivered via the WASM
module's RPN interface -- (>K:NAME), or PARAM (>K:NAME) when a
parameter is given -- not through native SimConnect event mapping (that
is msfs_trigger_event). This reaches events outside the standard
SimConnect catalog.
An aircraft with its own event system (PMDG, Fenix) may silently ignore
a default key event in favour of its own SDK: measured live against a
PMDG 737, PARKING_BRAKES delivered through this path had no effect on
the aircraft's brake state, while a sim-level event (no aircraft can
intercept it) delivered correctly. A no-op result on such aircraft means
the aircraft ignored the event, not that this tool failed.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Custom event name, e.g. 'MobiFlight.AS1000_PFD_SOFTKEYS_1' | |
| parameter | No | Optional integer parameter |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the exact RPN delivery syntax, the fact that this is not native SimConnect event mapping, and the important aircraft-specific no-op behavior with a concrete PMDG 737 example. This is rich behavioral context that the structured fields do not provide.
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 focused paragraphs each serve a distinct purpose: definition, mechanism and alternative, and failure-mode caveat. The PMDG example is detailed but earns its place by explaining a non-obvious result an agent would otherwise misinterpret. There is no fluff.
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 non-trivial runtime behavior, the description covers mechanism, prerequisite, alternative path, and failure interpretation. With full schema coverage and an output schema present, nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters and gives an example for `name`. The description adds genuine value by showing how `name` maps to `(>K:NAME)` and how `parameter` is prefixed when present, clarifying the runtime semantics beyond the schema.
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 first sentence states a specific action ('Fire a custom event as a key event') and a specific resource ('through the MobiFlight WASM module'). The second paragraph explicitly contrasts this with msfs_trigger_event, making the tool's distinct role in the sibling set clear.
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 names msfs_trigger_event as the native SimConnect alternative and explains that this path reaches events outside the standard SimConnect catalog, which helps an agent choose between them. It also flags the WASM module requirement. It stops short of an explicit 'use this when / use that when' rule, but the guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_trigger_eventTrigger EventADestructive
Fire a SimConnect event.
Resolves through the library's 994-event catalog first, then falls back to mapping the name directly, so third-party and newer MSFS events work too. Either way, the event is sent through the same MapClientEventToSimEvent + TransmitClientEvent pair, correlated by send ID on a dispatcher-equipped connection (NAME_UNRECOGNIZED/ERROR mean the event doesn't exist; other exceptions propagate as errors).
That correlation proves SimConnect accepted the packet -- not that the
aircraft acted on it. An aircraft with its own event system (PMDG, Fenix)
can silently ignore an event it received in favour of its own SDK; see
message and CLAUDE.md's "Known Sim Behaviours".
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Event name, e.g. 'PARKING_BRAKES', 'AP_MASTER', 'THROTTLE_SET' | |
| parameter | No | Integer parameter for events that take one. Negative values are supported (e.g. AP_VS_VAR_SET_ENGLISH). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations by disclosing the underlying MapClientEventToSimEvent + TransmitClientEvent mechanism, send-ID correlation, error behavior (NAME_UNRECOGNIZED/ERROR vs propagated exceptions), and the critical caveat that acceptance does not guarantee the aircraft acted on the event. This is rich, non-obvious behavioral detail.
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?
Every sentence earns its place: the opener states the action, the second paragraph explains resolution and mechanism, and the final paragraph covers important behavioral caveats. The structure is front-loaded and the density is appropriate for the tool's complexity.
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 output schema present and detailed annotations, the description covers resolution order, error handling, correlation limits, and aircraft-specific behavior. It even points to external documentation for known Sim Behaviours. No critical operational information appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the schema already documents name examples and integer parameter behavior including negative values. The description adds context about name resolution through the catalog and direct mapping, but does not further clarify parameter semantics beyond the schema.
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?
Description opens with 'Fire a SimConnect event' — a specific verb and resource. It further defines scope by explaining the 994-event catalog resolution and fallback to direct name mapping, making clear this is the generic SimConnect event trigger, distinct from siblings like msfs_trigger_custom_event.
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 useful context: it works for both catalog events and third-party/newer MSFS events, and explains error semantics. However, it does not explicitly say when to prefer this tool over alternatives such as msfs_trigger_custom_event or msfs_set_simvar; usage is implied rather than directly contrasted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
msfs_watch_simvarWatch SimVar Over TimeARead-only
Sample a SimVar over time, returning a time series for debugging.
Fails fast if the first read raises, rather than looping for the full duration on a name or unit that will never work.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | SimVar name to watch | |
| unit | No | Unit to read in. Defaults to the catalog unit. | |
| index | No | Index for indexed SimVars. Index 0 is valid. | |
| duration_s | No | Total sampling duration in seconds | |
| interval_ms | No | Polling interval in milliseconds |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and destructiveHint annotations, the description discloses a valuable failure behavior: it fails fast on the first read error instead of wasting the full sampling duration. This directly informs agent expectations about error handling and performance.
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 only two short paragraphs, with the core behavior front-loaded in the first sentence and the key failure mode in the second. Every sentence contributes meaningful information with 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?
With a complete 100% parameter schema, an output schema, and annotations covering read-only and non-destructive behavior, the description adds what structured data cannot: the time-series purpose and fail-fast behavior. Nothing essential for correct invocation is missing.
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 baseline is 3. The description does not add parameter-level meaning beyond the schema, though the mention of 'name or unit' in the fail-fast note lightly reinforces those parameters' roles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses 'Sample a SimVar over time' with a specific verb and resource, and 'returning a time series' makes the output explicit. This clearly distinguishes it from one-shot alternatives like msfs_get_simvar and msfs_get_simvars_bulk.
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?
'For debugging' gives a clear context and 'over time' implies the use case, but the description never names alternative tools or states when not to use this one. The guidance is present only by implication, not explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
32 tool updates
v1.0.1- First observed
msfs_browse_lvar_catalog - First observed
msfs_connect - First observed
msfs_create_ai_object - First observed
msfs_disconnect - First observed
msfs_execute_calculator_code - First observed
msfs_get_aircraft_snapshot - First observed
msfs_get_connection_status - First observed
msfs_get_facility_info - First observed
msfs_get_lvar - First observed
msfs_get_nearby_airports - First observed
msfs_get_pmdg_cdu - First observed
msfs_get_pmdg_var - First observed
msfs_get_simvar - First observed
msfs_get_simvars_bulk - First observed
msfs_list_hubhop_aircraft - First observed
msfs_list_lvars - First observed
msfs_list_simvar_categories - First observed
msfs_load_flight - First observed
msfs_load_flight_plan - First observed
msfs_save_flight - First observed
msfs_search_events - First observed
msfs_search_hubhop - First observed
msfs_search_lvars - First observed
msfs_search_simvars - First observed
msfs_send_pmdg_event - First observed
msfs_send_sim_text - First observed
msfs_set_aircraft_position - First observed
msfs_set_lvar - First observed
msfs_set_simvar - First observed
msfs_trigger_custom_event - First observed
msfs_trigger_event - First observed
msfs_watch_simvar
TDQS
Each tool targets a distinct resource+action combination: SimVars, L-Vars, PMDG data, events, flights, facilities, HubHop, and AI objects. Near-pairs like trigger_event vs trigger_custom_event and get_simvar vs get_lvar are explicitly differentiated by mechanism or data source, so an agent can reliably pick the right tool.
All tools share the msfs_ prefix and consistently use verb_object naming: get_simvar, set_simvar, search_events, load_flight, create_ai_object. Minor variants like get_simvars_bulk and execute_calculator_code are still readable and fit the overall pattern.
32 tools is above the rubric's 'too many' threshold and creates a large surface for an agent to scan, even though MSFS/SimConnect is a broad domain. The set could reasonably be split into focused servers for core variables, events, PMDG/HubHop, and flight/AI operations.
The tool set covers connection lifecycle, SimVar/LVar read/write/search, events, aircraft state, facilities, PMDG data, HubHop search, flight persistence, and AI spawning. The notable gap is that AI objects can be created but not removed, which leaves a cleanup dead end; otherwise the surface is extensive and workable.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
One connector for 15,000+ MCP servers plus your team's private MCPs, from any AI client.
Build and supervise fleets of agents from Claude Code, Codex or Cursor. Connects over OAuth.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Related MCP Servers
- AlicenseAqualityCmaintenanceSimBrief MCP Server brings flight planning data directly into your AI workspace. Access your SimBrief flight plans (OFP), retrieve real-time METAR weather reports for any airport, and fetch pilot information - all through natural conversation. Built for virtual pilots who want to streamline their pre-flight briefing workflow in Microsoft Flight Simulator, X-Plane, and other flight simulation platf141MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to interact with DCS World in real-time through chat by executing Lua scripts and providing tools for mission info, unit management, coordinate conversion, and more.108MIT
- AlicenseAqualityBmaintenanceEnables AI agents to access live aviation data including METAR weather, airport information, aircraft specs, an aviation glossary, and FAA-style practice questions via the free Rotate Pilot API.6211MIT
- AlicenseAqualityBmaintenanceEnables MCP clients like Claude to read live state and control aircraft in Microsoft Flight Simulator 2024 via SimConnect, FSUIPC7, and raw memory, offering 23 tools for simvars, events, autopilot, and more.23MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/robin24/simconnect-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server