protogrid

Search / com.materialscodegraph/mcg

MaterialsCodeGraph

R1· needs a key

Materials simulations for AI agents over MCP: binding token quote before every run, record after it.

v0.1.1 · active · repository · website · descriptor JSON · versions

An agent can connect on its own if it already holds MCG_TOKEN.Remote endpoint behind a static API key or header. The registry never sees the value; the agent fills the placeholder.
Quality73needs work
Trust100of 100
Uptime, 30 days98%
Latency p50259 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "mcg": {
      "type": "http",
      "url": "https://api.materialscodegraph.com/mcp",
      "headers": {
        "Authorization": "Bearer ${MCG_TOKEN}"
      }
    }
  }
}
claude mcp add --transport http mcg https://api.materialscodegraph.com/mcp --header "Authorization: Bearer ${MCG_TOKEN}"
[mcp_servers.mcg]
url = "https://api.materialscodegraph.com/mcp"
bearer_token_env_var = "MCG_TOKEN"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mcg": {
      "type": "remote",
      "url": "https://api.materialscodegraph.com/mcp",
      "enabled": true,
      "headers": {
        "Authorization": "Bearer {env:MCG_TOKEN}"
      }
    }
  }
}
{
  "mcpServers": {
    "mcg": {
      "type": "http",
      "url": "https://api.materialscodegraph.com/mcp",
      "headers": {
        "Authorization": "Bearer ${MCG_TOKEN}"
      }
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=mcg&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vYXBpLm1hdGVyaWFsc2NvZGVncmFwaC5jb20vbWNwIiwiaGVhZGVycyI6eyJBdXRob3JpemF0aW9uIjoiQmVhcmVyICR7TUNHX1RPS0VOfSJ9fQ%3D%3D"
}
{
  "servers": {
    "mcg": {
      "type": "http",
      "url": "https://api.materialscodegraph.com/mcp",
      "headers": {
        "Authorization": "Bearer ${MCG_TOKEN}"
      }
    }
  }
}
{
  "mcpServers": {
    "mcg": {
      "httpUrl": "https://api.materialscodegraph.com/mcp",
      "headers": {
        "Authorization": "Bearer ${MCG_TOKEN}"
      }
    }
  }
}
extensions:
  "mcg":
    enabled: true
    name: "mcg"
    type: streamable_http
    uri: "https://api.materialscodegraph.com/mcp"
    headers:
      "Authorization": "Bearer ${MCG_TOKEN}"
    timeout: 300

Placeholders to fill from your own secret store: ${MCG_TOKEN}. The registry never accepts secret values.

Quality 73 / 100needs work

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-06-18; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene71 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • warn
    tools.description_length2 tools have descriptions over 1,024 characters, which crowds the context
  • pass
    tools.schemasevery tool has an object input schema
  • warn
    tools.annotationsonly 9 of 12 tools declare readOnlyHint or destructiveHint
  • fail
    tools.directory_hintsno tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: mcg_rates (destructiveHint, idempotentHint, openWorldHint); mcg_clusters (destructiveHint, idempotentHint, openWorldHint); mcg_list_runs (destructiveHint, idempotentHint, openWorldHint); …
  • pass
    tools.token_costabout 3,742 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability75 · weight 15
  • warn
    stability.changes7 tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

12 tools, about 3,742 tokens to load them all · tool set 8240c6bf2a2d · tools last changed 2026-10-18 · checked 2026-10-19 10:52 UTC

Tool changes

  • mcg_quotechangeddescription
    before

    Price a simulation. FREE: no hardware starts. Returns quote_id, quote_hash, tokens, rate_card_version, wall_s, expires_at, resource_class, resource_label and sku (the GPU class the quote is bound to, its name, and the offer SKU it priced; null when none was chosen), resource_options (one row per class the run can rent at this venue: resource_class, label, sku, tokens, wall_s, available; tokens and wall_s are what this quote would be on that class, null when it has no live offer now; re-quote with resource_class to pick one), the plan, and record: {traced: true, node, node_uid, map_version (the openmaterials graph version the node is pinned at; the commons map version is published at openmaterials.ai/data/version.json), material (the material the pinned conditions name: what the run computes)} when the completed run's OpenMaterials record is keyed on that public map node (measured instances cite the method that ran), else {traced: false, reason}. Research coordinators remain traced:false because they have no single public-node pin, but add record.record_contract: per-task omai completion requirements and the approved contract_sha256. Scientific tasks require simulation records; source-integrity QA requires node-less light_evidence, not scientific results. This is a required contract, not evidence that a run has completed; read it before you spend. The price is a binding ceiling: never more than this. mcg_run accepts only this quote_id with this quote_hash before expires_at and REJECTS a stale hash (quote_mismatch) or an expired quote (quote_expired). Arms, exactly one: kind from mcg_catalog (spec passed through verbatim, spec.params set the price, engine overrides the default only with a known engine id); external_frontier, an OpenMaterials external-solve envelope from mcg_catalog's graphs (also returns request_id, plan_digest and the compiled plan; an envelope not byte-equal to a supported graph REJECTS with unsupported_graph); draft_id (see the parameter). Also returns app_url, the owner's page in the app (for the human, never fetched by the agent) and, on the kind arm, warnings: the inputs the app cannot render without (material or structure_xyz, study); pass them. accuracy_study needs no hardware_contract up front: the reply's contract_source says whether the run binds this simulation's published contract (published) or the labeled default synthetic one (default_synthetic).

    after · 96% of words in common

    Price a simulation. FREE: no hardware starts. Returns quote_id, quote_hash, tokens, rate_card_version, wall_s, expires_at, resource_class, resource_label and sku (the GPU class the quote is bound to, its name, and the offer SKU it priced; null when none was chosen), resource_options (one row per class the run can rent at this venue: resource_class, label, sku, tokens, wall_s, available; tokens and wall_s are what this quote would be on that class, null when it has no live offer now; re-quote with resource_class to pick one), the plan, and record: {traced: true, node, node_uid, map_version (the openmaterials graph version the node is pinned at; the commons map version is published at openmaterials.ai/data/version.json), material (the material the pinned conditions name: what the run computes)} when the completed run's OpenMaterials record is keyed on that public map node (measured instances cite the method that ran), else {traced: false, reason}. Research coordinators remain traced:false because they have no single public-node pin, but add record.record_contract: per-task omai completion requirements and the approved contract_sha256. Scientific tasks require simulation records; source-integrity QA requires node-less light_evidence, not scientific results. This is a required contract, not evidence that a run has completed; read it before you spend. The price is a binding ceiling: never more than this. mcg_run accepts only this quote_id with this quote_hash before expires_at and REJECTS a stale hash (quote_mismatch) or an expired quote (quote_expired). Arms, exactly one: kind from mcg_catalog (spec passed through verbatim, spec.params set the price, engine overrides the default only with a known engine id); external_frontier, an OpenMaterials external-solve envelope from mcg_catalog's graphs (also returns request_id, plan_digest and the compiled plan; an envelope not byte-equal to a supported graph REJECTS with unsupported_graph); draft_id (see the parameter). Also returns app_url, the owner's page in the app (for the human, never fetched by the agent) and, on the kind arm, warnings: the inputs the app cannot render without (material or structure_xyz, study); pass them. key_cap {tokens, daily_token_cap, message} appears when the quote alone is above this key's daily_token_cap: mcg_run with this key would be refused. accuracy_study needs no hardware_contract up front: the reply's contract_source says whether the run binds this simulation's published contract (published) or the labeled default synthetic one (default_synthetic).

  • mcg_quotechangeddescription
    before

    Price a simulation. FREE: no hardware starts. Returns quote_id, quote_hash, tokens, rate_card_version, wall_s, expires_at, resource_class, resource_label and sku (the GPU class the quote is bound to, its name, and the offer SKU it priced; null when none was chosen), resource_options (one row per class the run can rent at this venue: resource_class, label, sku, tokens, wall_s, available; tokens and wall_s are what this quote would be on that class, null when it has no live offer now; re-quote with resource_class to pick one), the plan, and record: {traced: true, node, node_uid, map_version (the openmaterials graph version the node is pinned at; the commons map version is published at openmaterials.ai/data/version.json), material (the material the pinned conditions name: what the run computes)} when the completed run's OpenMaterials record is keyed on that public map node (measured instances cite the method that ran), else {traced: false, reason}; read it before you spend. The price is a binding ceiling: never more than this. mcg_run accepts only this quote_id with this quote_hash before expires_at and REJECTS a stale hash (quote_mismatch) or an expired quote (quote_expired). Arms, exactly one: kind from mcg_catalog (spec passed through verbatim, spec.params set the price, engine overrides the default only with a known engine id); external_frontier, an OpenMaterials external-solve envelope from mcg_catalog's graphs (also returns request_id, plan_digest and the compiled plan; an envelope not byte-equal to a supported graph REJECTS with unsupported_graph); draft_id (see the parameter). Also returns app_url, the owner's page in the app (for the human, never fetched by the agent) and, on the kind arm, warnings: the inputs the app cannot render without (material or structure_xyz, study); pass them. accuracy_study needs no hardware_contract up front: the reply's contract_source says whether the run binds this simulation's published contract (published) or the labeled default synthetic one (default_synthetic).

    after · 86% of words in common

    Price a simulation. FREE: no hardware starts. Returns quote_id, quote_hash, tokens, rate_card_version, wall_s, expires_at, resource_class, resource_label and sku (the GPU class the quote is bound to, its name, and the offer SKU it priced; null when none was chosen), resource_options (one row per class the run can rent at this venue: resource_class, label, sku, tokens, wall_s, available; tokens and wall_s are what this quote would be on that class, null when it has no live offer now; re-quote with resource_class to pick one), the plan, and record: {traced: true, node, node_uid, map_version (the openmaterials graph version the node is pinned at; the commons map version is published at openmaterials.ai/data/version.json), material (the material the pinned conditions name: what the run computes)} when the completed run's OpenMaterials record is keyed on that public map node (measured instances cite the method that ran), else {traced: false, reason}. Research coordinators remain traced:false because they have no single public-node pin, but add record.record_contract: per-task omai completion requirements and the approved contract_sha256. Scientific tasks require simulation records; source-integrity QA requires node-less light_evidence, not scientific results. This is a required contract, not evidence that a run has completed; read it before you spend. The price is a binding ceiling: never more than this. mcg_run accepts only this quote_id with this quote_hash before expires_at and REJECTS a stale hash (quote_mismatch) or an expired quote (quote_expired). Arms, exactly one: kind from mcg_catalog (spec passed through verbatim, spec.params set the price, engine overrides the default only with a known engine id); external_frontier, an OpenMaterials external-solve envelope from mcg_catalog's graphs (also returns request_id, plan_digest and the compiled plan; an envelope not byte-equal to a supported graph REJECTS with unsupported_graph); draft_id (see the parameter). Also returns app_url, the owner's page in the app (for the human, never fetched by the agent) and, on the kind arm, warnings: the inputs the app cannot render without (material or structure_xyz, study); pass them. accuracy_study needs no hardware_contract up front: the reply's contract_source says whether the run binds this simulation's published contract (published) or the labeled default synthetic one (default_synthetic).

  • mcg_catalogchangeddescription
    before

    Enabled simulation kinds (each with example mcg_quote arguments that price, or a note naming what must exist first; traced says whether the kind's default lineage returns an OpenMaterials record, traced_note why or why not), the costed lineage menu (runnability, physical conditions, indicative token costs and wall time per resource class, with its label and the offer SKU priced), the external-frontier graphs mcg_quote accepts, recipes (pass a recipe's quote object to mcg_quote unchanged), and codes (versions, licenses, pins; the only software a run may execute). Call before mcg_quote. A kind or code absent here cannot run.

    after · 72% of words in common

    Enabled simulation kinds (each with example mcg_quote arguments that price, or a note naming what must exist first; traced says whether the kind's default lineage has a single public OpenMaterials node pin, traced_note why or why not; research coordinators instead expose record_contract describing per-task completion requirements, not completed results), the costed lineage menu (runnability, physical conditions, indicative token costs and wall time per resource class, with its label and the offer SKU priced), the external-frontier graphs mcg_quote accepts, recipes (pass a recipe's quote object to mcg_quote unchanged), and codes (versions, licenses, pins; the software a run may execute, plus codes kept listed while their engines are withdrawn from sale). Call before mcg_quote. A kind or code absent here cannot run.

  • mcg_quotechangeddescription, input schema
    before

    Price a simulation. FREE: no hardware starts. Returns quote_id, quote_hash, tokens, rate_card_version, wall_s, expires_at, the plan, and record: {traced: true, node, node_uid, map_version (the openmaterials graph version the node is pinned at; the commons map version is published at openmaterials.ai/data/version.json), material (the material the pinned conditions name: what the run computes)} when the completed run's OpenMaterials record is keyed on that public map node (measured instances cite the method that ran), else {traced: false, reason}; read it before you spend. The price is a binding ceiling: never more than this. mcg_run accepts only this quote_id with this quote_hash before expires_at and REJECTS a stale hash (quote_mismatch) or an expired quote (quote_expired). Arms, exactly one: kind from mcg_catalog (spec passed through verbatim, spec.params set the price, engine overrides the default only with a known engine id); external_frontier, an OpenMaterials external-solve envelope from mcg_catalog's graphs (also returns request_id, plan_digest and the compiled plan; an envelope not byte-equal to a supported graph REJECTS with unsupported_graph); draft_id (see the parameter). Also returns app_url, the owner's page in the app (for the human, never fetched by the agent) and, on the kind arm, warnings: the inputs the app cannot render without (material or structure_xyz, study); pass them. accuracy_study needs no hardware_contract up front: the reply's contract_source says whether the run binds this simulation's published contract (published) or the labeled default synthetic one (default_synthetic).

    after · 84% of words in common

    Price a simulation. FREE: no hardware starts. Returns quote_id, quote_hash, tokens, rate_card_version, wall_s, expires_at, resource_class, resource_label and sku (the GPU class the quote is bound to, its name, and the offer SKU it priced; null when none was chosen), resource_options (one row per class the run can rent at this venue: resource_class, label, sku, tokens, wall_s, available; tokens and wall_s are what this quote would be on that class, null when it has no live offer now; re-quote with resource_class to pick one), the plan, and record: {traced: true, node, node_uid, map_version (the openmaterials graph version the node is pinned at; the commons map version is published at openmaterials.ai/data/version.json), material (the material the pinned conditions name: what the run computes)} when the completed run's OpenMaterials record is keyed on that public map node (measured instances cite the method that ran), else {traced: false, reason}; read it before you spend. The price is a binding ceiling: never more than this. mcg_run accepts only this quote_id with this quote_hash before expires_at and REJECTS a stale hash (quote_mismatch) or an expired quote (quote_expired). Arms, exactly one: kind from mcg_catalog (spec passed through verbatim, spec.params set the price, engine overrides the default only with a known engine id); external_frontier, an OpenMaterials external-solve envelope from mcg_catalog's graphs (also returns request_id, plan_digest and the compiled plan; an envelope not byte-equal to a supported graph REJECTS with unsupported_graph); draft_id (see the parameter). Also returns app_url, the owner's page in the app (for the human, never fetched by the agent) and, on the kind arm, warnings: the inputs the app cannot render without (material or structure_xyz, study); pass them. accuracy_study needs no hardware_contract up front: the reply's contract_source says whether the run binds this simulation's published contract (published) or the labeled default synthetic one (default_synthetic).

  • mcg_catalogchangeddescription
    before

    Enabled simulation kinds (each with example mcg_quote arguments that price, or a note naming what must exist first; traced says whether the kind's default lineage returns an OpenMaterials record, traced_note why or why not), the costed lineage menu (runnability, physical conditions, indicative token costs), the external-frontier graphs mcg_quote accepts, recipes (pass a recipe's quote object to mcg_quote unchanged), and codes (versions, licenses, pins; the only software a run may execute). Call before mcg_quote. A kind or code absent here cannot run.

    after · 87% of words in common

    Enabled simulation kinds (each with example mcg_quote arguments that price, or a note naming what must exist first; traced says whether the kind's default lineage returns an OpenMaterials record, traced_note why or why not), the costed lineage menu (runnability, physical conditions, indicative token costs and wall time per resource class, with its label and the offer SKU priced), the external-frontier graphs mcg_quote accepts, recipes (pass a recipe's quote object to mcg_quote unchanged), and codes (versions, licenses, pins; the only software a run may execute). Call before mcg_quote. A kind or code absent here cannot run.

  • mcg_quotechangedinput schema
  • mcg_get_runchangeddescription
    before

    Fetch a run's state, event timeline and LLM spend. The payload leads with a derived summary (state, current_stage, billing {quoted_tokens, charged_tokens, hold, policy}, fault, refusal, next, last event) for cheap polling, then app_url (the run page, for the human), study and headline. events holds the newest events that fit about 12 KB plus the last complete or fail event; events_omitted counts the others. In a payload over 2 KB, each value over 256 chars becomes {omitted_bytes, see}, where see names the route that returns the full event. A report body_md over 6,000 chars becomes the same stub; a brief body_md is cut at 6,000 chars and ends in an ellipsis; llm_spend.calls holds the newest 10 calls, and calls_omitted counts the rest. A done, node-addressed run also carries record (its OpenMaterials SimulationRecord), openmaterials_url (the datasheet link) and openmaterials_label: null, or the commons' note when the record cites a model or configuration that is not in the public registry (record.unregistered lists each), so its values cannot be checked against the commons.

    after · 99% of words in common

    Fetch a run's state, event timeline and LLM spend. The payload leads with a derived summary (state, current_stage, billing {quoted_tokens, charged_tokens, hold, policy}, fault, refusal, next, last event) for cheap polling, then app_url (the run page, for the human), study and headline. events holds the newest events that fit about 12 KB plus the last complete or fail event; events_omitted counts the others. In a payload over 2 KB, each value over 256 chars becomes {omitted_bytes, see}, where see names the route that returns the full event. A report body_md over 6,000 chars becomes the same stub; a brief body_md is cut at 6,000 chars and ends in an ellipsis; llm_spend.calls holds the newest 10 calls, and calls_omitted counts the rest. A done, node-addressed run also carries record (its OpenMaterials SimulationRecord), openmaterials_url (the datasheet link) and openmaterials_label: null, or the commons' note when the record cites a model, configuration or code that is not in the public registry (record.unregistered lists each model and configuration), so its values cannot be checked against the commons.

Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 100 / 100

provenance100
liveness99
freshness100
hygiene100

+repository +namespace-matches-repo +dns-namespace +website +reachable +uptime-98% +updated-29d-ago

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://api.materialscodegraph.com/mcp streamable-httpapi_key ${MCG_TOKEN}yes98%259 ms2025-06-182026-10-19

Tools (12)

mcg_cancel_rundestructiveCancel a run from any non-terminal state before collecting (a collecting run's outputs are delivered and charged: 409). The cancel request is recorded immediately and returns run_id and cancel_requested true; the platform kills the machine and terminalizes the run as state killed on its next orchestration tick (about 60 s). Poll mcg_get_run to observe the terminal state.
mcg_catalogread-onlyEnabled simulation kinds (each with example mcg_quote arguments that price, or a note naming what must exist first; traced says whether the kind's default lineage has a single public OpenMaterials node pin, traced_note why or why not; research coordinators instead expose record_contract describing per-task completion requirements, not completed results), the costed lineage menu (runnability, physical conditions, indicative token costs and wall time per resource class, with its label and the offer SKU priced), the external-frontier graphs mcg_quote accepts, recipes (pass a recipe's quote object to mcg_quote unchanged), and codes (versions, licenses, pins; the software a run may execute, plus codes kept listed while their engines are withdrawn from sale). Call before mcg_quote. A kind or code absent here cannot run.
mcg_clustersread-onlyConnected clusters: id, name, preset (hive or auto), status (pending until the agent's first sync; connected; stale: the agent stopped syncing; revoked; scheduler_down: the agent syncs but cannot reach the scheduler, nothing is offered; agent_outdated: an auto cluster's agent sends no inventory; snapshot_rejected: its last snapshot was over the size cap; snapshot_stale: no fresh capacity snapshot, nothing is offered; nodes_unavailable: none of an auto cluster's nodes accept jobs (drained, down, in maintenance or not responding), nothing is offered), status_detail (why, when not connected), classes (resource classes offered per partition, with per-job GPU, CPU and memory maxima and the GRES type), unclassified_gpus (GPU types present but not offered: type, count, reason), untyped_gpus, last sync time. Pass target {cluster_id} to mcg_quote to run there at zero hardware cost; only a connected cluster quotes. Clusters are created with POST /api/clusters (on the machine host with a spend-scoped key).
mcg_fetch_artifactsread-onlyList a run's collected artifacts as a typed manifest: artifacts, a list of path, bytes, stage and sha256 per file, plus removed on a file the retention sweep deleted (its bytes are gone; do not fetch it); truncated; source. Never returns file contents; fetch one file with mcg_get_artifact.
mcg_get_artifactread-onlyFetch one artifact file's TEXT content, up to max_bytes (default 65536), with an explicit truncation note. Binary content REJECTS with unsupported_content; fetch binaries from the run's public page.
mcg_get_runread-onlyFetch a run's state, event timeline and LLM spend. The payload leads with a derived summary (state, current_stage, billing {quoted_tokens, charged_tokens, hold, policy}, fault, refusal, next, last event) for cheap polling, then app_url (the run page, for the human), study and headline. events holds the newest events that fit about 12 KB plus the last complete or fail event; events_omitted counts the others. In a payload over 2 KB, each value over 256 chars becomes {omitted_bytes, see}, where see names the route that returns the full event. A report body_md over 6,000 chars becomes the same stub; a brief body_md is cut at 6,000 chars and ends in an ellipsis; llm_spend.calls holds the newest 10 calls, and calls_omitted counts the rest. A done, node-addressed run also carries record (its OpenMaterials SimulationRecord), openmaterials_url (the datasheet link) and openmaterials_label: null, or the commons' note when the record cites a model, configuration or code that is not in the public registry (record.unregistered lists each model and configuration), so its values cannot be checked against the commons.
mcg_get_studyread-onlyFetch a study (the project a quote's `study` named) with its member simulations and their latest runs. Pass study_id or the exact name. Returns study, members (each with app_url) and app_url.
mcg_list_runsread-onlyList runs, newest first: every run of this key's owner, or one quote's runs when quote_id is given. Each row carries state, spend_tokens, created_by_key_name (null when launched in the browser), study, headline (the AI brief's first line) and app_url. Returns runs.
mcg_quotePrice a simulation. FREE: no hardware starts. Returns quote_id, quote_hash, tokens, rate_card_version, wall_s, expires_at, resource_class, resource_label and sku (the GPU class the quote is bound to, its name, and the offer SKU it priced; null when none was chosen), resource_options (one row per class the run can rent at this venue: resource_class, label, sku, tokens, wall_s, available; tokens and wall_s are what this quote would be on that class, null when it has no live offer now; re-quote with resource_class to pick one), the plan, and record: {traced: true, node, node_uid, map_version (the openmaterials graph version the node is pinned at; the commons map version is published at openmaterials.ai/data/version.json), material (the material the pinned conditions name: what the run computes)} when the completed run's OpenMaterials record is keyed on that public map node (measured instances cite the method that ran), else {traced: false, reason}. Research coordinators remain traced:false because they have no single public-node pin, but add record.record_contract: per-task omai completion requirements and the approved contract_sha256. Scientific tasks require simulation records; source-integrity QA requires node-less light_evidence, not scientific results. This is a required contract, not evidence that a run has completed; read it before you spend. The price is a binding ceiling: never more than this. mcg_run accepts only this quote_id with this quote_hash before expires_at and REJECTS a stale hash (quote_mismatch) or an expired quote (quote_expired). Arms, exactly one: kind from mcg_catalog (spec passed through verbatim, spec.params set the price, engine overrides the default only with a known engine id); external_frontier, an OpenMaterials external-solve envelope from mcg_catalog's graphs (also returns request_id, plan_digest and the compiled plan; an envelope not byte-equal to a supported graph REJECTS with unsupported_graph); draft_id (see the parameter). Also returns app_url, the owner's page in the app (for the human, never fetched by the agent) and, on the kind arm, warnings: the inputs the app cannot render without (material or structure_xyz, study); pass them. key_cap {tokens, daily_token_cap, message} appears when the quote alone is above this key's daily_token_cap: mcg_run with this key would be refused. accuracy_study needs no hardware_contract up front: the reply's contract_source says whether the run binds this simulation's published contract (published) or the labeled default synthetic one (default_synthetic).
mcg_ratesread-onlyThe public rate card: token_usd, overheads, rate_card_version. FREE, no arguments; also a connectivity check.
mcg_runLaunch the quoted simulation. SPENDS TOKENS: provisions hardware and bills the account. Requires the quote_id and quote_hash from mcg_quote (a stale hash or an expired quote REJECTS: re-quote and retry) and a client-generated idempotency_key (replaying it returns the existing run instead of launching twice). Optional max_tokens is a hard ceiling: a quote above it REJECTS the launch, never clamps. Returns run_id.
mcg_stageCreate a DRAFT simulation whose input files are uploaded before pricing. FREE. Takes the same kind, spec, study, material and conditions as mcg_quote plus inputs: one entry per file the run needs, each with a name and, for small text files, the text inline (staged immediately). Entries without text come back in uploads as presigned PUT URLs (valid 15 minutes, 4 GiB per file): upload each with a plain HTTP PUT of the file bytes, no key or header. Then call mcg_quote with draft_id to price; it REJECTS with inputs_missing until every declared input has arrived.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "com.materialscodegraph/mcg",
  "title": "MaterialsCodeGraph",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://api.materialscodegraph.com/mcp",
      "type": "streamable-http",
      "headers": [
        {
          "name": "Authorization",
          "isSecret": true,
          "isRequired": true,
          "description": "Bearer mcg_sk_... API key, minted on the Keys page of app.materialscodegraph.com."
        }
      ]
    }
  ],
  "version": "0.1.1",
  "repository": {
    "url": "https://github.com/materialscodegraph/materialscodegraph",
    "source": "github"
  },
  "websiteUrl": "https://materialscodegraph.com",
  "description": "Materials simulations for AI agents over MCP: binding token quote before every run, record after it."
}