MDEngine
MD workbench for agents: 13 analysis tools, renders, hosted GPU runs; LAMMPS + OpenMM.
¿Debería usar esto?
Calidad y seguridad
Hallazgos (1)
- LOWen account
Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.
Costo de contexto
Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.
Instalar
Instalación con un clic
Agrega esto a tu archivo `claude_desktop_config.json`:
{
"mcpServers": {
"mdengine": {
"url": "https://api.forcefieldsilicon.com/mcp"
}
}
}Puntos de conexión remotos
https://api.forcefieldsilicon.com/mcpstreamable-httpQué puede hacer
Inventario de herramientas
Herramientas (12)
🟢account
Balance in USD, how jobs are priced (`pricing.mode` job = the deck's own work in atom-steps at per-class prices, capped at wall_limit_s x rate; metered = per second of pod time), the rate table, and the key id of the API key in use.
Esquema de entrada
{
"type": "object",
"properties": {}
}🟡submit_job(input, label, gpu, wall_limit_s, estimate_s, ...)
One call: create a hosted GPU job, upload the deck given INLINE as {relative_path: text}, and queue it. Total inline size <= 8 MB; for larger decks use create_job, PUT the tarball to upload_url, then start_job. Billing starts at the first heartbeat (state running) and stops at done/failed/cancelled. The deck is executed as a program on an isolated GPU pod.
Esquema de entrada
{
"type": "object",
"properties": {
"input": {
"type": "string",
"description": "Relative path of the LAMMPS (or runner) input script inside the deck, e.g. in.lmp"
},
"label": {
"type": "string",
"description": "Free text <= 120 chars shown in job lists"
},
"gpu": {
"type": "string",
"description": "GPU class; call account for the offered classes and how jobs are priced. Default any = cheapest available"
},
"wall_limit_s": {
"type": "integer",
"description": "Hard cap in seconds (default 14400, max 86400); the job fails at the cap and is billed to it"
},
"estimate_s": {
"type": "integer",
"description": "Your runtime guess in seconds; only used for the balance pre-check (min 900 s at the rate)"
},
"runner": {
"type": "string",
"description": "Runner flavour: lammps (default) or openmm (beta)"
},
"launch": {
"type": "string",
"description": "Launch template; omit for the default KOKKOS/CUDA LAMMPS command line"
},
"files": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "Deck contents: {\"in.lmp\": \"...\", \"data.al\": \"...\"}; paths relative, no '..'; must include `input`"
}
},
"required": [
"input",
"files"
]
}🟡create_job(input, label, gpu, wall_limit_s, estimate_s, ...)
Step 1 of the two-step path for big decks: validates the spec, reserves a job id, returns a presigned upload_url. PUT the deck as a .tar.gz (<= 2 GB, relative paths, input at `input`) to upload_url, then call start_job.
Esquema de entrada
{
"type": "object",
"properties": {
"input": {
"type": "string",
"description": "Relative path of the LAMMPS (or runner) input script inside the deck, e.g. in.lmp"
},
"label": {
"type": "string",
"description": "Free text <= 120 chars shown in job lists"
},
"gpu": {
"type": "string",
"description": "GPU class; call account for the offered classes and how jobs are priced. Default any = cheapest available"
},
"wall_limit_s": {
"type": "integer",
"description": "Hard cap in seconds (default 14400, max 86400); the job fails at the cap and is billed to it"
},
"estimate_s": {
"type": "integer",
"description": "Your runtime guess in seconds; only used for the balance pre-check (min 900 s at the rate)"
},
"runner": {
"type": "string",
"description": "Runner flavour: lammps (default) or openmm (beta)"
},
"launch": {
"type": "string",
"description": "Launch template; omit for the default KOKKOS/CUDA LAMMPS command line"
}
},
"required": [
"input"
]
}⚪start_job(id)
Step 2: queue a job whose deck tarball has been uploaded. A GPU pod is launched; billing starts when it reports running.
Esquema de entrada
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Job id, e.g. MDJOB-20260907-3F200C"
}
},
"required": [
"id"
]
}🟢job_status(id)
State (created|uploaded|queued|launching|running|uploading|done|failed|cancelled), GPU, rate, billed seconds, cost so far, exit code, error, last thermo lines.
Esquema de entrada
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Job id, e.g. MDJOB-20260907-3F200C"
}
},
"required": [
"id"
]
}🟢job_log(id)
The last <= 20 thermo/log lines the running pod reported (30 s heartbeat). Full log.lammps is in the results tarball.
Esquema de entrada
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Job id, e.g. MDJOB-20260907-3F200C"
}
},
"required": [
"id"
]
}🟢job_results(id)
For a done/failed job: a presigned download_url (valid ~7 days) for the results tarball (work/, log.lammps, exitcode). Results are deleted 30 days after the run.
Esquema de entrada
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Job id, e.g. MDJOB-20260907-3F200C"
}
},
"required": [
"id"
]
}🟢list_jobs(limit, full)
Jobs of this API key, newest first. Compact rows (id, state, label, created, finished, gpu, cost_usd, error) unless full=true.
Esquema de entrada
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"description": "1..200, default 20"
},
"full": {
"type": "boolean",
"description": "Return the complete status object per job (default false)"
}
}
}🔴delete_results(id)
For a finished job: delete its deck and results tarballs immediately instead of at the automatic 30-day purge. Metadata and billing records are kept; results can no longer be downloaded.
Esquema de entrada
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Job id, e.g. MDJOB-20260907-3F200C"
}
},
"required": [
"id"
]
}🟢capabilities(runner, full)
Capability manifest of the hosted runners: LAMMPS version, installed packages, and every style by category with gpu=true (KOKKOS-accelerated) or gpu=false (exists, but runs on the pod's CPU cores at the GPU rate). Default = compact summary; runner=lammps&full=true returns the whole style table. Use preflight_deck to check a specific deck.
Esquema de entrada
{
"type": "object",
"properties": {
"runner": {
"type": "string",
"description": "lammps | openmm; omit for all"
},
"full": {
"type": "boolean",
"description": "Include the full style table (large)"
}
}
}🟢preflight_deck(input, files)
Dry run of the check submit_job performs: which styles the deck asks for are MISSING on every hosted LAMMPS image (the run would exit at startup), which are CPU-only, whether its pair style will use the GPU at all, and which image (`runner`) the job will be routed to — decks needing packages beyond the fast default image run on lammps-full automatically. Nothing is created or billed.
Esquema de entrada
{
"type": "object",
"properties": {
"input": {
"type": "string",
"description": "Relative path of the LAMMPS (or runner) input script inside the deck, e.g. in.lmp"
},
"files": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "Deck contents {path: text}, must include `input`"
}
},
"required": [
"input",
"files"
]
}🔴cancel_job(id)
Cancel a job that is not finished. A running job is billed up to the cancel time; its pod is terminated.
Esquema de entrada
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Job id, e.g. MDJOB-20260907-3F200C"
}
},
"required": [
"id"
]
}Comunidad
Evidencia