<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Aerospace MCP - Comprehensive Flight Planning & Space Operations API</title>
<meta name="description" content="Open-source aerospace research platform with flight planning, orbital mechanics, and spacecraft trajectory optimization. Features 30+ tools, 28,000+ airports, and FastMCP integration.">
<meta name="keywords" content="aerospace, flight planning, orbital mechanics, MCP, FastAPI, space operations, aviation API, aircraft performance">
<meta name="author" content="Aerospace MCP Project">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<style>
:root {
--primary-color: #1e40af;
--secondary-color: #7c3aed;
--accent-color: #f59e0b;
--text-color: #f8fafc;
--text-secondary: #cbd5e1;
--bg-dark: #0f172a;
--bg-card: #1e293b;
--bg-gradient: linear-gradient(135deg, #1e40af, #7c3aed, #0f172a);
--shadow: 0 10px 25px rgba(0, 0, 0, 0.3);
--border-radius: 12px;
--transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
background: var(--bg-dark);
color: var(--text-color);
line-height: 1.6;
overflow-x: hidden;
}
/* Animated background particles */
.particles {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
opacity: 0.1;
}
.particle {
position: absolute;
background: var(--accent-color);
border-radius: 50%;
animation: float 6s ease-in-out infinite;
}
@keyframes float {
0%, 100% { transform: translateY(0px) rotate(0deg); }
50% { transform: translateY(-20px) rotate(180deg); }
}
/* Header */
.header {
background: var(--bg-gradient);
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
position: relative;
padding: 2rem;
}
.hero-content h1 {
font-size: clamp(2.5rem, 5vw, 4rem);
font-weight: 700;
margin-bottom: 1rem;
background: linear-gradient(45deg, var(--text-color), var(--accent-color));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.hero-content p {
font-size: clamp(1.1rem, 2.5vw, 1.3rem);
margin-bottom: 2rem;
color: var(--text-secondary);
max-width: 600px;
}
.hero-buttons {
display: flex;
gap: 1rem;
justify-content: center;
flex-wrap: wrap;
margin-bottom: 3rem;
}
.btn {
padding: 12px 24px;
border: none;
border-radius: var(--border-radius);
font-size: 1rem;
font-weight: 600;
text-decoration: none;
cursor: pointer;
transition: var(--transition);
display: inline-flex;
align-items: center;
gap: 8px;
}
.btn-primary {
background: var(--accent-color);
color: var(--bg-dark);
}
.btn-secondary {
background: transparent;
color: var(--text-color);
border: 2px solid var(--text-color);
}
.btn:hover {
transform: translateY(-3px);
box-shadow: var(--shadow);
}
.stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 2rem;
margin-top: 2rem;
}
.stat {
text-align: center;
}
.stat-number {
font-size: 2rem;
font-weight: 700;
color: var(--accent-color);
display: block;
}
.stat-label {
font-size: 0.9rem;
color: var(--text-secondary);
margin-top: 0.5rem;
}
/* Sections */
.section {
padding: 5rem 2rem;
max-width: 1200px;
margin: 0 auto;
}
.section h2 {
font-size: 2.5rem;
font-weight: 700;
text-align: center;
margin-bottom: 3rem;
color: var(--text-color);
}
/* Features Grid */
.features-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
}
.feature-card {
background: var(--bg-card);
padding: 2rem;
border-radius: var(--border-radius);
transition: var(--transition);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.feature-card:hover {
transform: translateY(-5px);
box-shadow: var(--shadow);
}
.feature-icon {
font-size: 2.5rem;
margin-bottom: 1rem;
display: block;
}
.feature-card h3 {
font-size: 1.3rem;
margin-bottom: 1rem;
color: var(--text-color);
}
.feature-card p {
color: var(--text-secondary);
margin-bottom: 1rem;
}
.feature-list {
list-style: none;
color: var(--text-secondary);
font-size: 0.9rem;
}
.feature-list li {
padding: 0.2rem 0;
padding-left: 1rem;
position: relative;
}
.feature-list li:before {
content: "ā";
position: absolute;
left: 0;
color: var(--accent-color);
font-weight: bold;
}
/* Code Examples */
.code-section {
background: var(--bg-card);
border-radius: var(--border-radius);
margin: 2rem 0;
}
.code-tabs {
display: flex;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
overflow-x: auto;
}
.code-tab {
padding: 1rem 1.5rem;
cursor: pointer;
border: none;
background: transparent;
color: var(--text-secondary);
transition: var(--transition);
white-space: nowrap;
}
.code-tab.active,
.code-tab:hover {
color: var(--accent-color);
background: rgba(245, 158, 11, 0.1);
}
.code-content {
display: none;
padding: 2rem;
}
.code-content.active {
display: block;
}
.code-block {
background: var(--bg-dark);
padding: 1.5rem;
border-radius: 8px;
overflow-x: auto;
margin: 1rem 0;
position: relative;
}
.code-block code {
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
font-size: 0.9rem;
line-height: 1.5;
color: var(--text-color);
white-space: pre-wrap;
word-wrap: break-word;
}
.copy-btn {
position: absolute;
top: 10px;
right: 10px;
padding: 5px 10px;
background: var(--accent-color);
color: var(--bg-dark);
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 0.8rem;
opacity: 0.8;
}
.copy-btn:hover {
opacity: 1;
}
/* Installation Methods */
.install-methods {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
margin: 2rem 0;
}
.install-card {
background: var(--bg-card);
padding: 2rem;
border-radius: var(--border-radius);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.install-card h3 {
display: flex;
align-items: center;
gap: 0.5rem;
margin-bottom: 1rem;
color: var(--accent-color);
}
/* Warning Section */
.warning {
background: linear-gradient(45deg, #dc2626, #ea580c);
padding: 2rem;
border-radius: var(--border-radius);
margin: 3rem 0;
text-align: center;
}
.warning h3 {
font-size: 1.5rem;
margin-bottom: 1rem;
color: white;
}
.warning p {
color: rgba(255, 255, 255, 0.9);
margin-bottom: 0.5rem;
}
/* Footer */
.footer {
background: var(--bg-card);
padding: 3rem 2rem;
text-align: center;
border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.footer-content {
max-width: 800px;
margin: 0 auto;
}
.footer-links {
display: flex;
justify-content: center;
gap: 2rem;
margin: 2rem 0;
flex-wrap: wrap;
}
.footer-links a {
color: var(--text-secondary);
text-decoration: none;
transition: var(--transition);
}
.footer-links a:hover {
color: var(--accent-color);
}
/* Responsive Design */
@media (max-width: 768px) {
.section {
padding: 3rem 1rem;
}
.features-grid {
grid-template-columns: 1fr;
}
.hero-buttons {
flex-direction: column;
align-items: center;
}
.stats {
grid-template-columns: repeat(2, 1fr);
gap: 1rem;
}
.code-tabs {
flex-direction: column;
}
}
/* Syntax highlighting */
.keyword { color: #8b5cf6; }
.string { color: #10b981; }
.number { color: #f59e0b; }
.comment { color: #64748b; font-style: italic; }
.function { color: #06b6d4; }
/* Mock Terminal Styles */
.terminal-section {
background: var(--bg-card);
border-radius: var(--border-radius);
overflow: hidden;
box-shadow: var(--shadow);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.terminal-tabs {
display: flex;
background: #1a1a2e;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
overflow-x: auto;
}
.terminal-tab {
padding: 0.75rem 1.25rem;
cursor: pointer;
border: none;
background: transparent;
color: var(--text-secondary);
font-size: 0.9rem;
transition: var(--transition);
white-space: nowrap;
border-bottom: 2px solid transparent;
}
.terminal-tab:hover {
color: var(--text-color);
background: rgba(255, 255, 255, 0.05);
}
.terminal-tab.active {
color: var(--accent-color);
border-bottom-color: var(--accent-color);
background: rgba(245, 158, 11, 0.1);
}
.terminal-window {
display: none;
}
.terminal-window.active {
display: block;
}
.terminal-header {
background: linear-gradient(180deg, #3d3d5c 0%, #2d2d44 100%);
padding: 0.5rem 1rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.terminal-buttons {
display: flex;
gap: 6px;
}
.terminal-btn {
width: 12px;
height: 12px;
border-radius: 50%;
}
.terminal-btn.red { background: #ff5f56; }
.terminal-btn.yellow { background: #ffbd2e; }
.terminal-btn.green { background: #27ca40; }
.terminal-title {
flex: 1;
text-align: center;
color: var(--text-secondary);
font-size: 0.8rem;
font-family: 'Monaco', 'Menlo', monospace;
}
.terminal-body {
background: #0d1117;
padding: 1.5rem;
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;
font-size: 0.85rem;
line-height: 1.6;
min-height: min(400px, 60vh);
overflow-x: auto;
}
.terminal-line {
margin-bottom: 0.5rem;
}
.terminal-prompt {
color: #58a6ff;
}
.terminal-user-input {
color: #c9d1d9;
}
.terminal-tool-call {
background: rgba(136, 87, 255, 0.1);
border-left: 3px solid #8957ff;
padding: 0.75rem 1rem;
margin: 0.75rem 0;
border-radius: 0 6px 6px 0;
}
.terminal-tool-name {
color: #d2a8ff;
font-weight: 600;
}
.terminal-tool-params {
color: #7ee787;
margin-left: 1rem;
}
.terminal-response {
background: rgba(33, 38, 45, 0.8);
border-radius: 6px;
padding: 1rem;
margin: 0.75rem 0;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.terminal-response-header {
color: var(--accent-color);
font-weight: 600;
margin-bottom: 0.5rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.terminal-response-content {
color: #8b949e;
}
.terminal-response-content .highlight {
color: #58a6ff;
}
.terminal-response-content .value {
color: #7ee787;
}
.terminal-response-content .label {
color: #d2a8ff;
}
.terminal-json {
color: #c9d1d9;
}
.terminal-json .json-key {
color: #79c0ff;
}
.terminal-json .json-string {
color: #a5d6ff;
}
.terminal-json .json-number {
color: #7ee787;
}
.terminal-cursor {
display: inline-block;
width: 8px;
height: 16px;
background: #58a6ff;
animation: blink 1s step-end infinite;
vertical-align: middle;
margin-left: 2px;
}
@keyframes blink {
50% { opacity: 0; }
}
.terminal-divider {
border: none;
border-top: 1px dashed rgba(255, 255, 255, 0.1);
margin: 1rem 0;
}
/* Utility classes for terminal content */
.terminal-output {
font-family: monospace;
white-space: pre-wrap;
}
.terminal-line-spaced {
margin-top: 1rem;
}
.section-intro {
text-align: center;
color: var(--text-secondary);
margin-bottom: 2rem;
max-width: 700px;
margin-left: auto;
margin-right: auto;
}
.terminal-explanation {
margin-top: 0.5rem;
color: #8b949e;
}
</style>
</head>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-PNQSKR40DH"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-PNQSKR40DH');
</script>
<body>
<!-- Animated Background -->
<div class="particles" id="particles"></div>
<!-- Header Section -->
<header class="header">
<div class="hero-content">
<h1>š Aerospace MCP</h1>
<p>Comprehensive flight planning, orbital mechanics, and spacecraft trajectory optimization platform with FastMCP integration and 30+ specialized aerospace tools.</p>
<div class="hero-buttons">
<a href="https://github.com/cheesejaguar/aerospace-mcp" class="btn btn-primary" target="_blank">
š± View on GitHub
</a>
<a href="#features" class="btn btn-secondary">
⨠Explore Features
</a>
<a href="#quick-start" class="btn btn-secondary">
š Get Started
</a>
</div>
<div class="stats">
<div class="stat">
<span class="stat-number">30+</span>
<div class="stat-label">Aerospace Tools</div>
</div>
<div class="stat">
<span class="stat-number">28K+</span>
<div class="stat-label">Airports</div>
</div>
<div class="stat">
<span class="stat-number">190+</span>
<div class="stat-label">Aircraft Types</div>
</div>
<div class="stat">
<span class="stat-number"><1s</span>
<div class="stat-label">Response Time</div>
</div>
</div>
</div>
</header>
<!-- Features Section -->
<section id="features" class="section">
<h2>š Comprehensive Aerospace Capabilities</h2>
<div class="features-grid">
<div class="feature-card">
<span class="feature-icon">āļø</span>
<h3>Flight Planning & Airport Resolution</h3>
<p>Intelligent airport search, route planning, and aircraft performance modeling with real-time calculations.</p>
<ul class="feature-list">
<li>28,000+ airports worldwide</li>
<li>Great-circle route calculation</li>
<li>Aircraft-specific performance</li>
<li>Fuel consumption estimation</li>
<li>Multi-leg journey planning</li>
</ul>
</div>
<div class="feature-card">
<span class="feature-icon">š°ļø</span>
<h3>Orbital Mechanics & Space Operations</h3>
<p>Complete orbital mechanics suite with propagation, rendezvous planning, and trajectory optimization.</p>
<ul class="feature-list">
<li>Keplerian elements conversion</li>
<li>J2 perturbation modeling</li>
<li>Ground track computation</li>
<li>Hohmann transfers</li>
<li>Lambert problem solving</li>
</ul>
</div>
<div class="feature-card">
<span class="feature-icon">šŖļø</span>
<h3>Atmospheric & Aerodynamics</h3>
<p>Advanced atmospheric modeling and aerodynamic analysis for comprehensive flight envelope studies.</p>
<ul class="feature-list">
<li>ISA atmosphere profiles</li>
<li>Wind modeling (logarithmic/power law)</li>
<li>Wing VLM analysis</li>
<li>Airfoil polar generation</li>
<li>Stability derivatives</li>
</ul>
</div>
<div class="feature-card">
<span class="feature-icon">š</span>
<h3>Rocket Trajectory Optimization</h3>
<p>3DOF trajectory simulation, sizing estimation, and thrust profile optimization for rocket systems.</p>
<ul class="feature-list">
<li>3DOF numerical integration</li>
<li>Launch angle optimization</li>
<li>Thrust profile optimization</li>
<li>Sizing requirements estimation</li>
<li>Sensitivity analysis</li>
</ul>
</div>
<div class="feature-card">
<span class="feature-icon">š§</span>
<h3>FastMCP & REST API</h3>
<p>Dual interface support with modern FastMCP framework and traditional REST API for maximum flexibility.</p>
<ul class="feature-list">
<li>FastMCP integration</li>
<li>RESTful API endpoints</li>
<li>Claude Desktop compatible</li>
<li>70% code reduction</li>
<li>Modular tool architecture</li>
</ul>
</div>
<div class="feature-card">
<span class="feature-icon">š¬</span>
<h3>Research & Analysis Tools</h3>
<p>Specialized tools for propeller analysis, UAV optimization, and Monte Carlo uncertainty studies.</p>
<ul class="feature-list">
<li>BEMT propeller analysis</li>
<li>UAV energy optimization</li>
<li>Monte Carlo simulations</li>
<li>Genetic algorithms</li>
<li>Coordinate transformations</li>
</ul>
</div>
</div>
</section>
<!-- Code Examples Section -->
<section class="section">
<h2>š» Easy Integration</h2>
<div class="code-section">
<div class="code-tabs">
<button class="code-tab active" onclick="showTab('rest-api', this)">REST API</button>
<button class="code-tab" onclick="showTab('mcp-client', this)">MCP Client</button>
<button class="code-tab" onclick="showTab('python-client', this)">Python Client</button>
</div>
<div id="rest-api" class="code-content active">
<h3>REST API Usage</h3>
<div class="code-block">
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<code># Search for airports
<span class="comment"># GET /airports/by_city?city=San Jose&country=US</span>
curl <span class="string">"http://localhost:8080/airports/by_city?city=San Jose&country=US"</span>
<span class="comment"># Plan a flight</span>
curl -X <span class="keyword">POST</span> <span class="string">"http://localhost:8080/plan"</span> \
-H <span class="string">"Content-Type: application/json"</span> \
-d <span class="string">'{
"depart_city": "San Jose",
"arrive_city": "Tokyo",
"ac_type": "A320",
"cruise_alt_ft": 35000
}'</span></code>
</div>
</div>
<div id="mcp-client" class="code-content">
<h3>MCP Integration (Anthropic API with Deferred Loading)</h3>
<p style="color: var(--text-secondary); margin-bottom: 1rem;">Enable deferred tool loading for efficient context usage with 34+ tools:</p>
<div class="code-block">
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<code><span class="comment">// Anthropic API with deferred tool loading</span>
{
<span class="string">"tools"</span>: [
{
<span class="string">"type"</span>: <span class="string">"tool_search_tool_regex_20251119"</span>,
<span class="string">"name"</span>: <span class="string">"tool_search_tool_regex"</span>
},
{
<span class="string">"type"</span>: <span class="string">"mcp_toolset"</span>,
<span class="string">"mcp_server_name"</span>: <span class="string">"aerospace-mcp"</span>,
<span class="string">"default_config"</span>: { <span class="string">"defer_loading"</span>: <span class="keyword">true</span> },
<span class="string">"configs"</span>: {
<span class="string">"search_aerospace_tools"</span>: { <span class="string">"defer_loading"</span>: <span class="keyword">false</span> },
<span class="string">"list_tool_categories"</span>: { <span class="string">"defer_loading"</span>: <span class="keyword">false</span> }
}
}
]
}</code>
</div>
</div>
<div id="python-client" class="code-content">
<h3>Python Client Example</h3>
<div class="code-block">
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<code><span class="keyword">import</span> requests
<span class="comment"># Initialize client</span>
base_url = <span class="string">"http://localhost:8080"</span>
<span class="comment"># Search airports</span>
response = requests.<span class="function">get</span>(
<span class="string">f"{base_url}/airports/by_city"</span>,
params={<span class="string">"city"</span>: <span class="string">"San Jose"</span>, <span class="string">"country"</span>: <span class="string">"US"</span>}
)
airports = response.<span class="function">json</span>()
<span class="comment"># Plan flight</span>
flight_data = {
<span class="string">"depart_city"</span>: <span class="string">"San Jose"</span>,
<span class="string">"arrive_city"</span>: <span class="string">"Tokyo"</span>,
<span class="string">"ac_type"</span>: <span class="string">"A320"</span>
}
response = requests.<span class="function">post</span>(<span class="string">f"{base_url}/plan"</span>, json=flight_data)
flight_plan = response.<span class="function">json</span>()</code>
</div>
</div>
</div>
</section>
<!-- Mock Terminal Section -->
<section class="section">
<h2>š„ļø See It In Action</h2>
<p class="section-intro">
Experience aerospace-mcp tools through Claude Code. Click the tabs below to see example interactions.
</p>
<div class="terminal-section">
<div class="terminal-tabs" role="tablist" aria-label="Terminal examples">
<button class="terminal-tab active" role="tab" aria-selected="true" aria-controls="airport-search" id="tab-airport" onclick="showTerminalTab('airport-search', this)">
āļø Airport Search
</button>
<button class="terminal-tab" role="tab" aria-selected="false" aria-controls="launch-optimization" id="tab-launch" onclick="showTerminalTab('launch-optimization', this)">
š Launch Optimization
</button>
<button class="terminal-tab" role="tab" aria-selected="false" aria-controls="hohmann-transfer" id="tab-hohmann" onclick="showTerminalTab('hohmann-transfer', this)">
š°ļø Hohmann Transfer
</button>
</div>
<!-- Airport Search Example -->
<div id="airport-search" class="terminal-window active" role="tabpanel" aria-labelledby="tab-airport">
<div class="terminal-header">
<div class="terminal-buttons">
<span class="terminal-btn red"></span>
<span class="terminal-btn yellow"></span>
<span class="terminal-btn green"></span>
</div>
<span class="terminal-title">claude ā aerospace-mcp</span>
</div>
<div class="terminal-body">
<div class="terminal-line">
<span class="terminal-prompt">⯠</span>
<span class="terminal-user-input">Find airports in Tokyo, Japan</span>
</div>
<div class="terminal-tool-call">
<div><span class="terminal-tool-name">search_airports</span></div>
<div class="terminal-tool-params">
query: <span class="json-string">"Tokyo"</span>, country: <span class="json-string">"JP"</span>, query_type: <span class="json-string">"city"</span>
</div>
</div>
<div class="terminal-response">
<div class="terminal-response-content" class="terminal-output">Found 3 airport(s):
⢠<span class="highlight">NRT</span> (RJAA) - Narita International Airport
City: <span class="value">Tokyo, JP</span>
Coordinates: <span class="value">35.7647, 140.3864</span>
Timezone: <span class="value">Asia/Tokyo</span>
⢠<span class="highlight">HND</span> (RJTT) - Tokyo Haneda International Airport
City: <span class="value">Tokyo, JP</span>
Coordinates: <span class="value">35.5494, 139.7798</span>
Timezone: <span class="value">Asia/Tokyo</span>
⢠<span class="highlight">NJA</span> (RJTA) - Atsugi Naval Air Facility
City: <span class="value">Tokyo, JP</span>
Coordinates: <span class="value">35.4546, 139.4500</span>
Timezone: <span class="value">Asia/Tokyo</span></div>
</div>
<hr class="terminal-divider">
<div class="terminal-line">
<span class="terminal-prompt">⯠</span>
<span class="terminal-user-input">What's the IATA code for San Francisco?</span>
</div>
<div class="terminal-tool-call">
<div><span class="terminal-tool-name">search_airports</span></div>
<div class="terminal-tool-params">
query: <span class="json-string">"San Francisco"</span>, country: <span class="json-string">"US"</span>
</div>
</div>
<div class="terminal-response">
<div class="terminal-response-content" class="terminal-output">Found 1 airport(s):
⢠<span class="highlight">SFO</span> (KSFO) - San Francisco International Airport
City: <span class="value">San Francisco, US</span>
Coordinates: <span class="value">37.6213, -122.3790</span>
Timezone: <span class="value">America/Los_Angeles</span></div>
</div>
<div class="terminal-line" class="terminal-line-spaced">
<span class="terminal-prompt">⯠</span>
<span class="terminal-cursor"></span>
</div>
</div>
</div>
<!-- Launch Optimization Example -->
<div id="launch-optimization" class="terminal-window" role="tabpanel" aria-labelledby="tab-launch" aria-hidden="true">
<div class="terminal-header">
<div class="terminal-buttons">
<span class="terminal-btn red"></span>
<span class="terminal-btn yellow"></span>
<span class="terminal-btn green"></span>
</div>
<span class="terminal-title">claude ā aerospace-mcp</span>
</div>
<div class="terminal-body">
<div class="terminal-line">
<span class="terminal-prompt">⯠</span>
<span class="terminal-user-input">Simulate a 3DOF trajectory for my sounding rocket: 15kg dry mass, 8kg propellant, 0.12m diameter, 2.0m length, launched at 85 degrees</span>
</div>
<div class="terminal-tool-call">
<div><span class="terminal-tool-name">rocket_3dof_trajectory</span></div>
<div class="terminal-tool-params">
rocket_geometry: { dry_mass_kg: <span class="json-number">15</span>, propellant_mass_kg: <span class="json-number">8</span>, diameter_m: <span class="json-number">0.12</span>, length_m: <span class="json-number">2.0</span> }<br>
launch_conditions: { launch_angle_deg: <span class="json-number">85</span> }
</div>
</div>
<div class="terminal-response">
<div class="terminal-response-content" class="terminal-output"><span class="highlight">3DOF Rocket Trajectory Analysis</span>
==================================================
Rocket: <span class="value">2.0m</span> long, <span class="value">0.12m</span> dia
Mass: <span class="value">15.0 kg</span> dry + <span class="value">8.0 kg</span> prop
Launch Angle: <span class="value">85.0°</span>
<span class="label">Performance Summary:</span>
Max Altitude: <span class="value">12847 m (12.85 km)</span>
Max Velocity: <span class="value">412.3 m/s (Mach 1.21)</span>
Apogee Time: <span class="value">45.2 s</span>
Burnout Time: <span class="value">8.4 s</span>
Max Q: <span class="value">89.4 kPa</span>
Total Impulse: <span class="value">21000 Nā
s</span>
Specific Impulse: <span class="value">267.8 s</span>
<span class="label">Key Trajectory Points:</span>
Time (s) Alt (m) Vel (m/s) Accel (m/s²)
---------------------------------------------
0.0 0 0.0 108.7
11.3 1847 312.4 -9.8
22.5 8234 198.2 -9.8
33.8 11892 89.1 -9.8
45.0 12847 0.0 -9.8</div>
</div>
<hr class="terminal-divider">
<div class="terminal-line">
<span class="terminal-prompt">⯠</span>
<span class="terminal-user-input">Now optimize the launch angle for maximum altitude</span>
</div>
<div class="terminal-tool-call">
<div><span class="terminal-tool-name">optimize_launch_angle</span></div>
<div class="terminal-tool-params">
rocket_geometry: { dry_mass_kg: <span class="json-number">15</span>, propellant_mass_kg: <span class="json-number">8</span>, ... }<br>
optimize_for: <span class="json-string">"altitude"</span>, angle_bounds_deg: [<span class="json-number">75</span>, <span class="json-number">90</span>]
</div>
</div>
<div class="terminal-response">
<div class="terminal-response-content" class="terminal-output">{
<span class="json-key">"optimal_angle_deg"</span>: <span class="json-number">87.3</span>,
<span class="json-key">"objective"</span>: <span class="json-string">"altitude"</span>,
<span class="json-key">"max_altitude_m"</span>: <span class="json-number">13102.4</span>,
<span class="json-key">"max_velocity_ms"</span>: <span class="json-number">418.7</span>,
<span class="json-key">"apogee_time_s"</span>: <span class="json-number">46.8</span>,
<span class="json-key">"iterations"</span>: <span class="json-number">12</span>,
<span class="json-key">"convergence"</span>: <span class="json-string">"success"</span>
}</div>
</div>
<div class="terminal-line" class="terminal-line-spaced">
<span class="terminal-prompt">⯠</span>
<span class="terminal-cursor"></span>
</div>
</div>
</div>
<!-- Hohmann Transfer Example -->
<div id="hohmann-transfer" class="terminal-window" role="tabpanel" aria-labelledby="tab-hohmann" aria-hidden="true">
<div class="terminal-header">
<div class="terminal-buttons">
<span class="terminal-btn red"></span>
<span class="terminal-btn yellow"></span>
<span class="terminal-btn green"></span>
</div>
<span class="terminal-title">claude ā aerospace-mcp</span>
</div>
<div class="terminal-body">
<div class="terminal-line">
<span class="terminal-prompt">⯠</span>
<span class="terminal-user-input">Calculate a Hohmann transfer from a 400km LEO orbit to geostationary orbit at 35,786km altitude</span>
</div>
<div class="terminal-tool-call">
<div><span class="terminal-tool-name">hohmann_transfer</span></div>
<div class="terminal-tool-params">
r1_m: <span class="json-number">6778000</span> <span style="color: #8b949e;">(400km + 6378km Earth radius)</span><br>
r2_m: <span class="json-number">42164000</span> <span style="color: #8b949e;">(35786km + 6378km Earth radius)</span>
</div>
</div>
<div class="terminal-response">
<div class="terminal-response-content" class="terminal-output">{
<span class="json-key">"delta_v1_ms"</span>: <span class="json-number">2397.51</span>,
<span class="json-key">"delta_v2_ms"</span>: <span class="json-number">1456.50</span>,
<span class="json-key">"total_delta_v_ms"</span>: <span class="json-number">3854.01</span>,
<span class="json-key">"transfer_time_s"</span>: <span class="json-number">19048.40</span>,
<span class="json-key">"transfer_time_h"</span>: <span class="json-number">5.29</span>,
<span class="json-key">"transfer_semi_major_axis_m"</span>: <span class="json-number">24471000</span>
}</div>
</div>
<div class="terminal-line" class="terminal-explanation">
The transfer requires <span class="value">3,854 m/s</span> total Īv: first burn of <span class="value">2,398 m/s</span> at perigee raises apogee to GEO, then <span class="value">1,457 m/s</span> at apogee circularizes the orbit. Transfer time is about <span class="value">5.3 hours</span>.
</div>
<hr class="terminal-divider">
<div class="terminal-line">
<span class="terminal-prompt">⯠</span>
<span class="terminal-user-input">What about a transfer to lunar distance at 384,400km?</span>
</div>
<div class="terminal-tool-call">
<div><span class="terminal-tool-name">hohmann_transfer</span></div>
<div class="terminal-tool-params">
r1_m: <span class="json-number">6778000</span>, r2_m: <span class="json-number">384400000</span> <span style="color: #8b949e;">(Earth-centered distance)</span>
</div>
</div>
<div class="terminal-response">
<div class="terminal-response-content" class="terminal-output">{
<span class="json-key">"delta_v1_ms"</span>: <span class="json-number">3082.09</span>,
<span class="json-key">"delta_v2_ms"</span>: <span class="json-number">828.74</span>,
<span class="json-key">"total_delta_v_ms"</span>: <span class="json-number">3910.82</span>,
<span class="json-key">"transfer_time_s"</span>: <span class="json-number">430416.00</span>,
<span class="json-key">"transfer_time_h"</span>: <span class="json-number">119.56</span>,
<span class="json-key">"transfer_semi_major_axis_m"</span>: <span class="json-number">195589000</span>
}</div>
</div>
<div class="terminal-line" class="terminal-explanation">
A Hohmann transfer to lunar distance requires <span class="value">3,082 m/s</span> at perigee, with a <span class="value">~5 day</span> coast. Note: real lunar missions use 3-body trajectories (~3 days) and require separate LOI burns relative to the Moon.
</div>
<div class="terminal-line" class="terminal-line-spaced">
<span class="terminal-prompt">⯠</span>
<span class="terminal-cursor"></span>
</div>
</div>
</div>
</div>
</section>
<!-- Quick Start Section -->
<section id="quick-start" class="section">
<h2>š Quick Start</h2>
<div class="install-methods">
<div class="install-card">
<h3>ā” UV (Recommended)</h3>
<p>Fastest Python package manager with excellent dependency resolution.</p>
<div class="code-block">
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<code><span class="comment"># Install UV</span>
curl -LsSf https://astral.sh/uv/install.sh | sh
<span class="comment"># Clone and setup</span>
git clone https://github.com/cheesejaguar/aerospace-mcp.git
cd aerospace-mcp
uv venv && source .venv/bin/activate
uv sync
<span class="comment"># Run HTTP server</span>
uvicorn main:app --reload --host <span class="number">0.0.0.0</span> --port <span class="number">8080</span></code>
</div>
</div>
<div class="install-card">
<h3>š³ Docker</h3>
<p>Containerized deployment for consistent environments.</p>
<div class="code-block">
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<code><span class="comment"># Clone and build</span>
git clone https://github.com/cheesejaguar/aerospace-mcp.git
cd aerospace-mcp
<span class="comment"># Build and run</span>
docker build -t aerospace-mcp .
docker run -p <span class="number">8080</span>:<span class="number">8080</span> aerospace-mcp
<span class="comment"># Test the API</span>
curl <span class="string">"http://localhost:8080/health"</span></code>
</div>
</div>
<div class="install-card">
<h3>š¤ Claude Code MCP</h3>
<p>Add aerospace-mcp to your Claude Code settings for full tool access.</p>
<div class="code-block">
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<code><span class="comment">// Add to ~/.claude/settings.json</span>
{
<span class="string">"mcpServers"</span>: {
<span class="string">"aerospace-mcp"</span>: {
<span class="string">"command"</span>: <span class="string">"uv"</span>,
<span class="string">"args"</span>: [
<span class="string">"--directory"</span>,
<span class="string">"/path/to/aerospace-mcp"</span>,
<span class="string">"run"</span>,
<span class="string">"aerospace-mcp"</span>
]
}
}
}</code>
</div>
</div>
</div>
</section>
<!-- Warning Section -->
<div class="warning">
<h3>ā ļø IMPORTANT SAFETY NOTICE</h3>
<p><strong>THIS SOFTWARE IS FOR EDUCATIONAL, RESEARCH, AND DEVELOPMENT PURPOSES ONLY</strong></p>
<p>⢠NOT FOR REAL NAVIGATION - Do not use for actual flight planning or navigation</p>
<p>⢠NOT CERTIFIED - This system is not certified by any aviation authority</p>
<p>⢠ESTIMATES ONLY - Performance calculations are theoretical estimates</p>
<p>⢠NO LIABILITY - Authors assume no responsibility for any consequences of use</p>
<p style="margin-top: 1rem; font-weight: bold;">For real flight planning, always use certified aviation software and consult official sources.</p>
</div>
<!-- Footer -->
<footer class="footer">
<div class="footer-content">
<h3>š Aerospace MCP Project</h3>
<p>Open-source aerospace research platform powered by FastMCP</p>
<div class="footer-links">
<a href="https://github.com/cheesejaguar/aerospace-mcp" target="_blank">GitHub Repository</a>
<a href="https://github.com/cheesejaguar/aerospace-mcp/blob/main/README.md" target="_blank">Documentation</a>
<a href="https://github.com/cheesejaguar/aerospace-mcp/issues" target="_blank">Issues</a>
<a href="https://github.com/cheesejaguar/aerospace-mcp/blob/main/LICENSE" target="_blank">MIT License</a>
<a href="https://fastmcp.com" target="_blank">FastMCP</a>
</div>
<p style="margin-top: 2rem; color: var(--text-secondary);">
Made with ā¤ļø for the aerospace community ⢠© 2025 Cheesejaguar
</p>
</div>
</footer>
<script>
// Create animated particles
function createParticles() {
const particlesContainer = document.getElementById('particles');
const particleCount = 50;
for (let i = 0; i < particleCount; i++) {
const particle = document.createElement('div');
particle.className = 'particle';
particle.style.left = Math.random() * 100 + '%';
particle.style.top = Math.random() * 100 + '%';
particle.style.width = Math.random() * 4 + 2 + 'px';
particle.style.height = particle.style.width;
particle.style.animationDelay = Math.random() * 6 + 's';
particle.style.animationDuration = (Math.random() * 3 + 3) + 's';
particlesContainer.appendChild(particle);
}
}
// Tab switching functionality for code examples
function showTab(tabId, element) {
// Hide all content
const contents = document.querySelectorAll('.code-content');
contents.forEach(content => content.classList.remove('active'));
// Remove active class from all tabs
const tabs = document.querySelectorAll('.code-tab');
tabs.forEach(tab => tab.classList.remove('active'));
// Show selected content and activate tab
document.getElementById(tabId).classList.add('active');
element.classList.add('active');
}
// Terminal tab switching functionality
function showTerminalTab(tabId, element) {
// Hide all terminal windows and update ARIA
const windows = document.querySelectorAll('.terminal-window');
windows.forEach(win => {
win.classList.remove('active');
win.setAttribute('aria-hidden', 'true');
});
// Remove active class from all terminal tabs and update ARIA
const tabs = document.querySelectorAll('.terminal-tab');
tabs.forEach(tab => {
tab.classList.remove('active');
tab.setAttribute('aria-selected', 'false');
});
// Show selected terminal window and activate tab
const selectedWindow = document.getElementById(tabId);
selectedWindow.classList.add('active');
selectedWindow.setAttribute('aria-hidden', 'false');
element.classList.add('active');
element.setAttribute('aria-selected', 'true');
}
// Copy to clipboard functionality
async function copyCode(button) {
const codeBlock = button.nextElementSibling;
// Get the original text content and preserve line breaks
let text = codeBlock.innerHTML
.replace(/<span[^>]*>/g, '') // Remove opening span tags
.replace(/<\/span>/g, '') // Remove closing span tags
.replace(/</g, '<') // Decode HTML entities
.replace(/>/g, '>')
.replace(/&/g, '&')
.replace(/"/g, '"')
.trim();
try {
await navigator.clipboard.writeText(text);
button.textContent = 'Copied!';
button.style.background = '#10b981';
setTimeout(() => {
button.textContent = 'Copy';
button.style.background = 'var(--accent-color)';
}, 2000);
} catch (err) {
console.error('Failed to copy text: ', err);
button.textContent = 'Failed';
}
}
// Smooth scrolling for anchor links
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
});
});
// Initialize particles on page load
document.addEventListener('DOMContentLoaded', function() {
createParticles();
});
// Add scroll-based animations
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -100px 0px'
};
const observer = new IntersectionObserver(function(entries) {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
}
});
}, observerOptions);
// Observe all feature cards and terminal section for animation
document.addEventListener('DOMContentLoaded', function() {
const cards = document.querySelectorAll('.feature-card, .install-card, .terminal-section');
cards.forEach(card => {
card.style.opacity = '0';
card.style.transform = 'translateY(30px)';
card.style.transition = 'opacity 0.6s ease, transform 0.6s ease';
observer.observe(card);
});
});
</script>
</body>
</html>