ThrustLab
Simulate electric UAV powertrains and search a public motor, propeller and battery database.
사용해야 할까요
품질 및 안전성
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`claude_desktop_config.json` 파일에 다음을 추가하세요:
{
"mcpServers": {
"thrustlab": {
"url": "https://thrustlab.com/mcp"
}
}
}원격 엔드포인트
https://thrustlab.com/mcpstreamable-http할 수 있는 일
도구 목록
도구 (7)
🟢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`.
입력 스키마
{
"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"
}출력 스키마
{
"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.
입력 스키마
{
"type": "object",
"properties": {
"component_id": {
"title": "Component Id",
"type": "string"
}
},
"required": [
"component_id"
],
"title": "get_componentArguments"
}출력 스키마
{
"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.
입력 스키마
{
"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"
}출력 스키마
{
"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.
입력 스키마
{
"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"
}출력 스키마
{
"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.
입력 스키마
{
"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"
}출력 스키마
{
"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.
입력 스키마
{
"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"
}출력 스키마
{
"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.
입력 스키마
{
"type": "object",
"properties": {
"model": {
"default": "full",
"title": "Model",
"type": "string"
}
},
"title": "get_validation_summaryArguments"
}출력 스키마
{
"type": "object",
"additionalProperties": true,
"title": "get_validation_summaryDictOutput"
}커뮤니티
증거