# ThrustLab

> Simulate electric UAV powertrains and search a public motor, propeller and battery database.

- name: com.thrustlab/thrustlab
- version: 1.0.0
- connection class: R0 (autonomous)
- trust: 82/100 flags: no-repository
- quality: 96/100 (strong)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/com.thrustlab%2Fthrustlab
- tools: https://api.protogrid.dev/v1/servers/com.thrustlab%2Fthrustlab/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "thrustlab": {
      "type": "http",
      "url": "https://thrustlab.com/mcp",
      "headers": {
        "Authorization": "Bearer ${THRUSTLAB_TOKEN}"
      }
    }
  }
}
```

Placeholders to fill: `${THRUSTLAB_TOKEN}`.

## Trust

- hygiene: 80
- liveness: 98
- freshness: 100
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-94% +updated-18d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 96/100 (strong)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 100 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 7 of 7 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- pass `tools.token_cost`: about 2,823 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: no tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 7, about 2,823 tokens to load them all
- tool set hash: d65656338a0502d1e40e3283cc31e89f
- badge: [![protogrid quality](https://protogrid.dev/badge/com.thrustlab/thrustlab.svg)](https://protogrid.dev/servers/com.thrustlab/thrustlab)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

_No tool definition changes recorded._

## Remotes

- https://thrustlab.com/mcp (streamable-http, auth none, reachable true, uptime30d 0.9411765)

## Packages

_none_

## Tools (7)

- `estimate_propeller`: Thrust, torque and shaft power for one propeller, from its printed size.

    A closed-form momentum plus blade-element equation — no motor, no battery,
    no account. Give the size as it is printed: a 10x5 is `diameter_in=10`,
    `pitch_in=5`. `chord_ratio` is the chord at 75 % radius over the diameter:
    0.065 thin electric, 0.07 sport, 0.10 slow flyer, 0.11 multirotor.
    
- `get_component`: Read one database row by its id (`comp_…`), with provenance.

    Propeller rows give diameter, pitch, blade count, weight and maximum rpm.
    Blade station geometry is never returned.
    
- `get_result`: Read a stored result: a share `token` from a run, or a `simulation_id`.

    `simulation_id` needs a ThrustLab API key in `Authorization: Bearer` and
    reads only that account's own runs.
    
- `get_validation_summary`: How accurate a model is, measured against wind-tunnel and bench data.

    `model` is "fast", "full", or an exact report slug such as "prom-5.3". The
    numbers are error against measured data by partition and channel, with the
    envelope they were measured inside. Quote the model name with the number.
    
- `search_components`: Find motors, propellers or batteries in the ThrustLab database.

`component_type` is "motor", "propeller" or "battery". `query` is a
case-insensitive substring of the part name or its maker ("APC", "T-Motor",
"13x6.5"). The maker sits under `spec.brand` for motors and batteries and under
`spec.type` for propellers. `limit` is capped at 200 rows a
page; when `has_more` is true, pass the returned `next_offset` as `offset` to
read the next page. Each row carries its datasheet values, its source and the
CC BY 4.0 attribution line. Pass a returned `id` to
`simulate_powertrain`.

- `simulate_powertrain`: Solve one operating point of a whole powertrain on the Fast model.

    Battery, ESC, motor and propeller are solved together, so the answer is a
    real thrust and current, not a propeller curve. The numbers come back in
    `result` (`result.All` = system totals in SI units: thrust N, current A,
    power W, time s; one entry per rotor; `result.Battery`), with a share URL.
    No second call is needed to read them.
    
- `sweep_powertrain`: Solve a powertrain across a throttle or airspeed range, up to 25 points.

    `sweep.steps` is the NUMBER OF POINTS, not a step size: start 40, stop 100,
    steps 4 gives 40, 60, 80 and 100. One sweep beats a loop of single points.
    The points come back in `result.points` with the share URL; no second call
    is needed to read them.
    
