Skip to main content
Glama

Write Bill of Materials

write_bom
Destructive

Use this to merge a supplied handoff BOM with optional KernelCAD catalog parts, MPNs and pricing, write a local CSV, and return Sheets-ready rows. Pass exactly one of handoff, handoff_json or handoff_path. The default output is a new file under artifacts/bom; an explicit output_path selects another allowed destination. Existing files are preserved unless overwrite:true, which replaces the destination. This tool makes no Google API calls.

Input Schema

NameRequiredDescriptionDefault
handoffNoBOM handoff object. Supply exactly one handoff source.
overwriteNoSet true to replace an existing CSV destination. Existing files are otherwise preserved.
output_pathNoOptional CSV destination. Defaults to artifacts/bom/bom-<id>.csv.
handoff_jsonNoJSON text containing a handoff object with parts; use instead of handoff or handoff_path.
handoff_pathNoPath to a handoff JSON file; use instead of handoff or handoff_json.
catalog_partsNoOptional catalog entries matched by ref or catalog id; unmatched entries become additional rows.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed11 schema fields changed
    • addedInput schema / allOf
      Added value: +[
      +  {
      +    "oneOf": [
      +      {
      +        "required": [
      +          "handoff"
      +        ]
      +      },
      +      {
      +        "required": [
      +          "handoff_json"
      +        ]
      +      },
      +      {
      +        "required": [
      +          "handoff_path"
      +        ]
      +      }
      +    ]
      +  }
      +]
    • changedInput schema / properties / catalog_parts / description
      Previous value: -"Optional matching KernelCAD catalog entries with id/ref, partNumber, vendor and price."New value: +"Optional catalog entries matched by ref or catalog id; unmatched entries become additional rows."
    • addedInput schema / properties / catalog_parts / items / properties
      Added value: +{
      +  "currency": {
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "id": {
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "name": {
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "notes": {
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "partNumber": {
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "price": {
      +    "anyOf": [
      +      {
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      },
      +      {
      +        "properties": {
      +          "amount": {
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "currency": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "amount"
      +        ],
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  "qty": {
      +    "maximum": 9007199254740991,
      +    "minimum": 1,
      +    "type": "integer"
      +  },
      +  "ref": {
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "source": {
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "vendor": {
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  }
      +}
    • changedInput schema / properties / handoff / description
      Previous value: -"Handoff object with a parts array."New value: +"BOM handoff object. Supply exactly one handoff source."
    • addedInput schema / properties / handoff / properties
      Added value: +{
      +  "parts": {
      +    "items": {
      +      "properties": {
      +        "catalog_id": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "mpn": {
      +          "anyOf": [
      +            {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            {
      +              "properties": {
      +                "source": {
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "status": {
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "value": {
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            }
      +          ]
      +        },
      +        "name": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "notes": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "part": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "qty": {
      +          "maximum": 9007199254740991,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "quantity": {
      +          "maximum": 9007199254740991,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "ref": {
      +          "description": "Non-empty part reference, e.g. R1.",
      +          "pattern": "\\S",
      +          "type": "string"
      +        },
      +        "source": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "ref"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  }
      +}
    • addedInput schema / properties / handoff / required
      Added value: +[
      +  "parts"
      +]
    • changedInput schema / properties / handoff_json / description
      Previous value: -"Handoff JSON text."New value: +"JSON text containing a handoff object with parts; use instead of handoff or handoff_path."
    • addedInput schema / properties / handoff_json / examples
      Added value: +[
      +  "{\"parts\":[{\"ref\":\"R1\",\"quantity\":2}]}"
      +]
    • addedInput schema / properties / handoff_json / minLength
      Added value: +1
    • changedInput schema / properties / handoff_path / description
      Previous value: -"Path to handoff JSON."New value: +"Path to a handoff JSON file; use instead of handoff or handoff_json."
    • addedInput schema / properties / handoff_path / minLength
      Added value: +1
  2. Added

TDQS

A4.3/5.0
Behavior4/5

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

The annotations mark the tool as destructive and non-idempotent, and the description adds concrete context: existing files are preserved unless overwrite:true, which replaces the destination, and it makes no Google API calls. It also discloses that it writes a local CSV and returns Sheets-ready rows. This goes beyond the annotations and clarifies the safety implications of overwrite.

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

Conciseness5/5

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

The description is compact and front-loaded, starting with the core action and then covering source selection, output destination, overwrite behavior, and the no-Google-API note. Every sentence contributes useful operational context without redundancy.

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

Completeness5/5

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

Given six parameters, nested handoff structures, a true output schema, and destructive overwrite behavior, the description provides enough context for correct invocation. It covers input source exclusivity, output destination, overwrite semantics, and the absence of Google API calls, while the output schema handles return details.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents each parameter thoroughly. The description reinforces the exclusive handoff source constraint, default output path, and overwrite semantics, but it does not add significant new meaning beyond what the schema already provides. Baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific multi-step action: merge a handoff BOM with optional catalog parts, write a local CSV, and return Sheets-ready rows. It clearly identifies the resource and output artifact, and no sibling tool performs this BOM-writing function, so the agent can distinguish it easily.

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

Usage Guidelines4/5

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

The description explicitly says to use this tool for merging and writing a BOM, and instructs passing exactly one of handoff, handoff_json, or handoff_path. It also clarifies default versus explicit output paths and overwrite behavior. It does not name alternative sibling tools for related tasks like pricing or ordering, but the main usage context is clear.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.