positioning-mcp
This MCP server lets AI coding agents run reproducible indoor-positioning experiments against the engine and inspect the resulting metrics.
List simulation scenarios and describe venue layouts, walls, levels, hardware, and beacon positions.
Inspect effective engine configs for presets (
pf,pf-nomap,ekf,wcl) and test JSON config patches.Simulate synthetic IMU/BLE/barometer/ground-truth traces, including scenario overrides such as dead or moved beacons.
Replay scenarios, trace files, or real phone recordings through filters and get accuracy metrics plus a
run_id.Break down error windows, find nearest truth/estimate beacons, and plot floor plans with true/estimated tracks and error over time.
Compare filters over multiple seeds and A/B test config changes across scenarios with per-scenario verdicts.
Benchmark real walks and run the engine's CI accuracy regression gates.
Access engine documentation and latest-results resources.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@positioning-mcpwhy is the blue dot jumping in office_field_issue?"
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.
positioning-agent-tools
An MCP server that lets AI coding agents (Claude Code, Cursor, Codex) run experiments on the indoor-positioning-engine instead of reasoning about positioning accuracy from code alone.
An agent asked "why is the blue dot jumping in this venue?" can simulate the venue, replay it through each filter, find the time window where the error spikes (or the estimate is on the wrong floor), see which beacons sit next to the wrong estimate, change one fault in the scenario to test a hypothesis, A/B test a fix across every scenario on identical seeds, and check it on real phone walks. Every tool returns numbers that come from the engine's own replay and metrics code, so the agent's claims can be checked.
Tools
Tool | What it does |
| Scenarios, their venue, and the real-world fault each one injects |
| Size, walls, levels, stairs and lifts, mapped wall and slab loss, transmitter positions |
| Effective config of a preset ( |
| Config files shipped with the engine ( |
| Real phone walks that can be replayed, and the tune/holdout manifests if the dataset is converted |
| Synthetic IMU/BLE/barometer/ground-truth trace, with scenario overrides (e.g. kill one beacon) |
| One scenario, real recording or trace file through one filter; metrics plus a |
| Windows where error exceeded a threshold or the floor was wrong, with the beacons nearest the truth and the estimate |
| PNG of each visited floor plan, true and estimated tracks, and error over time with wrong-floor intervals |
| Several filters on one scenario, averaged over seeds |
| Config change vs defaults on every scenario, same seeds; verdict per scenario: better, worse, mixed or same |
| Real walks through each filter, per floor; medians over walks |
| The engine's CI accuracy gates: simulated scenarios, held-out real walks, or both |
Resources: ipe://docs/agents (the engine's AGENTS.md), ipe://docs/formats, ipe://docs/design,
ipe://docs/experiments, ipe://docs/real_data, ipe://results/latest.
On multi-floor venues CEP only counts fixes on the correct floor, so the tools report floor_accuracy
next to it, and ab_test counts a floor-accuracy change of more than 3 points (the engine's regression
tolerance) like a CEP change. coverage95 (share of fixes inside the reported 95% ellipse) appears where
the filter reports a covariance.
The server instructions tell the agent how to use them: never judge a change from one seed, report regressions in other scenarios, separate model problems from data problems, check real walks before claiming field accuracy, tune on the tune walks and report on holdout, and never regenerate a regression baseline to make the gate pass.
Related MCP server: Sentinel MCP
Setup
Build the engine's command-line tools (unit tests are not needed here):
git clone https://github.com/Yusufss4/indoor-positioning-engine
cmake -S indoor-positioning-engine -B indoor-positioning-engine/build -DCMAKE_BUILD_TYPE=Release -DIPE_BUILD_TESTS=OFF
cmake --build indoor-positioning-engine/build -j
git clone https://github.com/Yusufss4/positioning-agent-tools
cd positioning-agent-tools
python3 -m venv .venv && .venv/bin/pip install -e '.[dev]'If the two repositories are checked out side by side, the server finds the engine on its own. Otherwise
set IPE_ROOT (engine checkout), and optionally IPE_BUILD (default $IPE_ROOT/build) and
IPE_WORKDIR (scratch space for traces and runs, default ~/.cache/positioning-agent-tools).
Claude Code
claude mcp add positioning -e IPE_ROOT=/path/to/indoor-positioning-engine -- /path/to/positioning-agent-tools/.venv/bin/positioning-mcpCursor (.cursor/mcp.json in the engine checkout, or ~/.cursor/mcp.json)
{
"mcpServers": {
"positioning": {
"command": "/path/to/positioning-agent-tools/.venv/bin/positioning-mcp",
"env": { "IPE_ROOT": "/path/to/indoor-positioning-engine" }
}
}
}Codex (~/.codex/config.toml)
[mcp_servers.positioning]
command = "/path/to/positioning-agent-tools/.venv/bin/positioning-mcp"
env = { IPE_ROOT = "/path/to/indoor-positioning-engine" }Example: investigating a field issue
examples/investigate_field_issue.py scripts the sequence of tool
calls an agent makes on office_field_issue (two dead beacons, one installed in the wrong room), using
the particle filter configuration from before the engine fix. Output, abridged:
compare_filters (5 seeds): the map-aware particle filter is worse than the map-free one, which
should not happen.
filter | mean [m] | CEP50 [m] | CEP95 [m] | converged [s] | cov95 |
pf | 1.35 | 0.80 | 5.41 | 5.9 | 80% |
pf-nomap | 1.17 | 0.97 | 2.42 | 3.5 | 77% |
ekf | 1.27 | 0.86 | 4.09 | 16.1 | 75% |
error_breakdown finds one window, t = 31.0-39.4 s, peak error 18 m. The truth is 1.9 m from
beacon N3; the estimate is 4.2 m from beacon S3. That points to S3 being somewhere other than where the
map says.
compare_filters with scenario_overrides={"ble": {"moved_beacons": null}} puts S3 back. The
map-aware filter's CEP95 drops from 5.41 to 2.88 m, which confirms the hypothesis.
ab_test of the pre-fix config (B) against the current defaults (A) shows the engine fix is a
trade-off, not a free win:
scenario | filter | CEP50 A -> B | CEP95 A -> B | floor acc A -> B | B is |
airport_hall_sparse | pf | 1.38 -> 1.55 | 8.26 -> 6.58 | - | mixed |
baro_drift_long | pf | 0.65 -> 0.64 | 2.04 -> 1.76 | 100% -> 100% | better |
office_device_offset | pf | 0.65 -> 0.75 | 1.82 -> 2.40 | - | worse |
office_elevator | pf | 0.62 -> 0.63 | 1.67 -> 1.50 | 99% -> 99% | better |
office_field_issue | pf | 0.76 -> 0.80 | 2.42 -> 5.41 | - | worse |
office_floor_bleed | pf | 0.85 -> 0.76 | 4.42 -> 2.93 | 96% -> 98% | better |
office_mag_disturbance | pf | 1.06 -> 0.98 | 2.65 -> 2.51 | - | better |
office_nlos_heavy | pf | 0.64 -> 0.66 | 2.23 -> 2.03 | - | better |
office_nominal | pf | 0.60 -> 0.61 | 1.37 -> 1.37 | - | same |
office_stairs_up_down | pf | 0.79 -> 0.77 | 3.32 -> 2.08 | 99% -> 99% | better |
office_step_scale | pf | 0.62 -> 0.55 | 1.75 -> 1.51 | - | better |
With 5 seeds several of these deltas are within noise. The engine's experiment log repeats the comparison with 20 seeds. The multi-floor scenarios were added after the fix, and the pre-fix config does better on all four of them (office_floor_bleed CEP95 4.42 -> 2.93 m), which is worth a second look at the fix on those venues.
Example: real phone walks
The simulator and the filters share one radio model, so simulated numbers are optimistic. The engine ships held-out walks from two shopping malls (Microsoft Indoor Location dataset, Wi-Fi positioning, ground truth only at the surveyor's waypoints):
list_recordingslists them with their recommendedconfig_file(msil_wifi).run_replay(recording="site1_F2_5dda5afc")applies that config by default: CEP50 2.65 m, CEP95 4.49 m over 19 waypoints. Withconfig_file="none"(engine defaults) CEP95 is 17.89 m. In both casescoverage95is around 0.2: the filter is far more confident than it should be.error_breakdown(threshold_m=4)returns four single-waypoint windows of 4.0-4.8 m and says that the track between waypoints (8.4 s apart) is unknown.benchmark_recordings(manifest="holdout")needs the converted dataset (datasets/msil/fetch.sh, see the engine'sdocs/real_data.md;manifest="demo"works without it). On the 109 held-out walks:
group | filter | walks | median CEP50 [m] | median CEP95 [m] |
all | pf | 109 | 7.07 | 9.50 |
all | wcl | 109 | 8.15 | 14.53 |
Development
.venv/bin/pytest -qThe tests call the real engine binaries (they are skipped if the engine is not built). They exercise the
tools directly, through the server's MCP dispatch, and end to end by spawning positioning-mcp and
talking to it over stdio with the MCP client, as an agent would. Real-data tests use only the walks
committed in the engine's data/real; the full held-out gate is exercised only for its "skipped" path.
CI builds the engine from source and runs them on every push.
License
MIT
Available Tools
10 toolsab_testB
A/B test a configuration change across scenarios on identical seeds.
A = current defaults, B = defaults + config_patch (JSON merge patch, e.g. {"pf": {"num_particles": 500}}). Returns per-scenario CEP deltas with a verdict for B (better, worse, mixed or same) and a summary. "mixed" means CEP50 and CEP95 moved in opposite directions; treat it as a trade-off, not a win.
| Name | Required | Description | Default |
|---|---|---|---|
| seeds | No | ||
| presets | No | ||
| scenarios | No | ||
| config_patch | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full disclosure burden. It does valuable work explaining the return contract (per-scenario CEP deltas, verdict values, and how to interpret 'mixed' as a trade-off), but it never says whether the patch is persisted or purely experimental, how many runs are executed, or whether the operation is expensive or read-only in effect.
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?
Front-loaded with the action, followed by the A/B definition, the return contract, and one interpretive caveat. Every sentence adds information an agent would otherwise have to guess, and nothing is repeated from the schema.
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?
There is no output schema, and the description compensates by describing the result shape and verdict vocabulary. But for a 4-parameter tool with a nested free-form object and zero schema coverage, the failure to explain presets/scenarios scoping or whether the patch is persisted leaves real gaps 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 0%, so the description must compensate. It explains config_patch well with a JSON merge-patch example, but 'presets', 'scenarios' and 'seeds' are never described in either place — the agent cannot tell that presets/scenarios select the comparison set or that seeds is a repetition count (default 5).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('A/B test a configuration change across scenarios on identical seeds') and defines exactly what A and B mean in terms of the config_patch. It doesn't explicitly distinguish itself from the similar-sounding sibling compare_filters, so the agent must infer the boundary, but the core action is unambiguous.
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?
Implicit guidance: it's clearly for evaluating a proposed config change against current defaults on comparable seeds. However, there is no explicit when-to-use/when-not, no mention of the alternative paths (editing config via engine_config, or single-scenario validation via simulate_scenario), and no note about cost/runtime relative to a single simulation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_filtersB
Mean CEP50/CEP95/convergence of several filters on one scenario, averaged over seeds.
scenario_overrides (JSON merge patch on the scenario; null deletes a key) lets you remove or add a
single fault to test a hypothesis, e.g. {"ble": {"moved_beacons": null}}.
| Name | Required | Description | Default |
|---|---|---|---|
| seeds | No | ||
| filters | No | ||
| scenario | Yes | ||
| config_patch | No | ||
| scenario_overrides | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that results are averaged over seeds and that scenario_overrides is a JSON merge patch where null deletes a key, but it omits return format, how many seeds are used by default, and what config_patch changes.
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 and front-loaded with the core computation, followed by a compact example for the most unusual parameter. It avoids waste, though it could mention returned metrics or defaults more explicitly.
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 five-parameter comparison tool with no annotations and no output schema, this is only minimally complete. The scenario_overrides behavior is well covered, but config_patch, return structure, and sibling differentiation are 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 0%, so the description should compensate for five undocumented parameters. It explains scenario_overrides well and implies the roles of scenario, filters, and seeds, but leaves config_patch and the expected filter-name format entirely unexplained.
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 computation: mean CEP50, CEP95, and convergence across several filters on one scenario, averaged over seeds. This is more specific than a bare verb, but it does not distinguish the tool from the sibling ab_test, which may also compare configurations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the scenario_overrides example: vary one fault to test a hypothesis. The description does not say when to choose compare_filters over ab_test or run_regression, nor does it state prerequisites such as needing a scenario name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_venueC
Floor size, wall count, mapped wall attenuation and beacon positions of a venue (e.g. 'office_floor').
| Name | Required | Description | Default |
|---|---|---|---|
| venue | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It implies a read of venue metadata but does not explicitly say it is read-only, whether it errors for unknown venues, or what the response structure looks like.
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 and front-loads the returned fields without wasted words. However, it is a sentence fragment rather than an action-oriented statement, which slightly weakens clarity despite the brevity.
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 annotations, no output schema, and no documented parameters, the description leaves important gaps. It tells the agent what venue attributes are involved but not what it receives, whether the call is safe, or how to supply the required venue argument 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 0%, and the sole parameter 'venue' has no type description beyond being a string. The example 'office_floor' gives a hint about the expected identifier format, but the description does not name the parameter, explain how to obtain valid values, or clarify whether it is a name, ID, or path.
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 enumerates the venue attributes returned (floor size, wall count, attenuation, beacon positions), which makes the resource clear. However, it is a noun phrase with no verb and does not explicitly state that the tool retrieves or describes a venue, leaving the action implicit from the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool, what it requires, or how it relates to any sibling tool. The sibling list is about scenarios and runs rather than venue metadata, so there is little opportunity for confusion, but the description still provides no usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
engine_configA
Effective engine configuration for a preset (pf, pf-nomap, ekf, wcl), optionally with a JSON merge patch.
Use this to discover tunable parameter names before writing a config_patch.
| Name | Required | Description | Default |
|---|---|---|---|
| preset | No | pf | |
| config_patch | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. 'Effective ... configuration' implies a computed read, and the merge-patch behavior is disclosed, but the ambiguity that matters is left open: is the patch applied persistently or is this a preview? Nor does it confirm the operation is non-destructive. Useful context, meaningful gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the core function stated first and the workflow hint second. Every clause contributes either scope, valid values, or a usage rule.
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 two-parameter tool with no annotations and no output schema, the description covers the input side adequately but omits the return shape entirely. Since the tool's stated purpose is discovering tunable parameter names, a sentence on what the configuration object looks like (nested key paths, units, defaults) would materially help an agent use 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 0%, so the description must compensate and only partly does: it enumerates the preset values and labels config_patch a JSON merge patch. It never explains what the presets mean (pf vs ekf vs wcl), gives no patch format example, and does not say what a null patch yields. The enum-like preset list is the main value added.
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?
Names a specific resource (effective engine configuration) scoped to a preset, and enumerates the four valid presets inline (pf, pf-nomap, ekf, wcl), which the schema does not. It also states the merge-patch capability. It stops short of explicitly differentiating itself from siblings like simulate_scenario or list_scenarios, but the verb+resource pairing is unambiguous.
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 a concrete use case and a sequencing rule: call this to discover tunable parameter names before writing a config_patch. That is real routing guidance rather than a restatement. It does not name an alternative tool or state when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
error_breakdownB
Time windows where the error stayed above a threshold, with the true and estimated position at the peak and the beacons nearest to each. Useful for spotting moved beacons and divergence.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | ||
| threshold_m | No | ||
| min_duration_s | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does usefully disclose the return structure (windows, peak true/estimated position, nearest beacons), which substitutes for the missing output schema. However, it says nothing about it being a read-only diagnostic, the cost of the computation, or how the defaults behave, leaving meaningful behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the core output shape is front-loaded before the use case. Every clause adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate but with clear gaps for a 3-parameter tool with no annotations and no output schema. The return shape is covered, but the required run_id is unexplained, the two tuning parameters lack units/defaults, and the tool's position relative to the other nine diagnostic siblings is unstated.
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 0%, so the description must carry parameter meaning, and it only partially does. "Above a threshold" and "time windows" loosely map to threshold_m and min_duration_s, but no units, defaults (3 m, 1 s), or filtering semantics are given. run_id, the sole required parameter, is never mentioned at all.
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 specifies the resource precisely: time windows where error exceeded a threshold, with true/estimated positions at the peak and nearest beacons. An agent can distinguish this from plot_run or compare_filters because the output shape (threshold-crossing windows, peak positions) is stated. It falls short of 5 because it never explicitly says this analyzes a single run's error trace, nor names which sibling it competes with.
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?
"Useful for spotting moved beacons and divergence" gives a purpose but no when-to-use versus alternatives and no exclusions. Nothing tells the agent whether to reach for this or for plot_run / compare_filters / run_regression when diagnosing error. Usage is implied by context only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_scenariosA
List simulation scenarios with the venue they use and the real-world effect each one injects.
| 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?
With no annotations, the description carries the full behavioral burden. 'List' implies a safe read, and it does disclose what each result contains, but it says nothing about whether all scenarios are returned, whether results are ordered, or how large the catalog can get.
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?
One sentence, front-loaded with the verb and resource, with the return contents appended rather than buried. Nothing redundant.
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 tool with an output schema covering return values, the description gives what an agent needs: what is listed and what each item includes. Only the lack of any volume/ordering note keeps it from 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 tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; the schema is fully described and requires no narrative support.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('simulation scenarios'), and adds what each entry carries (venue + injected real-world effect). This is clearly a catalog read, distinguishable in kind from simulate_scenario or run_replay, though the description never names a sibling to sharpen that contrast.
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 only implied: a parameterless list reads naturally as a discovery step before simulate_scenario or run_replay, but the description never says so or mentions any alternative. No when-not-to-use guidance is offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plot_runA
Render the floor plan with the true and estimated tracks, plus error over time, as a PNG.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the output artifact (PNG) and what is visualized, which is useful, but does not state whether the tool writes a file or returns bytes, whether it is read-only, or what happens if the run_id is invalid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no unnecessary words. The key output format ('PNG') is included without burying the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter plotting tool, the description covers what is rendered and the output format. However, it omits the meaning and sourcing of run_id and any indication of error behavior, leaving a noticeable gap 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 0% for the single required parameter 'run_id', and the description does not explain what a run_id is or where to obtain one. The parameter name is somewhat self-explanatory, but the description adds no semantic meaning 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 description uses a specific verb ('Render') and names the exact resource and outputs: floor plan with true and estimated tracks plus error over time, as a PNG. This clearly distinguishes it from siblings like error_breakdown or compare_filters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: you render after a run exists, but the description does not say when to choose this over error_breakdown or other diagnostic tools. No prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_regressionC
Run the CI accuracy gate: every scenario and preset against tests/regression/baseline.json.
| Name | Required | Description | Default |
|---|---|---|---|
| seeds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose real scope ('every scenario and preset'), which signals a broad, expensive operation, but says nothing about runtime, whether failures abort the run, what artifacts are written, or whether it mutates any state. Too thin for an unannotated whole-suite execution tool.
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?
One sentence, front-loaded with the action and immediately scoped. No filler. It is efficient, though the terseness is partly the cause of the gaps elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A whole-suite accuracy gate with no output schema and no annotations needs the description to explain the pass/fail contract and the seed parameter. Neither is covered, so the agent cannot predict the result shape or the cost of a larger seed count.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'seeds' has 0% schema description coverage and is never mentioned in the description. The agent must guess that increasing seeds means more repetitions per scenario and what the cost tradeoff is. One undocumented parameter pulls this below the zero-param baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: it runs the CI accuracy gate over every scenario and preset against a named baseline file. That clearly separates it from simulate_scenario, run_replay and ab_test, which operate on targeted cases. It stops short of naming a sibling, but the scope statement does the differentiation work.
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?
'CI accuracy gate' implies the when: an all-up correctness check rather than an exploratory run. No explicit exclusion, no statement of when a targeted replay/simulation is preferable, and no prerequisite is stated. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_replayA
Run one scenario (simulated in memory) or a recorded trace file through a filter.
Returns accuracy metrics (CEP50/CEP95/mean/convergence) and a run_id for error_breakdown and plot_run. One run is one sample: use ab_test or compare_filters for conclusions.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | ||
| trace | No | ||
| venue | No | ||
| filter | No | pf | |
| scenario | No | ||
| config_patch | No | ||
| scenario_overrides | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does useful work: it discloses that simulation happens in memory and that results come back as metrics plus a reusable run_id. It does not say whether artifacts are persisted for plot_run, what happens on invalid filter/scenario, runtime cost, or whether a single sample is noisy beyond the hint that one run is one sample.
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-loaded with the action, followed by outputs then the usage caveat. 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?
All 7 parameters are undocumented in the schema and mostly unaddressed in the description, with no output schema and no annotations to fall back on. For a 7-parameter entry-point tool that gates the rest of the workflow, this leaves too much for the agent to guess.
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 0% across 7 parameters, so the description carries the full burden, yet it only touches scenario, trace, and filter. It says nothing about seed (presumably reproducibility), venue, config_patch, scenario_overrides, or the mutual exclusivity/defaults between scenario and trace.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: run one scenario (in-memory simulation) or a recorded trace file through a filter. It also implicitly scopes this as a single-sample run, which separates it from the aggregate siblings ab_test and compare_filters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'One run is one sample: use ab_test or compare_filters for conclusions', naming the alternatives and the condition that selects them. It also names error_breakdown and plot_run as downstream consumers of run_id. It does not clarify when to pick scenario vs trace input, though that is arguably a parameter-level choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
simulate_scenarioC
Generate a synthetic trace (IMU, BLE, ground truth) for a scenario.
overrides is merged into the scenario JSON, e.g. {"ble": {"dead_beacons": ["C3"]}} or
{"ble": {"device_offset_db": -6}}, to test one hypothesis at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | ||
| scenario | Yes | ||
| overrides | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, yet it only says a trace is generated. It does not disclose whether files are written to disk, whether the operation is deterministic with a seed, whether an existing scenario is required, or what the output looks like. For a generator with mutation-like side effects, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the core action, and the override examples earn their place by clarifying merge behavior. The second sentence is slightly dense but not wasteful.
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 three parameters, no annotations, no output schema, and zero schema descriptions, the definition is incomplete. An agent knows what is generated but not what inputs mean, where the output goes, or what side effects occur, making correct invocation uncertain.
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 0%, so the description must compensate. It explains the `overrides` object and its merge semantics with concrete examples, but leaves `scenario` (string) and `seed` (integer/null) completely undefined — the agent cannot tell whether `scenario` is an ID, name, path, or JSON payload, nor what the seed controls.
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: 'Generate a synthetic trace (IMU, BLE, ground truth) for a scenario,' which tells an agent exactly what the tool produces. It does not differentiate from related siblings such as run_replay or ab_test, leaving the agent to infer the boundary.
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 phrase 'to test one hypothesis at a time' and the override examples imply an experimentation use case, but there is no explicit guidance on when to use this instead of run_replay, ab_test, or compare_filters. Usage is implied rather than stated.
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.
10 tool updates
v0.1.0- First observed
ab_test - First observed
compare_filters - First observed
describe_venue - First observed
engine_config - First observed
error_breakdown - First observed
list_scenarios - First observed
plot_run - First observed
run_regression - First observed
run_replay - First observed
simulate_scenario
TDQS
Scored across 10 tools
Each tool targets a distinct stage or artifact in the positioning workflow: scenario discovery, venue metadata, engine config, simulation, replay, diagnostics, plotting, filter comparison, regression, and A/B testing. The closest pairs (simulate_scenario vs run_replay and compare_filters vs ab_test) are explicitly differentiated in their descriptions by input type and comparison scope.
All names use snake_case consistently and are readable. Most are verb_noun or clear action phrases, but a few noun phrases such as engine_config, error_breakdown, and ab_test deviate from a strict verb_noun pattern.
Ten tools is well within the expected range for a simulation and analysis server. Each tool covers a meaningful workflow step and none appears redundant or trivial.
The surface covers the core workflow well: discover scenarios and venues, simulate or replay, diagnose errors, visualize, compare filters/configs, and run regression checks. Minor gaps exist around explicit scenario/trace management or historical run listing, but these are not blocking for the stated analysis purpose.
Maintenance
Related MCP Connectors
Your AI builds, checks and compares 2D/3D floor plans and spaces, and simulates queues and robots.
Verifiable backtests for AI-built trading strategies: deterministic engine, reproducible results.
Evaluate, benchmark, and simulate AI agents on the VerifyAX agent-evaluation platform.
Launch and verify high-fidelity mobile simulations from an AI agent.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to create, run, and debug 2D games in a sandboxed engine, providing tools for simulation, state inspection, and quality validation.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents and software engineers to investigate and resolve realistic distributed-system incidents using safe MCP-based diagnostic tools for code, logs, metrics, traces, database, and deployments.Apache 2.0
- AlicenseAqualityCmaintenanceEnables reproducible evaluation of AI agents on multi-source evidence investigation tasks, providing Docker-based scenarios, MCP tools, and automated scoring for payout reconciliation, performance-claim verification, and incident reconstruction.14MIT
- AlicenseNot gradedqualityCmaintenanceEnables simulating deterministic tool failures and evaluating agent workflows against effect invariants, with action replay for reproducible fault analysis.MIT