ThrustLab

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

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
68%
Naming quality
91%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,208Tokens (tool definitions)
~3.6 KBTypical response size
Significant attention impact (2.51% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "thrustlab": {
      "url": "https://thrustlab.com/mcp"
    }
  }
}

Remote endpoints

https://thrustlab.com/mcpstreamable-http

What it can do

Tool inventory

Tools (7)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢search_components(component_type, query, limit, offset, sort_by, ...)

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`.

Input Schema

{
  "type": "object",
  "properties": {
    "component_type": {
      "title": "Component Type",
      "type": "string"
    },
    "query": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Query"
    },
    "limit": {
      "default": 25,
      "title": "Limit",
      "type": "integer"
    },
    "offset": {
      "default": 0,
      "title": "Offset",
      "type": "integer"
    },
    "sort_by": {
      "default": "name",
      "title": "Sort By",
      "type": "string"
    },
    "sort_order": {
      "default": "asc",
      "title": "Sort Order",
      "type": "string"
    }
  },
  "required": [
    "component_type"
  ],
  "title": "search_componentsArguments"
}

Output Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "search_componentsDictOutput"
}
🟢get_component(component_id)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "component_id": {
      "title": "Component Id",
      "type": "string"
    }
  },
  "required": [
    "component_id"
  ],
  "title": "get_componentArguments"
}

Output Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "get_componentDictOutput"
}
🟢estimate_propeller(diameter_in, pitch_in, rpm, blades, airspeed_m_s, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "diameter_in": {
      "title": "Diameter In",
      "type": "number"
    },
    "pitch_in": {
      "title": "Pitch In",
      "type": "number"
    },
    "rpm": {
      "title": "Rpm",
      "type": "number"
    },
    "blades": {
      "default": 2,
      "title": "Blades",
      "type": "integer"
    },
    "airspeed_m_s": {
      "default": 0,
      "title": "Airspeed M S",
      "type": "number"
    },
    "altitude_m": {
      "default": 0,
      "title": "Altitude M",
      "type": "number"
    },
    "chord_ratio": {
      "default": 0.065,
      "title": "Chord Ratio",
      "type": "number"
    },
    "camber_pct": {
      "default": 3.2,
      "title": "Camber Pct",
      "type": "number"
    }
  },
  "required": [
    "diameter_in",
    "pitch_in",
    "rpm"
  ],
  "title": "estimate_propellerArguments"
}

Output Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "estimate_propellerDictOutput"
}
🟢simulate_powertrain(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.

Input Schema

{
  "type": "object",
  "properties": {
    "powertrain": {
      "$ref": "#/$defs/PowertrainInput"
    }
  },
  "required": [
    "powertrain"
  ],
  "$defs": {
    "PowertrainInput": {
      "description": "One powertrain, as the anonymous endpoint accepts it (spec D4).\n\nCatalog components are referenced by their public id (``comp_…``, from\n``search_components``). The propeller may instead be given as a label, which\nis all the Fast model needs.",
      "properties": {
        "motor_id": {
          "description": "Catalog motor public id, e.g. comp_2xK….",
          "title": "Motor Id",
          "type": "string"
        },
        "battery_id": {
          "description": "Catalog battery public id.",
          "title": "Battery Id",
          "type": "string"
        },
        "propeller_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Catalog propeller public id.",
          "title": "Propeller Id"
        },
        "propeller_label": {
          "anyOf": [
            {
              "$ref": "#/$defs/PropellerLabel"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Use instead of propeller_id to run from the printed size."
        },
        "rotor_count": {
          "default": 1,
          "description": "Rotors on the craft.",
          "maximum": 16,
          "minimum": 1,
          "title": "Rotor Count",
          "type": "integer"
        },
        "throttle_pct": {
          "default": 100,
          "exclusiveMinimum": 0,
          "maximum": 100,
          "title": "Throttle Pct",
          "type": "number"
        },
        "airspeed_m_s": {
          "default": 0,
          "description": "0 is a static run.",
          "maximum": 300,
          "minimum": 0,
          "title": "Airspeed M S",
          "type": "number"
        },
        "altitude_m": {
          "default": 0,
          "maximum": 11000,
          "minimum": 0,
          "title": "Altitude M",
          "type": "number"
        }
      },
      "required": [
        "motor_id",
        "battery_id"
      ],
      "title": "PowertrainInput",
      "type": "object"
    },
    "PropellerLabel": {
      "description": "What is printed on the propeller — all the Fast model reads.\n\nInches and a spoken family name, because that is how a propeller is sold and\nhow a user will say it. :func:`to_schema_label` turns this into the metres\nand the enum ``app.schemas.simulation.PropellerLabel`` declares.",
      "properties": {
        "diameter_in": {
          "description": "Diameter in inches, e.g. 10 for a 10x5.",
          "exclusiveMinimum": 0,
          "maximum": 400,
          "title": "Diameter In",
          "type": "number"
        },
        "pitch_in": {
          "description": "Pitch in inches, e.g. 5 for a 10x5.",
          "exclusiveMinimum": 0,
          "maximum": 400,
          "title": "Pitch In",
          "type": "number"
        },
        "num_blades": {
          "default": 2,
          "description": "Blade count.",
          "maximum": 8,
          "minimum": 2,
          "title": "Num Blades",
          "type": "integer"
        },
        "family": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Chord-ratio preset: 'thin electric' (0.065 D), 'sport' (0.07 D), 'slow flyer' (0.10 D) or 'multirotor' (0.11 D). Defaults to sport.",
          "title": "Family"
        },
        "chord_ratio": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "maximum": 0.5,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Chord at 75 % radius over diameter. Give it instead of 'family' (or with family='custom'); the two cannot both be set.",
          "title": "Chord Ratio"
        },
        "camber_pct": {
          "anyOf": [
            {
              "maximum": 8,
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Section camber in percent. Defaults to 3.2.",
          "title": "Camber Pct"
        }
      },
      "required": [
        "diameter_in",
        "pitch_in"
      ],
      "title": "PropellerLabel",
      "type": "object"
    }
  },
  "title": "simulate_powertrainArguments"
}

Output Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "simulate_powertrainDictOutput"
}
🟢sweep_powertrain(powertrain, sweep)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "powertrain": {
      "$ref": "#/$defs/PowertrainInput"
    },
    "sweep": {
      "$ref": "#/$defs/SweepAxis"
    }
  },
  "required": [
    "powertrain",
    "sweep"
  ],
  "$defs": {
    "PowertrainInput": {
      "description": "One powertrain, as the anonymous endpoint accepts it (spec D4).\n\nCatalog components are referenced by their public id (``comp_…``, from\n``search_components``). The propeller may instead be given as a label, which\nis all the Fast model needs.",
      "properties": {
        "motor_id": {
          "description": "Catalog motor public id, e.g. comp_2xK….",
          "title": "Motor Id",
          "type": "string"
        },
        "battery_id": {
          "description": "Catalog battery public id.",
          "title": "Battery Id",
          "type": "string"
        },
        "propeller_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Catalog propeller public id.",
          "title": "Propeller Id"
        },
        "propeller_label": {
          "anyOf": [
            {
              "$ref": "#/$defs/PropellerLabel"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Use instead of propeller_id to run from the printed size."
        },
        "rotor_count": {
          "default": 1,
          "description": "Rotors on the craft.",
          "maximum": 16,
          "minimum": 1,
          "title": "Rotor Count",
          "type": "integer"
        },
        "throttle_pct": {
          "default": 100,
          "exclusiveMinimum": 0,
          "maximum": 100,
          "title": "Throttle Pct",
          "type": "number"
        },
        "airspeed_m_s": {
          "default": 0,
          "description": "0 is a static run.",
          "maximum": 300,
          "minimum": 0,
          "title": "Airspeed M S",
          "type": "number"
        },
        "altitude_m": {
          "default": 0,
          "maximum": 11000,
          "minimum": 0,
          "title": "Altitude M",
          "type": "number"
        }
      },
      "required": [
        "motor_id",
        "battery_id"
      ],
      "title": "PowertrainInput",
      "type": "object"
    },
    "PropellerLabel": {
      "description": "What is printed on the propeller — all the Fast model reads.\n\nInches and a spoken family name, because that is how a propeller is sold and\nhow a user will say it. :func:`to_schema_label` turns this into the metres\nand the enum ``app.schemas.simulation.PropellerLabel`` declares.",
      "properties": {
        "diameter_in": {
          "description": "Diameter in inches, e.g. 10 for a 10x5.",
          "exclusiveMinimum": 0,
          "maximum": 400,
          "title": "Diameter In",
          "type": "number"
        },
        "pitch_in": {
          "description": "Pitch in inches, e.g. 5 for a 10x5.",
          "exclusiveMinimum": 0,
          "maximum": 400,
          "title": "Pitch In",
          "type": "number"
        },
        "num_blades": {
          "default": 2,
          "description": "Blade count.",
          "maximum": 8,
          "minimum": 2,
          "title": "Num Blades",
          "type": "integer"
        },
        "family": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Chord-ratio preset: 'thin electric' (0.065 D), 'sport' (0.07 D), 'slow flyer' (0.10 D) or 'multirotor' (0.11 D). Defaults to sport.",
          "title": "Family"
        },
        "chord_ratio": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "maximum": 0.5,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Chord at 75 % radius over diameter. Give it instead of 'family' (or with family='custom'); the two cannot both be set.",
          "title": "Chord Ratio"
        },
        "camber_pct": {
          "anyOf": [
            {
              "maximum": 8,
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Section camber in percent. Defaults to 3.2.",
          "title": "Camber Pct"
        }
      },
      "required": [
        "diameter_in",
        "pitch_in"
      ],
      "title": "PropellerLabel",
      "type": "object"
    },
    "SweepAxis": {
      "description": "A 1-D sweep axis. ``steps`` is the NUMBER OF POINTS, not a step size.",
      "properties": {
        "parameter": {
          "description": "'throttle_pct' or 'airspeed_m_s'.",
          "title": "Parameter",
          "type": "string"
        },
        "start": {
          "title": "Start",
          "type": "number"
        },
        "stop": {
          "title": "Stop",
          "type": "number"
        },
        "steps": {
          "description": "Point count, at most 25 anonymous.",
          "maximum": 25,
          "minimum": 2,
          "title": "Steps",
          "type": "integer"
        }
      },
      "required": [
        "parameter",
        "start",
        "stop",
        "steps"
      ],
      "title": "SweepAxis",
      "type": "object"
    }
  },
  "title": "sweep_powertrainArguments"
}

Output Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "sweep_powertrainDictOutput"
}
🟢get_result(token, simulation_id)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "token": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Token"
    },
    "simulation_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Simulation Id"
    }
  },
  "title": "get_resultArguments"
}

Output Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "get_resultDictOutput"
}
🟢get_validation_summary(model)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "model": {
      "default": "full",
      "title": "Model",
      "type": "string"
    }
  },
  "title": "get_validation_summaryArguments"
}

Output Schema

{
  "type": "object",
  "additionalProperties": true,
  "title": "get_validation_summaryDictOutput"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded7 tools