MCP server that wraps the Dagster GraphQL API — manage runs, assets, schedules, sensors, and backfills from any MCP client
MCP for OpenFilters is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Design, simulate and optimize optical thin-film coatings with the OpenFilters engine.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user mcp-for-openfilters '--' uvx mcp-for-openfilters
# 2 — ask your agent for something these tools do
# server_info, list_materials, get_material_index and 25 more
MCP for OpenFilters costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. This one runs on your machine: your client starts MCP for OpenFilters as a process under your own user, with your files and your network, so the tool surface below is what it can do to your computer rather than to a server somewhere else. Its scan result is on the Security tab — read the surface before you approve it.
This is a public server: you run it yourself and this marketplace is not in the path. You need uv (docs.astral.sh/uv): uvx comes with it. Claude Code registers it in one command; --scope user makes it available in every project. The '--' is in quotes so that PowerShell passes it on.
claude mcp add --scope user mcp-for-openfilters '--' uvx mcp-for-openfiltersReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry your client uses to start the process locally. A local server runs with your file system and your network, which is why it is priced without metering.
28 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Read from its source code. A server that builds its tool list when it starts can list more tools than this.
Version, build (git commit of a source checkout, and when this server started: a server started before a code change still runs the old code until the app is restarted), data folder, worker count and whether the compiled C++ core is in use.
Takes no parameters.
List available materials (built-in OpenFilters library plus the user's own) with n,k at a few wavelengths. Mixtures (variable composition) report their index range at 550 nm.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name_filter | string | no | — |
Tabulate n and k of a regular material over wavelengths (default 300-2000 nm, 50 nm steps).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | — |
| wavelengths | no | — | |
| plot | boolean | no | — |
Add a material to the user's material folder.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | — |
| model | string | yes | — |
| description | string | no | — |
| n | number | no | — |
| k | number | no | — |
| coefficients | array | no | — |
| table | array | no | — |
| table_file | string | no | — |
| wavelength_unit | string | no | — |
| overwrite | boolean | no | — |
Delete one of the user's own materials (from add_material or import_refractiveindex_material).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | — |
Search the refractiveindex.info database of optical constants (public domain) by material name, formula or author, e.g. "Ta2O5", "silicon nitride", "HfO2 thin film", "N-BK7". Each result gives a page id to pass to import_refractiveindex_material (pass it exactly, spaces included), the source…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | — |
| shelf | string | no | — |
| limit | integer | no | — |
| refresh | boolean | no | — |
Download one refractiveindex.info entry (page from search_refractiveindex) and add it to the user's materials as an n,k table, usable in designs like any other material. Tabulated data and dispersion formulas are both converted; k = 0 when the entry gives none. name defaults to <book>_<page>…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| page | string | yes | — |
| name | string | no | — |
| from_nm | number | no | — |
| to_nm | number | no | — |
| overwrite | boolean | no | — |
| plot | boolean | no | — |
Validate a design and list its layers (thickness, index and QWOT at the center wavelength; graded
| Parameter | Type | Required | Notes |
|---|---|---|---|
| design | yes | — | |
| plot_index_profile | boolean | no | — |
Compute R, T, A, OD, phase, GD or GDD spectra (quantity names R, T, A, OD, R_phase, T_phase, R_GD, T_GD, R_GDD, T_GDD) versus wavelength for one design at one or more angles and polarizations. Returns, per series, min/max/mean and sample_points evenly spaced samples (set sample_points=0 for…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| design | yes | — | |
| quantities | array | no | — |
| wavelengths | no | — | |
| angles | array | no | — |
| polarizations | array | no | — |
| reverse | boolean | no | — |
| sample_points | integer | no | — |
| threshold | object | no | {"above": 0.999} or {"below": 0.01}: ranges where each series is above/below the level, edges interpolated (e.g. the high-reflection band of a mirror); {"half_max": true}: FWHM, peak and half-maximum |
| plot | boolean | no | — |
| save_csv | boolean | no | — |
R/T/A (or phase) versus angle of incidence at a single wavelength. Per curve: min/max with the angle where each occurs (e.g. Brewster's angle is at_deg_min of "R p"), mean, sample_points evenly spaced samples (0 for statistics only) and optional threshold ranges.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| design | yes | — | |
| wavelength | number | yes | — |
| quantities | array | no | — |
| angles | object | no | {"from": 0, "to": 85, "step": 1} |
| polarizations | array | no | — |
| sample_points | integer | no | — |
| threshold | object | no | as in compute_spectrum, over angle |
| plot | boolean | no | — |
Color of the coating in reflection or transmission: XYZ, xy, L*a*b*, LCh, sRGB and hex, at each angle (use several angles to see the color shift).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| design | yes | — | |
| angles | array | no | — |
| mode | string | no | — |
| polarization | no | — | |
| illuminant | string | no | — |
| observer | string | no | — |
Standing-wave |E|^2 inside the coating (relative to the incident wave), e.g. for laser-damage analysis, sampled every 1 nm inside every layer (graded layers too). Returns the peak value and position, its value at each interface and, for graded layers, the peak inside each one.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| design | yes | — | |
| wavelength | number | yes | — |
| angle | number | no | — |
| polarization | no | — | |
| plot | boolean | no | — |
Optical monitoring signal (R or T) versus deposited thickness, as seen during deposition. Returns the signal at the end of each layer (turning-point/level-cut planning). With many wavelengths (spectroscopic monitoring) it returns the layer-end signals of the selected wavelength (the center…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| design | yes | — | |
| wavelengths | array/object/string | yes | Monitoring wavelengths: a list (e.g. [550]), a range {"from": 400, "to": 800, "step": 2}, or "spectroscopic" = every wavelength of the design's wavelength_range (OpenFilters' spectroscopic option: bro |
| angle | number | no | — |
| polarization | no | — | |
| mode | string | no | — |
| direction | string | no | — |
| save_map | boolean | no | — |
| plot | boolean | no | — |
How the peak of R or T nearest near (default the center wavelength; e.g. a band-pass line) moves when each material's index or thickness changes: d(lambda)/dn in nm per refractive-index unit and d(lambda)/d(strain) in nm per unit relative thickness change, for all layers of that material…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| design | yes | — | |
| near | number | no | — |
| quantity | string | no | — |
| thermal | no | — | |
| window | no | — | |
| angle | number | no | — |
| polarization | no | — |
The peak of R or T nearest near at each temperature change delta_T (K, relative to the temperature the design's materials and thicknesses describe), with every material's dn/dT, dk/dT and thickness strain applied together: half-maximum centre, peak wavelength and value, FWHM; a linear fit gives…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| design | yes | — | |
| delta_T | array | yes | — |
| thermal | yes | — | |
| near | number | no | — |
| quantity | string | no | — |
| window | no | — | |
| angle | number | no | — |
| polarization | no | — | |
| plot | boolean | no | — |
Merit (chi^2, OpenFilters' definition) of a design against targets, with per-target pass fraction and maximum deviation. all_targets_met is true when every point meets its target (inequalities must hold;
| Parameter | Type | Required | Notes |
|---|---|---|---|
| design | yes | — | |
| targets | yes | — | |
| plot | boolean | no | — |
Change in merit (delta_chi2) and in worst margin when each layer thickness changes by +/- relative_step (default 1 %; the worse direction), to find the layers that need the tightest deposition control.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| design | yes | — | |
| targets | yes | — | |
| relative_step | number | no | — |
Optimize a design with OpenFilters: method "refine" (thicknesses only), "needle" (refine and insert new layers until no improvement) or "step" (graded/step index, needs a mixture material).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| design | yes | — | |
| targets | yes | — | |
| method | string | no | — |
| options | object | no | time_limit (s, default 300), max_iterations, min_thickness (nm; guaranteed in the result: thin layers are clamped or removed and the design re-refined with that bound; a clamped design that already me |
| wait_seconds | number | no | — |
Parameter sweep run in parallel on all cores as a background job.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| operation | string | yes | — |
| template | object | yes | Arguments of the operation, where any value written "$name" (or "${name}" inside a string) is replaced by the swept parameter name. |
| parameters | object | yes | e.g. {"n_pairs": [4, 6, 8], "aoi": [0, 15, 30]} |
| mode | string | no | — |
| label | string | no | — |
Many optimizations from different starting designs, in parallel; ranks distinct results (by yield first when a tolerance stage is requested, then targets met, merit, layer count, total thickness) and saves the top_n designs as an .ofp project. Starts that converge to the same design are marked…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| targets | yes | — | |
| starts | array | no | Explicit starting designs. |
| random_starts | object | no | Generate starts: {"count": 50, "materials": ["TiO2", "SiO2"], "n_layers": [5, 25], "thickness": [20, 200], "substrate": "BK7", "seed": 1, ...other design keys}. n_layers only sizes the starting design |
| methods | array | no | — |
| options | object | no | Same as optimize_design options, applied to every optimization (e.g. max_layers, min_thickness, time_limit). |
| top_n | integer | no | — |
| tolerance | object | no | Optional yield stage on the top_n designs: {"n_trials": 200, "thickness_error": {"type": "relative", "sigma": 0.01}, "index_error": {"sigma": 0.005}, "seed": 0} |
| label | string | no | — |
Monte Carlo yield: random thickness (and optional index) errors; a trial passes when every target is met. Runs in parallel; returns yield with 95 % interval, merit statistics and the failure rate of each target. Both faces of a two-sided design are perturbed. A graded layer is scaled as a whole…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| design | yes | — | |
| targets | yes | — | |
| n_trials | integer | no | — |
| thickness_error | object | no | {"type": "relative"|"absolute", "sigma": 0.01 (fraction) or nm, "distribution": "normal"|"uniform", "systematic": 0.0 (common relative offset)} |
| index_error | object | no | {"sigma": 0.005} relative index error, drawn per material per trial |
| seed | integer | no | — |
| wait_seconds | number | no | — |
OpenFilters' Preproduction > Simulate random errors: the spread of R, T, A, phase, GD, GDD (and colour) curves when every layer thickness is off by a random error, without targets (tolerance_analysis gives the yield against targets instead). Runs OpenFilters' own analysis: front layers only,…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| design | yes | — | |
| quantities | array | no | — |
| wavelengths | no | — | |
| angle | number | no | — |
| polarization | no | — | |
| thickness_error | object | no | {"type": "relative" (value a fraction, 0.01 = 1 %) | "absolute" (value in nm), "value": 0.01 ("sigma" is accepted too), "distribution": "uniform" (within +/- value) | "normal" (sigma = value)}; defaul |
| nb_tests | integer | no | — |
| illuminant | string | no | — |
| observer | string | no | — |
| show | object | no | What the plots draw, as the dialog's Show boxes: {"all_results": false, "mean": false, "std_devs": null (e.g. 3 for mean +/- 3 sigma), "worst_case": true, "design": true, "targets": false} |
| targets | no | — | |
| seed | integer | no | — |
| sample_points | integer | no | — |
| save_all_results | boolean | no | — |
| plot | boolean | no | — |
Progress of a background job (tasks done/total, failures, ETA, output files when done).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| job_id | string | yes | — |
Most recent background jobs, newest first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | — |
Result rows of a job (campaigns are ranked best first; batches in task order unless sort_by is given). Works on partial results while the job is running. include_designs adds the optimized design JSON of the returned rows. For finished campaigns, plots the top 3 designs against the targets.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| job_id | string | yes | — |
| top_n | integer | no | — |
| sort_by | string | no | — |
| descending | boolean | no | — |
| include_designs | boolean | no | — |
| plot | boolean | no | — |
Cancel the pending tasks of a running background job. Reports tasks_done, tasks_still_running (they finish on their own) and tasks_cancelled (never started); a finished job is left as it is.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| job_id | string | yes | — |
Read an OpenFilters .ofp project: returns its designs (as design JSON) and targets.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | — |
| full_graded_arrays | boolean | no | — |
Write designs and their targets to an .ofp project that opens in the OpenFilters GUI.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | — |
| designs | array | yes | — |
| targets | array | no | — |
| comment | string | no | — |
- Every tool, no call limit
- No card, and mcprush charges nothing for it
- Source published under GPL-2.0
- Runs on your machine — nothing of it reaches our gateway
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install MCP for OpenFilters or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | minimal | capability blast radius (minimal) — client exposure if the model is manipulated | −0 |
| verification-discount | source | publisher verification (provenance) — cryptographic build provenance ties the artifact to its source | −0 |
| coverage-honesty | source | inspection depth (source) — how much of the target the scan could see | −0 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
Tools were statically extracted from the published source (28 recovered), not enumerated from a running server. Tool-poisoning, Unicode-smuggling, capability and toxic-flow analysis ran on this inferred surface, but a mis-parsed registration could be missed or mis-attributed, so tool-derived findings are capped below “confirmed”. To grade the real runtime surface, scan the running server: --command "npx -y <package>".
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. minimal is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| server_info | no tags | |
| list_materials | no tags | |
| get_material_index | no tags | |
| add_material | no tags | |
| remove_material | no tags | |
| search_refractiveindex | no tags | |
| import_refractiveindex_material | untrusted-input | untrusted-input: keyword "download" |
| describe_design | no tags | |
| compute_spectrum | no tags | |
| compute_angle_scan | no tags | |
| compute_color | no tags | |
| compute_electric_field | no tags | |
| compute_monitoring_curves | no tags | |
| thermal_sensitivity | no tags | |
| thermal_sweep | no tags | |
| evaluate_design | no tags | |
| layer_sensitivity | no tags | |
| optimize_design | no tags | |
| run_batch | no tags | |
| run_optimization_campaign | no tags | |
| simulate_random_errors | no tags | |
| job_status | no tags | |
| list_jobs | no tags | |
| get_results | no tags | |
| cancel_job | no tags | |
| load_project | no tags | |
| save_project | no tags | |
| tolerance_analysis | no tags |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
The public result for this release does not print the flow graph, so there is nothing to show here. That is not the same as "no paths were found": what the scan did read is above, under coverage.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
Always latest — the install command names no version, so it installs the newest release when it runs; the current release on file is 0.2.2. Pin a release below and the command asks for exactly that one.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish MCP for OpenFilters can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.