Atlas / MCP servers / hereon-institutems / openPASO

openPASOBLOCK

mcp/hereon-institutems/openpaso

openPASO (formerly OASiS): an MCP server that lets an AI model run nine finite-element and multiphysics codes, with curated knowledge, verified execution and cross-code coupling. Under active development; contributions welcome.

Verdict
BLOCK
Grade
F
Trust score
39 /100
Exposed tools
64 51r · 13w · 0d
Transport
stdio
License
MIT
Stars
27
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

openPASO

open Platform for Agentic Simulation and Optimization

Describe a physics problem in plain words. An AI model picks a solver, writes its input, runs it, and checks the answer.

Click the film to watch it in full quality on the documentation website.

[!WARNING] openPASO is under active development, and we invite you to help. It works and is used for
Read from source at commit 678b3ab53bf0OBSERVED · 2026-10-09
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add openpaso-ui --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env CLAUDE_CODE_OAUTH_TOKEN=${CLAUDE_CODE_OAUTH_TOKEN} --env OPENROUTER_API_KEY=${OPENROUTER_API_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "openpaso-ui": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
        "CLAUDE_CODE_OAUTH_TOKEN": "${CLAUDE_CODE_OAUTH_TOKEN}",
        "OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}"
      }
    }
  }
}
03

Exposed tools (64)

51 read · 13 write · 0 destructive.

ToolRiskDescription
audit_resultsreadCheck your OWN result files for the failures that most often sink a
benchmark_poisson_cross_solverreadQuick benchmark: Poisson on unit square across all available solvers.
benchmark_problemwriteRun the same physics problem on all available backends and compare.
browse_solver_testsreadBrowse real test/example files from a solver
build_sourcewriteRun the build recipe (CMake + ninja, or pip install -e .) for a
check_inputreadName the defects of an input deck or script BEFORE it runs: the setup checks the run
check_simulation_qualitywriteRun quality checks on a simulation BEFORE running it.
compare_solversreadCompare results from multiple solver runs side by side.
couplereadGENERAL partitioned multi-code coupling — works for ANY physics/coupling.
couple_levelsreadEVERY PRESCRIBED MESH LEVEL IN ONE CALL -- the same partitioned coupling as
couple_precicereadGENERAL preCICE coupling of ARBITRARY codes/paradigms, end-to-end.
coupled_solvereadLEGACY cross-solver coupling — FIXED toy geometries only. PREFER `couple`.
deep_validatereadDeep validation of solver input — catches physics errors, not just syntax.
developerreadDeveloper tools: architecture, source files, capabilities matrix.
discoverreadDiscover available solvers and their capabilities.
discover_sourcesreadFind source trees + binaries for every backend by scanning the
ensure_sourcereadOne-shot: discover → fetch if missing → optionally build if no
examplesreadFind and retrieve example input files from solver test suites.
fetch_sourcereadClone the canonical upstream source for a backend into
generate_inputreadGenerate a complete, runnable input for a solver backend.
generate_meshreadGenerate a mesh using Gmsh for non-trivial geometries.
get_coupling_knowledgereadComplete knowledge for partitioned multi-code coupling via `couple`.
get_example_inputreadRetrieve a complete, runnable example input file.
get_example_inputsreadGet working example input files for a given physics module.
get_input_file_guidereadGet a comprehensive guide for writing input files for a solver.
get_input_schemareadGet the full input schema for a solver
get_job_statusreadCheck the status of a simulation job.
get_module_inforeadGet detailed information about a specific physics module on a specific solver.
get_physics_knowledgereadGet domain knowledge for a physics module from a specific solver backend.
get_precice_knowledgereadComplete knowledge for preCICE coupling via `couple_precice`.
get_solver_architecturereadGet the source code architecture and extension points for a solver backend.
get_solver_capabilities_matrixreadGet a comprehensive capabilities matrix across all available backends.
get_solver_inforeadGet detailed information about a specific solver backend.
get_tsi_knowledgereadGet complete knowledge for thermo-structural interaction (TSI) coupling.
list_jobsreadList all simulation jobs from this session.
list_physicsreadList all physics problems solvable by available backends.
list_solver_source_filesreadList source files matching a pattern in a solver
list_solversreadList all registered FEM solver backends and their availability status.
list_template_variantsreadList all available template variants for a solver and/or physics module.
list_tutorialsreadList available tutorial examples for a solver backend.
parameter_studywriteRun a parameter study: same simulation with different parameter values.
plot_all_fieldsreadGenerate PNG plots for ALL fields in a simulation result.
plot_resultreadGenerate a publication-quality visualization of simulation results.
post_processwriteExtract field statistics from simulation results.
prepare_simulationwritePrepare everything needed to set up a simulation — in ONE call.
query_documentationreadSearch solver documentation for a specific topic.
read_solver_test_filereadRead the content of a specific test/example file from a solver.
recommend_solver_forreadRecommend the best available solver for a given physics problem.
rediscover_backendsreadProbe the system for solver backends and report findings.
reload_catalogreadHot-reload the per-backend KNOWLEDGE dicts from disk.
restart_simulationwriteRestart a completed simulation from its last checkpoint.
run_simulationwriteRun a simulation directly with input content.
run_with_generatorwriteRun a generator script that creates an input file, then execute the solver.
search_examplesreadSearch for example input files across all backends.
session_insightsreadReview knowledge discovered during this session or from saved
setup_backendwriteGuided backend setup: detect, plan, install, verify, persist.
submit_critic_reviewwritePut an independent critic
transfer_fieldwriteExtract field values at an interface from a VTU file and format for transfer.
validate_inputreadValidate solver-specific input content before running.
validate_physicsreadValidate simulation parameters against physics constraints.
verify_interface_fluxreadOn a COUPLED task: is your interface flux the right sign, and do
verify_mesh_independencereadHeuristic mesh-independence study for problems WITHOUT an exact
verify_pde_consistencyreadDoes your field actually satisfy the equation the task stated?
visualizewritePost-process and visualize simulation results.
04

Trust audit

BLOCKgrade F · trust 39/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (7 observation(s))
Network
declared (14 observation(s))
Shell
declared (11 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
data/coupling_participants/participant_dealii.py:137
F_SRC = lambda x, y: eval(_code, {"__builtins__": {}}, dict(_names, x=x, y=y)) + 0.0 * x  # noqa: E731,F811
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
data/coupling_participants/participant_dealii_elastic.py:125
return lambda x, y: eval(code, {"__builtins__": {}}, dict(names, x=x, y=y)) + 0.0 * x
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
data/coupling_participants/participant_dealii_transient.py:126
return lambda *a: eval(code, {"__builtins__": {}}, dict(env, **dict(zip(names, a)))) + 0.0 * a[0]
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
data/coupling_participants/participant_dune_elastic.py:150
return eval(code, {"__builtins__": {}}, env) + 0.0 * x
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
data/coupling_participants/participant_febio_elastic.py:135
return (eval(_bx, {"__builtins__": {}}, env) + 0.0 * x, eval(_by, {"__builtins__": {}}, env) + 0.0 * x)
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHObfuscation / stealth · obf.rtl_override · CWE-506, CWE-94
webui/static/assets/index-Cgsjd08P.js:300
?)[ \r	]*`,Qw=`[̀-ͯ]`,$w=RegExp(Qw+`+$`),eT=`(`+qw+`+)|`+(Zw+`|`)+`([!-\\[\\]-‧-豈-]`+(Qw+`*`)+`|[\ud800-\udbff][\udc00-\udfff]`+(Qw+`*`)+`|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5`+(`|`+Xw)+(
HIGHPrompt injection · prompt.tool_poisoning · CWE-94, CWE-1427
docs/tools/examples.md:26
IMPORTANT: Always call this before writing new input files to study
Why it matters. a tool description carrying instructions to the agent
Fix. tool descriptions describe the tool; nothing else
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
scripts/fingerprint_solvers.py:35
mod = importlib.import_module(module)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
scripts/fingerprint_solvers.py:45
mod = importlib.import_module(module)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
src/backends/dealii/generators/__init__.py:151
mod = importlib.import_module(module_path, package=__name__)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
src/backends/dealii/generators/__init__.py:176
mod = importlib.import_module(module_path, package=__name__)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
src/backends/fenics/generators/__init__.py:111
raw_mod = importlib.import_module(module_path, package=__name__)
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
ui/vite.config.ts:31
'/api': 'http://127.0.0.1:8080',
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
ui/vite.config.ts:32
'/sandbox-file': 'http://127.0.0.1:8080',
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
webui/app.py:85
"http://127.0.0.1:5173"],
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
webui/catalog.py:74
r = await c.get(f"http://127.0.0.1:{port}/v1/models")
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
webui/runner.py:74
base_url=f"http://127.0.0.1:{_MOCK_PORT}/v1",
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
src/backends/dune/backend.py:291
description="Poisson equation -Δu = f (UFL forms, DUNE backend)",
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
src/backends/dune/backend.py:369
description="Maxwell equations: 2-D TE-mode scalar Helmholtz proxy (-Δu - k2u = f); full H(curl) via NGSolve",
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
src/backends/dune/backend.py:376
description="Eigenvalue problem -Δu = λu via shift-invert inverse iteration",
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
src/backends/dune/backend.py:397
description="Helmholtz equation -Δu - k2u = f with MMS verification",
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
src/backends/dune/backend.py:404
description="Transient heat du/dt - alpha*Δu = f via implicit Euler time-stepping",
LOWInventory / provenance · inv.hidden_file · CWE-1104
.windsurfrules
.windsurfrules
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/core/coupling_driver.py:312
return hashlib.sha1(text.encode("utf-8", "replace")).hexdigest()
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/backends/febio/generators/__init__.py:829
"<config>/../../../include exists) and then globs for a "

Gates applied: no_behavioural_pass.

Audited 2026-10-09 · audit v0.4.1 · source sha 678b3ab53bf0full audit observations/trust-audit/mcp-server/hereon-institutems__openpaso.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-09678b3ab53bf0BLOCKF39first audit
06

Questions

What is the openPASO MCP server?

openPASO (formerly OASiS): an MCP server that lets an AI model run nine finite-element and multiphysics codes, with curated knowledge, verified execution and cross-code coupling. Under active development; contributions welcome.

What tools does openPASO expose?

64 in total: 51 read-only, 13 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is openPASO safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (39/100) and found 7 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does openPASO need?

It reads ANTHROPIC_API_KEY, CLAUDE_CODE_OAUTH_TOKEN and OPENROUTER_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does openPASO run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as openpaso-ui at 1.1.0.

How current is this page?

The grade is for one exact copy of the source (678b3ab53bf0), read on 2026-10-09. The repository is watched and re-audited when it changes.

Advertisement