OpenVSP MCP Server
This server automates parametric geometry manipulation and aerodynamic analysis through OpenVSP and VSPAero integration via MCP protocol.
Geometry Inspection (openvsp.inspect): Analyze OpenVSP models to retrieve component IDs, wing names, geometry metadata, and raw diagnostic output without making modifications.
Scripted Modification (openvsp.modify): Apply programmatic parameter edits (span, twist, chord, control surfaces) to OpenVSP models, generate repeatable .vspscript files for version control, duplicate geometries, and export meshes (STL/OBJ) without launching the GUI.
Aerodynamic Analysis (openvsp.run_vspaero): Execute geometry modifications followed by VSPAero batch simulations to compute aerodynamic coefficients and generate result files (.adb, CSVs) for design studies and optimization workflows.
Integration Options: Accessible via MCP protocol (STDIO/HTTP transports), REST API (FastAPI endpoints: /vsp/inspect, /vsp/modify, /vsp/run), enabling remote agents, geometry sweeps, parametric studies, and integration with downstream CFD, controller design, and manufacturing pipelines.
Supports running OpenVSP in containerized environments using provided Docker images with pre-installed OpenVSP and VSPAero binaries.
Exposes OpenVSP automation capabilities through a REST API with endpoints for inspecting geometries, modifying parameters, and running VSPAero analyses.
Automates OpenVSP (NASA's parametric aircraft geometry tool) and VSPAero for scripted geometry editing, mesh generation, and aerodynamic coefficient computation without manual GUI interaction.
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., "@OpenVSP MCP Serverincrease the wing span to 15 meters and run an aerodynamic analysis"
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.
openvsp-mcp - Parametric geometry for MCP workflows
TL;DR: Automate OpenVSP geometry edits and VSPAero runs so agents can generate meshes, scripts, and aerodynamic coefficients without manual GUI steps.
Table of contents
Related MCP server: ANSYS MCP Server
What it provides
Scenario | Value |
OpenVSP scripting | Automate OpenVSP commands (set parameters, duplicate geometries, export meshes) without opening the GUI. |
VSPAero batch runs | Launch VSPAero cases and capture generated metrics/CSV files for downstream optimisation. |
MCP transport | Publish the same functionality over STDIO or HTTP via the Model Context Protocol so ToolHive or other clients can drive geometry studies remotely. |
Quickstart
1. Install the package
uv pip install "git+https://github.com/Three-Little-Birds/openvsp-mcp.git"Install the official binaries from the OpenVSP download page (this wrapper was tested with OpenVSP/VSPAero 3.46.0 on macOS). Verify they are in your PATH:
export OPENVSP_BIN=/Applications/OpenVSP/vsp
export VSPAERO_BIN=/Applications/OpenVSP/vspaeroTip (macOS/Linux): if you prefer to avoid GUI installers, build the repo's ToolHive image and run the examples inside Docker:
docker build -t openvsp-mcp-toolhive -f infra/docker/openvsp_toolhive/Dockerfile . docker run --rm --entrypoint /usr/local/bin/vsp openvsp-mcp-toolhive --versionMount your geometry directory and set
OPENVSP_BIN=/usr/local/bin/vspwhen executing the Python snippets in-container.
2. Run a scripted geometry edit
from importlib import resources
import shutil
import tempfile
from pathlib import Path
from openvsp_mcp import OpenVSPRequest, VSPCommand, execute_openvsp
with resources.as_file(resources.files("openvsp_mcp.data") / "rect_wing.vsp3") as bundled:
with tempfile.TemporaryDirectory(prefix="openvsp_mcp_") as tmpdir:
geometry_path = Path(tmpdir) / "rect_wing.vsp3"
shutil.copy(bundled, geometry_path)
request = OpenVSPRequest(
geometry_file=str(geometry_path),
set_commands=[
VSPCommand(command='string geom_id = FindGeom("RectWing", 0)'),
VSPCommand(command='string span_id = GetParm( geom_id, "TotalSpan", "WingGeom" )'),
VSPCommand(command='SetParmVal( span_id, 12.0 )'),
VSPCommand(command='Update()'),
],
run_vspaero=False,
case_name="rectwing_span12",
)
response = execute_openvsp(request)
print("Script used:", response.script_path)
print("ADB path:", response.result_path) # None unless run_vspaero=TrueOpenVSPResponse contains:
script_path– absolute path to the generated.vspscriptyou can archive for repeatability.result_path– VSPAero.adbfile (string) whenrun_vspaero=True, otherwiseNone. Meshes, CSVs, and other artefacts are emitted by OpenVSP next to your original.vsp3.
Need a starter geometry? The package ships with openvsp_mcp.data/rect_wing.vsp3, generated from a single OpenVSP wing primitive. The snippet above uses OpenVSP script helpers (FindGeom + GetParm) so it works out of the box. For your own models, open the geometry in the GUI, note the component name returned by FindGeom, and update the commands accordingly.
Run as a service
CLI (STDIO / Streamable HTTP)
uvx openvsp-mcp # runs the MCP over stdio
# or python -m openvsp_mcp
python -m openvsp_mcp --transport streamable-http --host 0.0.0.0 --port 8000 --path /mcpRegistered tools:
openvsp.inspect– describe a geometry without modifying it.openvsp.modify– apply scripted parameter edits (no VSPAero).openvsp.run_vspaero– run edits followed by VSPAero.
Use python -m openvsp_mcp --describe to list the tools at runtime.
FastAPI (REST)
uv run uvicorn openvsp_mcp.fastapi_app:create_app --factory --port 8002Endpoints:
POST /vsp/inspect→OpenVSPInspectResponsePOST /vsp/modify→ run edits onlyPOST /vsp/run→ run edits + VSPAero
All operations return structured JSON; explore them via the interactive docs at http://127.0.0.1:8002/docs.
python-sdk tool (STDIO / MCP)
from mcp.server.fastmcp import FastMCP
from openvsp_mcp.tool import build_tool
mcp = FastMCP("openvsp-mcp", "OpenVSP automation")
build_tool(mcp)
if __name__ == "__main__":
mcp.run()Then launch with uv run mcp dev examples/openvsp_tool.py and connect your agent.
ToolHive smoke test
Requires exported binaries and a geometry file reachable inside the container:
export OPENVSP_BIN=/path/to/vsp
export VSPAERO_BIN=/path/to/vspaero # optional
export OPENVSP_GEOMETRY=/path/to/model.vsp3
uvx --with 'mcp==1.20.0' python scripts/integration/run_openvsp.py
# ToolHive 2025+ defaults to Streamable HTTP; select the same transport when registering
# the workload manually to avoid the legacy SSE 502 proxy issue.Agent playbook
Geometry studies - script sweep operations (span, twist, control surface deflections) and archive each variant.
Aerodynamic coefficients - hand VSPAero results to
ctrltest-mcpor custom controllers.Mesh exports - agents can request STL/OBJ assets for CFD or manufacturing pipelines.
Stretch ideas
Pair with
foam-agent-mcp-coreto auto-generate mesh-ready cases.Use deck.gl to visualise planform edits by surfacing geometry metadata in the response.
Schedule nightly configuration sweeps (span x sweep x incidence) and store the results for design-of-experiments studies.
Accessibility & upkeep
Run
uv run pytestbefore committing; tests mock VSPAero calls so they finish quickly.Keep OpenVSP/VSPAero versions consistent across developers to avoid geometry mismatches.
Contributing
uv pip install --system -e .[dev]Run
uv run ruff check .anduv run pytestSubmit PRs with sample scripts or geometry diffs so reviewers can validate quickly.
MIT license - see LICENSE.
OpenVSP ships under NASA’s license; VSPAero usage must comply with the terms that accompany your download. Commercial redistribution generally requires a separate agreement—check the official FAQ before packaging binaries into your MCP workloads.
Available Tools
3 toolsopenvsp.inspectA
Describe an OpenVSP geometry without modifying it. Returns component IDs and raw info.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| geom_ids | Yes | Top-level geometry IDs discovered |
| info_log | Yes | Raw output from OpenVSP describe command |
| wing_names | No | Detected wing geometry names |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool is non-modifying and returns 'component IDs and raw info,' which covers basic behavior. However, it lacks details on error handling, performance, or any constraints like file size limits, leaving gaps in transparency.
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 and concise, consisting of two sentences that efficiently convey the tool's purpose and output. Every sentence earns its place by adding value without redundancy, making it easy to understand quickly.
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 low complexity (1 parameter) and the presence of an output schema, the description is mostly complete. It covers the non-modifying nature and output type, but could benefit from more behavioral context, such as error cases or usage tips, to be fully comprehensive.
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 description adds no parameter-specific information beyond what the input schema provides, as schema description coverage is 0%. However, with only one parameter, the baseline is high. The description's mention of 'OpenVSP geometry' and '.vsp3 file' in the schema provides adequate context, compensating for the lack of explicit param details.
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 purpose with a specific verb ('Describe') and resource ('OpenVSP geometry'), and distinguishes it from siblings by emphasizing it doesn't modify the geometry. However, it doesn't explicitly name the sibling tools for comparison, which prevents a perfect score.
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 implies when to use this tool by stating it 'without modifying it,' suggesting it's for inspection rather than modification. However, it doesn't provide explicit guidance on when to choose this over alternatives like 'openvsp.modify' or 'openvsp.run_vspaero,' nor does it mention any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openvsp.modifyB
Apply scripted parameter edits to an OpenVSP model without running VSPAero. Use set_commands to adjust geometry; returns the generated script path.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result_path | No | Path to the generated VSPAero .adb file (if run_vspaero=True) |
| script_path | Yes | Absolute path to the temporary script file |
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 mentions that the tool 'returns the generated script path,' which adds some behavioral context about the output. However, it lacks details on permissions needed, whether edits are destructive or reversible, error handling, or how the script interacts with the model. For a mutation tool with zero annotation coverage, this is insufficient.
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 concise with two sentences that are front-loaded with key information: the tool's purpose and a usage hint. There's no wasted text, though it could be slightly more structured to separate purpose from guidelines.
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 (mutation with 1 parameter but nested objects), no annotations, and an output schema (which reduces the need to describe returns), the description is partially complete. It covers the main action and output but misses critical behavioral details like safety, prerequisites, and parameter explanations, leaving gaps for an AI agent.
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 references 'set_commands' to adjust geometry, which aligns with one parameter, but doesn't explain other parameters like 'geometry_file' or 'run_vspaero' (which seems contradictory to the description's 'without running VSPAero'). The description adds minimal value beyond the schema, resulting in a baseline score.
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 purpose: 'Apply scripted parameter edits to an OpenVSP model without running VSPAero.' It specifies the action (apply edits), resource (OpenVSP model), and constraint (without VSPAero). However, it doesn't explicitly differentiate from sibling tools like 'openvsp.run_vspaero' beyond mentioning the VSPAero exclusion.
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 some usage context: 'Use set_commands to adjust geometry' and distinguishes it from VSPAero execution. However, it doesn't explicitly state when to use this tool versus alternatives like 'openvsp.inspect' or 'openvsp.run_vspaero', nor does it mention prerequisites or exclusions beyond the VSPAero aspect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openvsp.run_vspaeroC
Run OpenVSP edits followed by VSPAero. Provide geometry commands and case_name.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result_path | No | Path to the generated VSPAero .adb file (if run_vspaero=True) |
| script_path | Yes | Absolute path to the temporary script file |
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 of behavioral disclosure. It states the tool runs edits and VSPAero, implying a mutation operation, but doesn't detail critical behaviors such as whether it modifies the input file in-place, creates new files, requires specific permissions, handles errors, or has performance implications like runtime or resource usage. The description is too sparse for a tool that likely involves complex computational tasks.
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 extremely concise—just one sentence—with no wasted words. It front-loads the core action ('Run OpenVSP edits followed by VSPAero') and includes essential input hints. This efficiency is appropriate, though it may sacrifice detail for 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?
Given the complexity of running geometry edits and aerodynamic analysis, the description is incomplete. No annotations exist to clarify safety or behavior, and while an output schema is present (which might describe results), the description doesn't hint at what the tool returns or its operational context. For a tool with nested parameters and likely significant computational impact, more guidance on usage, outcomes, and constraints 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 description mentions 'geometry commands and case_name,' which loosely maps to the 'set_commands' and 'case_name' parameters in the schema. However, with 0% schema description coverage, the schema provides no descriptions for parameters, and the description doesn't fully compensate by explaining all parameters (e.g., 'geometry_file' and 'run_vspaero' are not addressed). It adds minimal semantic value beyond the parameter names, meeting the baseline for partial 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 clearly states the tool's purpose: 'Run OpenVSP edits followed by VSPAero.' It specifies the verb 'run' and the resources 'OpenVSP edits' and 'VSPAero,' which is specific and actionable. However, it doesn't explicitly distinguish this tool from its siblings (openvsp.inspect and openvsp.modify), which likely involve inspection or modification without the VSPAero execution step.
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 no guidance on when to use this tool versus alternatives. It mentions providing 'geometry commands and case_name,' but doesn't explain scenarios where this tool is preferred over openvsp.inspect or openvsp.modify, nor does it outline prerequisites or exclusions. This lack of contextual direction leaves the agent to infer usage based on tool names alone.
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.
3 tool updates
v1.0.0- Changed
openvsp.inspect2 fields changed- added
Input schema / $defsAdded value: +{ + "OpenVSPGeometryRequest": { + "properties": { + "geometry_file": { + "description": "Path to the .vsp3 file", + "title": "Geometry File", + "type": "string" + } + }, + "required": [ + "geometry_file" + ], + "title": "OpenVSPGeometryRequest", + "type": "object" + } +} - added
Input schema / titleAdded value: +"inspectArguments"
- Changed
openvsp.modify2 fields changed- added
Input schema / $defsAdded value: +{ + "OpenVSPRequest": { + "description": "Parameters controlling geometry edits and optional VSPAero run.", + "properties": { + "case_name": { + "default": "case", + "description": "Base name for generated results", + "title": "Case Name", + "type": "string" + }, + "geometry_file": { + "description": "Path to the .vsp3 file", + "title": "Geometry File", + "type": "string" + }, + "run_vspaero": { + "default": true, + "description": "Execute VSPAero after editing geometry", + "title": "Run Vspaero", + "type": "boolean" + }, + "set_commands": { + "description": "Commands to run", + "items": { + "$ref": "#/$defs/VSPCommand" + }, + "title": "Set Commands", + "type": "array" + } + }, + "required": [ + "geometry_file" + ], + "title": "OpenVSPRequest", + "type": "object" + }, + "VSPCommand": { + "description": "Single OpenVSP script command.", + "properties": { + "command": { + "description": "Literal line inserted into the VSP script", + "title": "Command", + "type": "string" + } + }, + "required": [ + "command" + ], + "title": "VSPCommand", + "type": "object" + } +} - added
Input schema / titleAdded value: +"modifyArguments"
- Changed
openvsp.run_vspaero2 fields changed- added
Input schema / $defsAdded value: +{ + "OpenVSPRequest": { + "description": "Parameters controlling geometry edits and optional VSPAero run.", + "properties": { + "case_name": { + "default": "case", + "description": "Base name for generated results", + "title": "Case Name", + "type": "string" + }, + "geometry_file": { + "description": "Path to the .vsp3 file", + "title": "Geometry File", + "type": "string" + }, + "run_vspaero": { + "default": true, + "description": "Execute VSPAero after editing geometry", + "title": "Run Vspaero", + "type": "boolean" + }, + "set_commands": { + "description": "Commands to run", + "items": { + "$ref": "#/$defs/VSPCommand" + }, + "title": "Set Commands", + "type": "array" + } + }, + "required": [ + "geometry_file" + ], + "title": "OpenVSPRequest", + "type": "object" + }, + "VSPCommand": { + "description": "Single OpenVSP script command.", + "properties": { + "command": { + "description": "Literal line inserted into the VSP script", + "title": "Command", + "type": "string" + } + }, + "required": [ + "command" + ], + "title": "VSPCommand", + "type": "object" + } +} - added
Input schema / titleAdded value: +"run_vspaeroArguments"
3 tool updates
- First observed
openvsp.inspect - First observed
openvsp.modify - First observed
openvsp.run_vspaero
TDQS
Each tool has a clearly distinct purpose: inspect is for describing geometry, modify is for applying parameter edits, and run_vspaero is for running edits followed by VSPAero. There is no overlap or ambiguity between these functions, making tool selection straightforward for an agent.
All tool names follow a consistent pattern with the prefix 'openvsp.' and a descriptive action suffix (inspect, modify, run_vspaero). This verb-based naming is uniform and predictable, enhancing usability and clarity across the tool set.
With only 3 tools, the set feels thin for a server focused on OpenVSP geometry and VSPAero analysis. While it covers core operations, it may lack depth for more advanced workflows, such as managing multiple models or handling specific analysis outputs, which could limit agent capabilities.
The tools provide a basic workflow for inspecting, modifying, and running analyses on OpenVSP models, covering key operations. However, there are minor gaps, such as no tools for creating new models, saving/loading files, or accessing detailed VSPAero results, which agents might need to work around.
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
AI-callable calculators and engineering models with real formulas. No hallucinated math.
- mcp-serverOAuthcom.make
Give your AI agents the tools to build, manage, and run automation workflows.
Build, validate, deploy — HTTP APIs, cron jobs, webhooks and MCP tools — from your AI client.
Design, save, and run outcome-aligned AI workflows and verifiers, with reliable image output.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables language models to perform hardware engineering tasks including CAD part design and heat transfer simulations. Provides tool calls for building mechanical components and running thermal analysis through natural language interactions.-
- AlicenseBqualityBmaintenanceEnables natural language-driven ANSYS simulations (Fluent, Mechanical, Geometry) with automatic TUI script generation for reproducibility.416MIT
- FlicenseAqualityDmaintenanceProvides aerodynamic analysis tools through MCP, enabling geometry generation, meshing, CFD solving, and visualization for 2D airfoils.7-
- AlicenseNot gradedqualityAmaintenanceAutomates OpenFOAM CFD simulations via MCP, enabling AI agents to mesh, run, and post-process cases from natural language prompts without any API keys.MIT
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/Three-Little-Birds/openvsp-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server