Skip to main content
Glama
ClickHouse Loom

ClickHouse Loom

Official

loom_memory_pin

Idempotent

Saves a standing fact as a pinned memory that later conflicting writes cannot evict, storing the newer fact beside it and ranking pinned rows ahead of unpinned ones in file context.

Instructions

WHAT: Save a standing fact and protect it. A pinned memory is never evicted by a later conflicting write: the newer fact is stored beside it and answers 409 PINNED_CONFLICT, and pinned rows rank ahead of unpinned ones in file context. Same arguments as memory.set; pinned is forced on. WHEN: The user marks a fact as permanent or asks for it to be kept explicitly: 'always remember X', 'never forget this', 'pin this', a hard constraint stated as standing ('I am allergic to penicillin', 'deploys freeze on Fridays', 'the prod DB is read-only'). WHEN NOT: An ordinary fact, preference or state — that is memory.set, the default for almost every save; a fact that must not change or be deleted at all (memory.lock); a topic that must not be remembered (blacklist.add, refused to a token bounded to one user). ARGS: memory_key, value; optional tags, ttl_seconds, on_expire. Server fills identity.

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": {
      "memory_key": "<memory_key>",
      "value": "<value>"
    },
    "name": "loom_memory_pin"
  }
}

Input Schema

NameRequiredDescriptionDefault
tagsNo
filesNo
valueYes
run_idNo
dry_runNo
entitiesNo
proposedNo
valid_atNo
valid_toNo
namespaceNo
on_expireNo
confidenceNo
memory_keyYes
memory_typeNosemantic
sensitivityNo
ttl_secondsNo
clear_expiryNo
expire_reasonNo
if_match_sha256No
source_resource_idNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv1.1.0

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the safety profile is supplied. The description adds genuinely new behavior beyond that: no eviction on conflicting write, the newer fact stored alongside, a 409 PINNED_CONFLICT response, and rank ordering in file context. However, with 20 parameters and 0% schema coverage, it omits whether pinning is reversible, whether it requires specific permissions, and what the return payload looks like.

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 WHAT/WHEN/WHEN NOT/ARGS labeling makes it scannable and front-loads the defining constraint (no eviction, forced pin) before the routing guidance. Every sentence carries information — the conflict code, the ranking effect, and the named alternatives all change agent behavior.

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

Completeness3/5

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

The description covers purpose, routing, and the key conflict behavior well, but this is a 20-parameter mutation tool with 0% schema coverage and no output schema. Fifteen-plus parameters are left entirely unexplained and delegated to a sibling's schema, which is a meaningful gap for an agent constructing a call.

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 description coverage is 0%, so the description must compensate and it only partly does: it names memory_key, value, tags, ttl_seconds and on_expire, and explains that 'pinned is forced on' (why no pinned parameter exists). The remaining parameters (files, entities, valid_at/valid_to, namespace, confidence, sensitivity, dry_run, if_match_sha256, and others) are covered only by the blanket delegation 'Same arguments as memory.set', which requires the agent to consult another tool's schema.

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 WHAT block states a precise verb and resource ('Save a standing fact and protect it') and immediately qualifies the mechanism: pinned facts are never evicted, conflicting writes are stored beside them, and pinned rows rank ahead in file context. It also explicitly contrasts itself with loom_memory_set ('pinned is forced on'), so an agent can distinguish it from its nearest sibling without opening either 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?

The WHEN block gives concrete user phrasings ('always remember X', 'never forget this', 'pin this') plus hard-constraint examples ('I am allergic to penicillin', 'deploys freeze on Fridays'). The WHEN NOT block names explicit alternatives with the condition selecting each: memory.set for ordinary facts, memory.lock for facts that must never change, blacklist.add for topics that must not be remembered.

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