ovito-mcp 2026.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ovito_mcp-2026.1/.gitignore +266 -0
- ovito_mcp-2026.1/.gitlab-ci.yml +95 -0
- ovito_mcp-2026.1/LICENSE +39 -0
- ovito_mcp-2026.1/PKG-INFO +245 -0
- ovito_mcp-2026.1/README.md +213 -0
- ovito_mcp-2026.1/RELEASING.md +98 -0
- ovito_mcp-2026.1/ovito_mcp/__init__.py +2137 -0
- ovito_mcp-2026.1/ovito_mcp/__main__.py +47 -0
- ovito_mcp-2026.1/ovito_mcp/rag/__init__.py +433 -0
- ovito_mcp-2026.1/ovito_mcp/rag/db.py +1054 -0
- ovito_mcp-2026.1/pyproject.toml +47 -0
- ovito_mcp-2026.1/tests/conftest.py +114 -0
- ovito_mcp-2026.1/tests/test_agent_guidance.py +100 -0
- ovito_mcp-2026.1/tests/test_concurrency.py +150 -0
- ovito_mcp-2026.1/tests/test_docs_index.py +130 -0
- ovito_mcp-2026.1/tests/test_docs_index_discovery.py +75 -0
- ovito_mcp-2026.1/tests/test_error_reporting.py +267 -0
- ovito_mcp-2026.1/tests/test_kernel_attach.py +158 -0
- ovito_mcp-2026.1/tests/test_kernel_namespace.py +128 -0
- ovito_mcp-2026.1/tests/test_kernel_spec.py +59 -0
- ovito_mcp-2026.1/tests/test_object_lookup.py +184 -0
- ovito_mcp-2026.1/tests/test_rag_db.py +601 -0
- ovito_mcp-2026.1/tests/test_screenshot.py +181 -0
- ovito_mcp-2026.1/tests/test_tool_annotations.py +104 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,python,macos,linux,windows
|
|
2
|
+
# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,python,macos,linux,windows
|
|
3
|
+
|
|
4
|
+
### Linux ###
|
|
5
|
+
*~
|
|
6
|
+
|
|
7
|
+
# temporary files which can be created if a process still has a handle open of a deleted file
|
|
8
|
+
.fuse_hidden*
|
|
9
|
+
|
|
10
|
+
# KDE directory preferences
|
|
11
|
+
.directory
|
|
12
|
+
|
|
13
|
+
# Linux trash folder which might appear on any partition or disk
|
|
14
|
+
.Trash-*
|
|
15
|
+
|
|
16
|
+
# .nfs files are created when an open file is removed but is still being accessed
|
|
17
|
+
.nfs*
|
|
18
|
+
|
|
19
|
+
### macOS ###
|
|
20
|
+
# General
|
|
21
|
+
.DS_Store
|
|
22
|
+
.AppleDouble
|
|
23
|
+
.LSOverride
|
|
24
|
+
|
|
25
|
+
# Icon must end with two \r
|
|
26
|
+
Icon
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# Thumbnails
|
|
30
|
+
._*
|
|
31
|
+
|
|
32
|
+
# Files that might appear in the root of a volume
|
|
33
|
+
.DocumentRevisions-V100
|
|
34
|
+
.fseventsd
|
|
35
|
+
.Spotlight-V100
|
|
36
|
+
.TemporaryItems
|
|
37
|
+
.Trashes
|
|
38
|
+
.VolumeIcon.icns
|
|
39
|
+
.com.apple.timemachine.donotpresent
|
|
40
|
+
|
|
41
|
+
# Directories potentially created on remote AFP share
|
|
42
|
+
.AppleDB
|
|
43
|
+
.AppleDesktop
|
|
44
|
+
Network Trash Folder
|
|
45
|
+
Temporary Items
|
|
46
|
+
.apdisk
|
|
47
|
+
|
|
48
|
+
### macOS Patch ###
|
|
49
|
+
# iCloud generated files
|
|
50
|
+
*.icloud
|
|
51
|
+
|
|
52
|
+
### Python ###
|
|
53
|
+
# Byte-compiled / optimized / DLL files
|
|
54
|
+
__pycache__/
|
|
55
|
+
*.py[cod]
|
|
56
|
+
*$py.class
|
|
57
|
+
|
|
58
|
+
# C extensions
|
|
59
|
+
*.so
|
|
60
|
+
|
|
61
|
+
# Distribution / packaging
|
|
62
|
+
.Python
|
|
63
|
+
build/
|
|
64
|
+
develop-eggs/
|
|
65
|
+
dist/
|
|
66
|
+
downloads/
|
|
67
|
+
eggs/
|
|
68
|
+
.eggs/
|
|
69
|
+
lib/
|
|
70
|
+
lib64/
|
|
71
|
+
parts/
|
|
72
|
+
sdist/
|
|
73
|
+
var/
|
|
74
|
+
wheels/
|
|
75
|
+
share/python-wheels/
|
|
76
|
+
*.egg-info/
|
|
77
|
+
.installed.cfg
|
|
78
|
+
*.egg
|
|
79
|
+
MANIFEST
|
|
80
|
+
|
|
81
|
+
# PyInstaller
|
|
82
|
+
# Usually these files are written by a python script from a template
|
|
83
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
84
|
+
*.manifest
|
|
85
|
+
*.spec
|
|
86
|
+
|
|
87
|
+
# Installer logs
|
|
88
|
+
pip-log.txt
|
|
89
|
+
pip-delete-this-directory.txt
|
|
90
|
+
|
|
91
|
+
# Unit test / coverage reports
|
|
92
|
+
htmlcov/
|
|
93
|
+
.tox/
|
|
94
|
+
.nox/
|
|
95
|
+
.coverage
|
|
96
|
+
.coverage.*
|
|
97
|
+
.cache
|
|
98
|
+
nosetests.xml
|
|
99
|
+
coverage.xml
|
|
100
|
+
*.cover
|
|
101
|
+
*.py,cover
|
|
102
|
+
.hypothesis/
|
|
103
|
+
.pytest_cache/
|
|
104
|
+
cover/
|
|
105
|
+
|
|
106
|
+
# Translations
|
|
107
|
+
*.mo
|
|
108
|
+
*.pot
|
|
109
|
+
|
|
110
|
+
# Django stuff:
|
|
111
|
+
*.log
|
|
112
|
+
local_settings.py
|
|
113
|
+
db.sqlite3
|
|
114
|
+
db.sqlite3-journal
|
|
115
|
+
|
|
116
|
+
# Flask stuff:
|
|
117
|
+
instance/
|
|
118
|
+
.webassets-cache
|
|
119
|
+
|
|
120
|
+
# Scrapy stuff:
|
|
121
|
+
.scrapy
|
|
122
|
+
|
|
123
|
+
# Sphinx documentation
|
|
124
|
+
docs/_build/
|
|
125
|
+
|
|
126
|
+
# PyBuilder
|
|
127
|
+
.pybuilder/
|
|
128
|
+
target/
|
|
129
|
+
|
|
130
|
+
# Jupyter Notebook
|
|
131
|
+
.ipynb_checkpoints
|
|
132
|
+
|
|
133
|
+
# IPython
|
|
134
|
+
profile_default/
|
|
135
|
+
ipython_config.py
|
|
136
|
+
|
|
137
|
+
# pyenv
|
|
138
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
139
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
140
|
+
# .python-version
|
|
141
|
+
|
|
142
|
+
# pipenv
|
|
143
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
144
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
145
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
146
|
+
# install all needed dependencies.
|
|
147
|
+
#Pipfile.lock
|
|
148
|
+
|
|
149
|
+
# poetry
|
|
150
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
151
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
152
|
+
# commonly ignored for libraries.
|
|
153
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
154
|
+
#poetry.lock
|
|
155
|
+
|
|
156
|
+
# pdm
|
|
157
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
158
|
+
#pdm.lock
|
|
159
|
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
|
160
|
+
# in version control.
|
|
161
|
+
# https://pdm.fming.dev/#use-with-ide
|
|
162
|
+
.pdm.toml
|
|
163
|
+
|
|
164
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
165
|
+
__pypackages__/
|
|
166
|
+
|
|
167
|
+
# Celery stuff
|
|
168
|
+
celerybeat-schedule
|
|
169
|
+
celerybeat.pid
|
|
170
|
+
|
|
171
|
+
# SageMath parsed files
|
|
172
|
+
*.sage.py
|
|
173
|
+
|
|
174
|
+
# Environments
|
|
175
|
+
.env
|
|
176
|
+
.venv
|
|
177
|
+
env/
|
|
178
|
+
venv/
|
|
179
|
+
ENV/
|
|
180
|
+
env.bak/
|
|
181
|
+
venv.bak/
|
|
182
|
+
|
|
183
|
+
# Spyder project settings
|
|
184
|
+
.spyderproject
|
|
185
|
+
.spyproject
|
|
186
|
+
|
|
187
|
+
# Rope project settings
|
|
188
|
+
.ropeproject
|
|
189
|
+
|
|
190
|
+
# mkdocs documentation
|
|
191
|
+
/site
|
|
192
|
+
|
|
193
|
+
# mypy
|
|
194
|
+
.mypy_cache/
|
|
195
|
+
.dmypy.json
|
|
196
|
+
dmypy.json
|
|
197
|
+
|
|
198
|
+
# Pyre type checker
|
|
199
|
+
.pyre/
|
|
200
|
+
|
|
201
|
+
# pytype static type analyzer
|
|
202
|
+
.pytype/
|
|
203
|
+
|
|
204
|
+
# Cython debug symbols
|
|
205
|
+
cython_debug/
|
|
206
|
+
|
|
207
|
+
# PyCharm
|
|
208
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
209
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
210
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
211
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
212
|
+
#.idea/
|
|
213
|
+
|
|
214
|
+
### Python Patch ###
|
|
215
|
+
# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
|
|
216
|
+
poetry.toml
|
|
217
|
+
|
|
218
|
+
# ruff
|
|
219
|
+
.ruff_cache/
|
|
220
|
+
|
|
221
|
+
# LSP config files
|
|
222
|
+
pyrightconfig.json
|
|
223
|
+
|
|
224
|
+
### VisualStudioCode ###
|
|
225
|
+
.vscode/
|
|
226
|
+
|
|
227
|
+
# Local History for Visual Studio Code
|
|
228
|
+
.history/
|
|
229
|
+
|
|
230
|
+
# Built Visual Studio Code Extensions
|
|
231
|
+
*.vsix
|
|
232
|
+
|
|
233
|
+
### VisualStudioCode Patch ###
|
|
234
|
+
# Ignore all local history of files
|
|
235
|
+
.history
|
|
236
|
+
.ionide
|
|
237
|
+
|
|
238
|
+
### Windows ###
|
|
239
|
+
# Windows thumbnail cache files
|
|
240
|
+
Thumbs.db
|
|
241
|
+
Thumbs.db:encryptable
|
|
242
|
+
ehthumbs.db
|
|
243
|
+
ehthumbs_vista.db
|
|
244
|
+
|
|
245
|
+
# Dump file
|
|
246
|
+
*.stackdump
|
|
247
|
+
|
|
248
|
+
# Folder config file
|
|
249
|
+
[Dd]esktop.ini
|
|
250
|
+
|
|
251
|
+
# Recycle Bin used on file shares
|
|
252
|
+
$RECYCLE.BIN/
|
|
253
|
+
|
|
254
|
+
# Windows Installer files
|
|
255
|
+
*.cab
|
|
256
|
+
*.msi
|
|
257
|
+
*.msix
|
|
258
|
+
*.msm
|
|
259
|
+
*.msp
|
|
260
|
+
|
|
261
|
+
# Windows shortcuts
|
|
262
|
+
*.lnk
|
|
263
|
+
|
|
264
|
+
# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,python,macos,linux,windows
|
|
265
|
+
|
|
266
|
+
.claude
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
default:
|
|
2
|
+
image: python:3.11
|
|
3
|
+
|
|
4
|
+
stages:
|
|
5
|
+
- test
|
|
6
|
+
- publish
|
|
7
|
+
|
|
8
|
+
variables:
|
|
9
|
+
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
|
|
10
|
+
|
|
11
|
+
cache:
|
|
12
|
+
paths:
|
|
13
|
+
- .cache/pip
|
|
14
|
+
|
|
15
|
+
test:
|
|
16
|
+
stage: test
|
|
17
|
+
parallel:
|
|
18
|
+
matrix:
|
|
19
|
+
# The floor and ceiling of requires-python. This package needs
|
|
20
|
+
# torch, so every extra matrix entry is expensive; the two ends catch the version
|
|
21
|
+
# incompatibilities that matter.
|
|
22
|
+
- PYTHON_VERSION: ["3.10", "3.14"]
|
|
23
|
+
image: python:${PYTHON_VERSION}
|
|
24
|
+
script:
|
|
25
|
+
# Upgrade pip before anything else. The python:3.10 image ships a pip old enough to
|
|
26
|
+
# reject a wheel whose metadata Name differs from the requested name only by
|
|
27
|
+
# normalization ('typing_extensions' vs 'typing-extensions'). It discards every wheel
|
|
28
|
+
# candidate, falls back to the sdist, and then cannot install that sdist's build
|
|
29
|
+
# dependency (flit_core) because --index-url below has replaced PyPI with the
|
|
30
|
+
# PyTorch-only index. Newer pip canonicalizes both names and uses the wheel, which is
|
|
31
|
+
# why the 3.14 entry was unaffected.
|
|
32
|
+
- pip install --upgrade pip
|
|
33
|
+
# Install the CPU-only torch build first so the sentence-transformers dependency
|
|
34
|
+
# below is already satisfied and pip never pulls the ~2.5GB CUDA wheel. CI has no GPU.
|
|
35
|
+
- pip install torch --index-url https://download.pytorch.org/whl/cpu
|
|
36
|
+
- pip install -e ".[test]"
|
|
37
|
+
- pytest -q
|
|
38
|
+
|
|
39
|
+
publish-pypi:
|
|
40
|
+
stage: publish
|
|
41
|
+
rules:
|
|
42
|
+
- if: $CI_COMMIT_TAG =~ /^v\d+\.\d+/
|
|
43
|
+
variables:
|
|
44
|
+
HATCH_INDEX_USER: __token__
|
|
45
|
+
# HATCH_INDEX_AUTH holds the PyPI API token. It is not defined here: set it as a
|
|
46
|
+
# masked CI/CD variable in the GitLab project settings (see RELEASING.md).
|
|
47
|
+
# Disable keyring, which otherwise hangs waiting for a backend on a headless runner.
|
|
48
|
+
PYTHON_KEYRING_BACKEND: keyring.backends.null.Keyring
|
|
49
|
+
script:
|
|
50
|
+
# Fail fast, and legibly, when the token never reached the job. Without this the
|
|
51
|
+
# symptom is an opaque "403 Forbidden" from PyPI at the very end of the pipeline,
|
|
52
|
+
# which looks like a bad token rather than a missing one.
|
|
53
|
+
- |
|
|
54
|
+
if [ -z "$HATCH_INDEX_AUTH" ]; then
|
|
55
|
+
echo "HATCH_INDEX_AUTH is empty or unset in this job." >&2
|
|
56
|
+
echo "A 'Protected' CI/CD variable is only exposed to protected refs. Either add a" >&2
|
|
57
|
+
echo "protected-tag rule covering 'v*' under Settings > Repository > Protected tags," >&2
|
|
58
|
+
echo "or clear the Protected flag on the variable." >&2
|
|
59
|
+
exit 1
|
|
60
|
+
fi
|
|
61
|
+
case "$HATCH_INDEX_AUTH" in
|
|
62
|
+
pypi-*) ;;
|
|
63
|
+
*)
|
|
64
|
+
echo "HATCH_INDEX_AUTH does not look like a PyPI API token." >&2
|
|
65
|
+
echo "Expected it to start with 'pypi-'; got ${#HATCH_INDEX_AUTH} characters." >&2
|
|
66
|
+
echo "Check for a truncated paste, surrounding quotes, or trailing whitespace." >&2
|
|
67
|
+
exit 1
|
|
68
|
+
;;
|
|
69
|
+
esac
|
|
70
|
+
- pip install hatch
|
|
71
|
+
# Fail on a tag that disagrees with the packaged version. PyPI refuses re-uploads of
|
|
72
|
+
# a version, so a mismatch has to be caught before `hatch publish`, not after.
|
|
73
|
+
#
|
|
74
|
+
# The tag is compared against the PEP 440 *normalized* version, because that is what
|
|
75
|
+
# ends up in the artifact filename and on PyPI. `hatch version` echoes the literal
|
|
76
|
+
# string from pyproject.toml, so a non-canonical spelling like "2026.1-rc1" would
|
|
77
|
+
# otherwise satisfy a literal comparison while publishing as "2026.1rc1".
|
|
78
|
+
# `packaging` is available here as a hatchling dependency.
|
|
79
|
+
- |
|
|
80
|
+
RAW_VERSION="$(hatch version)"
|
|
81
|
+
VERSION="$(python -c 'import sys; from packaging.version import Version; print(Version(sys.argv[1]))' "$RAW_VERSION")"
|
|
82
|
+
if [ "v$VERSION" != "$CI_COMMIT_TAG" ]; then
|
|
83
|
+
echo "Tag $CI_COMMIT_TAG does not match the version that would be published ($VERSION)." >&2
|
|
84
|
+
if [ "$RAW_VERSION" != "$VERSION" ]; then
|
|
85
|
+
echo "Note: pyproject.toml says '$RAW_VERSION', which normalizes to '$VERSION'." >&2
|
|
86
|
+
echo "Write the version in canonical PEP 440 form to avoid this." >&2
|
|
87
|
+
fi
|
|
88
|
+
echo "Retag as v$VERSION, or bump the version to match the tag." >&2
|
|
89
|
+
exit 1
|
|
90
|
+
fi
|
|
91
|
+
- hatch build
|
|
92
|
+
- hatch publish
|
|
93
|
+
environment:
|
|
94
|
+
name: pypi
|
|
95
|
+
url: https://pypi.org/project/ovito-mcp/
|
ovito_mcp-2026.1/LICENSE
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# OVITO Pro Add-on Package License
|
|
2
|
+
Copyright (c) 2026 OVITO GmbH. All rights reserved.
|
|
3
|
+
|
|
4
|
+
This software (the "Software") is a copyrighted work of OVITO GmbH ("Licensor"). The Software is made available in source form on the Python Package Index (PyPI) for distribution convenience only. Making the source code accessible does not constitute a grant of open-source rights, and no rights are granted to any person except as expressly set out below.
|
|
5
|
+
|
|
6
|
+
## 1. Grant of License
|
|
7
|
+
Subject to the terms of this License, Licensor grants you a limited, non-exclusive, non-transferable, non-sublicensable license to install, execute, and use the Software, solely if and for so long as you hold a valid, active license to OVITO Pro issued by OVITO GmbH ("OVITO Pro License").
|
|
8
|
+
This license to use the Software:
|
|
9
|
+
- is granted only to the same individual, group, or organization holding the corresponding OVITO Pro License, subject to the same installation limits as that OVITO Pro License;
|
|
10
|
+
- terminates automatically upon expiration, termination, or non-renewal of the underlying OVITO Pro License, without notice;
|
|
11
|
+
- does not include any right to use the Software independently of, or separately from, OVITO Pro.
|
|
12
|
+
|
|
13
|
+
## 2. Restrictions
|
|
14
|
+
Except as expressly permitted under Section 1, you may not:
|
|
15
|
+
|
|
16
|
+
a. use the Software without holding a valid, active OVITO Pro License;
|
|
17
|
+
b. copy, distribute, sublicense, sell, rent, lease, or otherwise make the Software available to any third party;
|
|
18
|
+
c. modify, adapt, translate, or create derivative works based on the Software;
|
|
19
|
+
d. reverse engineer, decompile, or disassemble the Software, except to the extent such restriction is prohibited by applicable mandatory law;
|
|
20
|
+
e. remove or alter any copyright, trademark, or other proprietary notices contained in the Software;
|
|
21
|
+
f. use the Software for any purpose other than in conjunction with your licensed use of OVITO Pro.
|
|
22
|
+
|
|
23
|
+
## 3. Ownership
|
|
24
|
+
The Software is licensed, not sold. Licensor retains all right, title, and interest in and to the Software, including all intellectual property rights therein. No rights are granted other than those expressly set forth in this License.
|
|
25
|
+
|
|
26
|
+
## 4. No Warranty
|
|
27
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT.
|
|
28
|
+
|
|
29
|
+
## 5. Limitation of Liability
|
|
30
|
+
IN NO EVENT SHALL LICENSOR BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE, TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW.
|
|
31
|
+
|
|
32
|
+
## 6. Termination
|
|
33
|
+
This License terminates automatically, without notice from Licensor, upon any breach of its terms, or upon expiration or termination of the underlying OVITO Pro License. Upon termination, you must cease all use of the Software and delete all copies in your possession.
|
|
34
|
+
|
|
35
|
+
## 7. Governing Law
|
|
36
|
+
This License shall be governed by the laws of the Federal Republic of Germany, without regard to its conflict-of-law provisions. The place of jurisdiction shall be Darmstadt, Germany, to the extent permitted by law.
|
|
37
|
+
|
|
38
|
+
## 8. Contact
|
|
39
|
+
For questions regarding this License, contact: mail@ovito.org
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: ovito-mcp
|
|
3
|
+
Version: 2026.1
|
|
4
|
+
Summary: MCP server for interactive work in OVITO Pro
|
|
5
|
+
Project-URL: Homepage, https://www.ovito.org
|
|
6
|
+
Project-URL: Documentation, https://docs.ovito.org/reference/data_inspector/coding_agent.html
|
|
7
|
+
Project-URL: Repository, https://gitlab.com/ovito-org/ovito-mcp-server
|
|
8
|
+
Project-URL: Bug Tracker, https://gitlab.com/ovito-org/ovito-mcp-server/-/issues
|
|
9
|
+
Author-email: OVITO GmbH <support@ovito.org>
|
|
10
|
+
License: Proprietary
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: mcp,molecular-dynamics,ovito,visualization
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: License :: Other/Proprietary License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
23
|
+
Requires-Python: >=3.10
|
|
24
|
+
Requires-Dist: jupyter-client>=8.0
|
|
25
|
+
Requires-Dist: jupyter-core>=5.0
|
|
26
|
+
Requires-Dist: mcp<3,>=2.0
|
|
27
|
+
Requires-Dist: numpy>=1.26
|
|
28
|
+
Requires-Dist: sentence-transformers>=5.6.0
|
|
29
|
+
Provides-Extra: test
|
|
30
|
+
Requires-Dist: pytest; extra == 'test'
|
|
31
|
+
Description-Content-Type: text/markdown
|
|
32
|
+
|
|
33
|
+
# OVITO Pro MCP Server
|
|
34
|
+
|
|
35
|
+
Connects an AI coding agent to a running **OVITO Pro** session, so you can work with your
|
|
36
|
+
simulation data by describing what you want in plain language. The agent operates inside
|
|
37
|
+
the session you already have open — it can load files, build and adjust pipelines, analyze
|
|
38
|
+
results, and look things up in the OVITO documentation, while you watch each step happen
|
|
39
|
+
live in the GUI and keep working in the same window yourself.
|
|
40
|
+
|
|
41
|
+
Works with Claude Code, GitHub Copilot CLI, OpenAI Codex, OpenCode, Google Antigravity, and
|
|
42
|
+
other coding agents that support MCP.
|
|
43
|
+
|
|
44
|
+
## Requirements
|
|
45
|
+
|
|
46
|
+
- **OVITO Pro 3.16 or later**, with a valid license
|
|
47
|
+
- **Python 3.10 or later**
|
|
48
|
+
- A supported coding agent, installed and set up separately (see
|
|
49
|
+
[Agent configuration](#agent-configuration))
|
|
50
|
+
|
|
51
|
+
## Installation
|
|
52
|
+
|
|
53
|
+
Install the server:
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
pip install ovito-mcp
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Verify the installation and check the version with:
|
|
60
|
+
|
|
61
|
+
```sh
|
|
62
|
+
ovito-mcp --version
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The documentation-search tools provided by the OVITO MCP server use two small sentence-transformers models that are downloaded
|
|
66
|
+
once from the Hugging Face Hub (~180 MB total) and cached locally. The server downloads them
|
|
67
|
+
automatically in the background the first time it starts, and never touches the network for
|
|
68
|
+
them again. If you would rather do this one-time download up front — recommended on a slow or
|
|
69
|
+
restricted network, so it can't slow down the first search — run:
|
|
70
|
+
|
|
71
|
+
```sh
|
|
72
|
+
ovito-mcp --download-models
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Then register it with your coding agent, using the **absolute path** to the `ovito-mcp` console
|
|
76
|
+
script. For Claude Code:
|
|
77
|
+
|
|
78
|
+
```powershell
|
|
79
|
+
# Windows (PowerShell)
|
|
80
|
+
claude mcp add ovito-mcp --scope user -- (Get-Command ovito-mcp).Source
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
```sh
|
|
84
|
+
# macOS / Linux
|
|
85
|
+
claude mcp add ovito-mcp --scope user -- "$(which ovito-mcp)"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
See [Agent configuration](#agent-configuration) below for the other agents.
|
|
89
|
+
|
|
90
|
+
## Using it
|
|
91
|
+
|
|
92
|
+
In OVITO Pro, open the
|
|
93
|
+
[**AI Agent**](https://docs.ovito.org/reference/data_inspector/coding_agent.html) tab in
|
|
94
|
+
the data inspector panel at the bottom of the main window, pick your coding agent, and
|
|
95
|
+
press **Start**.
|
|
96
|
+
|
|
97
|
+
OVITO launches the agent and connects it to the session in front of you. Anything the agent
|
|
98
|
+
does appears live in the GUI, and you can keep interacting with the same scene while it
|
|
99
|
+
works.
|
|
100
|
+
|
|
101
|
+
No further setup is needed — the agent finds everything it needs from the running OVITO Pro
|
|
102
|
+
session.
|
|
103
|
+
|
|
104
|
+
See the [AI Agent manual page](https://docs.ovito.org/reference/data_inspector/coding_agent.html)
|
|
105
|
+
for the OVITO-side documentation, including security considerations.
|
|
106
|
+
|
|
107
|
+
## Agent configuration
|
|
108
|
+
|
|
109
|
+
Register `ovito-mcp` by its **absolute path** in the configurations below. Find that path with:
|
|
110
|
+
|
|
111
|
+
```powershell
|
|
112
|
+
# Windows (PowerShell)
|
|
113
|
+
(Get-Command ovito-mcp).Source
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
```sh
|
|
117
|
+
# macOS / Linux
|
|
118
|
+
which ovito-mcp
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
and substitute it for `/path/to/ovito-mcp` in the snippets below.
|
|
122
|
+
|
|
123
|
+
### Claude Code / Claude Desktop
|
|
124
|
+
|
|
125
|
+
Add this to your `~/.claude.json`:
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
"mcpServers": {
|
|
129
|
+
"ovito-mcp": {
|
|
130
|
+
"type": "stdio",
|
|
131
|
+
"command": "/path/to/ovito-mcp"
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### OpenCode
|
|
137
|
+
|
|
138
|
+
Add this to your `~/.opencode.json`:
|
|
139
|
+
|
|
140
|
+
```json
|
|
141
|
+
"mcp": {
|
|
142
|
+
"ovito-mcp": {
|
|
143
|
+
"type": "local",
|
|
144
|
+
"command": ["/path/to/ovito-mcp"],
|
|
145
|
+
"enabled": true
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Google Antigravity
|
|
151
|
+
|
|
152
|
+
Add this to your `~/.antigravity/config.json`:
|
|
153
|
+
|
|
154
|
+
```json
|
|
155
|
+
"mcpServers": {
|
|
156
|
+
"ovito-mcp": {
|
|
157
|
+
"command": "/path/to/ovito-mcp"
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### OpenAI Codex
|
|
163
|
+
|
|
164
|
+
Add this to your `$HOME/.codex/config.toml`:
|
|
165
|
+
|
|
166
|
+
```toml
|
|
167
|
+
[mcp_servers.ovito-mcp]
|
|
168
|
+
command = "/path/to/ovito-mcp"
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### GitHub Copilot
|
|
172
|
+
|
|
173
|
+
Add this to your `~/.copilot/mcp-config.json`:
|
|
174
|
+
|
|
175
|
+
```json
|
|
176
|
+
"mcpServers": {
|
|
177
|
+
"ovito-mcp": {
|
|
178
|
+
"command": "/path/to/ovito-mcp"
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Advanced configuration
|
|
184
|
+
|
|
185
|
+
Neither setting below is needed for normal use. Both are environment variables, intended
|
|
186
|
+
for development and unusual setups.
|
|
187
|
+
|
|
188
|
+
| Env var | Purpose |
|
|
189
|
+
| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
190
|
+
| `OVITO_EXE` | Path to the OVITO Pro executable (`ovito.exe` on Windows, `ovito` on Linux, `Ovito.app/Contents/MacOS/ovito` on macOS). Only needed to let the agent start OVITO Pro itself, instead of connecting to a session you already have running. |
|
|
191
|
+
| `OVITO_RAG_DB` | Path to an alternative documentation database. Overrides the one that ships with OVITO Pro, for developing against a custom build. |
|
|
192
|
+
|
|
193
|
+
## Workflow examples
|
|
194
|
+
|
|
195
|
+
### Prompt:
|
|
196
|
+
|
|
197
|
+
*"Analyze the grain boundary in this sample and highlight repeating structural units in the boundary."*
|
|
198
|
+
|
|
199
|
+
**Video:** https://www.ovito.org/download/data/videos/ai_agent_demo_gb_analysis.mp4
|
|
200
|
+
|
|
201
|
+
- Identified the sample as a 2D-periodic bicrystal grain boundary
|
|
202
|
+
- Ran structure identification via polyhedral template matching
|
|
203
|
+
- Determined the boundary plane, tilt angle, and tilt axis
|
|
204
|
+
- Measured periodicity along the boundary with an FFT
|
|
205
|
+
- Color-coded the repeating structural units and aligned the camera
|
|
206
|
+
|
|
207
|
+
### Prompt:
|
|
208
|
+
|
|
209
|
+
*"Import the ethene molecule and show the electron density along a representative slice — then add bond orders, a colorbar, and color the bonds by particle type."*
|
|
210
|
+
|
|
211
|
+
**Video:** https://www.ovito.org/download/data/videos/ai_agent_demo_electron_density.mp4
|
|
212
|
+
|
|
213
|
+
- Loaded the molecule's charge-density file and computed the molecular plane
|
|
214
|
+
- Sliced along the plane and aligned the camera to it
|
|
215
|
+
- Switched to a logarithmic color scale after spotting oversaturation
|
|
216
|
+
- Added a color legend in preview mode
|
|
217
|
+
- Computed bond orders and colored bonds to match particle colors
|
|
218
|
+
|
|
219
|
+
### Prompt:
|
|
220
|
+
|
|
221
|
+
*"Recreate the analysis and view from this reference figure using my data already loaded in OVITO — don't manipulate the data for better agreement."*
|
|
222
|
+
|
|
223
|
+
**Video:** https://www.ovito.org/download/data/videos/ai_agent_demo_nano_indentation.mp4
|
|
224
|
+
|
|
225
|
+
- Identified the sample as SrTiO₃ with a free surface
|
|
226
|
+
- Selected the BCC-like cation sublattice for dislocation analysis
|
|
227
|
+
- Applied the Dislocation Extraction Algorithm (DXA)
|
|
228
|
+
- Matched line and defect-mesh coloring to the reference figure
|
|
229
|
+
- Adjusted the camera to match the reference viewport
|
|
230
|
+
|
|
231
|
+
### Prompt:
|
|
232
|
+
|
|
233
|
+
*"Read this trajectory and compute the diffusion constant — then plot the result."*
|
|
234
|
+
|
|
235
|
+
**Video:** https://www.ovito.org/download/data/videos/ai_agent_demo_diffusion.mp4
|
|
236
|
+
|
|
237
|
+
- Loaded a 1,000-frame trajectory in a 5 Å cubic periodic box
|
|
238
|
+
- Unwrapped trajectories to avoid MSD saturation from periodic boundaries
|
|
239
|
+
- Computed the mean squared displacement (MSD) over time
|
|
240
|
+
- Fit MSD vs. time using the Einstein–Smoluchowski relation
|
|
241
|
+
- Plotted the result: D = 0.0490 Ų/ps (R² = 0.995)
|
|
242
|
+
|
|
243
|
+
## Support
|
|
244
|
+
|
|
245
|
+
Questions and bug reports: <support@ovito.org>
|