Koskamo

MDEngine MCP

An MCP server provided by ForceField Silicon that enables AI agents to run molecular dynamics simulations using LAMMPS and OpenMM on hosted GPU infrastructure. It allows agents to submit simulation decks, monitor job status, view live logs, and retrieve results, with pricing based on computational work performed.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

MDEngine MCP logo, by ForceField SiliconVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by ForceField Silicon
You need:buy a credit pack at https://forcefieldsilicon.com/mdengine and paste the key once on the sign-in pagepaste the key from your credit pack
MCP endpoint (Streamable HTTP)
https://api.forcefieldsilicon.com/mcp
Vendor documentation

What its tools do

14 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

14 of 14 have a description · 14 of 14 declare behavior hints · 13 of 13 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to forcefieldsilicon.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Run LAMMPS molecular dynamics simulations on hosted GPUs
  • Monitor simulation job status and view live logs
  • Retrieve and visualize simulation results and trajectories
  • Check pricing and submit decks via agent tools

Source and maintenance

Vendor evidenceRegistry 0.7.1
Maintenance checked

Protocol and capabilities

Server
com.forcefieldsilicon/mdengine 0.11.0
MCP protocol negotiated in check
2025-11-25
Tools
14 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

MDEngine runs molecular dynamics on hosted GPUs for people who have a Claude, in three groups: semiconductor process materials, drug discovery and delivery, and mineral processing and critical metals, with a fourth guide for alloy wear and hardness studies (customer_type alloys). Call guide first, then capabilities and preflight_deck; all three work without a key, and after reading a guide, call campaign_request to start a study. To submit runs, buy a credit pack at https://forcefieldsilicon.com/mdengine and paste the key once on the sign-in page, never in chat.

Tools

14 advertised

guide — Start here: guides by customer type
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

No key needed. Without customer_type: the list of guides (one line each), the start page and how to get a key. With customer_type (mineral-processing | dark-proteins | alloys): the full guide, which says what to supply, what runs, what comes back and what it costs. With template (openmm-stability): the script text of that template, ready to save and submit.

guide input schema
{
  "type": "object",
  "properties": {
    "template": {
      "type": "string",
      "description": "openmm-stability (dark-proteins stage 1 OpenMM script); returns the script text"
    },
    "customer_type": {
      "type": "string",
      "description": "mineral-processing | dark-proteins | alloys; omit for the list"
    }
  }
}
guide annotations
{
  "title": "Start here: guides by customer type",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
campaign_request — Start a study: request a quoted campaign
Advertised by the server during the last successful anonymous check.
Open-world

No key needed. Sends a study request to a person and returns a request_id, the tier that fits, the price band, what we still need from you, the next step and the claim scope. Nothing is run or charged. Call it after reading a guide.

campaign_request input schema
{
  "type": "object",
  "required": [
    "customer_type",
    "question",
    "contact_email"
  ],
  "properties": {
    "grid": {
      "type": "string",
      "description": "Free text: compositions x temperatures, or ligands x pockets (e.g. 3 ligands x 1 receptor)"
    },
    "question": {
      "type": "string",
      "maxLength": 4000,
      "minLength": 20,
      "description": "One paragraph: the decision the study feeds"
    },
    "data_rules": {
      "type": "string",
      "description": "How the data and results may be used, kept or shared"
    },
    "organization": {
      "type": "string",
      "description": "Optional"
    },
    "contact_email": {
      "type": "string",
      "description": "Where the reply goes"
    },
    "customer_type": {
      "enum": [
        "mineral-processing",
        "dark-proteins",
        "alloys",
        "semiconductor",
        "other"
      ],
      "type": "string",
      "description": "mineral-processing | dark-proteins | alloys | semiconductor | other"
    },
    "inputs_available": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "What you can supply now, e.g. bath range, AlphaFold model, ligand list, alloy composition range"
    }
  }
}
campaign_request annotations
{
  "title": "Start a study: request a quoted campaign",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
account — Account balance and pricing
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Balance in USD (`balance_usd`), the part of it held by your unfinished jobs (`reserved_usd`, `held_jobs`) and what a new submit can use (`available_usd` = balance - reserved; a submit needs wall_limit_s x rate of it), 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, the key id of the API key in use, and `packs` (when the endpoint sells credit): [{id, name, usd, gpu_h, url}] to top up THIS key by appending ?client_reference_id=<key_id> to the pack url.

account input schema
{
  "type": "object",
  "properties": {}
}
account annotations
{
  "title": "Account balance and pricing",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
submit_job — Submit a deck (inline files) and start it
Advertised by the server during the last successful anonymous check.
Open-world

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.

submit_job input schema
{
  "type": "object",
  "required": [
    "input",
    "files"
  ],
  "properties": {
    "gpu": {
      "type": "string",
      "description": "GPU class; call account for the offered classes and how jobs are priced. Default any = cheapest available"
    },
    "files": {
      "type": "object",
      "description": "Deck contents: {\"in.lmp\": \"...\", \"data.al\": \"...\"}; paths relative, no '..'; must include `input`",
      "additionalProperties": {
        "type": "string"
      }
    },
    "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"
    },
    "launch": {
      "type": "string",
      "description": "Launch template; omit for the default KOKKOS/CUDA LAMMPS command line"
    },
    "runner": {
      "type": "string",
      "description": "Runner flavour: lammps (default) or openmm (beta)"
    },
    "end_marker": {
      "type": "string",
      "description": "Optional line your deck prints when it truly finished (e.g. a `print DONE` at the end); a done job whose log lacks a line starting with it gets verdict=warnings, end_marker_missing=true"
    },
    "estimate_s": {
      "type": "integer",
      "description": "Your runtime guess in seconds; informational only; the pre-check uses wall_limit_s net of credit held by your unfinished jobs"
    },
    "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"
    }
  }
}
submit_job annotations
{
  "title": "Submit a deck (inline files) and start it",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
create_job — Create a job (returns upload URL)
Advertised by the server during the last successful anonymous check.
Open-world

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.

create_job input schema
{
  "type": "object",
  "required": [
    "input"
  ],
  "properties": {
    "gpu": {
      "type": "string",
      "description": "GPU class; call account for the offered classes and how jobs are priced. Default any = cheapest available"
    },
    "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"
    },
    "launch": {
      "type": "string",
      "description": "Launch template; omit for the default KOKKOS/CUDA LAMMPS command line"
    },
    "runner": {
      "type": "string",
      "description": "Runner flavour: lammps (default) or openmm (beta)"
    },
    "end_marker": {
      "type": "string",
      "description": "Optional line your deck prints when it truly finished (e.g. a `print DONE` at the end); a done job whose log lacks a line starting with it gets verdict=warnings, end_marker_missing=true"
    },
    "estimate_s": {
      "type": "integer",
      "description": "Your runtime guess in seconds; informational only; the pre-check uses wall_limit_s net of credit held by your unfinished jobs"
    },
    "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"
    }
  }
}
create_job annotations
{
  "title": "Create a job (returns upload URL)",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
start_job — Start an uploaded job
Advertised by the server during the last successful anonymous check.
Open-world

Step 2: queue a job whose deck tarball has been uploaded. A GPU pod is launched; billing starts when it reports running.

start_job input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Job id, e.g. MDJOB-20260907-3F200C"
    }
  }
}
start_job annotations
{
  "title": "Start an uploaded job",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
job_status — Job status
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

State (created|uploaded|queued|launching|running|uploading|done|failed|cancelled), GPU, rate, billed seconds, cost so far, exit code, error, last thermo lines, and the post-run verdict: clean | warnings (a done run whose log shows QEq CG failures, lost atoms, a fix halt, or no end_marker line; counts in `warnings`).

job_status input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Job id, e.g. MDJOB-20260907-3F200C"
    }
  }
}
job_status annotations
{
  "title": "Job status",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
job_log — Job log tail
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

The last <= 20 thermo/log lines the running pod reported (30 s heartbeat). Full log.lammps is in the results tarball.

job_log input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Job id, e.g. MDJOB-20260907-3F200C"
    }
  }
}
job_log annotations
{
  "title": "Job log tail",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
job_results — Results download URL
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

job_results input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Job id, e.g. MDJOB-20260907-3F200C"
    }
  }
}
job_results annotations
{
  "title": "Results download URL",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
list_jobs — List jobs
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Jobs of this API key, newest first. Compact rows (id, state, label, created, finished, gpu, cost_usd, error) unless full=true.

list_jobs input schema
{
  "type": "object",
  "properties": {
    "full": {
      "type": "boolean",
      "description": "Return the complete status object per job (default false)"
    },
    "limit": {
      "type": "integer",
      "description": "1..200, default 20"
    }
  }
}
list_jobs annotations
{
  "title": "List jobs",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
delete_results — Delete a job's files now
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

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.

delete_results input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Job id, e.g. MDJOB-20260907-3F200C"
    }
  }
}
delete_results annotations
{
  "title": "Delete a job's files now",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
capabilities — What the runner can do
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

capabilities input schema
{
  "type": "object",
  "properties": {
    "full": {
      "type": "boolean",
      "description": "Include the full style table (large)"
    },
    "runner": {
      "type": "string",
      "description": "lammps | openmm; omit for all"
    }
  }
}
capabilities annotations
{
  "title": "What the runner can do",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
preflight_deck — Check a deck before spending
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

preflight_deck input schema
{
  "type": "object",
  "required": [
    "input",
    "files"
  ],
  "properties": {
    "files": {
      "type": "object",
      "description": "Deck contents {path: text}, must include `input`",
      "additionalProperties": {
        "type": "string"
      }
    },
    "input": {
      "type": "string",
      "description": "Relative path of the LAMMPS (or runner) input script inside the deck, e.g. in.lmp"
    }
  }
}
preflight_deck annotations
{
  "title": "Check a deck before spending",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
cancel_job — Cancel job
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Cancel a job that is not finished. A running job is billed up to the cancel time; its pod is terminated.

cancel_job input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Job id, e.g. MDJOB-20260907-3F200C"
    }
  }
}
cancel_job annotations
{
  "title": "Cancel job",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
571 ms
95th percentile latency
571 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 571 ms · metadata changed · 14 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http mdengine-mcp https://api.forcefieldsilicon.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add mdengine-mcp --url https://api.forcefieldsilicon.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable mdengine-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "mdengine-mcp": {
      "url": "https://api.forcefieldsilicon.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "mdengine-mcp": {
      "type": "streamableHttp",
      "url": "https://api.forcefieldsilicon.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start mdengine-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "mdengine-mcp": {
      "type": "http",
      "url": "https://api.forcefieldsilicon.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http mdengine-mcp https://api.forcefieldsilicon.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://api.forcefieldsilicon.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "mdengine-mcp": {
      "serverUrl": "https://api.forcefieldsilicon.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like MDEngine MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run MDEngine MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing