Skip to main content
Glama

add_safety_profile

Destructive

Save a local owner-supplied safety profile override for a printer model, tightening curated hotend, bed, feedrate, and build-volume limits without uploading or sharing data.

Instructions

Add a local safety-profile override for a printer model. Free at every tier.

        Validates the profile and saves it to this machine's override file
        (``~/.kiln/local_printer_overrides.json``; the older name
        ``community_profiles.json`` is still read).  Nothing saved here is
        uploaded, pooled or shared.

        An override may only TIGHTEN a curated limit.  A higher number is
        discarded in favour of Kiln's curated value, so this is the right
        tool for a printer Kiln has never heard of, or for holding your own
        machine BELOW the curated limits.

        It is the WRONG tool for "my hotend is upgraded".  Use
        ``select_printer_variant`` for that: it resolves to a ceiling Kiln
        has verified against the manufacturer, instead of one you typed.

        Values saved here are labelled owner-supplied in every profile
        readout — Kiln never presents them as its own verified numbers.

        For a printer Kiln has no number for, a limit above its generic
        floor needs two things.  A signed-in install (a free account:
        ``kiln_signin``), because Kiln vouches for ceilings it enforces
        and a ceiling nobody set is held to the floor.  And a PERSON's
        confirmation: Kiln shows a code on the screen of the machine it
        runs on, the person types it in the chat, you pass it to
        ``give_print_code``, then call this again with the same numbers.  Find the numbers on the maker's own spec
        page (maximum hotend and bed temperature, bed size) and say where
        they came from in ``notes``; never guess them, and never ask the
        person to type numbers they do not know.  The code is the
        confirmation; nothing you can call stands in for it.

        A Klipper printer that is set up here can state them itself.
        Leave ``profile`` out and Kiln reads the heater ceilings, travel
        and velocity limit off the printer's own configuration (through
        Moonraker), puts them in front of the person as ``proposal`` with
        the configuration lines they came from, and takes the same code.
        The saved limits are labelled as read from that printer.  The
        hotend and bed numbers are the board's shutdown points, and a
        hotend proposal above Kiln's generic floor carries a
        ``caution`` about PTFE-lined hotends: say it to the person
        before they confirm.  A printer that cannot state them (any
        other backend) says so and asks for ``profile``; a
        configuration that states only some of them hands those back
        in ``proposal`` for you to complete.

        Args:
            printer_model: Short identifier for the printer (e.g.
                ``"my_custom_corexy"``).
            profile: Dict containing at least ``max_hotend_temp``,
                ``max_bed_temp``, ``max_feedrate``, and ``build_volume``
                (a list of 3 positive numbers ``[X, Y, Z]``).  Optional
                fields: ``display_name``, ``max_chamber_temp``, ``min_safe_z``,
                ``max_volumetric_flow``, ``notes``.  Omit it to read the
                limits off the printer.
            printer_name: Which registered printer to read the limits
                off when ``profile`` is omitted; the default printer
                when empty.  Ignored when ``profile`` is given.
        

Tool call template

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

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

Input Schema

NameRequiredDescriptionDefault
profileNoDict containing at least ``max_hotend_temp``, ``max_bed_temp``, ``max_feedrate``, and ``build_volume`` (a list of 3 positive numbers ``[X, Y, Z]``). Optional fields: ``display_name``, ``max_chamber_temp``, ``min_safe_z``, ``max_volumetric_flow``, ``notes``. Omit it to read the limits off the printer.
printer_nameNoWhich registered printer to read the limits off when ``profile`` is omitted; the default printer when empty. Ignored when ``profile`` is given. Default: "".
printer_modelYesShort identifier for the printer (e.g. ``"my_custom_corexy"``).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changedv1.5.1
    • addedInput schema / properties / printer_model / description
      Added value: +"Short identifier for the printer (e.g. ``\"my_custom_corexy\"``)."
    • changedInput schema / properties / printer_name / description
      Previous value: -"Default: \"\"."New value: +"Which registered printer to read the limits off when ``profile`` is omitted; the default printer when empty.  Ignored when ``profile`` is given. Default: \"\"."
    • addedInput schema / properties / profile / description
      Added value: +"Dict containing at least ``max_hotend_temp``, ``max_bed_temp``, ``max_feedrate``, and ``build_volume`` (a list of 3 positive numbers ``[X, Y, Z]``).  Optional fields: ``display_name``, ``max_chamber_temp``, ``min_safe_z``, ``max_volumetric_flow``, ``notes``.  Omit it to read the limits off the printer."
  2. Changed5 schema fields changedv1.5.0
    • addedInput schema / properties / printer_name
      Added value: +{
      +  "description": "Default: \"\".",
      +  "title": "Printer Name",
      +  "type": "string"
      +}
    • removedInput schema / properties / profile / additionalProperties
      Removed value: -true
    • addedInput schema / properties / profile / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": true,
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / properties / profile / type
      Removed value: -"object"
    • changedInput schema / required
      Previous value: -[
      -  "printer_model",
      -  "profile"
      -]New value: +[
      +  "printer_model"
      +]
  3. First observedv0.1.0

TDQS

A4.7/5.0
Behavior5/5

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

Far beyond the annotations: it discloses the on-disk file path, that nothing is uploaded or shared, that higher-than-curated values are silently discarded, that saved values are labelled owner-supplied, that a proposal plus caution may come back, and that a confirmation code cannot be substituted. Annotations only say destructive/non-read-only/non-open-world; the description supplies the actual behavioral contract.

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

Conciseness3/5

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

Well front-loaded (purpose, then tightening rule, then the wrong-tool exclusion, then the confirmation flow), but bloated: the Args section duplicates the input schema nearly verbatim and the middle paragraphs drift into procedural narration that could be tightened considerably.

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?

Covers the full lifecycle an agent needs: validation and clamping behavior, file location, auth and human-confirmation gates, the Klipper/Moonraker alternate path, partial proposals, and the caution about PTFE-lined hotends. Nothing essential is missing despite the absence of an output schema.

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

Parameters4/5

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

Schema coverage is 100% and the Args block largely repeats it, so little is added there. However, the description adds real meaning around the omission of 'profile' — it switches the tool into a read-from-printer mode with a proposal/confirmation flow — and explains when printer_name is ignored.

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

Purpose5/5

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

Opens with a specific verb+resource+scope: 'Add a local safety-profile override for a printer model', naming the storage location and noting it is free at every tier. It explicitly differentiates itself from sibling select_printer_variant and implicitly from lock_safety_profile/get_safety_profile by describing what it owns (the local override file).

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('a printer Kiln has never heard of', 'holding your own machine BELOW the curated limits') and an explicit when-NOT-to-use with the named alternative ('It is the WRONG tool for my hotend is upgraded. Use select_printer_variant'). It also spells out prerequisites (signed-in install via kiln_signin, human confirmation via give_print_code) and the omit-profile path.

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

Deploy Server

Other Tools