Aevia
Server Details
AI-powered life cycle assessment and modelling: connect to LCA databases, build and analyze systems
- Status
- Healthy
- Uptime
- 73.7% over 42 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 23 tools
Each tool targets a distinct resource+action, and the potentially confusing pairs (compose_assembly vs compose_linked, edit_assembly vs edit_linked, engine_get vs lca_get, knowledge_search vs get_excerpts vs get_full_document) are explicitly cross-referenced in their descriptions. The deliberate 'two ways to build/edit a system' pairs still require careful reading, so it's not perfectly frictionless, but boundaries are well drawn.
Consistent prefix_verb_noun pattern throughout: engine_*, knowledge_*, lca_*, and load_skill all follow verb_noun with a clear domain prefix. No mixing of camelCase/snake_case or verb styles; the taxonomy is predictable and readable.
23 tools is on the heavier side, but the server spans genuinely broad sub-domains (engine catalog browsing, literature library, workspace management, system composition, assessment, analysis, import). Each tool appears to earn its place, though the count is slightly high and would benefit from tighter consolidation.
Strong lifecycle coverage: search/browse, compose, edit, assess, analyze, compare, import, delete, and workspace/engine switching. Reports are referenced (r<N> refs, report_writing skill) but no report-creation tool is present, leaving one minor gap an agent would have to work around.
Available Tools
23 toolsengine_getGet database itemARead-onlyIdempotentInspect
Detail for one engine-catalog object by ref: p<N>, e<N>, f<N> or m<N>. Refs come from engine_search and name objects in the connected engine database. Polymorphic on the prefix: p<N> → process, e<N> → engine product system, f<N> → flow, m<N> → LCIA method. A workspace s<N> is a different object, read with lca_get(ref='s<N>'); this tool rejects it. Process detail defaults to a summary of both sides (top 20 each: product flows first, then elementary, grouped by unit, largest amount first); section='inputs'|'outputs' with offset pages one side, and limit (max 100) sizes the page. Every heading states the true total; a follow-up hint appears whenever rows remain. include_providers=true on a flow ref lists the processes that produce it. An m<N> returns the method's categories; section='factors' adds their characterization factors (rarely needed). A process's exchange rows and reference product carry f<N> refs, which the compose and edit tools accept directly.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | The item to look up — a reference like p1, e3 or f7 taken from an earlier search. Run `engine_search` first if you don't have one. | |
| limit | No | How many rows to show per side. Default 20, up to 100. | |
| engine | No | Name of the engine database, as `lca_get(kind='engines')` lists it (case-insensitive). Omitted: this connection's default engine. Not combined with `scope_ref`, which picks the database a ref came from. | |
| offset | No | Skip this many rows to page further down the list. Starts at 0 (the top). | |
| section | No | Processes: show only the inputs (what the process uses) or only the outputs (what it makes or emits), one page at a time; leave unset for a short summary of both. Methods: `factors` adds the characterization factors of each impact category (heavy; rarely needed). | |
| include_providers | No | Also list the processes that produce this flow — i.e. where it comes from. Flows only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly/idempotent/non-destructive/closed-world), yet the description still adds substantial behavior: the default two-sided summary with top-20-per-side ordering, grouping by unit, largest-amount-first, true totals in headings, follow-up hints when rows remain, and paging semantics for section+offset. This is well beyond what structured fields convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense paragraph, but it is front-loaded with the purpose and ref-prefix legend before the paging and edge-case detail. Almost every sentence carries operational content; a mild deduction for length and for re-covering limit/section behavior already present in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must describe returns, and it does — default summary composition, pagination, totals, and hints. For a read-only lookup with 6 params, nothing an agent needs to call it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning the schema lacks — notably what each ref prefix resolves to (p=process, e=product system, f=flow, m=LCIA method) and that process exchange rows carry f<N> refs usable by compose/edit tools. It largely restates limit/offset/include_providers behavior that the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Detail for one engine-catalog object by ref') and immediately decodes the four ref prefixes (p/e/f/m). It explicitly separates itself from siblings: refs come from engine_search, and workspace s<N> objects belong to lca_get, not this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the prerequisite (run engine_search first for a ref), the exclusion (rejects s<N>, use lca_get instead), and per-type usage guidance (section='factors' is 'rarely needed'; include_providers only applies to flow refs). An agent can route correctly without opening any schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
engine_searchSearch LCA databaseARead-onlyIdempotentInspect
Search an LCA database for processes, systems, flows or methods. The database is the one named by engine, else this connection's default. kind scopes to processes, systems, flows, projects, methods (m<N> refs), or all (processes, systems and flows). query='*' (or an empty string) enumerates everything of the given kind — e.g. kind='system', query='*' lists every product system in the database (one page of limit, plus the true total). With kind='flow', flow_type (elementary / product / waste) filters the results; with kind='process', process_type (unit_process / system_process) does. Returns typed refs (p1, e1, f1; a system hit is an e<N> engine-catalog ref, not a workspace s<N>) valid for the session, accepted by engine_get and lca_run_assessment. scope_ref (any engine ref such as p3/e1/m2 from an earlier result) searches the database that ref came from instead, for comparing across databases; refs minted that way stay bound to that database.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | What to search for. 'all' queries processes, systems, and flows in parallel. 'project' lists openLCA projects — a project is addressed by its name, which `lca_import_project` takes. 'method' lists the LCIA methods whose name contains every word of `query` (`*` lists all); not part of 'all'. | all |
| limit | No | Max results per page (default 20). | |
| query | Yes | Free-text query, matched word by word against dataset names, categories and location codes — there is no meaning-based matching, so the nouns a dataset is named by (a material, a process, a product) find more than a description of the use (`polypropylene injection moulding`, not `plastic plate`). A place matches by name or code (`Switzerland`, `CH`). When no hit contains every word, the closest partial matches come back, labelled as such. Use `*` (or an empty string) to list everything of the given `kind` — the way to enumerate what a database contains. | |
| engine | No | Name of the engine database, as `lca_get(kind='engines')` lists it (case-insensitive). Omitted: this connection's default engine. Not combined with `scope_ref`, which picks the database a ref came from. | |
| offset | No | Start index for pagination (default 0). | |
| flow_type | No | Only meaningful when kind=flow. | |
| scope_ref | No | Optional. An engine ref (`p`/`e`/`f`/`m`) whose database to search instead of the active connection. Omit to search the active connection. | |
| process_type | No | Only meaningful when kind=process. Restrict to unit processes vs aggregated (system) processes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so the safety profile is covered. The description adds non-obvious behavioral context the annotations cannot: refs are session-scoped, refs minted via `scope_ref` stay bound to that database, results come back as one page of `limit` plus the true total, and unmatched queries fall back to labelled partial matches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the core enumeration trick are front-loaded, and there is little filler, but the whole definition is one dense unbroken block covering query, kind, flow_type, process_type, engine and scope_ref in sequence, which makes it harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does: it explains that hits are typed refs (`p1`, `e1`, `f1`), that a system hit is an `e<N>` engine-catalog ref rather than a workspace `s<N>`, and that results are paginated with a true total. Pagination is also covered by the limit/offset schema fields, so nothing an agent needs to call and interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description exceeds it by explaining matching semantics the schema only gestures at (word-by-word against names/categories/location codes, no semantic matching, concrete `polypropylene injection moulding` example) and by clarifying cross-parameter interactions the schema lists separately (flow_type only with kind='flow', scope_ref overrides engine).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource ('Search an LCA database for processes, systems, flows or methods') and the rest of the description positions it against engine_get (fetch by ref) and lca_run_assessment (consume refs), so the agent can tell what this tool is for without opening the schema. The scope of what is searchable and what refs are minted is stated up front.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Rich when-to-use guidance: `query='*'` to enumerate a kind, `scope_ref` specifically 'for comparing across databases', `flow_type` only with kind='flow', `process_type` only with kind='process'. What is missing is an explicit statement of when NOT to use it (e.g. use `engine_get` when you already hold a ref), though the ref handoff is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_get_excerptsGet literature excerptsARead-onlyIdempotentInspect
Search the library and return abstracts with matching passages. Three modes: (1) query only → discover documents AND return each one's abstract + relevant chunk excerpts in one call; (2) document_refs only → abstract + first chunks per doc as a table-of-contents glimpse; (3) both → re-rank chunks against the query, scoped to those refs. At least one of query or document_refs is required. In query-discovery mode you may also scope by journal / year_from / year_to (ignored when document_refs is given).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max documents (only applies when document_refs is omitted, default: 10). | |
| query | No | Search text. Required when no documents are selected (discovery mode) — finds matching documents. Optional once document_refs are given: include it to rank those documents' chunks by relevance, or omit it to pull each document's abstract + opening chunks. The library is English-language: technical terms and scientific names match best. | |
| journal | No | Optional. Restrict the search to ONE journal, by its full name (e.g. "Journal of Cleaner Production"). A distinctive fragment also works ("Cleaner Production"), but a fragment matching several journals is rejected with the candidates listed — never guessed at — so prefer the full name. To compare journals, run one search per journal. Omit to search every document this session can reach — including the user's own uploads and anything else with no journal recorded, which a journal filter would exclude. | |
| year_to | No | Optional inclusive upper bound on publication year. Omit for no upper bound. | |
| year_from | No | Optional inclusive lower bound on publication year (e.g. 2020 for "recent"). Omit for no lower bound. | |
| document_refs | No | Specific documents to pull from, as knowledge refs from a recent knowledge_search (e.g. ["k1", "k7"]). Provide these to fetch those exact documents (abstract + chunks) instead of discovering by query — the metadata filters (Scope / years) then no longer apply. Required if query is omitted. | |
| top_k_chunks_per_doc | No | Max chunks to return per document (default: 3). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: the library is English-language so technical terms/scientific names match best, a multi-journal fragment is rejected with candidates rather than guessed, omitting journal widens scope to uploads and journal-less documents, and filters are inert in document_refs mode. Return shape (abstract + chunks) is also sketched.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then a tight numbered enumeration of the three modes, then the input requirement and the filter-scoping caveat. Every sentence earns its place and the parenthetical constraints are load-bearing rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters, no required params, and no output schema, the description does the important work of explaining mode interactions and mutual constraints, which is what an agent needs to call it correctly. It could say a bit more about what a returned excerpt/chunk actually contains (ordering, sizing) and about behavior when a ref is invalid, but the essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantic value beyond the schema: the trade-off of omitting journal (includes the user's own uploads), the fragment-resolution/rejection behavior, and the interaction where scope filters are ignored once document_refs are given. It does not add anything for limit/top_k_chunks_per_doc or the year bounds, which the schema already handles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb+resource ('Search the library and return abstracts with matching passages') and enumerates three operating modes keyed on which inputs are supplied. It is very clear about what the tool produces, but it never names sibling tools (knowledge_search, knowledge_get_full_document), so differentiation from them is only implied by the 'discover AND return excerpts in one call' framing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Strong mode-selection guidance: query-only for discovery+excerpts, document_refs-only for a table-of-contents glimpse, both for re-ranking scoped to refs, plus the hard constraint that at least one of query/document_refs is required. It also states when metadata filters are ignored. It stops short of naming an alternative tool for pure document discovery (e.g. knowledge_search), which would be the 5-level signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_get_full_documentGet full documentARead-onlyIdempotentInspect
Full text of one library document, by its k<N> ref. The ref comes from a recent knowledge_search (k1, k7). knowledge_get_excerpts returns abstracts and matching passages, which usually suffice; this returns the whole paper. Refs marked [ref-only] have no full text, so for those it returns the same abstract knowledge_get_excerpts does.
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes | Ref like `k1`/`k7` from a recent knowledge_search. Titles, DOIs and document uuids are rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower, yet the description adds real behavioral context: [ref-only] documents return only an abstract rather than failing or returning empty. It could go further on size/truncation behavior for large full texts, hence not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with what the tool returns and the ref contract, then the sibling comparison and the edge case. No padding or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent what comes back (full text, or the same abstract as excerpts for ref-only entries) and where the input ref originates. Nothing needed 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents the k<N> format and the rejection of titles/DOIs/uuids. The description restates the ref origin ('comes from a recent knowledge_search') without adding format or syntax detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Full text of one library document') and scopes it precisely by ref type. It explicitly contrasts itself with knowledge_get_excerpts and knowledge_search, so an agent can distinguish it from siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use-this-vs-alternative rule: excerpts 'usually suffice', this tool is for the whole paper, and it names which refs are even eligible ([ref-only] excluded). That is a genuine routing decision, not vague context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_searchSearch literatureARead-onlyIdempotentInspect
Search 130,000+ peer-reviewed sustainability papers and the account's uploads. Articles from Sustainability, the Journal of Cleaner Production, the International Journal of Life Cycle Assessment and the Journal of Industrial Ecology, 1993 to the present — LCA, material flows, energy, food and agriculture, materials, waste, buildings and policy. English-language; most entries are abstract and metadata only. Returns ref-numbered metadata only (title, authors, year, journal, DOI) — no abstract, no excerpts. Refs (e.g. k1, k7) persist for this session and are accepted by knowledge_get_excerpts (passages) and knowledge_get_full_document (the full paper). limit defaults to 12; a larger limit suits broad literature surveys. Optional filters: journal (its full name) and year_from / year_to.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default: 12). Bump toward 30 for broad literature surveys. | |
| query | Yes | Search query. The library is English-language: technical terms and scientific names match best. | |
| journal | No | Optional. Restrict the search to ONE journal, by its full name (e.g. "Journal of Cleaner Production"). A distinctive fragment also works ("Cleaner Production"), but a fragment matching several journals is rejected with the candidates listed — never guessed at — so prefer the full name. To compare journals, run one search per journal. Omit to search every document this session can reach — including the user's own uploads and anything else with no journal recorded, which a journal filter would exclude. | |
| year_to | No | Optional inclusive upper bound on publication year. Omit for no upper bound. | |
| year_from | No | Optional inclusive lower bound on publication year (e.g. 2020 for "recent"). Omit for no lower bound. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, but the description adds substantial context beyond them: returns are metadata-only with no abstracts or excerpts, refs persist only for the session, coverage is English-language and abstract-heavy, and journal-fragment ambiguity is rejected with candidates rather than guessed. This is genuinely useful behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with corpus and scope, then returns, then ref lifecycle and downstream tools, then parameters — every sentence carries distinct information despite the density. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so precisely (ref-numbered title/authors/year/journal/DOI only), plus session-scoped ref persistence. For a 5-parameter, read-only search tool this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description earns an increment by tying parameters to intent: limit default 12 with 'a larger limit suits broad literature surveys', year_from/year_to as optional bounds, and journal as a full-name single-journal restriction. Most of this restates the schema, so it does not reach 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (130,000+ peer-reviewed sustainability papers plus account uploads), scopes the corpus by journal and date, and implicitly distinguishes itself from the sibling retrieval tools it hands refs to. An agent can tell this apart from knowledge_get_excerpts and knowledge_get_full_document without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the downstream alternatives — refs are 'accepted by knowledge_get_excerpts (passages) and knowledge_get_full_document (the full paper)' — and the journal filter guidance states when to omit it and why (it would exclude uploads and unjournaled docs). Conditions for larger limits and per-journal comparison searches are also given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_analyze_contributionsAnalyze contributionsAInspect
Break down what drives an impact category. ref is a<N> (analyses a saved assessment's setup) or s<N> (analyses a saved system directly, with no prior assessment needed; method and amount then shape the solve). Returns a b<N> breakdown ref, a separate object from the a<N> it analyses. Modes: by='process' ranks contributing processes (total_amount = per-process total, loop-corrected); by='flow' ranks substance drivers by amount × CF; by='upstream' walks the supply chain. For composed (bill-of-materials) systems only process via an a<N> is available; flow, upstream and an s<N> return 422. The first call per solve prepares the engine in the background (about 3–5 s); later calls on the same solve reuse it. Rows carry p<N>/f<N> refs for further detail.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | How to break down the result: rank contributing processes, rank substance flows, or walk the upstream supply-chain tree. Composed (bill-of-materials) systems support process only. | process |
| ref | Yes | `a<N>` — analyse that saved assessment's setup (its system, method and functional unit); `s<N>` — analyse the saved system directly, with NO prior assessment (`method` / `amount` apply only here). List current ones with `lca_get(kind='assessments')` / `lca_get(kind='systems')` — never pass UUIDs. | |
| depth | No | Upstream only: maximum depth of the supply-chain walk (1–6). | |
| top_n | No | Maximum number of rows to return (default 20). | |
| amount | No | `s<N>` only: how many of the system's DECLARED functional units to analyse (N). The solve scales by N x the declared amount, the same way `lca_run_assessment` does. Omit to analyse at the system's declared functional unit (N=1); an explicit value overrides. Ignored with an `a<N>`, which inherits its functional unit — and ignores `amount` entirely — from the saved assessment. | |
| cutoff | No | Upstream only: drop nodes contributing less than this fraction of the total impact (0–1, default 0.01). | |
| method | No | `s<N>` only: preferred LCIA method — fuzzy-matched (substring) against the methods in the connected database; free text is accepted. Defaults to the same house preference `lca_run_assessment` uses. Ignored with an `a<N>`, which inherits its method from the saved assessment. | |
| category | No | Impact category to break down. Defaults to the first category of the method. | |
| direction | No | Flow only: which exchange direction to keep — 'input' = substances taken from the environment (resources, land, water intake); 'output' = released to it (emissions like CO₂ to air); 'both' (the default) applies no filter. Most categories are dominated by one direction anyway; narrow mainly for net-balance categories like water consumption, where withdrawals (input) and returns (output) carry opposite signs and would otherwise both rank as top 'drivers' while largely cancelling. | both |
| workspace | Yes | 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. | |
| compartment | No | Flow only: filter substances to one environmental compartment (medium) — e.g. 'air', 'water', 'soil'. Case-insensitive substring against the compartment path. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-idempotent operation but say nothing about cost or side effects; the description fills that gap by disclosing that the first call per solve prepares the engine in the background (~3–5 s) and later calls reuse it, plus the 422 failure modes. It also notes the returned b<N> is a new object separate from the analysed a<N>. Rich disclosure beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core purpose, the ref scheme, and mode behavior come first, with latency and error caveats at the end. Backtick refs compact a lot into one paragraph, though the density borders on cryptic for a first-time reader.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter tool with no output schema, the description explains the return shape (b<N> breakdown ref, p<N>/f<N> row refs for further detail), all mode-dependent parameter applicability, engine-preparation latency, and error conditions. Nothing essential for a correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real meaning: `ref` `a<N>` vs `s<N>` semantics, that `method`/`amount` only shape an `s<N>` solve, and the per-mode meaning of results (`total_amount` loop-corrected for process, `amount × CF` for flow, supply-chain walk for upstream). Adds value over the schema without fully documenting every param (e.g. depth/top_n/cutoff stay schema-only).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (break down what drives an impact category) and immediately disambiguates from siblings by naming the three modes and the b<N> output object distinct from the a<N> input. An agent can distinguish this from lca_analyze_sensitivity or lca_run_assessment without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use routing: `a<N>` analyses a saved assessment's setup, `s<N>` analyses a saved system with no prior assessment, and it names lca_get for enumerating refs. It also states when-not (composed systems support only 'process' via `a<N>`; flow/upstream/s<N> return 422). Lacks an explicit comparison to lca_analyze_sensitivity, so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_analyze_sensitivityAnalyze sensitivityAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | 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. | |
| sweep | No | Sweep study: walk ONE variable across [`range_min`, `range_max`] (add `reference_ref` or `threshold` for a break-even). | |
| tornado | No | Tornado study: rank each variable's ±`variation_pct` swing. The default when no study is given. | |
| category | No | Impact category to analyse. Defaults to the method's first. | |
| scenarios | No | 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. | |
| workspace | Yes | 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. |
TDQS
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.
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.
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.
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.
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.
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.
lca_apply_nw_setApply normalization/weighting setAIdempotentInspect
Apply a normalization/weighting set to a saved assessment (a<N>). ref is an a<N> in the workspace named by workspace; nw_set names one of its method's sets, and an unknown name is refused with the sets the method offers. Nothing is recalculated: the set's factors are read from the engine that calculated the assessment, and normalized and weighted results per category plus a single score are stored beside the unchanged characterized results. Applying the same set again refreshes it. A set may cover only some of the categories; the result names the ones it leaves out of the single score. lca_compare_assessments with nw_set compares assessments that all carry the same set. Weighting expresses value choices, and ISO 14044 §4.4.5 bars it from a comparative assertion disclosed to the public.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | The saved assessment `a<N>` to re-score. | |
| nw_set | Yes | Name of one of the assessment method's normalization/weighting sets (exact, or a unique part of the name). An unknown name is refused with the sets the method offers. | |
| workspace | Yes | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: nothing is recalculated, factors are read from the engine that produced the assessment, results are stored beside unchanged characterized results, re-application refreshes (consistent with idempotentHint), partial category coverage is possible, and it cites the ISO 14044 restriction on public comparative assertions. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and keeps every sentence substantive, but it is dense with several distinct topics (storage semantics, refresh, partial coverage, ISO caveat) that could be tightened. No filler sentences, so it stays efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining what gets produced: normalized/weighted results per category plus a single score, stored alongside unchanged characterized results, with omitted categories named. An agent has everything needed to invoke and interpret the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: ref is an a<N> in the named workspace, nw_set must match one of the method's sets (exact or unique part), and workspace is mandatory per call because connections are shared. It reinforces and contextualizes the schema rather than merely repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: applying a normalization/weighting set to a saved assessment. It explicitly distinguishes itself from lca_compare_assessments (which uses nw_set only to compare assessments all carrying the same set), so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions: apply to a saved assessment, unknown set names are refused, re-applying refreshes rather than duplicates, and comparison of sets belongs to lca_compare_assessments. Alternatives and preconditions are named, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_compare_assessmentsCompare assessmentsAInspect
Save a comparison across 2–8 saved assessments. Each target is an a<N> ref (listable with lca_get(kind='assessments')); every lca_run_assessment call already saves one, so there is no separate save step. Two preconditions are enforced (400): all targets share one LCIA method, and all are one product at one amount unless function states the function they all deliver. Differences in allocation, database or provider linking are not refused; they are returned as equivalence warnings alongside the result. The comparison is saved into the workspace named by workspace and returned as primary_ref (c<N>), which holds the full matrix. The matrix does not rank the targets; it reports each impact category separately. nw_set adds the targets' stored single scores for that set beside the matrix; every target must already carry it (lca_apply_nw_set). The assessment_interpretation skill (load_skill) documents comparison discipline.
| Name | Required | Description | Default |
|---|---|---|---|
| nw_set | No | Compare by the single score of this normalization/weighting set (its name, or a unique part of it); every target must carry it, see `lca_apply_nw_set`. A target missing it, or carrying a different copy, is refused with what to do. Omit for the characterized matrix only. | |
| targets | Yes | Saved-assessment refs to compare, e.g. ['a1', 'a2']. Must have ≥2 items. | |
| function | No | The function every target delivers, quantified — e.g. 'packaging for 1 L of beverage'. Needed when the targets are not the same product at the same amount: take it from the user's stated goal, or ask them. Saved with the comparison and shown wherever it is read. | |
| workspace | Yes | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations: it discloses two enforced 400-level preconditions (single LCIA method; single product/amount unless function is stated), that allocation/database/provider differences do not fail but return equivalence warnings, that the result is persisted to a named workspace as primary_ref c<N>, that the matrix is unranked and per-category, and that nw_set only adds already-stored scores. This is a write operation (readOnlyHint=false), and the description makes its side effects and failure modes explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The paragraph is front-loaded with the core action and follows a logical order: what is saved, what a target is, preconditions, non-refused differences, return value, nw_set, skill. It is dense but several clauses paraphrase the schema descriptions, which is mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still names the returned artifact (primary_ref c<N>) and describes the matrix's semantics (unranked, per-category, optional nw_set column). Preconditions, failure modes, and prerequisites are all covered, so 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter already carries a detailed inline description (nw_set's refusal behavior, targets' a<N> pattern and ≥2 requirement, function's quantified-goal guidance, workspace naming rationale). The prose largely restates that same material, adding little syntax or format information the schema does not already provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Save a comparison across 2–8 saved assessments') and immediately distinguishes itself from lca_run_assessment by noting every run already saves one, so no separate save step exists. An agent can tell exactly what this creates and from what inputs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage conditions: targets must number 2–8, function is required when targets are not the same product at the same amount, and nw_set requires every target to already carry that set (via lca_apply_nw_set). It points to the assessment_interpretation skill, but never contrasts itself with sibling analysis tools such as lca_analyze_contributions or lca_analyze_sensitivity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_compose_assemblyBuild product system (bill of quantities)AInspect
Build a product system as a bill of quantities of database processes. Each member's amount is sent in one call. Structure only; no LCIA runs. The assembled product is the functional unit; each member is linked to its full upstream when assessed, so the total is a full-upstream figure for the declared scope, with a per-material breakdown. Takes inputs (flat) or stages (a DAG of life-cycle stages), not both. The system is validated against the database; if valid it is saved and system_ref is returned for lca_run_assessment. If invalid, the response lists errors[], missing_required[] and warnings[] and nothing is saved; a corrected call carries the complete system. dry_run: true validates without saving. A tool error, not an invalid result, means the engine is unavailable. Members are p<N> refs; UUIDs are not accepted. lca_compose_linked builds explicit supply edges instead. The product_system_authoring skill (load_skill) documents build order and common failures.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | System boundary. 'cradle_to_gate' (default) = materials through manufacture. 'cradle_to_grave' = ALSO include end-of-life (add disposal/treatment process leaves). 'end_of_life' = treatment of a product at end of life only; the functional unit is the treated product, e.g. '1 kg of end-of-life PV module, treated'. A cradle-to-grave system spans life-cycle phases — prefer `stages` over a flat `inputs` list so each phase gets its own subtotal. | |
| title | Yes | Name for the assembly, e.g. 'Wooden house assembly, 100 m²'. | |
| engine | No | Name of the engine database, as `lca_get(kind='engines')` lists it (case-insensitive). Omitted: this connection's default engine. | |
| inputs | No | FLAT bill of quantities: one entry per member. Use for a single cradle-to-gate group of parts with no phases to separate. If the system spans life-cycle phases (materials/transport/use/end-of-life) or is a comparison, prefer `stages` instead — same total, per-phase subtotals. Set this OR `stages`, not both. | |
| stages | No | MULTI-STAGE DAG (preferred for cradle-to-grave, multi-phase, or comparison systems — same total as a flat list, but each phase gets its own subtotal): named stages, each consuming process leaves and/or other stages. Declare stages + what each consumes; DO NOT wire links or name the final product — the compiler derives the edges and the final (sink) stage. Cycles are rejected. Set this OR `inputs`, not both. | |
| dry_run | No | When true, validate ONLY — return the envelope without persisting (and without a confirmation prompt). Default false: a valid system is built and its s-ref returned in this one call. | |
| workspace | Yes | 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. | |
| output_name | Yes | Name for the assembled product, e.g. 'Wooden house, 100 m²'. | |
| output_unit | No | Declared unit for the assembled product (e.g. 'house', 'm2', 'tonne'). Used as the functional-unit unit in the scope editor. | |
| target_amount | No | Functional-unit amount (default 1.0). | |
| temporal_scope | No | Temporal scope of the system (e.g. '2020-2024', 'Reference year 2022'). | |
| cutoff_criteria | No | Explicit cutoff criteria (e.g. 'Mass cutoff 1%; energy cutoff 1%'). Overrides the scope-derived default. | |
| geographical_scope | No | Explicit geographical scope (e.g. 'Switzerland'). Overrides location codes derived from member processes. | |
| functional_unit_description | No | Free-text description of the functional unit (e.g. 'One house, 160 m², 50-year service life'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/non-idempotent/non-destructive profile, but the description adds substantial context the annotations cannot: validation against the database before saving, the errors[]/missing_required[]/warnings[] failure contract with 'nothing is saved', the requirement that a corrected call carry the complete system, and the distinction between a tool error (engine unavailable) and an invalid result. Not covered: permissions/auth prerequisites for writing into a workspace.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then validation and failure semantics, then sibling routing. Every sentence is functional, though the block is dense and the member-ref/UUID rule could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, no-output-schema, non-idempotent mutation tool, the description covers construction (inputs vs stages), validation/failure contract, the returned system_ref, dry_run, and sign/unit conventions. Nothing an agent needs in order 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already carries the per-parameter meaning; the description correctly gets baseline 3. It adds a small amount of non-duplicative constraint ('Members are p<N> refs; UUIDs are not accepted', and the inputs-vs-stages exclusivity), but most parameter guidance is repeated from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource: 'Build a product system as a bill of quantities of database processes.' It explicitly names the sibling it is not (lca_compose_linked builds explicit supply edges instead), so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing rules: inputs OR stages but not both, with a stated preference for stages when the system spans life-cycle phases; dry_run for validate-only; and lca_run_assessment named as the consumer of system_ref. It even points to the product_system_authoring skill for build order.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_compose_linkedBuild linked product systemAInspect
Build a product system as an explicit process network with supply edges. Every member and supply edge is sent in one call. Structure only; no LCIA runs. For a list of materials and quantities, lca_compose_assembly is simpler. A link may route a waste output to its treatment (consumer_ref outputs it, provider_ref treats it). ref_process_ref is the functional unit's process and also appears in member_process_refs. It is validated against the database; if valid it is saved and system_ref is returned for lca_run_assessment. If invalid, the response lists errors[], missing_required[] and warnings[] and nothing is saved; a corrected call carries the complete system. dry_run: true validates without saving. A tool error (not an invalid result) means the engine is unavailable. Takes p<N>/f<N> refs; UUIDs are not accepted. Requires the user's own writable engine; an unreachable member blocks the build. The product_system_authoring skill (load_skill) covers build order and failures.
| Name | Required | Description | Default |
|---|---|---|---|
| links | No | Supply edges connecting members: a supplier's product into a consumer's input, or a consumer's waste output into its treatment. | |
| title | No | Human title for the authored system. | |
| engine | No | Name of the engine database, as `lca_get(kind='engines')` lists it (case-insensitive). Omitted: this connection's default engine. | |
| dry_run | No | When true, validate ONLY — return the envelope without persisting (and without a confirmation prompt). Default false: a valid system is built and its s-ref returned in this one call. | |
| workspace | Yes | 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. | |
| ref_flow_ref | No | `f<N>` ref of the reference product flow (a product OUTPUT of the ref process). Omitted, it is the reference process's own quantitative reference. | |
| target_amount | No | Functional-unit amount (default 1.0). | |
| temporal_scope | No | Temporal scope of the system (e.g. '2020-2024', 'Reference year 2022'). | |
| cutoff_criteria | No | Explicit cutoff criteria (e.g. 'Mass cutoff 1%; energy cutoff 1%'). Overrides the scope-derived default. | |
| ref_process_ref | Yes | `p<N>` ref of the reference process (the functional unit). It must also be listed in `member_process_refs`. | |
| target_unit_ref | No | The functional unit's unit, when it is NOT the reference exchange's own unit (which is derived for you). A unit NAME as the engine spells it ('t', 'kg', 'MJ'), resolved against the reference flow's unit group — NOT a ref: there is no `u<N>` kind, and an f/p/s ref here is rejected. | |
| geographical_scope | No | Explicit geographical scope (e.g. 'Switzerland'). Overrides location codes derived from member processes. | |
| member_process_refs | Yes | `p<N>` refs of every process in the system — include the reference process. | |
| functional_unit_description | No | Free-text description of the functional unit (e.g. 'One house, 160 m², 50-year service life'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare write/non-idempotent/non-open-world; the description goes much further, disclosing atomicity ('Every member and supply edge is sent in one call', corrected calls must resend the complete system), validation semantics (validated against the DB; on failure nothing is saved and errors[]/missing_required[]/warnings[] are returned), dry_run behavior, that a tool error means the engine is unavailable, that an unreachable member blocks the build, and that the user's own writable engine is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core purpose and the 'structure only' scope lead, followed by routing, semantics, and failure behavior. It is long, and the middle sentences about link routing and ref_process_ref sit far from the corresponding schema fields, but for a 14-parameter tool nearly every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description specifies the return contract: system_ref on success, and errors[]/missing_required[]/warnings[] on invalid input, plus the dry_run envelope. Combined with the validation and permission constraints, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond it: the waste-routing semantics of consumer_ref/provider_ref, that ref_process_ref must also appear in member_process_refs, that target_unit_ref is a unit name and not a ref (f/p/s refs rejected), and that p<N>/f<N> refs are required with UUIDs not accepted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Build a product system as an explicit process network with supply edges') and immediately scopes it ('Structure only; no LCIA runs'). It differentiates from the sibling lca_compose_assembly by naming it and the condition that selects it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use lca_compose_assembly for a flat list of materials/quantities, and lca_run_assessment to run LCIA on the returned system_ref. It also points to the product_system_authoring skill. It does not, however, address when to use this versus lca_edit_linked for modifying an existing system.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_create_workspaceCreate workspaceAInspect
Create a workspace and return the name later calls pass as workspace. The workspace is the user's own, and later calls work in it by passing that name. By default it creates a new, empty workspace and makes it the connection's default — the workspace a call naming none reads, shared by every conversation on the connection; tools that save still take workspace on every call. With adopt_sandbox: true, the default workspace, when it is a sandbox created for this connection, becomes that workspace instead: renamed to name and made an ordinary workspace, with everything already saved in it kept in place and every workspace ref still valid; a later connection starts in a new sandbox. Either way the workspace counts toward the account's workspace limit and appears in the Aevia app. A name the user already has is refused rather than reused; an existing workspace is used by passing its name as workspace. goal_statement records the study's goal (ISO 14040 §4.2).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name for the workspace. Must differ from every workspace the user already has (matched exactly, including case). With `adopt_sandbox`, the sandbox's current name is also accepted. | |
| description | No | Short free-text description of the workspace. | |
| adopt_sandbox | No | When true, the connection's default workspace, when it is a sandbox, becomes the new workspace, keeping everything already saved there and every workspace ref. Refused when the default is not a sandbox. Default false: a new, empty workspace. | |
| goal_statement | No | The study's goal (ISO 14040 §4.2): intended application, reasons, audience, and whether comparative assertions are intended. Shown with the workspace in the Aevia app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (non-read-only, non-idempotent, non-destructive). The description adds substantial context beyond them: the workspace counts toward the account limit, appears in the Aevia app, duplicate names are refused rather than reused, adoption renames and preserves the sandbox contents with refs still valid, and a later connection starts fresh in a new sandbox.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the outcome, but the prose is long-winded and redundant, restating the workspace-name-passing idea twice ('return the name later calls pass as `workspace`' and 'later calls work in it by passing that name'). Several clauses could be tightened without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly states the return value (the workspace name). It covers side effects, limits, and adoption semantics thoroughly, though the interaction between the connection's default workspace and per-call `workspace` passing remains slightly tangled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already defines each parameter; a baseline of 3 would be defensible. The description nonetheless adds meaning: why `adopt_sandbox` matters behaviorally, that `workspace` name is the handle future calls use, and the ISO 14040 §4.2 framing for `goal_statement`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (create a workspace) and goes further by naming the return value that later calls pass as `workspace`. It implicitly separates itself from sibling lca_switch_workspace by noting an existing workspace is used by passing its name instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions for the two modes: default creates a new empty workspace and makes it the connection default, while `adopt_sandbox: true` converts an existing sandbox. It also states the refusal case (duplicate name) and how to use an existing workspace. It stops short of naming sibling tools like lca_switch_workspace explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_deleteDelete saved objectADestructiveInspect
Delete a saved system, assessment, comparison, analysis or report. ref is an s<N> system, a<N> assessment, c<N> comparison, b<N> contribution analysis, v<N> sensitivity analysis or r<N> report in the workspace named by workspace. The deletion cannot be undone. A system takes its assessments with it; they leave any comparison they belong to. An assessment leaves its system, its comparisons and its analyses (kept, detached). A comparison takes only itself. Reports citing a deleted object are kept, but those citations stop resolving. Without confirm: true the call returns a preview listing what goes by ref, and deletes nothing. For an s<N>, its copy in the openLCA engine is kept unless delete_engine_copy: true, which deletes it only when Aevia created it and the engine is writable; that changes the openLCA database, so it needs the Execute access level. A process or flow authored into an engine is deleted by engine_delete.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | The saved object to delete: `s<N>` system, `a<N>` assessment, `c<N>` comparison, `b<N>` contribution analysis, `v<N>` sensitivity analysis or `r<N>` report. | |
| confirm | No | Delete it. Without it the call returns a preview of everything the delete takes with it, and deletes nothing. | |
| workspace | Yes | 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. | |
| delete_engine_copy | No | `s<N>` only: also delete the system's copy in its openLCA engine — honoured only when Aevia created that copy and the engine is writable. Kept by default. Needs the Execute access level (it changes the openLCA database); below it the call is refused. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations (destructiveHint=true, idempotentHint=false) by spelling out irreversibility and the precise cascade per object type: a system absorbs its assessments, assessments detach from comparisons, reports survive with dead citations. It also discloses the Execute access-level requirement and the Aevia-authored/writable-engine preconditions for `delete_engine_copy`.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and ref grammar, and the consequence sentences are information-dense rather than padded. It runs long and repeats a few schema descriptions almost verbatim, so it is efficient but not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent tool with no output schema, the description covers everything needed: what is removed, what is preserved, what the no-confirm call returns, and the privilege level required. Nothing an agent needs to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the 3-baseline applies, and the description genuinely adds meaning by tying each `ref` prefix to a specific deletion cascade and by explaining that `delete_engine_copy` is honoured only under two conditions. Some content (confirm preview wording, ref prefix list) duplicates the schema verbatim, capping this below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Delete a saved system, assessment, comparison, analysis or report") and enumerates the exact object namespace via the `s<N>`/`a<N>`/`c<N>`/`b<N>`/`v<N>`/`r<N>` prefix scheme. An agent can distinguish this from lca_get or engine_delete without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: without `confirm: true` the call is a no-op preview, and a process or flow authored into an engine must go through `engine_delete` instead. It names the alternative tool and the condition that routes to it, but offers no explicit exclusion guidance for the objects it does own (e.g., how to inspect before deleting).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_edit_assemblyEdit product systemADestructiveInspect
Patch a saved composed (bill-of-materials) system (s<N>). Ops: replace_provider (swap a member everywhere it is used), set_target_amount (rescale the functional unit), set_title (rename), add_member / remove_member, set_member_amount (rescale an existing member), add_stage / remove_stage (grow or shrink the stage DAG, e.g. an amortization layer; it must stay acyclic with one sink). mode (default edit): edit patches in place, keeping the same s<N>; fork derives a new s<M>. A drift-tracked mirror is forked automatically on edit, with a warning. Each member is linked cradle-to-gate independently when assessed, so swaps and additions bring their own background; only unit compatibility is checked, so a swap can change a dataset's geography, technology and reference year. Members are p<N> refs; UUIDs are not accepted. Linked and single-process systems are edited with lca_edit_linked. The returned ref can be assessed with lca_run_assessment.
| Name | Required | Description | Default |
|---|---|---|---|
| ops | Yes | Ordered list of edits to apply in one call. | |
| ref | Yes | Saved product-system ref `s<N>` to patch. | |
| mode | No | `edit` (default) → edit the system IN PLACE, appending a new content version and keeping the same `s<N>` (self-contained systems; a drift-tracked mirror auto-forks to a new `s<M>` with a warning, since it can't be mutated in place). `fork` → always derive a NEW `s<M>`, leaving the baseline `s<N>` untouched. | edit |
| workspace | Yes | 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. | |
| base_version_seq | No | REQUIRED here: the system's current content `version_seq`, as `lca_get s<N>` reports it — the version you computed this edit against. Rejected (409) if the system has moved on since, and nothing is changed. Re-read the system between edits: a successful in-place edit advances the version. (Kept optional in the schema so an omission gets the backend's instructive 422 rather than a bare validation error.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint/readOnlyHint annotations: discloses the drift-tracked mirror auto-fork warning, that only unit compatibility is checked on swaps (geography/technology/year can change), that each member is linked cradle-to-gate independently, the negative-amount sign-flip semantics, and the 409 rejection tied to base_version_seq. This is rich operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the verb, op list, mode semantics, and ref-routing all arrive before the finer behavioral notes. It is long for a description, yet nearly every clause carries distinct operational information with little redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description closes that loop by naming the returned ref and the tool that consumes it (lca_run_assessment). Combined with mode, versioning, mirror-drift, and unit-handling details, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: members are `p<N>` refs and UUIDs are rejected, and the stage DAG must remain acyclic with a single sink. These constraints clarify how ops may be combined, pushing above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Patch a saved composed (bill-of-materials) system') and enumerates every supported op with parenthetical glosses. It explicitly names the sibling it is not ('Linked and single-process systems are edited with lca_edit_linked'), so an agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and when-not-to-use guidance: names lca_edit_linked as the alternative for linked/single-process systems, distinguishes `mode=edit` (in place, with auto-fork of drift-tracked mirrors) from `mode=fork` (new `s<M>`), and points to lca_run_assessment for the returned ref.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_edit_linkedEdit linked product systemADestructiveInspect
Patch a saved linked or single-process system (s<N>). A linked system is an explicit process network. Graph ops: add_link (wire a supplier onto a consumer input, or a waste output onto its treatment; the provider joins automatically), remove_link (drop matching edges; orphans are pruned), rewire_link (repoint one edge). Also replace_provider (swap a supplier on every edge it feeds; a bare unit_process swap warns: its background is unwired), set_target_amount and set_title. A swap checks only unit compatibility, so geography, technology and vintage can change. lca_get(ref='s<N>', form='authored') shows every edge and the consumer_input_index needed when a consumer has one flow on several exchanges. A link's amount only validates. mode edit (default) patches in place; fork derives a new s<M>; a mirror is forked automatically. A single-process system takes only the two setters. Composed systems use lca_edit_assembly. Takes p<N>/f<N> refs; UUIDs are not accepted.
| Name | Required | Description | Default |
|---|---|---|---|
| ops | Yes | Ordered list of edits to apply in one call. | |
| ref | Yes | Saved product-system ref `s<N>` to patch. | |
| mode | No | `edit` (default) → edit the system IN PLACE, appending a new content version and keeping the same `s<N>` (self-contained systems; a drift-tracked mirror auto-forks to a new `s<M>` with a warning, since it can't be mutated in place). `fork` → always derive a NEW `s<M>`, leaving the baseline `s<N>` untouched. | edit |
| workspace | Yes | 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. | |
| base_version_seq | No | REQUIRED here: the system's current content `version_seq`, as `lca_get s<N>` reports it — the version you computed this edit against. Rejected (409) if the system has moved on since, and nothing is changed. Re-read the system between edits: a successful in-place edit advances the version. (Kept optional in the schema so an omission gets the backend's instructive 422 rather than a bare validation error.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare mutation/destructive/non-idempotent; the description adds substantial context beyond that: in-place edits append a content version, mirrors auto-fork with a warning, orphans are pruned on removal, a provider swap checks only unit compatibility so geography/technology/vintage can change, and a bare `unit_process` swap warns its background is unwired.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then dense semicolon-separated clauses. Nearly every sentence carries distinct information (ops semantics, mode behavior, ref format), though the wall-of-text style is slightly heavy even for a tool this complex.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a nested `ops` array, six op types, and no output schema, the description is remarkably complete: it enumerates each op, the mode semantics, ref format constraints, the authored-view workflow, and the single-process caveat. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: refs take `p<N>`/`f<N>` and 'UUIDs are not accepted', `amount` on a link is validation-only, and `consumer_input_index` is required when a consumer has 2+ exchanges of a flow. These clarify usage beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Patch') and resource (a saved linked or single-process `s<N>` system), and explicitly distinguishes itself from `lca_edit_assembly` for composed systems and notes the single-process restriction. An agent can tell it apart from siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use routing: 'A single-process system takes only the two setters' and 'Composed systems use `lca_edit_assembly`'. It also points to `lca_get(ref='s<N>', form='authored')` as the way to discover edges and the required `consumer_input_index`, and explains when `fork` vs `edit` applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_getGet workspace itemARead-onlyIdempotentInspect
Read a saved workspace object by ref, or list systems, results or workspaces. Takes exactly one of ref (one object's detail) or kind (a list). A ref is read in the workspace named by workspace, which it requires: each workspace numbers its objects from 1. A kind list reads that workspace, else this connection's default. Refs: s/a/c/b/v/r<N> → system / assessment / comparison / contribution analysis / sensitivity analysis / report. An s<N> read also states the system's kind and its edit tool; form='authored' returns the authored shape the compose and edit tools accept. Kinds: 'systems' / 'assessments' / 'comparisons' / 'contribution_analyses' / 'sensitivity_analyses' / 'reports' return paginated lists of this workspace (filters: query, system_ref, method, assessment_status); 'workspaces' / 'engines' list those available, marking the default. UUIDs are not accepted.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Single-entity ref: `s`/`a`/`c`/`b`/`v`/`r<N>`. Mutually exclusive with `kind`. | |
| form | No | ref='s<N>' only. 'snapshot' (default) is the structural read. 'authored' returns the system lifted back to the AUTHORED form — the shape `lca_compose_assembly` / `lca_compose_linked` speak, tagged with its `kind`, carrying a multi-stage bill of quantities' stage DAG unflattened and a linked system's `links[]` (neither of which the snapshot has). Read this before editing a system you did not just author. | |
| kind | No | Collection mode. Mutually exclusive with `ref`. 'workspaces' and 'engines' are the odd ones out: they list the WORKSPACES / ENGINE DATABASES available to you rather than the contents of the current one. | |
| limit | No | ||
| query | No | Free-text match on name/description (case-insensitive). | |
| method | No | kind='assessments': substring match on method_name. | |
| offset | No | ||
| workspace | No | Name of the workspace to read, as `lca_get(kind='workspaces')` lists it. Required with `ref`: each workspace numbers its objects from 1, so a ref is read in the workspace it came from. Omitted with `kind`: this connection's default workspace, which every conversation on the connection shares and which is often an empty sandbox. | |
| system_ref | No | kind='assessments': filter to assessments on a single system. | |
| assessment_status | No | kind='assessments': filter by status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's job is narrower; it still adds real behavioral context: refs are numbered per-workspace and UUIDs are rejected, 'workspaces'/'engines' list globally rather than per-workspace, and the default workspace is shared across the connection and often an empty sandbox. It does not describe pagination mechanics or error behavior when both ref and kind are omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The dual-mode purpose is front-loaded in the opening clause, and the following sentences are densely informative rather than redundant. It is long and run-on in places (the ref-prefix mapping is packed inline), but nearly every clause carries load-bearing constraint or identifier information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, dual-mode read tool with no output schema, the description covers the ref/kind split, ref syntax, workspace resolution, filter options, and the authored-vs-snapshot distinction. What remains thin is the return shape of snapshot reads and pagination behavior, though the annotations and schema carry much of the rest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 80% schema description coverage the baseline is 3, but the description goes further by mapping ref prefixes to their meanings (s/a/c/b/v/r<N> → system/assessment/comparison/contribution analysis/sensitivity analysis/report) and enumerating the list filters (query, system_ref, method, assessment_status), which the schema only partially documents. It also clarifies that ref/kind are mutually exclusive, adding constraint semantics absent from the flat schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource with both operating modes: 'Read a saved workspace object by ref, or list systems, results or workspaces.' It is immediately distinguishable from siblings like lca_delete, lca_compose_assembly, or lca_get_task_status because it names exactly what is read and what is listed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear selection rule between the two modes ('Takes exactly one of `ref` ... or `kind`'), states that `ref` requires `workspace` while `kind` falls back to the connection default, and notes the auth/form caveat via 'Read this before editing a system you did not just author' in the schema. It stops short of explicitly naming alternative sibling tools (e.g. lca_edit_assembly) as the route for modification.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_get_task_statusCheck task statusARead-onlyIdempotentInspect
Poll a long-running call that returned a task_id instead of a result. Takes that id and waits up to 45 seconds for the task to finish. Returns status: 'pending' (still running after that wait; calling again waits again), 'success' (result holds the tool's result text and its ref; the saved object is read with lca_get) or 'error' (with can_retry). Only calls that returned a task_id have one; a tool that returned its result directly has nothing to poll. A task_id is readable only by the session that started it, and only for a day.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | The task id a previous tool call returned, e.g. `df_a1b2…`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description adds rich behavior beyond that: a 45-second bounded wait, re-calling extends the wait, the three status outcomes with their payloads, the `can_retry` flag on error, and the session-scoped, one-day task_id lifetime.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, front-loaded with the action and the wait semantics, then the return contract, then the eligibility and lifetime caveats. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates well by enumerating status values and their payloads. A minor gap remains around whether/how `result` refs should be passed back to `lca_get`, but overall an agent has what it needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents the id format, so baseline would be 3; the description adds genuine semantic value by explaining where the id originates (a previous tool call that returned a task_id) and its session/TTL constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: polls a long-running call identified by a `task_id` that was returned instead of a result. Clearly separable from siblings like `lca_get`, which it explicitly routes to for reading the saved object.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both the when ('only calls that returned a `task_id` have one') and the when-not ('a tool that returned its result directly has nothing to poll'), plus names `lca_get` as the alternative for retrieving the finished object.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_import_projectImport openLCA projectAInspect
Import an openLCA project: assess each variant and save one comparison. project is the project's name as engine_search(kind='project') lists it, or a unique part of it, in the database named by engine, else this connection's default, which must be writable. Each enabled variant's product system is imported into workspace as an s<N> (one already there is refreshed) and assessed once as an a<N> with the variant's amount, unit and allocation and the project's method and normalization/weighting set; the variants are saved as one comparison c<N>, returned as primary_ref. openLCA's API cannot calculate a project; this reproduces it variant by variant, each at its own amount (functional equivalence is not checked). Without confirm: true the call returns a preview and starts nothing. A run within 45 seconds returns its result; a longer one returns a task_id for lca_get_task_status. Refused: fewer than 2 or more than 8 enabled variants, or parameter redefinitions. Disabled variants are skipped.
| Name | Required | Description | Default |
|---|---|---|---|
| engine | No | Name of the engine database, as `lca_get(kind='engines')` lists it (case-insensitive). Omitted: this connection's default engine. | |
| confirm | No | Run the import: the systems, one assessment per variant and the comparison. Without it the call returns a preview of what would be imported and starts nothing. | |
| project | Yes | The openLCA project's name as `engine_search(kind='project')` lists it (backticks optional), or a unique part of it. | |
| workspace | Yes | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: preview-only without confirm, the ~45s synchronous window versus task_id escalation to lca_get_task_status, the s<N>/a<N>/c<N> materialization and refresh semantics, per-variant functional-equivalence caveat, and who is skipped or refused. The non-idempotent, non-destructive hints are neither repeated nor contradicted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then constraints, then refusal conditions — a sensible order for a complex tool. It is dense and parenthetical-heavy, but nearly every clause carries a fact an agent needs; only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating multi-step import with no output schema, the description covers everything material: return value (primary_ref), async escape hatch, confirmation semantics, failure modes, and skip behavior. An agent can call it correctly without further probing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description still contributes: project may be a unique substring, the engine default must be writable, and the workspace/element naming conventions (s<N>, a<N>, c<N>) clarify what the parameters actually produce. It does not restate syntax the schema omits nothing of.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise verb+resource ('Import an openLCA project') and immediately states the composite outcome: assess each enabled variant and save one comparison. The scope (project variants, not a single product system) cleanly distinguishes it from the sibling lca_import_system.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong operational context: it names engine_search(kind='project') and lca_get(kind='workspaces') for resolving parameters, states the confirm gate, and lists explicit refusal conditions (<2 or >8 enabled variants, parameter redefinitions). It never explicitly contrasts itself with lca_import_system or lca_run_assessment, so the alternative-selection guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_import_systemImport product systemAIdempotentInspect
Import an engine product system (e<N>) into a workspace as a saved system. The e<N> from engine_search is imported from its own database; the saved copy gets a stable s<N>. Captures the system's full definition server-side (no need to read its graph) and mirrors it — the copy tracks the engine original for drift and is immediately assessable (lca_run_assessment s<N>) and comparable. Idempotent: re-importing the same engine system returns the existing s<N>. Only accepts e<N> (engine systems) — a workspace s<N> is already imported, and a process p<N> is not a system. To RESTRUCTURE it: read lca_get(ref='s<N>', form='authored'), then either targeted lca_edit_linked ops (add_link/remove_link/rewire_link/replace_provider/set_target_amount/set_title — a new version of the same s<N>) or lca_compose_linked (a new s<M> from the restructured topology). The mirror stays fully assessable/comparable. On this rail lca_edit_linked also needs the base_version_seq lca_get reports.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Engine product-system ref `e<N>` from `engine_search(kind='system')`. | |
| mode | No | `full` (default) mirrors the full definition — assessable + editable. `link_only` stores just a reference that calculates against the live engine (advanced; can't be reopened for editing). | full |
| confirm | No | Over the Aevia MCP connector this call PREVIEWS by default — it reports what would be imported and writes nothing. Read the preview, then call again with `confirm:true` to apply. Ignored in the Aevia app, where the confirmation dialog plays this role. | |
| workspace | Yes | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond the annotations: server-side capture of the full definition (no graph read needed), drift tracking against the engine original, and the `mode=link_only` consequence (calculates live but cannot be reopened for editing). Idempotency is restated from the annotation and no permission/auth context is given, keeping it short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and constraints are front-loaded, but the tail paragraph on restructuring steps is post-import workflow that belongs with `lca_edit_linked`/`lca_compose_linked`. It also repeats the assessable/comparable claim twice ('immediately assessable and comparable' and 'The mirror stays fully assessable/comparable').
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param import with no output schema, the description covers the returned stable `s<N>`, idempotent behavior, mode tradeoffs, and the confirm preview flow. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already documented, but the description adds meaning the schema lacks — why only `e<N>` is valid for `ref`, and the editability tradeoff behind `mode` (full vs link_only). The `confirm` preview flow is explained but largely mirrors the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: import an engine product system `e<N>` into a workspace as a saved `s<N>`. It distinguishes itself from siblings by spelling out the accepted ref type and by routing to `lca_run_assessment`, `lca_edit_linked`, and `lca_compose_linked` for downstream work.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when this is the right tool and what it rejects: only `e<N>` is accepted, a workspace `s<N>` is already imported, and a `p<N>` is not a system. It also names the concrete alternatives for restructure via `lca_edit_linked`/`lca_compose_linked`, so selection is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_run_assessmentRun impact assessmentAInspect
Run LCIA on a target and save the result as a durable assessment (a<N>). ref is a saved workspace system (s<N>), or an engine-catalog process (p<N>) or system (e<N>) from engine_search; it is calculated on the database it belongs to. Runs the calculation with the given parameters and returns the impact result; a run that finishes within 45 seconds returns its result directly, and a longer one returns a task_id for lca_get_task_status; the assessment is always saved into the workspace named by workspace, with no separate save step. A catalog e<N> is assessed as a one-off result and not imported as a tracked system (lca_import_system does that). nw_set names one of the method's normalization/weighting sets, applied after the calculation for a single score. lca_analyze_contributions breaks a result down. The assessment_interpretation skill (load_skill) documents what a result means and comparison discipline.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Target ref: a saved system `s<N>`, or a catalog process `p<N>` / engine system `e<N>` from `engine_search`. | |
| amount | No | How many of the target's DECLARED functional units to assess (N). The calc scales by N x the declared amount, the SAME way for every target kind — a saved `s<N>` (composed, linked, or still mirrored to its remote openLCA copy), an imported `e<N>`, or a catalog process `p<N>`. Omit it to assess exactly one declared functional unit (a catalog `p<N>`/`e<N>` records no declared FU, so its declared amount is 1 reference unit and N is the whole scalar). Must be > 0 and finite. | |
| nw_set | No | Name of one of the method's normalization/weighting sets (e.g. 'EF 3.0 normalization and weighting set'), applied after the calculation: adds normalized and weighted results and a single score beside the per-category table. Omit for characterized results only; the result lists the sets the method offers. | |
| workspace | Yes | 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. | |
| allocation | No | Allocation for multi-output processes. Applies to EVERY target kind — a saved `s<N>` (composed or linked) as much as a catalog `p<N>`/`e<N>`. Omit it (or pass `as_declared`) to apply each dataset's OWN declared allocation procedure, resolved per process by openLCA — the same thing openLCA desktop does, and the default here. Naming any other value overrides every dataset in the system, which is a methodological choice you must report. | |
| method_preference | No | Preferred LCIA method (e.g., 'ReCiPe', 'CML'). Default: ReCiPe 2016. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the sync/async split (runs under 45s return the result directly, longer runs return a `task_id` for `lca_get_task_status`) and the persistence semantics (the assessment is always saved into `workspace` with no separate save step). These are the behaviors an agent most needs and none are in the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and outcome, then the ref taxonomy, then async behavior, then sibling routing — a sensible priority order with no filler. The sentences are long and clause-heavy (semicolon-chained), which costs a little readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 6-parameter mutation-style tool with no output schema, the description covers the return shape (impact result or `task_id`), persistence, target kinds, and where to go for interpretation via the `assessment_interpretation` skill. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: the ref 'is calculated on the database it belongs to', `nw_set` is applied after the calculation for a single score, and the assessment lands in the named workspace. The `amount` and `allocation` parameters are left to the schema, but the added ref/nw_set semantics justify a bump.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+outcome: 'Run LCIA on a target and save the result as a durable assessment (`a<N>`)'. It clearly separates this from siblings like `lca_import_system` (one-off vs tracked system) and `lca_analyze_contributions` (breakdown, not run).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states which ref kinds are valid (`s<N>`, `p<N>`, `e<N>` from `engine_search`) and when to use alternatives: 'a catalog `e<N>` is assessed as a one-off result and not imported as a tracked system (`lca_import_system` does that)' and '`lca_analyze_contributions` breaks a result down'. It even routes agents to `load_skill` for interpretation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_switch_engineSwitch databaseAIdempotentInspect
Set this connection's default engine database. The default is the database browsing and composing use when a call names no engine. The default is shared by every conversation on the connection. name is the engine name as shown, matched case-insensitively (a code span, accepted with or without its backticks). Nothing saved moves: no s<N>/a<N>/c<N>/b<N>/v<N> ref is affected, and saved systems keep solving on their own engine. Catalog refs (p<N>, e<N>, f<N>, m<N>) stay bound to the database that minted them: reading one still works, since engine_get and lca_run_assessment follow the ref back to its own database, but lca_compose_* and lca_edit_* refuse a member ref from another database, so members for a new system come from searches run after the switch.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the engine connection to bind to, copied verbatim from any result that named it — the `# Engines` listing or a search result's header (matched case-insensitively; the surrounding backticks are optional). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare mutation (readOnlyHint=false), idempotency, and non-destructiveness; the description substantiates these with concrete behavior: nothing saved moves, no s/a/c/b/v refs are affected, and catalog refs stay bound to their minting database, with lca_compose_*/lca_edit_* refusing cross-database member refs. This is exactly the kind of beyond-annotation detail that earns 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, and the subsequent sentences on ref behavior all earn their place. It is dense and fairly long, but no sentence is filler, so it stays near the top of the range.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation tool with no output schema, the description covers the non-obvious consequences (shared default, unaffected saved systems, ref binding, compose/edit refusals) thoroughly enough that an agent needs nothing more to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents case-insensitive matching, optional backticks, and verbatim copying. The description's 'as shown, matched case-insensitively' note largely restates the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Set this connection's default engine database.' It further defines the scope of that default and implicitly distinguishes itself from the sibling lca_switch_workspace by operating on the engine rather than the workspace.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the context in which the default matters (browsing/composing calls that name no engine) and the downstream conditions that follow a switch, e.g. members for a new system must come from searches run afterward. It does not state explicit when-not-to-use or name an alternative switch tool directly, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lca_switch_workspaceSwitch workspaceAIdempotentInspect
Set this connection's default workspace. The default is the workspace a call that names no workspace reads. name is the workspace name as lca_get(kind='workspaces') shows it (a code span; backticks optional). The default is shared by every conversation on the connection, so another conversation can move it too; tools that save take workspace on every call and are unaffected by it. Workspace refs (s<N>, a<N>, c<N>, b<N>, v<N>) are per-workspace ordinals, so on a call naming no workspace the same number now names an object in the new default; each still names its own object on a call that names its workspace. Engine-catalog refs (p<N>, e<N>, f<N>, m<N>) are unaffected.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the workspace to work in, copied verbatim from the `# Workspaces` listing. Names are rendered as code spans and never escaped, so what you read is what resolves; the surrounding backticks are optional. Matched exactly, INCLUDING case — a real workspace name is unique per user, and that uniqueness is case-sensitive. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a non-destructive, idempotent, non-read-only mutation; the description adds that the default is shared across all conversations on the connection and can be moved by another conversation. It also warns that workspace refs are per-workspace ordinals whose meaning shifts after the switch, a consequence an agent could not infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the definition of 'default', and every sentence carries real information. The ref-ordinal passage is dense but earns its place by explaining changed resolution semantics; still, the paragraph is long enough to test an agent's parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, annotation-covered, no-output-schema state mutation, the description covers the operation's scope, sharing behavior, and downstream reference-resolution effects. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: the name is what lca_get(kind='workspaces') shows, backticks are optional, and the value's effect is the connection-wide default. The case-sensitivity nuance is already in the schema, so credit is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set this connection's default workspace') and immediately defines what 'default' means, which is the crux of the tool. An agent can distinguish it from lca_create_workspace and lca_switch_engine without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains clearly when the setting matters ('the workspace a call that names no workspace reads') and when it does not ('tools that save take `workspace` on every call and are unaffected'), which is real routing guidance. It stops short of naming sibling tools as alternatives, but the conditional framing is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_skillLoad workflow guideARead-onlyIdempotentInspect
How this Aevia connection works, plus playbooks for results, reports, systems. Returns a skill's playbook as the result; takes no action itself. A playbook is step-by-step guidance for a multi-step job, too long for a description. connector_guide covers how this connection works: workspaces, refs, finding data, the library, building, calculating and failures. assessment_interpretation covers reading and comparing results: what an indicator result is and is not, a figure's anchors, functional-unit equivalence and comparison discipline. report_writing covers writing results up as a document, from a screening note to an ISO 14044 study. product_system_authoring covers building a new product system with lca_compose_assembly / lca_compose_linked: build order, which of the two fits, and failure modes. A loaded playbook stays in context; one load per session suffices. Skills are gated on what the token can call; an unavailable request returns the available list.
| Name | Required | Description | Default |
|---|---|---|---|
| skill_id | Yes | Id of the skill to load, e.g. `product_system_authoring`. An unknown or ungated id returns the list of skills available to this session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive/closed-world, so the description correctly focuses on what annotations cannot say: the tool takes no action, a loaded playbook persists in context, and skills are token-gated with an explicit fallback ('an unavailable request returns the available list'). That last point is valuable error-behavior disclosure, though it does not describe the playbook's size or format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior and result semantics before the enumeration. The per-skill sentences are the value-add rather than filler, though the block is long enough that it could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so: it states the result is a playbook and that an unknown/gated id returns the available list. Combined with the routing detail and session guidance, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the schema defines no enum and the description compensates by naming the concrete valid skill_ids and their subject matter. This adds real selection value beyond the schema's single generic string description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns a skill's playbook as the result') with an explicit scope disclaimer ('takes no action itself'). The enumeration of skill_ids makes it unmistakable from siblings like knowledge_get_full_document or engine_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Goes well beyond 'when to use': it routes the agent to the correct skill_id by describing what each covers ('connector_guide covers how this connection works', 'assessment_interpretation covers reading and comparing results'). It also gives the operational rule 'one load per session suffices'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
- Changed
engine_get2 fields changed- changed
Input schema / properties / section / descriptionPrevious value: -"Show only the inputs (what the process uses) or only the outputs (what it makes or emits), one page at a time. Leave unset for a short summary of both. Processes only."New value: +"Processes: show only the inputs (what the process uses) or only the outputs (what it makes or emits), one page at a time; leave unset for a short summary of both. Methods: `factors` adds the characterization factors of each impact category (heavy; rarely needed)." - changed
Input schema / properties / section / enumPrevious value: -[ - "inputs", - "outputs" -]New value: +[ + "inputs", + "outputs", + "factors" +]
- Removed
engine_list_methods - Changed
engine_search2 fields changed- changed
Input schema / properties / kind / descriptionPrevious value: -"What to search for. 'all' queries processes, systems, and flows in parallel. 'project' lists openLCA projects — a project is addressed by its name, which `lca_import_project` takes."New value: +"What to search for. 'all' queries processes, systems, and flows in parallel. 'project' lists openLCA projects — a project is addressed by its name, which `lca_import_project` takes. 'method' lists the LCIA methods whose name contains every word of `query` (`*` lists all); not part of 'all'." - changed
Input schema / properties / kind / enumPrevious value: -[ - "process", - "system", - "flow", - "project", - "all" -]New value: +[ + "process", + "system", + "flow", + "project", + "method", + "all" +]
- Changed
lca_analyze_contributions7 fields changed- changed
Input schema / properties / amount / descriptionPrevious value: -"`system_ref` only: how many of the system's DECLARED functional units to analyse (N). The solve scales by N x the declared amount, the same way `lca_run_assessment` does. Omit to analyse at the system's declared functional unit (N=1); an explicit value overrides. Ignored with `assessment_ref`, which inherits its functional unit — and ignores `amount` entirely — from the saved assessment."New value: +"`s<N>` only: how many of the system's DECLARED functional units to analyse (N). The solve scales by N x the declared amount, the same way `lca_run_assessment` does. Omit to analyse at the system's declared functional unit (N=1); an explicit value overrides. Ignored with an `a<N>`, which inherits its functional unit — and ignores `amount` entirely — from the saved assessment." - removed
Input schema / properties / assessment_refRemoved value: -{ - "description": "Saved-assessment ref in the form `a<N>` (e.g. `a3`) — analyse the setup this assessment captured (its system, method and functional unit). Mutually exclusive with `system_ref`. List current assessments with `lca_get(kind='assessments')` to pick the right one — never pass UUIDs.", - "pattern": "^a\\d+$", - "type": "string" -} - changed
Input schema / properties / method / descriptionPrevious value: -"`system_ref` only: preferred LCIA method — fuzzy-matched (substring) against the methods in the connected database; free text is accepted. Defaults to the same house preference `lca_run_assessment` uses. Ignored with `assessment_ref`, which inherits its method from the saved assessment."New value: +"`s<N>` only: preferred LCIA method — fuzzy-matched (substring) against the methods in the connected database; free text is accepted. Defaults to the same house preference `lca_run_assessment` uses. Ignored with an `a<N>`, which inherits its method from the saved assessment." - added
Input schema / properties / refAdded value: +{ + "description": "`a<N>` — analyse that saved assessment's setup (its system, method and functional unit); `s<N>` — analyse the saved system directly, with NO prior assessment (`method` / `amount` apply only here). List current ones with `lca_get(kind='assessments')` / `lca_get(kind='systems')` — never pass UUIDs.", + "pattern": "^[as]\\d+$", + "type": "string" +} - removed
Input schema / properties / sourceRemoved value: -{ - "description": "Which kind of target this analysis runs on — set it to match the ref you pass: 'assessment' with `assessment_ref`, 'system' with `system_ref`.", - "enum": [ - "assessment", - "system" - ], - "type": "string" -} - removed
Input schema / properties / system_refRemoved value: -{ - "description": "Saved-system ref in the form `s<N>` (e.g. `s1`) — analyse this system directly, with NO prior assessment. Mutually exclusive with `assessment_ref`. List current systems with `lca_get(kind='systems')` — never pass UUIDs.", - "pattern": "^s\\d+$", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "workspace" -]New value: +[ + "workspace", + "ref" +]
- Changed
lca_analyze_sensitivity16 fields changed- removed
Input schema / properties / assessment_refRemoved 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" -} - removed
Input schema / properties / modeRemoved value: -{ - "default": "tornado", - "description": "Analysis type.", - "enum": [ - "tornado", - "sweep", - "scenarios" - ], - "type": "string" -} - removed
Input schema / properties / range_maxRemoved value: -{ - "description": "Sweep: upper multiplier.", - "type": "number" -} - removed
Input schema / properties / range_minRemoved value: -{ - "description": "Sweep: lower multiplier.", - "type": "number" -} - added
Input schema / properties / refAdded 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" +} - removed
Input schema / properties / reference_refRemoved value: -{ - "description": "Sweep: break-even vs another assessment's total (`a<N>`). Mutually exclusive with `threshold`.", - "pattern": "^a\\d+$", - "type": "string" -} - changed
Input schema / properties / scenarios / descriptionPrevious 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." - added
Input schema / properties / scenarios / minItemsAdded value: +1 - removed
Input schema / properties / stepsRemoved value: -{ - "default": 9, - "description": "Sweep: number of points.", - "maximum": 25, - "minimum": 3, - "type": "integer" -} - added
Input schema / properties / sweepAdded 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" +} - removed
Input schema / properties / thresholdRemoved value: -{ - "description": "Sweep: break-even vs a fixed value. Mutually exclusive with `reference_ref`.", - "type": "number" -} - added
Input schema / properties / tornadoAdded 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" +} - removed
Input schema / properties / variableRemoved 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" -} - removed
Input schema / properties / variablesRemoved 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" -} - removed
Input schema / properties / variation_pctRemoved value: -{ - "default": 20, - "description": "Tornado: perturb each variable by ±this percent.", - "maximum": 90, - "minimum": 1, - "type": "number" -} - changed
Input schema / requiredPrevious value: -[ - "workspace", - "assessment_ref" -]New value: +[ + "workspace", + "ref" +]
- Added
lca_delete - Removed
lca_delete_assessment - Removed
lca_delete_system - Changed
lca_get2 fields changed- changed
Input schema / properties / kind / enumPrevious value: -[ - "systems", - "assessments", - "comparisons", - "workspaces", - "engines" -]New value: +[ + "systems", + "assessments", + "comparisons", + "contribution_analyses", + "sensitivity_analyses", + "reports", + "workspaces", + "engines" +] - changed
Input schema / properties / ref / descriptionPrevious value: -"Single-entity ref. `s<N>` system, `a<N>` assessment, `c<N>` comparison. Mutually exclusive with `kind`."New value: +"Single-entity ref: `s`/`a`/`c`/`b`/`v`/`r<N>`. Mutually exclusive with `kind`."
1 tool update
- Changed
lca_compare_assessments2 fields changed- removed
Input schema / properties / allow_mismatched_fuRemoved value: -{ - "default": false, - "description": "Compare targets that declare DIFFERENT functional units (e.g. 1 kg vs 1 unit). Default false refuses with a 400 naming both. Setting it true does NOT make the comparison valid — it stamps a warning onto the result. Only set it when the user has said the two functional units are equivalent for their question, and say so in your answer.", - "type": "boolean" -} - added
Input schema / properties / functionAdded value: +{ + "description": "The function every target delivers, quantified — e.g. 'packaging for 1 L of beverage'. Needed when the targets are not the same product at the same amount: take it from the user's stated goal, or ask them. Saved with the comparison and shown wherever it is read.", + "maxLength": 500, + "minLength": 1, + "type": "string" +}
5 tool updates
- Changed
engine_search2 fields changed- changed
Input schema / properties / kind / descriptionPrevious value: -"What to search for. 'all' queries processes, systems, and flows in parallel."New value: +"What to search for. 'all' queries processes, systems, and flows in parallel. 'project' lists openLCA projects — a project is addressed by its name, which `lca_import_project` takes." - changed
Input schema / properties / kind / enumPrevious value: -[ - "process", - "system", - "flow", - "all" -]New value: +[ + "process", + "system", + "flow", + "project", + "all" +]
- Changed
lca_compose_linked1 field changed- changed
Input schema / properties / ref_flow_ref / descriptionPrevious value: -"`f<N>` ref of the reference product flow (a product OUTPUT of the ref process)."New value: +"`f<N>` ref of the reference product flow (a product OUTPUT of the ref process). Omitted, it is the reference process's own quantitative reference."
- Added
lca_delete_assessment - Changed
lca_get1 field changed- removed
Input schema / properties / include_staleRemoved value: -{ - "description": "kind='systems': when true, also returns OUT_OF_SYNC / NOT_FOUND / UNREACHABLE / ARCHIVED rows.", - "type": "boolean" -}
- Added
lca_import_project
5 tool updates
- Changed
knowledge_get_excerpts2 fields changed- changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer" - changed
Input schema / properties / top_k_chunks_per_doc / typePrevious value: -"number"New value: +"integer"
- Changed
knowledge_search1 field changed- changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer"
- Changed
lca_get1 field changed- changed
Input schema / properties / workspace / descriptionPrevious value: -"Name of the workspace to read, as `lca_get(kind='workspaces')` lists it. Omitted: this connection's default workspace, which every conversation on the connection shares and which is often an empty sandbox."New value: +"Name of the workspace to read, as `lca_get(kind='workspaces')` lists it. Required with `ref`: each workspace numbers its objects from 1, so a ref is read in the workspace it came from. Omitted with `kind`: this connection's default workspace, which every conversation on the connection shares and which is often an empty sandbox."
- Changed
lca_import_system1 field changed- removed
Input schema / properties / engineRemoved value: -{ - "description": "Name of the engine database, as `lca_get(kind='engines')` lists it (case-insensitive). Omitted: this connection's default engine.", - "maxLength": 255, - "minLength": 1, - "type": "string" -}
- Changed
lca_run_assessment1 field changed- removed
Input schema / properties / engineRemoved value: -{ - "description": "Name of the engine database, as `lca_get(kind='engines')` lists it (case-insensitive). Omitted: this connection's default engine.", - "maxLength": 255, - "minLength": 1, - "type": "string" -}
3 tool updates
- Added
lca_apply_nw_set - Changed
lca_compare_assessments1 field changed- added
Input schema / properties / nw_setAdded value: +{ + "description": "Compare by the single score of this normalization/weighting set (its name, or a unique part of it); every target must carry it, see `lca_apply_nw_set`. A target missing it, or carrying a different copy, is refused with what to do. Omit for the characterized matrix only.", + "maxLength": 200, + "minLength": 1, + "type": "string" +}
- Changed
lca_run_assessment1 field changed- added
Input schema / properties / nw_setAdded value: +{ + "description": "Name of one of the method's normalization/weighting sets (e.g. 'EF 3.0 normalization and weighting set'), applied after the calculation: adds normalized and weighted results and a single score beside the per-category table. Omit for characterized results only; the result lists the sets the method offers.", + "maxLength": 200, + "type": "string" +}
1 tool update
- Changed
engine_search1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Free-text query against names/categories. Use `*` (or an empty string) to list everything of the given `kind` — the way to enumerate what a database contains."New value: +"Free-text query, matched word by word against dataset names, categories and location codes — there is no meaning-based matching, so the nouns a dataset is named by (a material, a process, a product) find more than a description of the use (`polypropylene injection moulding`, not `plastic plate`). A place matches by name or code (`Switzerland`, `CH`). When no hit contains every word, the closest partial matches come back, labelled as such. Use `*` (or an empty string) to list everything of the given `kind` — the way to enumerate what a database contains."
3 tool updates
- Changed
lca_compose_linked6 fields changed- changed
Input schema / properties / links / descriptionPrevious value: -"Supply edges connecting members."New value: +"Supply edges connecting members: a supplier's product into a consumer's input, or a consumer's waste output into its treatment." - changed
Input schema / properties / links / items / properties / amount / descriptionPrevious value: -"Quantity consumed (in the consumer input's unit)."New value: +"Quantity on this edge (in the consumer exchange's unit)." - changed
Input schema / properties / links / items / properties / consumer_input_index / descriptionPrevious value: -"When the consumer has 2+ input exchanges of `flow_ref`, the 0-based index (ordered by exchange id) of which one this edge feeds. Omit when unambiguous."New value: +"When the consumer has 2+ input exchanges of `flow_ref` (for a waste: 2+ output exchanges of it), the 0-based index (ordered by exchange id) of which one this edge pins. Omit when unambiguous." - changed
Input schema / properties / links / items / properties / consumer_ref / descriptionPrevious value: -"`p<N>` of the process consuming the flow."New value: +"`p<N>` of the process consuming the flow — for a waste flow, the process that OUTPUTS the waste." - changed
Input schema / properties / links / items / properties / flow_ref / descriptionPrevious value: -"`f<N>` of the product flow routed along this edge."New value: +"`f<N>` of the product flow routed along this edge, or of a waste routed from its generator to its treatment." - changed
Input schema / properties / links / items / properties / provider_ref / descriptionPrevious value: -"`p<N>` of the upstream process supplying the flow."New value: +"`p<N>` of the upstream process supplying the flow — for a waste flow, its treatment (reference = that waste as an input)."
- Added
lca_delete_system - Changed
lca_edit_linked4 fields changed- changed
Input schema / properties / ops / items / properties / consumer_input_index / descriptionPrevious value: -"Which of the consumer's input exchanges of `flow_ref` this edge feeds — the 0-based index `lca_get form='authored'` reports per link. add_link: REQUIRED when the consumer has 2+ input exchanges of that flow (the call tells you the valid range if it is). remove_link/rewire_link: optional, narrows the match to one edge."New value: +"Which of the consumer's input exchanges of `flow_ref` this edge feeds (for a waste: which OUTPUT exchange of it) — the 0-based index `lca_get form='authored'` reports per link. add_link: REQUIRED when the consumer has 2+ such exchanges of that flow (the call tells you the valid range if it is). remove_link/rewire_link: optional, narrows the match to one edge." - changed
Input schema / properties / ops / items / properties / consumer_ref / descriptionPrevious value: -"add_link/remove_link/rewire_link: `p<N>` of the process that CONSUMES the flow. It must already be a member of this system."New value: +"add_link/remove_link/rewire_link: `p<N>` of the process that CONSUMES the flow (for a waste: the process that OUTPUTS it). It must already be a member of this system." - changed
Input schema / properties / ops / items / properties / flow_ref / descriptionPrevious value: -"add_link/remove_link/rewire_link: `f<N>` of the product flow on the edge."New value: +"add_link/remove_link/rewire_link: `f<N>` of the product flow on the edge, or of a waste routed to its treatment." - changed
Input schema / properties / ops / items / properties / provider_ref / descriptionPrevious value: -"add_link: `p<N>` of the process that SUPPLIES the flow (it joins the system's members automatically). remove_link: OPTIONAL — narrows the removal to edges from this supplier; omit to remove every supplier of that flow into the consumer."New value: +"add_link: `p<N>` of the process that SUPPLIES the flow — for a waste, its treatment (it joins the system's members automatically). remove_link: OPTIONAL — narrows the removal to edges from this supplier; omit to remove every supplier of that flow into the consumer."
2 tool updates
- Changed
knowledge_get_excerpts1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Search text. Required when no documents are selected (discovery mode) — finds matching documents. Optional once document_refs are given: include it to rank those documents' chunks by relevance, or omit it to pull each document's abstract + opening chunks."New value: +"Search text. Required when no documents are selected (discovery mode) — finds matching documents. Optional once document_refs are given: include it to rank those documents' chunks by relevance, or omit it to pull each document's abstract + opening chunks. The library is English-language: technical terms and scientific names match best."
- Changed
knowledge_search1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Search query"New value: +"Search query. The library is English-language: technical terms and scientific names match best."
10 tool updates
- Changed
lca_analyze_contributions1 field changed- changed
Input schema / properties / workspace / descriptionPrevious 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."
- Changed
lca_analyze_sensitivity1 field changed- changed
Input schema / properties / workspace / descriptionPrevious 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."
- Changed
lca_compare_assessments1 field changed- changed
Input schema / properties / workspace / descriptionPrevious 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."
- Changed
lca_compose_assembly1 field changed- changed
Input schema / properties / workspace / descriptionPrevious 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."
- Changed
lca_compose_linked1 field changed- changed
Input schema / properties / workspace / descriptionPrevious 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."
- Changed
lca_edit_assembly1 field changed- changed
Input schema / properties / workspace / descriptionPrevious 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."
- Changed
lca_edit_linked1 field changed- changed
Input schema / properties / workspace / descriptionPrevious 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."
- Changed
lca_get1 field changed- changed
Input schema / properties / workspace / descriptionPrevious value: -"Name of the workspace to read, as `lca_get(kind='workspaces')` lists it. Omitted: this connection's default workspace, which every conversation on the connection shares."New value: +"Name of the workspace to read, as `lca_get(kind='workspaces')` lists it. Omitted: this connection's default workspace, which every conversation on the connection shares and which is often an empty sandbox."
- Changed
lca_import_system1 field changed- changed
Input schema / properties / workspace / descriptionPrevious 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."
- Changed
lca_run_assessment1 field changed- changed
Input schema / properties / workspace / descriptionPrevious 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."
21 tool updates
- Changed
engine_get3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Changed
engine_list_methods2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
engine_search3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Changed
knowledge_get_excerpts6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / year_from / maximumAdded value: +9007199254740991 - added
Input schema / properties / year_from / minimumAdded value: +-9007199254740991 - added
Input schema / properties / year_to / maximumAdded value: +9007199254740991 - added
Input schema / properties / year_to / minimumAdded value: +-9007199254740991
- Changed
knowledge_get_full_document2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
knowledge_search6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / year_from / maximumAdded value: +9007199254740991 - added
Input schema / properties / year_from / minimumAdded value: +-9007199254740991 - added
Input schema / properties / year_to / maximumAdded value: +9007199254740991 - added
Input schema / properties / year_to / minimumAdded value: +-9007199254740991
- Changed
lca_analyze_contributions2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
lca_analyze_sensitivity4 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / scenarios / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / scenarios / items / properties / overrides / propertyNamesAdded value: +{ + "type": "string" +}
- Changed
lca_compare_assessments2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
lca_compose_assembly5 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / inputs / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / stages / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / stages / items / properties / inputs / items / additionalPropertiesRemoved value: -false
- Changed
lca_compose_linked4 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / links / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / links / items / properties / consumer_input_index / maximumAdded value: +9007199254740991
- Changed
lca_create_workspace2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
lca_edit_assembly5 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / base_version_seq / maximumAdded value: +9007199254740991 - removed
Input schema / properties / ops / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / ops / items / properties / inputs / items / additionalPropertiesRemoved value: -false
- Changed
lca_edit_linked5 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / base_version_seq / maximumAdded value: +9007199254740991 - removed
Input schema / properties / ops / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / ops / items / properties / consumer_input_index / maximumAdded value: +9007199254740991
- Changed
lca_get4 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991 - added
Input schema / properties / system_ref / maximumAdded value: +9007199254740991
- Changed
lca_get_task_status2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
lca_import_system2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
lca_run_assessment2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
lca_switch_engine2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
lca_switch_workspace2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
load_skill2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false
1 tool update
- Changed
lca_compose_assembly2 fields changed- changed
Input schema / properties / scope / descriptionPrevious value: -"System boundary. 'cradle_to_gate' (default) = materials through manufacture. 'cradle_to_grave' = ALSO include end-of-life (add disposal/treatment process leaves). A cradle-to-grave system spans life-cycle phases — prefer `stages` over a flat `inputs` list so each phase gets its own subtotal."New value: +"System boundary. 'cradle_to_gate' (default) = materials through manufacture. 'cradle_to_grave' = ALSO include end-of-life (add disposal/treatment process leaves). 'end_of_life' = treatment of a product at end of life only; the functional unit is the treated product, e.g. '1 kg of end-of-life PV module, treated'. A cradle-to-grave system spans life-cycle phases — prefer `stages` over a flat `inputs` list so each phase gets its own subtotal." - changed
Input schema / properties / scope / enumPrevious value: -[ - "cradle_to_gate", - "cradle_to_grave" -]New value: +[ + "cradle_to_gate", + "cradle_to_grave", + "end_of_life" +]
14 tool updates
- Changed
engine_get1 field changed- added
Input schema / properties / engineAdded value: +{ + "description": "Name of the engine database, as `lca_get(kind='engines')` lists it (case-insensitive). Omitted: this connection's default engine. Not combined with `scope_ref`, which picks the database a ref came from.", + "maxLength": 255, + "minLength": 1, + "type": "string" +}
- Changed
engine_list_methods1 field changed- added
Input schema / properties / engineAdded value: +{ + "description": "Name of the engine database, as `lca_get(kind='engines')` lists it (case-insensitive). Omitted: this connection's default engine. Not combined with `scope_ref`, which picks the database a ref came from.", + "maxLength": 255, + "minLength": 1, + "type": "string" +}
- Changed
engine_search1 field changed- added
Input schema / properties / engineAdded value: +{ + "description": "Name of the engine database, as `lca_get(kind='engines')` lists it (case-insensitive). Omitted: this connection's default engine. Not combined with `scope_ref`, which picks the database a ref came from.", + "maxLength": 255, + "minLength": 1, + "type": "string" +}
- Changed
lca_analyze_contributions2 fields changed- added
Input schema / properties / workspaceAdded 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" +} - added
Input schema / requiredAdded value: +[ + "workspace" +]
- Changed
lca_analyze_sensitivity2 fields changed- added
Input schema / properties / workspaceAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "assessment_ref" -]New value: +[ + "workspace", + "assessment_ref" +]
- Changed
lca_compare_assessments2 fields changed- added
Input schema / properties / workspaceAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "targets" -]New value: +[ + "workspace", + "targets" +]
- Changed
lca_compose_assembly3 fields changed- added
Input schema / properties / engineAdded value: +{ + "description": "Name of the engine database, as `lca_get(kind='engines')` lists it (case-insensitive). Omitted: this connection's default engine.", + "maxLength": 255, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / workspaceAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "title", - "output_name" -]New value: +[ + "workspace", + "title", + "output_name" +]
- Changed
lca_compose_linked3 fields changed- added
Input schema / properties / engineAdded value: +{ + "description": "Name of the engine database, as `lca_get(kind='engines')` lists it (case-insensitive). Omitted: this connection's default engine.", + "maxLength": 255, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / workspaceAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "ref_process_ref", - "member_process_refs" -]New value: +[ + "workspace", + "ref_process_ref", + "member_process_refs" +]
- Changed
lca_create_workspace1 field changed- changed
Input schema / properties / adopt_sandbox / descriptionPrevious value: -"When true, the sandbox this session is currently in becomes the new workspace, keeping everything already saved there and every workspace ref. Refused when the current workspace is not a sandbox. Default false: a new, empty workspace."New value: +"When true, the connection's default workspace, when it is a sandbox, becomes the new workspace, keeping everything already saved there and every workspace ref. Refused when the default is not a sandbox. Default false: a new, empty workspace."
- Changed
lca_edit_assembly2 fields changed- added
Input schema / properties / workspaceAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "ref", - "ops" -]New value: +[ + "workspace", + "ref", + "ops" +]
- Changed
lca_edit_linked2 fields changed- added
Input schema / properties / workspaceAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "ref", - "ops" -]New value: +[ + "workspace", + "ref", + "ops" +]
- Changed
lca_get1 field changed- added
Input schema / properties / workspaceAdded value: +{ + "description": "Name of the workspace to read, as `lca_get(kind='workspaces')` lists it. Omitted: this connection's default workspace, which every conversation on the connection shares.", + "maxLength": 255, + "minLength": 1, + "type": "string" +}
- Changed
lca_import_system3 fields changed- added
Input schema / properties / engineAdded value: +{ + "description": "Name of the engine database, as `lca_get(kind='engines')` lists it (case-insensitive). Omitted: this connection's default engine.", + "maxLength": 255, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / workspaceAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "ref" -]New value: +[ + "workspace", + "ref" +]
- Changed
lca_run_assessment3 fields changed- added
Input schema / properties / engineAdded value: +{ + "description": "Name of the engine database, as `lca_get(kind='engines')` lists it (case-insensitive). Omitted: this connection's default engine.", + "maxLength": 255, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / workspaceAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "ref" -]New value: +[ + "workspace", + "ref" +]
1 tool update
- Added
lca_create_workspace
Publisher details
- Operator
- Sistemik SpA · Publisher source
- Operator website
- https://sistemik.cl/ · Publisher source
- Vendor relationship
- Unknown
- Documentation
- https://aeviamodeler.ai/mcp · Publisher source
- Trust center
- Unknown
- Restrictions
- There is a free Demo plan, and then paid plans and features. · Publisher source
Related MCP Connectors
Natural-language queries over a verified emissions knowledge graph, plus standards validation
Sourced carbon emission factors + audit-traced calculations an AI can cite.
- CRPOAuthio.github.z3green
Carbon accounting platform. Query emission factors and create or edit draft emissions.
- FormistOAuthai.formist
AI agent that fills CBAM, GHG, CSRD/ESRS, EU Taxonomy, CDP and other sustainability forms.
Related MCP Servers
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to connect to a running openLCA instance for life cycle assessment workflows, including building models, running calculations, auditing, and extracting data quality assessments.175 PyPI6-
- FlicenseNot gradedqualityBmaintenanceEnables carbon accounting by matching activities to emission factors via semantic search and AI ranking, supporting ELCD and ecoinvent databases.30 npm73 PyPI1-
- FlicenseNot gradedqualityFmaintenanceEnables anaerobic digester design from feedstock characterization to dynamic simulation using a complete mADM1 model with 63 components, including AI-powered state generation and thermodynamic pH solving.-
- AlicenseAqualityAmaintenanceSourced carbon emission factors + audit-traced calculations an AI can cite.1223 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.