Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Description from the maker (original English)
Build, simulate and calibrate JAX block-diagram models of hybrid dynamical systems.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"jaxonomy": {
"command": "uvx",
"args": [
"jaxonomy"
]
}
}
}Run this in your terminal
claude mcp add jaxonomy -- uvx jaxonomyPaste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"jaxonomy": {
"command": "uvx",
"args": [
"jaxonomy"
]
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"jaxonomy": {
"type": "stdio",
"command": "uvx",
"args": [
"jaxonomy"
]
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026
The registry name was verified with the GitHub account machinavitalis, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
The registry does not list a required key, though some servers ask you to sign in on first use.
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (3.4.1) reached the registry 3 months ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Python (uv) on your computer.
In the same category: Spec Driven Development, Remote Desktop Commander, 御府和田玉 在售作品查询
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Live in-stock Hetian jade from Yufu, Shanghai: prices, monthly price guide, book a viewing.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
Differentiable simulation of hybrid dynamical systems — powered by JAX.
*Block diagrams meet automatic differentiation. Model physical systems, close the loop with LQR/MPC/Kalman, and differentiate through everything.*
[Why JAX?](#-why-jax) · [Install](#-installation) · [Quick Start](#-quick-start) · [Gallery](#-gallery) · [Examples](#-examples) · [Docs](https://py.jaxonomy.com)
Every panel above is produced by jaxonomy.simulate on a model built from the library.
Jaxonomy is a Python framework for modeling, simulating, and optimizing hybrid dynamical systems — systems that combine continuous physics, discrete control laws, and event-driven logic in a single model. Every simulation runs on JAX, so it is JIT-compilable, batchable with vmap, and fully differentiable from end to end.
import jax.numpy as jnp
import jaxonomy as jx
A, B = jnp.array([[0., 1.], [0., 0.]]), jnp.array([[0.], [1.]]) C, D = jnp.eye(2), jnp.zeros((2, 1)) Q, R = jnp.eye(2), jnp.array([[1.]])
builder = jx.DiagramBuilder()
plant = builder.add(jx.library.LTISystem(A, B, C, D, initialize_states=jnp.array([1.0, 0.0]))) controller = builder.add(jx.library.LinearQuadraticRegulator(A, B, Q, R)) builder.connect(plant.output_ports[0], controller.input_ports[0]) builder.connect(controller.output_ports[0], plant.input_ports[0])
diagram = builder.build() results = jx.simulate( diagram, diagram.create_context(), (0.0, 10.0),
recorded_signals={"x": plant.output_ports[0], "u": controller.output_ports[0]}, )
results.outputs["x"] # (T, 2) — position and velocity, driven back to zero
Choosing JAX as the compute backbone unlocks capabilities that are impractical with NumPy-based simulators:
Traditional simulator Jaxonomy / JAX
────────────────────── ───────────────────────────────────────── simulate(params) → jit(simulate)(params) 10–100× faster for p in param_grid: … → vmap(simulate)(param_grid) embarrassingly parallel finite_diff_gradient(…) → grad(simulate)(params) exact gradients, free
| Feature | SciPy / NumPy | Julia / DiffEq | Modelica | MathWorks¹ | Jaxonomy |
|---|---|---|---|---|---|
| Python-native | ✓ | ✗ | ✗ | ✗ | ✓ |
| JIT / code generation | ✗ | ✓ | ✓ (C++) | ✓ (C/C++) | ✓ |
| Full autodiff through ODE | ✗ | Partial | ✗ | Partial² | ✓ |
| Hybrid events & zero-crossing | Partial | ✓ | ✓ | ✓ | ✓ |
| Acausal / equation-based | ✗ | ✗ | ✓ | ✓ (Simscape) | ✓ |
| Block-diagram composition | ✗ | Partial | Partial | ✓ (Simulink) | ✓ |
| State-machine modeling | ✗ | ✗ | ✗ | ✓ (Stateflow) | ✓ |
| LQR / MPC / Kalman built-in | ✗ | Partial | Via libs | ✓ (Toolboxes) | ✓ |
| Neural ODE / SINDy | ✗ | ✓ | ✗ | ✗ | ✓ |
| Reduced-order modeling (balred / POD-DEIM / DMD / Koopman) | ✗ | Partial | ✗ | ✓ (Toolboxes) | ✓ |
| Batch / ensemble (vmap) | ✗ | ✗ | ✗ | ✗ | ✓ |
| Open-source (MIT) | ✓ | ✓ | Partial | ✗ | ✓ |
¹ Simulink + Simscape + Stateflow + Control System Toolbox · ² Via Simulink Design Optimization, no end-to-end AD
| Capability | What it enables |
|---|---|
| ⚡ JAX-native engine | JIT-compile simulations, run ensembles with vmap, differentiate through ODE solvers including event handling |
| 🔀 Hybrid dynamics + state machines | Continuous ODEs, periodic discrete updates, zero-crossing events, and StateMachineBuilder-authored finite state machines composed in one model. jax.grad flows through event times for hybrid trajectory optimisation. |
| 🔌 Acausal modeling | Modelica-inspired multi-domain components (electrical, mechanical, thermal, fluid, battery) with Pantelides index reduction and a BDF mass-matrix DAE solver |
| 🎯 Control & estimation | LQR (continuous, discrete, finite-horizon, LQG), linear MPC (native + OSQP), nonlinear MPC (shooting / transcription / Hermite-Simpson), Kalman / EKF / UKF / RLS / Luenberger, 2-DOF PID with classical tuning helpers |
| 🧮 Unit-aware wiring | Optional BusUnit annotations on ports and signals; the diagram compiler catches dimensional mismatches at build time instead of as silent runtime bugs |
| 🧠 Data-driven modeling | Neural ODEs, Universal Differential Equations, SINDy symbolic regression, neural-network blocks (MLP / PyTorch / TensorFlow / ONNX), differentiable lookup-table fitting, and statistical surrogates (Gaussian process, polynomial chaos, RBF) |
| 📉 Reduced-order modeling | jaxonomy.library.rom: linear MOR (balanced truncation, minreal, modal / residualization), POD–Galerkin with DEIM hyper-reduction, and data-driven operator ROM (DMD / DMDc / ERA, Koopman / eDMD lifted-linear predictors). One reduce(...) front door; every reduced model is a differentiable, simulatable block |
| 🎲 Uncertainty & sensitivity | First-class jaxonomy.uq workflow: Monte Carlo with parameter distributions, Latin Hypercube + quasi-Monte Carlo sampling, Sobol sensitivity decomposition, Morris screening |
| 🤝 FMI 2.0 / 3.0 interop | Import FMI co-simulation FMUs (ModelicaFMU, mixed-type and array I/O) or model-exchange FMUs (ModelicaFMUME, integrated by Jaxonomy's own solver with FMI event indicators as zero-crossings); export a diagram as a binary .fmu via build_fmu. Verified against the Reference FMUs, OpenModelica, and the fmusim reference simulator in CI |
| 🧩 150+ library blocks | Integrators, filters, state machines, look-up tables, coordinate transforms, container blocks, bus / mux family, stochastic sources, and more |
Requires Python 3.10+.
# Create and activate a virtual environment (recommended)
python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install jaxonomy # core pip install jaxonomy[safe] # + SciPy, Matplotlib, control, jaxopt pip install jaxonomy[nmpc] # + nonlinear MPC (requires IPOPT on PATH) pip install jaxonomy[all] # + everything
From source:
git clone https://github.com/machinavitalis/jaxonomy
cd jaxonomy pip install -e .
CLI runner:
jaxonomy_cli run --model path/to/model.json
A first simulation in a few lines — a custom block, built into a diagram, integrated through its ODE:
import jaxonomy as jx
import jax.numpy as jnp
class VanDerPol(jx.LeafSystem): def init(self, mu=1.0, kwargs): super().__init__(kwargs) self.declare_dynamic_parameter("mu", mu) self.declare_continuous_state( default_value=jnp.array([0.0, 2.0]), ode=self._ode ) self.declare_continuous_state_output(name="x")
def _ode(self, time, state, *inputs, **params): x, mu = state.continuous_state, params["mu"] return jnp.array([x[1], mu * (1 - x[0]**2) * x[1] - x[0]])
builder = jx.DiagramBuilder() vdp = builder.add(VanDerPol(mu=2.0, name="vdp")) diagram = builder.build()
results = jx.simulate( diagram, diagram.create_context(), (0.0, 20.0), options=jx.SimulatorOptions(buffer_length=4000), # room for adaptive steps recorded_signals={"x": vdp.output_ports[0]}, )
pip install -r requirements.docs.txt
mkdocs serve # → http://127.0.0.1:8000
- **Example notebooks:** [`docs/examples/`](https://github.com/machinavitalis/jaxonomy/tree/main/docs/examples)
Jaxonomy ships an MCP server that exposes the engine as tools an AI agent can call directly — it can enumerate library blocks, build and validate a model, run a simulation, fit parameters to data, and linearize a system, then reason over the actual results. This is worth wiring up if you drive Jaxonomy from an agent (Claude Desktop/Code, Cursor, …); if you're writing Python by hand, the pip install above is all you need and you can skip this.
pip install jaxonomy[mcp]
Then register the server with your agent client. For Claude Desktop, add to claude_desktop_config.json:
{
"mcpServers": { "jaxonomy": { "command": "python", "args": ["-m", "jaxonomy.mcp.server"] } } }
Use the interpreter where jaxonomy[mcp] is installed (or the jaxonomy-mcp entry point). The server is listed in the MCP Registry as io.github.machinavitalis/jaxonomy; full tool reference, client configuration and limitations are at py.jaxonomy.com/mcp.
If you'd rather just point an agent at the documentation, start it on SKILL.md — when to use Jaxonomy, when to reach for something else, the core API, and the pitfalls that most often break a first script. The docs site also publishes llms.txt views: py.jaxonomy.com/llms.txt for an index of every page, and py.jaxonomy.com/llms-full.txt for the whole documentation set as one Markdown file.
Jaxonomy is designed for hybrid systems — models where continuous physics interacts with instantaneous discrete resets. The bouncing ball is the canonical example: free-fall ODE interrupted by a collision event that reverses velocity.
The dynamics between bounces follow:
$$ \dot{x} = v, \qquad \dot{v} = -g $$
When the ball hits the ground ($x = 0$, $v < 0$) a zero-crossing event fires and the state resets:
$$ x^+ = 0, \qquad v^+ = -e \cdot v \quad (e \in [0, 1] \text{ — coefficient of restitution}) $$
import jaxonomy as jx
import jax.numpy as jnp
class BouncingBall(jx.LeafSystem): def init(self, g=9.81, e=0.8, *
Only the beginning is shown; read the rest in the repo