Skip to main content
Glama
Unilytics MCP Server

Unilytics MCP Server

Official

update_skill

Destructive

Save edits to an editable skill as a new version without publishing, using targeted find/replace, whole-file updates, or file deletions.

Instructions

Save changes to one of the user's editable skills as a new version (no publish step).

Use when the user asks to change a skill they own or share through a project (as its owner, an
admin or an editor; a project viewer can use a skill but not change it). Three ways to
change files, combinable in one version; file_edits sends only the changed text, so it suits
small changes.

  file_edits   — surgical find/replace on an EXISTING file. Maps path ->
    list of edits, e.g.
        {"reference/style-guide.md": [{"find": "—", "replace": "-", "count": 5}]}
    Each `find` must match exactly `count` times (default 1); a 0-match or a
    count mismatch is rejected and nothing is written. A longer, unique `find`
    targets one place; `count` replaces several occurrences.

  file_changes — create a new file or whole-file replace. Maps path ->
    full markdown, e.g. {"SKILL.md": "...", "reference/new.md": "..."}.
    Use for new files or large rewrites.

  delete_files — remove files, e.g. ["reference/old.md"]. SKILL.md can't be
    deleted (it is the contract).

File layout (get_skill lists files by these prefixes):
  - reference/*  documents (style guides, pipelines, specs).
  - data/*       assets the skill carries, including runnable scripts such as a
                 data/verify_row.py checker.

Built-in and Unilytics skills are read-only and an update to one is rejected;
create_skill(extends=<skill_id>) makes an editable copy.

Size: the whole SKILL.md loads on every run of the skill. In a well-kept skill a correction or a
new step is one line in SKILL.md at the step it changes, and its detail (examples, edge cases,
the why) sits in that phase's reference/ file, which keeps SKILL.md under 500 lines.

The result's `lint` lists authoring findings on the saved version, as lint-v1 rule ids with a
message and a fix: body.too_long (the body's line count and its largest sections),
references.unlinked, description.no_trigger, and the frontmatter or description problems an
Agent Skills export refuses. Findings don't stop the save. The save is refused (skill_md_invalid,
nothing written) when the change introduces a SKILL.md frontmatter break, or makes the description
longer than 1,024 characters or a description already over that longer; a problem already there
that the change leaves untouched is allowed.

Args:
    skill_id: The editable skill id (user/... or project/...).
    file_changes: {path: markdown} — create/replace whole files.
    file_edits: {path: [{find, replace, count?}]} — surgical edits to existing files.
    delete_files: [path, ...] — files to remove.
    change_summary: Short note on what changed (for version history).
    expected_version: The version the change was made on (get_skill returns it). Required for a
        project skill, which collaborators share, and optional for the user's own. The save fails with
        version_conflict (naming who saved the newer version and when) unless the skill is still at it.
    verbatim_source: When porting or restructuring existing content, its original text. The
        store returns a fidelity report on the resulting files: FAIL means content was condensed
        or dropped; splitting and intentional edits pass.

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": {
      "skill_id": "<skill_id>"
    },
    "name": "update_skill"
  }
}

Input Schema

NameRequiredDescriptionDefault
skill_idYes
file_editsNo
delete_filesNo
file_changesNo
change_summaryNo
verbatim_sourceNo
expected_versionNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.1.0
    • removedInput schema / properties / config
      Removed value: -{
      -  "default": null,
      -  "title": "config",
      -  "type": "string"
      -}
  2. First observedv1.0.0

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (destructive, non-idempotent), it discloses failure semantics that matter: a 0-match or count mismatch is rejected with nothing written, updates to built-in/Unilytics skills are rejected, expected_version yields version_conflict naming who saved newer and when, and lint findings surface without blocking the save while frontmatter/description breaks refuse it entirely.

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

Conciseness4/5

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

The core purpose is front-loaded and the parameter sections are cleanly labeled and indented. It is long and the size/lint/fidelity paragraphs could be tightened, but each carries operational detail an agent would otherwise have to discover by failing.

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 seven-parameter, nested-object mutation tool with no output schema, the definition covers valid paths, file layout conventions, permission model, concurrency control, and what the result's lint/fidelity reports contain — nothing essential to a correct call is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must carry the burden and it does: every argument is explained, including the nested shape of file_edits ({path: [{find, replace, count?}]}) with the exact-match counting rule, file_changes as whole-file markdown, and the conditional requirement of expected_version for project vs. user skills.

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 opening sentence names a specific verb and resource (save changes to a user's editable skill) and adds a scoping qualifier ('as a new version (no publish step)') that separates it from author_skill/create_skill. An agent can identify the operation 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.

Usage Guidelines5/5

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

It states exactly when to use it and who is allowed (owner, admin, editor; a project viewer can use but not change), names the alternative for the read-only case (create_skill(extends=<skill_id>) makes an editable copy), and explains which of the three mutation modes fits which change size.

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