Skip to main content
Glama

Analyze sensitivity

lca_analyze_sensitivity

Quantify which inputs drive a system's result, and by how much. ref is a saved assessment (a<N>). Composed (bill-of-materials) systems are analysed exactly and instantly; engine-backed tornado uses one cached contribution solve, and engine sweep/scenarios re-solve openLCA param:<name> parameters. Every result states its nature, source and limits. Pass at most one study (none = default tornado): tornado: {variables?, variation_pct?} ranks each variable's ±swing; sweep: {variable, range_min, range_max, steps?, reference_ref | threshold} walks one variable (a break-even needs reference_ref or threshold); scenarios: [{name, overrides}] compares named overrides (id → multiplier). Variable ids come from a default tornado run, or a unique name fragment. member:<slug> = composed member; driver:<slug> = engine driver; param:<name> = engine parameter (sweepable); system:amount scales a whole composed system. Returns a durable v<N>, separate from the a<N> it analyses.

Input Schema

NameRequiredDescriptionDefault
refYesSaved-assessment ref in the form `a<N>` (e.g. `a3`) — study the setup this composed assessment captured. List current assessments with `lca_get(kind='assessments')` — never pass UUIDs.
sweepNoSweep study: walk ONE variable across [`range_min`, `range_max`] (add `reference_ref` or `threshold` for a break-even).
tornadoNoTornado study: rank each variable's ±`variation_pct` swing. The default when no study is given.
categoryNoImpact category to analyse. Defaults to the method's first.
scenariosNoScenarios study: named override sets vs the same baseline, e.g. [{name: 'worst case', overrides: {'member:steel': 1.5}}]. Keys are composed `member:<slug>` / `system:amount` ids (analytic) OR, for an engine target, engine `param:<name>` ids (re-solves the model, deferred) — name fragments resolve server-side either way, but a scenario set may not MIX driver/member and param keys. An unresolvable key 422s.
workspaceYesName of the workspace to work in, as `lca_get(kind='workspaces')` lists it (backticks optional). Named on every call: several conversations can share one connection, and each names its own workspace. The connection's default is often an empty sandbox rather than the user's work.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed16 schema fields changed
    • removedInput schema / properties / assessment_ref
      Removed value: -{
      -  "description": "Saved-assessment ref in the form `a<N>` (e.g. `a3`) — study the setup this composed assessment captured. List current assessments with `lca_get(kind='assessments')` — never pass UUIDs.",
      -  "pattern": "^a\\d+$",
      -  "type": "string"
      -}
    • removedInput schema / properties / mode
      Removed value: -{
      -  "default": "tornado",
      -  "description": "Analysis type.",
      -  "enum": [
      -    "tornado",
      -    "sweep",
      -    "scenarios"
      -  ],
      -  "type": "string"
      -}
    • removedInput schema / properties / range_max
      Removed value: -{
      -  "description": "Sweep: upper multiplier.",
      -  "type": "number"
      -}
    • removedInput schema / properties / range_min
      Removed value: -{
      -  "description": "Sweep: lower multiplier.",
      -  "type": "number"
      -}
    • addedInput schema / properties / ref
      Added value: +{
      +  "description": "Saved-assessment ref in the form `a<N>` (e.g. `a3`) — study the setup this composed assessment captured. List current assessments with `lca_get(kind='assessments')` — never pass UUIDs.",
      +  "pattern": "^a\\d+$",
      +  "type": "string"
      +}
    • removedInput schema / properties / reference_ref
      Removed value: -{
      -  "description": "Sweep: break-even vs another assessment's total (`a<N>`). Mutually exclusive with `threshold`.",
      -  "pattern": "^a\\d+$",
      -  "type": "string"
      -}
    • changedInput schema / properties / scenarios / description
      Previous value: -"Scenarios: named override sets vs the same baseline, e.g. [{name: 'worst case', overrides: {'member:steel': 1.5}}]. Keys are composed `member:<slug>` / `system:amount` ids (analytic) OR, for an engine target, engine `param:<name>` ids (re-solves the model, deferred) — name fragments resolve server-side either way, but a scenario set may not MIX driver/member and param keys. An unresolvable key 422s."New value: +"Scenarios study: named override sets vs the same baseline, e.g. [{name: 'worst case', overrides: {'member:steel': 1.5}}]. Keys are composed `member:<slug>` / `system:amount` ids (analytic) OR, for an engine target, engine `param:<name>` ids (re-solves the model, deferred) — name fragments resolve server-side either way, but a scenario set may not MIX driver/member and param keys. An unresolvable key 422s."
    • addedInput schema / properties / scenarios / minItems
      Added value: +1
    • removedInput schema / properties / steps
      Removed value: -{
      -  "default": 9,
      -  "description": "Sweep: number of points.",
      -  "maximum": 25,
      -  "minimum": 3,
      -  "type": "integer"
      -}
    • addedInput schema / properties / sweep
      Added value: +{
      +  "description": "Sweep study: walk ONE variable across [`range_min`, `range_max`] (add `reference_ref` or `threshold` for a break-even).",
      +  "properties": {
      +    "range_max": {
      +      "description": "Upper multiplier.",
      +      "type": "number"
      +    },
      +    "range_min": {
      +      "description": "Lower multiplier.",
      +      "type": "number"
      +    },
      +    "reference_ref": {
      +      "description": "Break-even vs another assessment's total (`a<N>`). Mutually exclusive with `threshold`.",
      +      "pattern": "^a\\d+$",
      +      "type": "string"
      +    },
      +    "steps": {
      +      "default": 9,
      +      "description": "Number of points.",
      +      "maximum": 25,
      +      "minimum": 3,
      +      "type": "integer"
      +    },
      +    "threshold": {
      +      "description": "Break-even vs a fixed value. Mutually exclusive with `reference_ref`.",
      +      "type": "number"
      +    },
      +    "variable": {
      +      "description": "The single variable to walk — a composed `member:<slug>` id (analytic), an engine `param:<name>` id (openLCA dataset parameter — re-solves the model, deferred), a unique name fragment (resolved server-side), or `system:amount` (scale the whole system: service-life / replacement-count). An engine `driver:<slug>` is NOT sweepable (tornado only) — use `param:<name>` instead. Unresolvable → 422 with the valid list.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "variable",
      +    "range_min",
      +    "range_max"
      +  ],
      +  "type": "object"
      +}
    • removedInput schema / properties / threshold
      Removed value: -{
      -  "description": "Sweep: break-even vs a fixed value. Mutually exclusive with `reference_ref`.",
      -  "type": "number"
      -}
    • addedInput schema / properties / tornado
      Added value: +{
      +  "description": "Tornado study: rank each variable's ±`variation_pct` swing. The default when no study is given.",
      +  "properties": {
      +    "variables": {
      +      "description": "Variables to rank: composed `member:<slug>` ids, engine `driver:<slug>` ids, OR unique name fragments (resolved server-side; a default tornado's rows list every id). Naming ONLY engine `param:<name>` knobs instead re-solves the model under those parameters (deferred) rather than ranking drivers — mixing `driver:`/`param:` ids in one call 422s. Omit for all (composed members, or the E1 driver tornado). `system:amount` is NOT valid here (use sweep/scenarios).",
      +      "items": {
      +        "type": "string"
      +      },
      +      "maxItems": 16,
      +      "type": "array"
      +    },
      +    "variation_pct": {
      +      "default": 20,
      +      "description": "Perturb each variable by ±this percent.",
      +      "maximum": 90,
      +      "minimum": 1,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • removedInput schema / properties / variable
      Removed value: -{
      -  "description": "Sweep: the single variable to walk — a composed `member:<slug>` id (analytic), an engine `param:<name>` id (openLCA dataset parameter — re-solves the model, deferred), a unique name fragment (resolved server-side), or `system:amount` (scale the whole system: service-life / replacement-count). An engine `driver:<slug>` is NOT sweepable (tornado only) — use `param:<name>` instead. Unresolvable → 422 with the valid list.",
      -  "type": "string"
      -}
    • removedInput schema / properties / variables
      Removed value: -{
      -  "description": "Variables to rank: composed `member:<slug>` ids, engine `driver:<slug>` ids, OR unique name fragments (resolved server-side; a default tornado's rows list every id). Naming ONLY engine `param:<name>` knobs instead re-solves the model under those parameters (deferred) rather than ranking drivers — mixing `driver:`/`param:` ids in one call 422s. Omit for all (composed members, or the E1 driver tornado). `system:amount` is NOT valid here (use sweep/scenarios).",
      -  "items": {
      -    "type": "string"
      -  },
      -  "maxItems": 16,
      -  "type": "array"
      -}
    • removedInput schema / properties / variation_pct
      Removed value: -{
      -  "default": 20,
      -  "description": "Tornado: perturb each variable by ±this percent.",
      -  "maximum": 90,
      -  "minimum": 1,
      -  "type": "number"
      -}
    • changedInput schema / required
      Previous value: -[
      -  "workspace",
      -  "assessment_ref"
      -]New value: +[
      +  "workspace",
      +  "ref"
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / workspace / description
      Previous value: -"Name of the workspace to work in, as `lca_get(kind='workspaces')` lists it (backticks optional). Named on every call: several conversations can share one connection, and each names its own workspace."New value: +"Name of the workspace to work in, as `lca_get(kind='workspaces')` lists it (backticks optional). Named on every call: several conversations can share one connection, and each names its own workspace. The connection's default is often an empty sandbox rather than the user's work."
  3. Changed4 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • removedInput schema / additionalProperties
      Removed value: -false
    • removedInput schema / properties / scenarios / items / additionalProperties
      Removed value: -false
    • addedInput schema / properties / scenarios / items / properties / overrides / propertyNames
      Added value: +{
      +  "type": "string"
      +}
  4. Changed2 schema fields changed
    • addedInput schema / properties / workspace
      Added value: +{
      +  "description": "Name of the workspace to work in, as `lca_get(kind='workspaces')` lists it (backticks optional). Named on every call: several conversations can share one connection, and each names its own workspace.",
      +  "maxLength": 255,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "assessment_ref"
      -]New value: +[
      +  "workspace",
      +  "assessment_ref"
      +]
  5. First observed

TDQS

A4.5/5.0
Behavior4/5

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

Goes well beyond the annotations, which only declare it mutates and is non-idempotent. The description discloses performance traits ('analysed exactly and instantly', 'one cached contribution solve', 're-solve openLCA param:<name> parameters', 'deferred'), notes id-namespace rules, 422 behaviour on unresolvable ids, mixing restrictions, and that it returns a durable v<N> separate from the analysed a<N>. It doesn't explain permissions or persistence lifetime beyond 'durable', keeping it below a 5.

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

Conciseness4/5

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

Dense and front-loaded with the core purpose, then study modes, id forms, and return value. Every clause carries information, though the run-on sentence packing multiple constraints is dense enough to require careful reading.

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

Completeness4/5

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

Covers the complex nested schema (three study modes, overrides, reference_ref vs threshold) and the deferred/instant behavioral split well. No output schema exists, so it notes the return is a durable v<N>, but doesn't describe the result shape (e.g. per-variable swing rows) that an agent might need.

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 100%, so baseline is 3, but the description adds meaningful semantics: which variable id forms are valid per study (member:/driver:/param:/system:amount), that omission defaults to all, and how fragments resolve. It doesn't fully restate every nested field (e.g. category, variation_pct defaults), so it earns a 4 rather than 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?

States a specific verb and resource: 'Quantify which inputs drive a system's result, and by how much.' It clearly distinguishes itself from siblings like lca_analyze_contributions by framing the output as ranked drivers/swings rather than contribution shares.

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 'Pass at most one study (none = default tornado)' and specifies when to use each mode: tornado for ranking swings, sweep for walking one variable, scenarios for named override sets. It also names the constraints (e.g. 'a break-even needs reference_ref or threshold', 'system:amount is NOT valid here (use sweep/scenarios)').

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