Skip to main content
Glama

mcg_quote

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), pricing {hours_factor, potential_cost_ratio, note} when a potential staged at slots/potential was priced by its predicted per-step cost over the default's (the hours, the wall time and the run's wall limit are multiplied by hours_factor, at least 1, the factor on the quote's resource_class: each resource_options row is priced at its own class's factor; the per-second rate is unchanged), 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), potential {label, sha256} when the run's staged potential is not NEP89} 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}, which only the graph arm, research coordinators and the untraced preview kinds (the reason is the kind's traced_note) return: a kind-arm spec no record can name is refused with the reason, and one naming several materials or interfaces carries detail.split: one {material, spec} per simulation, each ready to quote (pass the same study to group them). 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. A quote with billing.policy metered_v1 (D-083) carries billing {billing_mode, rate_tokens_per_s, boot_tokens, gate_tokens_per_stage, laws, liability_table, waiver_remaining_today, statement, dispute}: a metered run pays the lower of its work and its time, and a refusal the liability table names as the caller's, after the code computed, pays its work, never more than the quote. 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.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "name": "<name>"
    },
    "name": "mcg_quote"
  }
}

Input Schema

NameRequiredDescriptionDefault
kindNoSimulation kind from mcg_catalog, e.g. bulk_kappa.
nameYesA human label for the simulation.
specNoThe spec object, e.g. {params: {...}, spec_yaml: '...'}. params drive the price. interface_tbc: params.production_steps, equilibration_steps, nx, ny, n_z_per_side, n_bins and delta_T_K set the NEMD budget, junction and thermostat offset within the bounds the reply's certification.settable states (a refused run's summary.next names the key to raise); the price follows the steps and the junction's atom count. On a native engine a params key the kind neither prices nor runs is refused (invalid_request, detail.unknown and detail.accepted), never run at the defaults.
studyNoThe study (project) this simulation belongs to: the id of a study you own (std_ plus 20 hex), or an exact name, created if absent. A value shaped like a study id never creates a study: one that is not yours is refused. Every quote for one investigation should name the same study so the app groups them together.
engineNoOptional engine id override (rejected if unknown).
targetNoRun on one of your connected clusters (see mcg_clusters) instead of the cloud: hardware cost 0, gate fee per the rate card and plan, wall time includes the scheduler's queue-wait estimate. The cluster's status must be connected.
draft_idNoThird arm: price a draft that mcg_stage created and whose inputs have been uploaded (refuses with inputs_missing while any declared input is absent). Also re-prices an already-quoted simulation, after its quote expired or to reproduce a run (pass the run's quote_id, its simulation_id): it clones the spec, the map pin and the staged inputs (not contract files, nor structure files the engine does not read; more than 25 inputs refuse) and returns the clone's fresh quote_id (reply carries requoted_from, and rerun_notes naming skipped inputs, structure overrides and an om_graph re-pin to the active bundle's graph snapshot when the envelope is unchanged; after a map train the envelope moves and the clone is refused with unsupported_graph, so quote with external_frontier instead). Mutually exclusive with every other argument but name, target and resource_class; a re-price keeps the quoted class on the same target unless resource_class names another.
materialNoKind arm only: the material or formula being simulated (e.g. Si, MoS2). Also selects the reference structure. On a traced run whose engine fixes its own conditions it must match the spec's material.
conditionsNoKind arm only: physical conditions as key/value pairs, e.g. {T: 300}. Values are numbers, strings or lists of up to 16 of them, except on an adapter engine, which runs them: there any value its conditions schema allows (lists, booleans, null) over the keys it declares, judged at quote. On a traced run whose engine fixes its own conditions, a key or value its record does not hold is refused; the error names what to send or omit.
max_tokensNoGraph arm only: quote-time hard ceiling; a quote above it REJECTS (never clamps).
structure_xyzNoKind arm only: the simulated structure as extended-XYZ text; staged as the input structure.xyz so the app renders the exact geometry (takes precedence over the material reference).
resource_classNoThe GPU class to run on, from a previous reply's resource_options (e.g. gpu-ampere-80). The quote prices that class only and the run rents only it: no fallback to another class, so it waits in quoted while the class has no capacity. Omit to price the cheapest class; the run may then take any class the engine runs on. A class the run cannot rent at this venue REJECTS with the allowed list.
external_frontierNoThe OpenMaterials #110 external-solve envelope, verbatim: mcg_catalog graphs[].envelope for the active bundle. Mutually exclusive with kind/spec/engine.
potential_from_runNoKind arm only: a done nep_train or nep_campaign run id whose trained NEP model this simulation runs; staged as its potential (with its license notice) before pricing.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / study / description
      Previous value: -"The study (project) this simulation belongs to, by exact name; created if absent. Every quote for one investigation should name the same study so the app groups them together."New value: +"The study (project) this simulation belongs to: the id of a study you own (std_ plus 20 hex), or an exact name, created if absent. A value shaped like a study id never creates a study: one that is not yours is refused. Every quote for one investigation should name the same study so the app groups them together."
  2. Changed2 schema fields changed
    • changedInput schema / properties / draft_id / description
      Previous value: -"Third arm: price a draft that mcg_stage created and whose inputs have been uploaded (refuses with inputs_missing while any declared input is absent). Also re-prices an already-quoted simulation, after its quote expired or to reproduce a run (pass the run's quote_id, its simulation_id): it clones the spec, the map pin and the staged inputs (not contract files, nor structure files the engine does not read; more than 25 inputs refuse) and returns the clone's fresh quote_id (reply carries requoted_from, and rerun_notes naming skipped inputs, structure overrides and an om_graph re-pin to the active bundle's graph snapshot). Mutually exclusive with every other argument but name, target and resource_class; a re-price keeps the quoted class on the same target unless resource_class names another."New value: +"Third arm: price a draft that mcg_stage created and whose inputs have been uploaded (refuses with inputs_missing while any declared input is absent). Also re-prices an already-quoted simulation, after its quote expired or to reproduce a run (pass the run's quote_id, its simulation_id): it clones the spec, the map pin and the staged inputs (not contract files, nor structure files the engine does not read; more than 25 inputs refuse) and returns the clone's fresh quote_id (reply carries requoted_from, and rerun_notes naming skipped inputs, structure overrides and an om_graph re-pin to the active bundle's graph snapshot when the envelope is unchanged; after a map train the envelope moves and the clone is refused with unsupported_graph, so quote with external_frontier instead). Mutually exclusive with every other argument but name, target and resource_class; a re-price keeps the quoted class on the same target unless resource_class names another."
    • changedInput schema / properties / external_frontier / description
      Previous value: -"The OpenMaterials #110 external-solve envelope, verbatim. Mutually exclusive with kind/spec/engine."New value: +"The OpenMaterials #110 external-solve envelope, verbatim: mcg_catalog graphs[].envelope for the active bundle. Mutually exclusive with kind/spec/engine."
  3. Changed1 schema field changed
    • changedInput schema / properties / spec / description
      Previous value: -"The spec object, e.g. {params: {...}, spec_yaml: '...'}. params drive the price. interface_tbc: params.production_steps, equilibration_steps, nx, ny, n_z_per_side, n_bins and delta_T_K set the NEMD budget, junction and thermostat offset within the bounds the reply's certification.settable states (a refused run's summary.next names the key to raise); the price follows the steps and the junction's atom count."New value: +"The spec object, e.g. {params: {...}, spec_yaml: '...'}. params drive the price. interface_tbc: params.production_steps, equilibration_steps, nx, ny, n_z_per_side, n_bins and delta_T_K set the NEMD budget, junction and thermostat offset within the bounds the reply's certification.settable states (a refused run's summary.next names the key to raise); the price follows the steps and the junction's atom count. On a native engine a params key the kind neither prices nor runs is refused (invalid_request, detail.unknown and detail.accepted), never run at the defaults."
  4. Changed1 schema field changed
    • changedInput schema / properties / spec / description
      Previous value: -"The spec object, e.g. {params: {...}, spec_yaml: '...'}. params drive the price. interface_tbc: params.production_steps and params.equilibration_steps set the NEMD budget within the bounds the reply's certification.settable states (a refused run's summary.next names the key to raise); the price follows the budget."New value: +"The spec object, e.g. {params: {...}, spec_yaml: '...'}. params drive the price. interface_tbc: params.production_steps, equilibration_steps, nx, ny, n_z_per_side, n_bins and delta_T_K set the NEMD budget, junction and thermostat offset within the bounds the reply's certification.settable states (a refused run's summary.next names the key to raise); the price follows the steps and the junction's atom count."
  5. Changed1 schema field changed
    • addedInput schema / properties / potential_from_run
      Added value: +{
      +  "description": "Kind arm only: a done nep_train or nep_campaign run id whose trained NEP model this simulation runs; staged as its potential (with its license notice) before pricing.",
      +  "type": "string"
      +}
  6. Changed1 schema field changed
    • changedInput schema / properties / spec / description
      Previous value: -"The spec object, e.g. {params: {...}, spec_yaml: '...'}. params drive the price. interface_tbc: params.production_steps and params.equilibration_steps set the NEMD budget (the run total across all interfaces) within the bounds the reply's certification.settable states (a refused run's summary.next names the key to raise); the price follows the budget."New value: +"The spec object, e.g. {params: {...}, spec_yaml: '...'}. params drive the price. interface_tbc: params.production_steps and params.equilibration_steps set the NEMD budget within the bounds the reply's certification.settable states (a refused run's summary.next names the key to raise); the price follows the budget."
  7. Changed2 schema fields changed
    • changedInput schema / properties / draft_id / description
      Previous value: -"Third arm: price a draft that mcg_stage created and whose inputs have been uploaded (refuses with inputs_missing while any declared input is absent). Also re-prices an already-quoted simulation, after its quote expired or to reproduce a run (pass the run's quote_id, its simulation_id): it clones the spec, the map pin and the staged inputs (not contract files, nor structure files the engine does not read; more than 25 inputs refuse) and returns the clone's fresh quote_id (reply carries requoted_from, and rerun_notes naming skipped inputs, structure overrides and an om_graph re-pin to the active bundle's graph snapshot). Mutually exclusive with every other argument but name and target."New value: +"Third arm: price a draft that mcg_stage created and whose inputs have been uploaded (refuses with inputs_missing while any declared input is absent). Also re-prices an already-quoted simulation, after its quote expired or to reproduce a run (pass the run's quote_id, its simulation_id): it clones the spec, the map pin and the staged inputs (not contract files, nor structure files the engine does not read; more than 25 inputs refuse) and returns the clone's fresh quote_id (reply carries requoted_from, and rerun_notes naming skipped inputs, structure overrides and an om_graph re-pin to the active bundle's graph snapshot). Mutually exclusive with every other argument but name, target and resource_class; a re-price keeps the quoted class on the same target unless resource_class names another."
    • addedInput schema / properties / resource_class
      Added value: +{
      +  "description": "The GPU class to run on, from a previous reply's resource_options (e.g. gpu-ampere-80). The quote prices that class only and the run rents only it: no fallback to another class, so it waits in quoted while the class has no capacity. Omit to price the cheapest class; the run may then take any class the engine runs on. A class the run cannot rent at this venue REJECTS with the allowed list.",
      +  "type": "string"
      +}
  8. Changed1 schema field changed
    • changedInput schema / properties / draft_id / description
      Previous value: -"Third arm: price a draft that mcg_stage created and whose inputs have been uploaded (refuses with inputs_missing while any declared input is absent). Also re-prices an already-quoted simulation, after its quote expired or to reproduce a run (pass the run's quote_id, its simulation_id): it clones the spec, the map pin and the staged inputs (not contract files, nor structure files the engine does not read; more than 25 inputs refuse) and returns the clone's fresh quote_id (reply carries requoted_from, and rerun_notes naming skipped inputs and structure overrides). Mutually exclusive with every other argument but name and target."New value: +"Third arm: price a draft that mcg_stage created and whose inputs have been uploaded (refuses with inputs_missing while any declared input is absent). Also re-prices an already-quoted simulation, after its quote expired or to reproduce a run (pass the run's quote_id, its simulation_id): it clones the spec, the map pin and the staged inputs (not contract files, nor structure files the engine does not read; more than 25 inputs refuse) and returns the clone's fresh quote_id (reply carries requoted_from, and rerun_notes naming skipped inputs, structure overrides and an om_graph re-pin to the active bundle's graph snapshot). Mutually exclusive with every other argument but name and target."
  9. First observed

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden and does so extensively: quote is a binding ceiling, expires_at/hash staleness rejections (quote_mismatch, quote_expired), unsupported_graph refusal, key_cap behavior, and metered_v1 billing semantics. This is far richer than the structured fields provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The content is a single dense wall of text with the return-value enumeration dumped in the second sentence before any usage framing, and it crams multiple independent concerns into run-on clauses. The information is valuable but poorly front-loaded and hard to parse, so it is not concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter tool with no output schema, the description explains return values (quote_id, resource_options, billing, record, app_url, key_cap), failure modes, and arm selection thoroughly. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so baseline is 3; the description still adds meaning beyond the schema on arm behavior, resource_class pricing/no-fallback semantics, and draft_id re-price/clone behavior. Some of its parameter detail duplicates the already-detailed schema, keeping it just short of 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Price a simulation') and immediately clarifies the crucial scope distinction ('FREE: no hardware starts'), which separates it from mcg_run. The relationship to mcg_run is spelled out (mcg_run accepts only this quote_id/hash), so an agent can tell pricing apart from execution without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it ('read it before you spend'), enumerates the exactly-one arm selection (kind from mcg_catalog, external_frontier, draft_id), and gives exclusion rules (draft_id 'mutually exclusive with every other argument'). It routes the agent among alternatives with named conditions rather than leaving inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources