Skip to main content
Glama

pack_apply

DestructiveIdempotent

Apply a channel preset pack: resolve and snapshot every variant, activate the chosen one, and probe font compatibility for the project.

Instructions

Load a channel preset pack, resolve and snapshot every variant, activate one.

pack_path is an external file — never confined to the project, the same way import_media's source is not — because a pack typically lives in a separate branding repo. Every declared variant is resolved and hashed, not only the one variant activates, so pack_activate can switch between them later with no file re-read; nothing after this call ever depends on pack_path staying reachable.

For every font role, fonts.probe asks whether the declared family actually draws on this machine — a family that does not refuses the whole call unless allow_fallback (then its declared CSS fallback is used and recorded, never silent); one that draws but is vendored nowhere proofcut knows about is recorded font_provenance: "unvendored" rather than refused, since the render here is genuinely correct today. install_fonts vendors the pack's own fonts/ directory if it ships one — off by default, since it writes into $HOME.

Writes nothing to caption styling or to any card already on disk; a card picks up the new style only when card_new/card_reauthor next draws it, and captions only via pack_apply_captions. plan resolves and probes without writing.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pathNoThe project directory to act on. Omit it — the usual case — when this server is bound to a project (started as `proofcut -C DIR mcp`, or inside a project; `ping` says which): it then resolves to that one bound project, a relative path resolves against it, and a path outside it is refused by name. Unbound, `path` is the whole address and omitting it refuses rather than guessing.
planNoResolve the whole call and report what it would do, writing nothing. Prefer it over doing the thing and undoing it.
variantNoWhich resolved variant to activate. Every declared variant is snapshotted regardless, so `pack_activate` can switch later with no file re-read.default
pack_pathYesThe pack file to load. An external file, never confined to the project — a pack usually lives in a separate branding repo — and nothing after this call depends on it staying reachable.
install_fontsNoVendor the pack's own `fonts/` directory, if it ships one. Off by default, since it writes into `$HOME`.
allow_fallbackNoAccept a declared CSS fallback for a font family that does not actually draw on this machine, recording which was used. Without it, a family that does not draw refuses the whole call.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed15 schema fields changedv0.25.0
    • addedInput schema / properties / allow_fallback / description
      Added value: +"Accept a declared CSS fallback for a font family that does not actually draw on this machine, recording which was used. Without it, a family that does not draw refuses the whole call."
    • removedInput schema / properties / allow_fallback / title
      Removed value: -"Allow Fallback"
    • addedInput schema / properties / install_fonts / description
      Added value: +"Vendor the pack's own `fonts/` directory, if it ships one. Off by default, since it writes into `$HOME`."
    • removedInput schema / properties / install_fonts / title
      Removed value: -"Install Fonts"
    • addedInput schema / properties / pack_path / description
      Added value: +"The pack file to load. An external file, never confined to the project — a pack usually lives in a separate branding repo — and nothing after this call depends on it staying reachable."
    • removedInput schema / properties / pack_path / title
      Removed value: -"Pack Path"
    • removedInput schema / properties / path / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / path / description
      Added value: +"The project directory to act on. Omit it — the usual case — when this server is bound to a project (started as `proofcut -C DIR mcp`, or inside a project; `ping` says which): it then resolves to that one bound project, a relative path resolves against it, and a path outside it is refused by name. Unbound, `path` is the whole address and omitting it refuses rather than guessing."
    • removedInput schema / properties / path / title
      Removed value: -"Path"
    • addedInput schema / properties / path / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • addedInput schema / properties / plan / description
      Added value: +"Resolve the whole call and report what it would do, writing nothing. Prefer it over doing the thing and undoing it."
    • removedInput schema / properties / plan / title
      Removed value: -"Plan"
    • addedInput schema / properties / variant / description
      Added value: +"Which resolved variant to activate. Every declared variant is snapshotted regardless, so `pack_activate` can switch later with no file re-read."
    • removedInput schema / properties / variant / title
      Removed value: -"Variant"
    • removedInput schema / title
      Removed value: -"pack_applyArguments"
  2. First observedv0.24.0

TDQS

A4.9/5.0
Behavior5/5

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

Despite the annotations already declaring readOnlyHint=false, idempotentHint=true, and destructiveHint=true, the description adds substantial behavioral detail: it resolves and hashes every variant (not just the activated one), describes font probing with fallback and 'unvendored' provenance, explains that install_fonts writes to $HOME, and clarifies that it writes nothing to existing cards or caption styling. It also mentions the plan mode as non-writing. This goes far beyond the annotations without contradicting them.

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 comprehensive yet efficiently structured. It starts with the core purpose, then explains the external file nature, variant snapshotting, font probing behavior, install_fonts caveat, writing limitations, and plan mode—all in a logical flow. Every sentence earns its place; there is no fluff or redundancy. The use of bold for key points (e.g., 'Every declared variant is resolved and hashed') aids scanning.

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

Completeness5/5

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

For a tool with 6 parameters, complex side effects, and a destructiveHint=true annotation, the description covers all critical aspects: what it does, what it does not write to, font handling nuances, plan mode, and how it relates to pack_activate and pack_apply_captions. It also addresses error conditions (refusal for non-drawing fonts) and environmental context (path binding). An agent has everything needed to invoke it correctly and safely.

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

Parameters4/5

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

Schema coverage is 100%, so each parameter already has a thorough description. The tool description reinforces and adds cross-parameter context, such as the interaction between allow_fallback and font probing, and the relationship between variant and pack_activate. While it does not add new per-parameter syntax, it enriches the meaning of the parameters as a whole, making it more than a simple restatement.

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 opens with a specific, action-packed sentence: 'Load a channel preset pack, resolve and snapshot every variant, activate one.' This clearly names the resource (pack), the core actions (load, resolve, snapshot, activate), and distinguishes it from siblings like pack_activate (switching later) and pack_apply_captions (captions only). The purpose is unmistakable and differentiated.

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?

The description explicitly states when to use this tool versus alternatives: it notes that pack_activate can switch variants later, that captions are applied via pack_apply_captions, and that cards only pick up the style on next card_new/card_reauthor. It also mentions plan as a dry-run alternative. These clear usage boundaries and conditional guidance make it easy for an agent to select the right tool.

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