Skip to main content
Glama
┌─ palinode ─┐
│ ░░░░░░░░░░ │
│ ▓▓▓▓▓▓▓▓▓▓ │
│ ██████████ │
└────────────┘

Audit-grade memory for AI agents. Every stored claim can carry an explicit epistemic status (fact / inference / open_question / unverified), typed links to the evidence that backs or contradicts it, and a verifiable quote-level citation to its source. MCP-first, so one memory works in every editor.

Agent memory is becoming a commodity. Auditable agent memory is not: Palinode is the memory layer where a remembered fact says how strongly it is believed and what evidence backs it — and where every fact is a line in a git-versioned markdown file, readable, diffable, attributable to the commit that recorded it, and revertible when it's wrong. An unmarked memory is unmarked, never silently promoted to fact. No black-box vector store you have to trust.

Your agent's memory is a folder of markdown files. Palinode indexes them with hybrid search, compacts them with an LLM, and serves them through MCP — so the same memory works in Claude Code, Cursor, Windsurf, Zed, VS Code (Continue/Cline), and any other MCP-compatible editor. Bring your own Obsidian vault, or use Palinode as one: palinode init --obsidian /path/to/vault scaffolds a full vault with graph defaults, daily-notes wiring, and an LLM-maintained wiki contract. Enterprises can govern AI memory the same way they govern code. If every service crashes, cat still works.

A palinode is a poem that retracts what was said before and says it better. That's what memory compaction does.

Built by Paul Kyle at phasespace-labs. See AUTHORS.


Supported Platforms

Platform

Session Skill Path

MCP Config

Claude Code CLI

~/.claude/skills/

~/.claude.json

Claude Desktop

~/.claude/skills/

claude_desktop_config.json

Cursor

.cursor/skills/

.cursor/mcp.json

VS Code + Claude (Continue / Cline)

~/.claude/skills/

see MCP-INSTALL-RECIPES.md

JetBrains + Claude

~/.claude/skills/

~/.claude.json

Antigravity IDE

.agent/skills/

native 3-dot MCP menu

Codex CLI

N/A (no skills)

~/.codex/config.toml

Pi

N/A (native extension)

plugins/pi/ — per-turn recall via lifecycle hooks

Cline CLI / SDK

N/A (native plugin)

plugins/cline/ — per-turn recall via AgentPlugin hooks

All platforms share the same MCP server — install once on your server, connect from any IDE. docs/HARNESSES.md is the cross-harness map: what each harness gets (native hooks vs. plugin vs. MCP), how the tiers stack, and where to start. Per-client config snippets: docs/MCP-SETUP.md and docs/MCP-INSTALL-RECIPES.md.


Related MCP server: brain

The Idea

Most agent memory is a black box. You can't read it, you can't diff it, you can't grep it when the vector DB is down. Palinode bets on plain files as the source of truth and builds everything else as a derived index.

Files (markdown + YAML frontmatter)
  ↓ watched
Index (SQLite-vec vectors + FTS5 keywords, single .db file)
  ↓ queried by
Interfaces (MCP server, REST API, CLI, OpenClaw plugin)
  ↓ compacted by
Consolidation (structured operations → validation and application → git commits)

That's the whole architecture. One directory of .md files, one SQLite database, one API server. No Postgres, no Redis, no cloud dependency.


One Backend, Every Interface

Palinode doesn't care how you talk to it. The full toolkit — save, search, doctor, dedup-suggest, orphan-repair, diff, blame, rollback, and more — works through every interface:

Interface

Transport

Best For

MCP Server

Streamable HTTP or stdio

Claude Code, Claude Desktop, Cursor, Windsurf, Zed, VS Code (Continue/Cline)

REST API

HTTP on :6340

Scripts, webhooks, custom integrations

CLI

Wraps REST API

Cron jobs, SSH, shell scripts (8x fewer tokens than MCP)

Plugin

OpenClaw lifecycle hooks

Agent frameworks with inject/extract patterns

Set up once on a server. Connect from any machine, any IDE, any agent framework. The MCP server is a pure HTTP client — it holds no state, no database connection, no embedder. Point it at the API and go.

{
  "mcpServers": {
    "palinode": { "type": "http", "url": "http://your-server:6341/mcp/" }
  }
}

That's the entire client config. Works with Claude Code, Claude Desktop, Cursor, Windsurf, Zed, and VS Code (Continue/Cline). palinode-mcp-http serves streamable-HTTP at /mcp/ — use "type": "http", not "type": "sse". Always include the trailing slash in the URL. See docs/MCP-SETUP.md for editor-specific install recipes.


How It Works

Store — Typed markdown files (people, projects, decisions, insights) with YAML frontmatter. Git-versioned. Human-readable. Editable in Obsidian, VS Code, vim, or anything.

Index — A file watcher embeds with BGE-M3 and indexes with FTS5 as you save. Content-hash dedup skips re-embedding unchanged files (~90% savings). Single SQLite file, zero external services.

Search — Hybrid BM25 + vector search merged with Reciprocal Rank Fusion. The two arms have different jobs: on full-sentence questions the vector arm does nearly all the retrieval (FTS5 requires every query token to co-occur, which questions rarely satisfy), while BM25 catches the exact terms and identifiers embeddings blur. Measured together: 0.981 evidence recall@10 on LongMemEval_S (benchmarks). Optional associative entity graph and prospective triggers.

Compact — Weekly consolidation where an LLM returns structured operations and Palinode validates and applies them. Every compaction is a git commit you can review, blame, or revert.

Dream — If you've met "dreaming" as the name for this, palinode dream is an alias for palinode consolidate. Use --dry-run to inspect the proposed operations; each completed pass lands as a git commit, so a bad consolidation is a diff to review and a commit to revert.

Auditgit blame any fact. git diff any change. rollback any mistake. These aren't just git-compatible files — palinode_diff, palinode_blame, and palinode_rollback are first-class tools your agent can call.


Requirements

  • Python 3.11+

  • Git

  • Ollama with bge-m3 (ollama pull bge-m3, ≈1.2 GB) — for semantic search. Optional: without an embedder Palinode runs in keyword-only mode (BM25/FTS5) — save, search, and audit all still work; you just don't get vector recall until you add one.

Optional extras: a chat model for weekly consolidation (any 7B+ that outputs JSON), OpenClaw for agent plugin hooks.


Install

Homebrew (macOS/Linux) — quickest path to the CLI:

brew install phasespace-labs/palinode/palinode
palinode --version

That taps and installs in one command. It puts the palinode CLI on your PATH; the service binaries (palinode-api, palinode-watcher, palinode-mcp) currently live in the tap's private prefix, so for running services use the source install below or Docker.

From source — the full-stack path. Clone, install, point at a memory directory, check it worked:

# 1. Get the code (lives separately from your memory — never the same directory)
git clone https://github.com/phasespace-labs/palinode ~/palinode-src && cd ~/palinode-src
python3 -m venv venv && source venv/bin/activate
pip install -e .

# 2. Create your memory directory (this is where your data lives — keep it private)
mkdir -p ~/.palinode && cd ~/.palinode && git init
cp ~/palinode-src/palinode.config.yaml.example palinode.config.yaml
# memory_dir stays commented out in the copied config → it inherits PALINODE_DIR below

# 3. Start the services (each in its own terminal — or as a service, next section)
PALINODE_DIR=~/.palinode palinode-api        # REST API on :6340
PALINODE_DIR=~/.palinode palinode-watcher     # auto-indexes on file save

# 4. Did it work?
palinode doctor

palinode doctor is the single "did it install correctly?" command — run it after every install, upgrade, or server move. On a fresh venv, use the venv's absolute path for the MCP command (~/palinode-src/venv/bin/palinode-mcp) so it resolves its own dependencies — see llms-install.md for the wrong-Python trap.

Your memory directory is private — it holds personal data. Never make it public; the code repo contains zero memory files. For a pre-populated demo, copy examples/sample-memory/ into ~/.palinode/.


Running as a service

Three long-running processes (API, watcher, embedder) shouldn't live in terminal tabs. Pick one:

Platform

How

Details

Anywhere with Docker

docker compose up -d from the repo root — API + watcher + Ollama, with the bge-m3 pull handled for you (≈1.2 GB on first run)

docker-compose.yml header comments

Linux

systemd units via deploy/systemd/install.sh --enable

deploy/systemd/README.md

macOS

launchd LaunchAgents from templates

deploy/launchd/README.md

Windows

use Docker Compose (set PALINODE_DATA_DIR to a Windows path)

docker-compose.yml header comments

With compose, your memory stays on the host at ~/.palinode (override with PALINODE_DATA_DIR) — the containers mount it; files remain the source of truth. Already running Ollama on the host? OLLAMA_URL=http://host.docker.internal:11434 docker compose up -d palinode-api palinode-watcher skips the bundled one. Verify any of the three the same way: palinode doctor (or curl http://127.0.0.1:6340/status).


Connect your editor

Palinode speaks MCP. Generate the correct config with the CLI instead of hand-pasting JSON (which drifts):

Editor / harness

One command

Claude Code (CLI)

claude mcp add palinode -- palinode-mcp

Claude Desktop

palinode mcp-config --stdio → paste into the config it prints (quit Desktop first)

Cursor / Windsurf / other MCP clients

palinode mcp-config --stdio (local) or --http (remote / streamable-HTTP)

Diagnose an existing setup

palinode mcp-config --diagnose

palinode mcp-config never writes your editor's config file — it prints a ready-to-paste block (pipe it straight to the target). Full per-harness detail: docs/MCP-INSTALL-RECIPES.md.


Daily use — drop into a project

Already installed with palinode-api running? Scaffold any project in one command:

cd your-project
palinode init

That scaffolds .claude/CLAUDE.md (memory instructions, appended if one exists), .claude/settings.json (SessionStart + SessionEnd + UserPromptSubmit hook registration), all three hook scripts, and .mcp.json (points Claude Code at the palinode MCP server). Sessions then start smart, recall as they go, and end captured: the SessionStart hook injects your core: true memories into every fresh session (startup and /clear) so standing context is there before the first prompt; the UserPromptSubmit hook recalls relevant memory before each prompt — prospective triggers plus a strict-threshold search, injected as compact snippets, silent when nothing matches; and the SessionEnd hook auto-captures on /clear, logout, and exit. Re-run with --dry-run to preview, --force to overwrite, or --no-mcp / --no-hook to scope it. See examples/hooks/ for tuning knobs.

Projects that use other harnesses get the same memory instructions automatically: when AGENTS.md (or a .agent/ directory) exists, init appends a harness-neutral memory block to AGENTS.md (read by Codex, Antigravity, and other AGENTS.md-aware agents), and when a .cursor/ directory exists it writes .cursor/rules/palinode.md for Cursor. Force or skip with --agents/--no-agents and --cursor/--no-cursor — same recall/save/session-end contract, minus the Claude-Code-only machinery (/clear, /wrap, hooks).


Usage Examples

Save a decision, recall it later

# During a session — save a decision
palinode save --type Decision "Chose SQLite over Postgres for the cache layer. \
  Reason: no ops burden, single-file deployment, good enough for our scale."

# Next week — search for it
palinode search "database decision for cache"

End-of-session capture

# Agent calls at end of coding session
palinode session-end \
  --summary "Migrated auth from JWT to session tokens" \
  --decisions "Session tokens stored server-side, 24h expiry" \
  --blockers "Need to update mobile client auth flow"

Audit trail — who decided what and when

# Trace a fact back to when it was recorded
palinode blame decisions/auth-migration.md

# Compose the full provenance lineage of a fact — sources, saved/changed
# commits, supersession trail, typed links, and recall — in one view
palinode trace decisions/auth-migration.md

# See what changed across all memory in the last week
palinode diff --days 7

# Retire a memory that turned out to be wrong — it leaves recall but stays
# on disk, in git, and in the index. Never a hard delete.
palinode archive insights/stale-finding.md --reason "superseded by the re-run" \
  --superseded-by insights/corrected-finding.md

Tools

29 tools available through every interface:

Tool

What It Does

session_init

Session-start context digest for the resolved project scope

search

Hybrid BM25 + vector search with category filter

save

Store a typed memory (person, decision, insight, project)

list

Browse memory files by type, filter by core status

read

Read the full content of a memory file

ingest

Fetch a URL and save as research

status

Health check — file counts, index stats, service status

entities

Entity graph — cross-references between memories

consolidate

Preview or run LLM-powered compaction

archive

Retire one memory that's wrong or obsolete — archive it, or supersede it with a named replacement

archive_expired

Archive ephemeral memories whose TTL has expired

diff

What changed in the last N days

blame

Trace a fact back to the commit that recorded it

trace

Compose a fact's full provenance lineage — sources, saved/changed commits, supersession, typed links, recall

history

Git history for a file with diff stats and rename tracking

rollback

Revert a file to a previous commit (safe, creates new commit)

push

Sync memory to a remote git repo

trigger

Prospective recall — auto-inject when a topic comes up

lint

Health scan — orphans, stale files, missing fields

review

Advisory project-memory review that proposes corrective operations without writing them

session_end

Capture summary, decisions, and blockers at end of session

prompt

List, show, or activate versioned LLM prompts

dedup_suggest

Before saving, surface existing files that overlap the draft

orphan_repair

Find semantic matches for broken [[wikilinks]]

doctor

Fast diagnostic pass — 18+ checks across paths, services, config, index

doctor_deep

Full diagnostic with canary write test (~10–15s)

cluster_neighbors

Find top-K semantically related files NOT already wiki-linked — surface implicit relationships for cross-link proposals

topic_coverage

Given a short topic phrase, return whether any existing wiki page already covers it (binary covered / best_match / similarity)

depends

Dependency tree (or unblocked-items list) from depends_on / blocks / parallel_with frontmatter on ProjectSnapshots

Every tool is accessible as palinode_<name> via MCP, palinode <name> via CLI, or POST/GET /<name> via the REST API.


Stack

Layer

Choice

Why

Source of truth

Markdown + YAML frontmatter

Human-readable, git-versioned, portable

Vector index

SQLite-vec (embedded)

No server, single file, zero config

Keyword index

SQLite FTS5 (embedded)

BM25 for exact terms, zero dependencies

Embeddings

BGE-M3 via Ollama

Local, private, no API key needed

API

FastAPI

Lightweight, async, one process

MCP

Python MCP SDK (Streamable HTTP)

Works with every IDE over the network

CLI

Click (wraps REST API)

Shell-native, TTY-aware output

Behavior

PROGRAM.md

What to remember, how to extract, how to compact — edit one file to change all behavior


Memory File Format

---
id: project-palinode
category: project
name: Palinode
core: true
status: active
entities: [person/alice]
last_updated: 2026-04-05T00:00:00Z
summary: "Persistent memory for AI agents."
canonical_question: "What is Palinode and what does it do?"
---
# Palinode

Your content here. As detailed or brief as you want.
Files marked `core: true` are always in context.
Everything else is retrieved on demand via hybrid search.
The `canonical_question` field anchors the file to the question it answers, improving search relevance.

Open in Obsidian

Palinode stores every memory as a plain markdown file — which means your memory directory is already a valid Obsidian vault. Point Obsidian at the folder and you get graph view, backlinks, and Bases on top of Palinode's hybrid search and compaction. No sync job, no plugin to install, no two-source-of-truth problem.

palinode init --obsidian ~/palinode-vault

This scaffolds the vault directory layout, an _index.md Map of Content, a _README.md orientation page, and an opinionated .obsidian/ config (graph view colour-coded by category, daily-notes wired to daily/). Then open the directory in Obsidian.

The LLM follows a wiki-maintenance contract — it keeps entities: frontmatter and [[wikilinks]] in the note body in sync so the Obsidian graph stays accurate as new memories are saved. When you save a memory with entity references, Palinode appends an idempotent ## See also block linking them as wikilinks.

Two embedding-aware tools support wiki hygiene: palinode_dedup_suggest checks whether a draft overlaps an existing file before creating a duplicate, and palinode_orphan_repair finds semantic matches for broken [[wikilinks]]. Both are callable via MCP, CLI, and REST.

See docs/OBSIDIAN.md for the comprehensive guide: quickstart, wiki contract details, migration paths, and FAQ.


Diagnose with palinode doctor

Silent misconfiguration — a db_path pointing at the wrong file, a watcher indexing a stale directory, a phantom DB file — is the most common reason Palinode doesn't behave as expected after an upgrade or server move. palinode doctor catches this entire class of bugs.

palinode doctor

The command runs 18+ checks across paths, services, config consistency, index health, and disk state, and emits a structured report with a pass/warn/fail status for each. --fix mode applies safe automated repairs (creates missing directories, appends the CLAUDE.md Palinode block) — it never moves user data; phantom DB files and DB-path mismatches print suggested mv commands but never execute them.

Run palinode doctor after every install, upgrade, or server migration. See docs/DOCTOR.md for the full check catalog and --fix reference.


Configuration

All behavior is in palinode.config.yaml:

memory_dir: "~/.palinode"
ollama_url: "http://localhost:11434"
embedding_model: "bge-m3"

search:
  hybrid_enabled: true
  hybrid_weight: 0.5         # 0.0 = vector only, 1.0 = BM25 only

consolidation:
  llm_model: "llama3.1:8b"   # any chat model that outputs JSON
  llm_url: "http://localhost:11434"
  llm_fallbacks:              # tried in order if primary fails
    - model: "qwen2.5:14b-instruct"
      url: "http://localhost:11434"

All models are swappable. Any Ollama embedding model, any OpenAI-compatible chat endpoint. See palinode.config.yaml.example for the full reference.

When exposing the API beyond loopback (PALINODE_API_HOST other than 127.0.0.1), set PALINODE_API_TOKEN — the server refuses to start unauthenticated on a non-loopback bind unless you opt out explicitly with PALINODE_API_ALLOW_UNAUTH=1. See SECURITY.md for the bearer-token auth model and the bind gate.


API Reference

Method

Path

Description

GET

/status

Health check + stats

POST

/search

Hybrid search with filters

POST

/search-associative

Entity graph traversal

POST

/save

Create a typed memory file. Schema: {content, type, slug?, entities?, title?}. Body cap 5 MB (override via PALINODE_MAX_REQUEST_BYTES).

POST

/ingest-url

Fetch URL, save as research

GET/POST

/triggers

Prospective recall triggers

POST

/consolidate

Run or preview compaction

GET

/list

Browse files by type

GET

/read?file_path=...

Read a memory file

GET

/history/{file_path}

Git log for a file

GET

/diff

Recent changes

GET

/blame/{file_path}

Git blame

GET

/trace/{file_path}

Composed provenance lineage for a file

POST

/rollback

Revert a file

POST

/push

Push to git remote

POST

/reindex

Rebuild indices

POST

/session-end

Capture session summary

POST

/lint

Health scan


Design Principles

  1. Files are truth. Not databases, not vector stores. Markdown files that humans can read, edit, and version with git.

  2. Typed, not flat. People, projects, decisions, insights — each has structure. This enables reliable retrieval and consolidation.

  3. Consolidation, not accumulation. 100 sessions should produce 20 well-maintained files, not 100 unread dumps.

  4. Invisible when working. The human talks to their agent. Palinode works behind the scenes.

  5. Graceful degradation. Vector index down? Read files directly. Embedding service down? Grep. Machine off? It's a git repo, clone it anywhere.

  6. Zero taxonomy burden. The system classifies. The human reviews. If the human has to maintain a taxonomy, the system dies.


What's Unique

  • Your data, your files — No accounts, no cloud dependency, no vendor lock-in. Your memory is markdown files in a directory you control. Export is cp. Backup is git push. Whatever happens to any tool in this ecosystem, your data is plain text on your filesystem.

  • Cross-IDE memory — Your memory lives in one place. Connect from Claude Code, Cursor, Windsurf, Zed, or any MCP-compatible editor. Switch IDEs without losing context.

  • Git operations as agent toolsdiff, blame, rollback, push exposed via MCP. No other system makes git ops callable by the agent.

  • Operation-based compaction — Structured operations are schema-checked and applied as reviewable git commits.

  • Per-fact addressability<!-- fact:slug --> IDs inline in markdown, invisible in rendering, preserved by git, targetable by compaction.

  • 4-phase injection — Core (always) + Topic (per-turn search) + Associative (entity graph) + Triggered (prospective recall).

  • Multi-transport MCP — stdio for local, Streamable HTTP for remote. One server, any IDE on any machine.

  • If everything crashes, cat still works.

Measured, not asserted: docs/BENCHMARKS.md has LongMemEval results with methodology, cost, and the losses.


Acknowledgments

Palinode builds on ideas from Karpathy's LLM Knowledge Bases, Letta (tiered memory), and LangMem (typed schemas + background consolidation). See docs/ACKNOWLEDGMENTS.md for the full list.

See also the epistemic integrity discussion in the Karpathy gist thread — particularly the problem of LLM wikis that "synthesise without citing, drift from sources without knowing it, and present false certainty where disagreement exists." Git-based provenance is Palinode's answer to that problem.

If you know of prior art we missed, please open an issue.


License

MIT — Privacy Policy


Built by Paul Kyle with help from AI agents who use Palinode to remember building Palinode.

Available Tools

29 tools
palinode_archiveA
DestructiveIdempotent

Retire one specific memory that is wrong or obsolete. Sets status: archived so it leaves default recall, records the reason in the file's history sibling, and commits — never hard-deletes, so the content stays auditable. Pass superseded_by to name the memory that replaces it (a SUPERSEDE rather than a plain archive). Use this instead of re-saving a memory with a hand-written tombstone body: that leaves the wrong content live in search.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoWhy this memory is being retired (kept in the audit trail).
file_pathYesMemory file path (e.g., 'insights/stale-finding.md')
superseded_byNoSlug or path of the memory that replaces this one. Omit for a plain archive with no successor.

TDQS

A3.8/5.0
Behavior1/5

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

The description says 'never hard-deletes' implying it is not destructive, but the annotations include destructiveHint: true, which indicates the tool may cause data loss. This is a contradiction. Although the description adds useful behavioral context (records reason, commits, keeps content auditable), the contradiction overrides and results in a score of 1.

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?

Four concise sentences, front-loaded with purpose, no fluff. Every sentence adds essential information.

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

Completeness4/5

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

Covers key effects (archive, audit trail, supersedence, no hard-delete) and differentiates from re-saving. Lacks mention of error conditions (e.g., file not found) or prerequisites, but given the simple interface and rich annotations, it is mostly complete.

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%, adding meaningful context beyond raw schema: explains that superseded_by creates a SUPERSEDE rather than plain archive, and reason is recorded in history. This adds value beyond the parameter descriptions.

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 clearly states the tool archives a single obsolete memory, using specific verbs ('retire', 'sets status: archived'). It distinguishes from re-saving with a tombstone and from sibling palinode_archive_expired (batch archiving). The purpose is precise and unambiguous.

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?

Describes when to use (memory is wrong/obsolete) and provides a negative guideline ('instead of re-saving with a hand-written tombstone body'). Also explains when to use superseded_by for superseding vs plain archive. However, it does not explicitly compare to other sibling tools like palinode_delete or palinode_save, but the context is clear.

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

palinode_archive_expiredA
DestructiveIdempotent

Archive ephemeral memories whose expires_at has passed (ADR-015 §2.3 TTL regime). Deterministic + idempotent — flips expired memories to status: archived so they drop out of default recall while staying on disk. Set dry_run=true to preview.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoPreview which memories would be archived without writing.

TDQS

A4.5/5.0
Behavior5/5

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

Expands on annotations: specifies deterministic, idempotent (consistent with idempotentHint), effect on status, persistence on disk, and dry_run preview. No contradiction with destructiveHint=true. Adds context beyond annotations.

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?

Two concise sentences front-loading the action. Every sentence provides essential info: what, effect, condition, and usage tip. No wasted words.

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 no output schema and simple mutation, description fully covers purpose, behavior, and parameter. Return value not needed; tool side effects are clear.

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?

Parameter dry_run is 100% schema-covered with description. Tool description repeats schema description without adding new meaning. Baseline 3 applies as schema does the heavy lifting.

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?

Explicitly states it archives ephemeral memories with expired expires_at, referencing ADR-015. Distinguishes from sibling palinode_archive by specificity to TTL regime. Clear verb+resource scope.

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?

Clearly indicates when to use (expired memories). Implicitly distinguishes from palinode_archive (non-expired/memories), but lacks explicit exclusion or mention of alternatives.

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

palinode_blameA
Read-onlyIdempotent

Trace a fact back to when it was first recorded. Shows which session or commit created each line in a memory file.

ParametersJSON Schema
NameRequiredDescriptionDefault
claimsNoAlso resolve the file's claim-level source anchors: which source span justifies each claim, with live integrity status.
searchNoOptional: filter to lines containing this text
file_pathYesMemory file path (e.g., 'projects/my-app.md')

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by saying the tool maps each line to the session or commit that created it. It does not describe output formatting or whether the claims flag changes the response, but there is no contradiction with annotations.

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?

Two sentences with no filler. The first sentence states the primary purpose, and the second clarifies the output granularity. The description is front-loaded and every part earns its place.

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

Completeness4/5

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

For a read-only tool with 3 well-documented parameters and rich safety annotations, the description is largely complete. Since there is no output schema, the description does need to convey return semantics, and 'shows which session or commit created each line' does that. It could be more explicit about how the optional claims and search flags reshape the result, but the schema fills that gap.

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 100%, and each parameter (file_path, search, claims) already has a meaningful schema description. The tool description adds little parameter-level detail beyond reinforcing that file_path targets a memory file and that the result is line-oriented, so the baseline of 3 is appropriate.

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

Purpose4/5

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

The description uses a specific verb ('Trace') with a clear resource ('a fact', 'each line in a memory file') and explains the outcome: showing which session or commit created a line. It evokes git-blame semantics, which helps distinguish it from general history or diff tools, though it does not explicitly name sibling alternatives.

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

Usage Guidelines3/5

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

The description implies the tool should be used when an agent needs to know the provenance of a fact or line in a memory file. It does not explicitly state when not to use it or mention alternatives like palinode_trace or palinode_history, so the when-to-use guidance is only implicit.

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

palinode_cluster_neighborsA
Read-onlyIdempotent

Given a memory file path, find the top-K semantically related files that are NOT currently linked to or from it (no existing [[wikilink]] in either direction). Use during wiki-maintenance passes to surface implicit relationships that no wikilink yet captures — the LLM can then propose new cross-links. Preprocessing strips wikilink syntax and the auto-generated ## See also footer so notes linking the same entities don't false-positive as related.

ParametersJSON Schema
NameRequiredDescriptionDefault
top_kNoMaximum number of candidate files to return. Default 10.
file_pathYesRelative file path (e.g. 'decisions/palinode-arch.md') to find unlinked semantic neighbours for.
min_similarityNoMinimum cosine similarity to surface (0.0–1.0). Default 0.70.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds valuable detail about preprocessing that strips wikilink syntax and '## See also' footers to avoid false positives, enhancing transparency beyond the annotations.

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 four sentences, with the core functionality immediately stated. Each sentence adds value: purpose, usage, preprocessing detail. No unnecessary words.

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

Completeness4/5

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

Given the lack of output schema, the description could specify what the tool returns (e.g., list of file paths with scores). However, the purpose and usage are sufficiently clear for an agent to understand when and how to invoke the tool correctly.

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 baseline is 3. The description does not add new meaning beyond the schema, but the mention of 'top-K' and 'semantically related' aligns with parameter purposes. No additional depth is provided.

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 clearly states the function: find top-K semantically related files that are not linked via wikilinks. It uses specific verbs and resources, and distinguishes from sibling tools by focusing on unlinked semantic relationships for wiki maintenance.

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 recommends use during 'wiki-maintenance passes' to surface implicit relationships. While it does not list alternative tools or contraindications, the context is clear and actionable.

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

palinode_consolidateA
Destructive

Run a manual knowledge consolidation pass. Set dry_run=true to preview the proposed operations without applying them.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoPreview operations without writing changes. Recommended when invoking from MCP — the tool is annotated destructive.
nightlyNoRun the nightly compaction prompt instead of the default write-time pass.
sourcesNoMemory directories to consolidate, e.g. `["insights"]`. Defaults to `daily` only.

TDQS

A3.7/5.0
Behavior4/5

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

The description goes beyond annotations by recommending dry_run=true for MCP invocation and noting the tool is destructive (via the schema parameter text). It discloses that dry_run previews operations without writing changes, adding safety context. However, it does not detail what consolidation actually does (e.g., merges, deletes, rewrites) or what side effects occur when applied, leaving some behavioral ambiguity.

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 consists of two concise sentences, front-loaded with the main action and immediately providing the key preview guidance. There is no redundant or filler wording. It is appropriately sized for a tool with a well-documented schema, and every sentence earns its place.

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 tool has no output schema, and the description does not explain what a consolidation pass produces (e.g., a report, applied changes, or a diff). It relies on the schema for parameter context and the annotations for destructive safety, but for a destructive operation, more detail about the actual consolidation operations and consequences would be expected. It is minimally adequate but has clear gaps.

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 100%, with each parameter (dry_run, nightly, sources) having helpful descriptions that explain defaults and usage. The tool description itself adds no new parameter information beyond the schema, so the baseline of 3 applies. It confirms the dry_run preview behavior but does not enrich beyond what schema already provides.

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

Purpose4/5

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

The description states a specific action ('Run a manual knowledge consolidation pass') with a clear resource ('knowledge consolidation'). The word 'manual' helps distinguish it from automatic passes, and the phrase distinguishes it from sibling tools like palinode_dedup_suggest or palinode_archive_expired. However, 'consolidation pass' is jargon and not fully explained, slightly reducing clarity.

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

Usage Guidelines3/5

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

The description implies this tool is for manually triggering consolidation when desired, and the dry_run recommendation provides a usage tip for safe previewing. But it does not explicitly state when to use this tool over alternatives (e.g., automatic consolidation, dedup_suggest, archive_expired), nor any exclusions or conditions. Usage context is only implied, not explicit.

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

palinode_dedup_suggestA
Read-onlyIdempotent

Given draft memory content the LLM is about to save, return the top-K existing memory files whose embeddings are semantically near it. Use BEFORE writing a new memory to decide 'create new' vs 'update existing'. Each result includes a strong_dup flag — when true (similarity ≥ 0.90), the existing file is a near-paraphrase and the LLM should usually update rather than create. Preprocessing strips wikilink syntax and the auto-generated ## See also footer so notes linking the same entities don't false-positive as duplicates.

ParametersJSON Schema
NameRequiredDescriptionDefault
top_kNoMaximum number of candidate files to return. Default 5.
contentYesThe draft memory body about to be saved (markdown, with or without frontmatter).
min_similarityNoMinimum cosine similarity to surface (0.0–1.0). Default 0.80.

TDQS

A4.6/5.0
Behavior5/5

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

Adds valuable behavioral details beyond annotations: preprocessing strips wikilink syntax and auto-generated footer to avoid false positives, explains strong_dup flag meaning and recommended action. No contradiction with annotations.

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?

Three sentences with efficient structure: purpose, usage guideline, preprocessing detail. No wasted words.

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

Completeness4/5

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

Covers purpose, return value (strong_dup), and preprocessing. Lacks return structure details, but given no output schema, it is adequate.

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 covers parameters fully (100%), but description adds meaning about output (strong_dup flag) which is not in schema, compensating for lack of output 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?

Description clearly states 'return the top-K existing memory files whose embeddings are semantically near it', with specific verb+resource and distinct purpose from siblings like palinode_save or palinode_search.

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?

Explicitly says 'Use BEFORE writing a new memory to decide create new vs update existing', providing clear context. Doesn't mention when not to use, but the guidance is sufficient.

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

palinode_dependsA
Read-onlyIdempotent

Return the dependency tree for a milestone or task slug, or list all unblocked items. Reads depends_on / blocks / parallel_with frontmatter from ProjectSnapshot files. Set unblocked=true to answer 'what can I work on right now?' across all slugs.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNoMilestone or task slug to inspect (e.g. 'milestone/M1'). Required unless unblocked=true.
unblockedNoIf true, return the list of all slugs whose every depends_on is done (ignores slug). Default false.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint, idempotentHint, and destructiveHint. The description adds that it reads frontmatter from ProjectSnapshot files and explains the unblocked behavior, providing useful context beyond annotations.

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?

Two concise sentences front-load the primary function and add a secondary mode. Every sentence adds value, no redundancy.

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

Completeness4/5

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

Covers the two main use cases adequately. No output schema, but description doesn't detail return format; however, for an agent selecting the tool, this is sufficient. Minor gap in describing error cases or edge conditions.

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% but the description adds meaningful context: slug is required unless unblocked=true, and unblocked returns slugs whose dependencies are done. This goes beyond the schema's descriptions.

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 clearly states the tool returns dependency trees or unblocked items, with specific verb and resource. It distinguishes from sibling tools by focusing on dependency relationships, a unique function among many palinode tools.

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?

Provides explicit guidance on when to use unblocked=true for actionable items, and implies slug for tree inspection. Lacks direct comparisons to sibling tools but offers clear usage context.

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

palinode_diffA
Read-onlyIdempotent

Show what memories changed recently. Use to review what was learned, decisions made, or facts updated in the last N days.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoLook back this many days (default 7)
pathsNoFilter to specific directories (e.g., ['projects/', 'decisions/'])

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already convey read-only (readOnlyHint=true), idempotent (idempotentHint=true), and non-destructive (destructiveHint=false) behavior. The description confirms it shows changes, aligning with annotations, but adds no additional behavioral disclosure beyond the basic read operation. Given annotation coverage, a score of 3 is appropriate.

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 two sentences: the first states the function, the second gives a usage directive. Every sentence is concise and relevant, with no wasted words. It is well-structured and front-loaded.

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

Completeness4/5

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

Given two parameters, no output schema, and extensive annotations, the description sufficiently covers the tool's context. It explains the purpose and provides a typical use case. Some might expect a mention of the default days value, but that is already in the schema. Overall, it is complete for the tool's simplicity.

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?

Both parameters ('days' and 'paths') are fully described in the input schema with defaults and filtering semantics. The tool description does not add further meaning to these parameters, so it relies on the schema's 100% coverage. Baseline score of 3 applies as the description adds no extra parameter context.

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

Purpose4/5

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

The description clearly states the tool shows recent memory changes with a specific verb ('Show') and resource ('memories'). It provides context for what types of changes are relevant (learnings, decisions, facts). While it doesn't explicitly differentiate from siblings like palinode_history, the usage hint suggests a focus on recent period, making the purpose clear.

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 instructs to 'Use to review what was learned, decisions made, or facts updated in the last N days,' providing a concrete use case. It implies the tool is for recent changes but does not mention alternatives or when not to use it. Nevertheless, the guidance is directly actionable.

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

palinode_doctorA
Read-onlyIdempotent

Fast palinode health check (<500ms). Skips network probes and canary writes. Checks path integrity, config consistency, and env-var drift. Use this first; call palinode_doctor_deep when results are unclear.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive. Description adds timing (<500ms), skipping details (network probes, canary writes), and specific checks. Good additional context, though return format not mentioned.

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?

Two concise sentences, front-loaded with key information, no wasted words.

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?

Lacks description of return values (no output schema). For a health check tool, knowing the response structure would be helpful, but the description covers what is checked.

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?

No parameters; schema coverage is 100% (empty schema). Description does not need to elaborate on parameters. Baseline 4 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?

Clearly states it performs a fast health check, specifying what it checks (path integrity, config consistency, env-var drift) and distinguishes from sibling palinode_doctor_deep.

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?

Explicitly advises to use this tool first and to call palinode_doctor_deep when results are unclear, providing clear when-to-use guidance.

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

palinode_doctor_deepA
Read-onlyIdempotent

Full palinode health check including network probes and canary write tests. Takes 10-15s. Use when palinode_doctor reports unclear results or you need to verify the API, watcher, and service connectivity.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate safe read operation (readOnlyHint=true, idempotentHint=true, destructiveHint=false). Description adds useful context: execution time (10-15s) and includes canary write tests (not purely read-only despite hint). No contradiction.

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?

Two sentences, no wasted words. Clearly states purpose, timing, and usage guidance in a compact format.

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?

With zero parameters and no output schema, the description covers all essential information: what it does, how long it takes, and when to use. Sufficient for an agent to select and invoke correctly.

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?

No parameters in input schema, so no explanation needed. Baseline 4 for zero parameters.

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 clearly states it performs a full health check with network probes and canary write tests, taking 10-15s. It distinguishes itself from the sibling tool palinode_doctor by being a deeper check.

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?

Explicitly states when to use: when palinode_doctor reports unclear results or when verifying API, watcher, and service connectivity. Implies palinode_doctor as an alternative for lighter checks.

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

palinode_entitiesA
Read-onlyIdempotent

List all known entities, or get memory files referencing a specific entity.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_refNoOptional entity reference (e.g. person/alice) to lookup files.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true and destructiveHint=false, so the description's behavioral disclosure is adequate but adds little beyond the two modes (list all vs. specific). No additional traits like pagination or rate limits are noted.

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 a single, front-loaded sentence with no unnecessary words. Every word is informative.

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?

For a simple tool with one optional parameter, the description is adequate but could elaborate on what memory files are or the response format. No output schema exists, so more detail would help.

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 covers the single parameter fully (100% coverage). The description mentions its effect briefly but adds no meaning beyond the schema's description.

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 clearly states the tool lists all known entities or retrieves memory files for a specific entity. It uses a specific verb ('List') and resource ('entities'), distinguishing it from siblings like palinode_search or palinode_list.

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

Usage Guidelines3/5

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

Usage is implied: use to list entities or lookup files. However, no explicit when-not-to-use guidance or alternatives among many sibling tools (e.g., palinode_search) are mentioned.

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

palinode_historyA
Read-onlyIdempotent

Show the change history of a memory file. Tracks renames (--follow) and includes diff stats per commit. Use detail='full' for the commit-level evolution view.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of commits to show (default 20)
detailNo'summary' (default) returns hash/date/message/stats. 'full' additionally includes the unified diff body per commit (commit-level evolution view).summary
file_pathYesFile path relative to the memory directory (e.g. people/alice.md)

TDQS

A4/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, and non-destructive behavior, so the description only needs to add context beyond that. It adds useful behavioral facts not present in the schema: 'Tracks renames (--follow)' and 'includes diff stats per commit.' There is no contradiction with the annotations. More detail on output ordering or pagination would be nice, but not necessary for this read operation.

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?

Two concise sentences with no filler. The main purpose is front-loaded, followed by a behavioral note and one targeted usage instruction. Every sentence earns its place.

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

Completeness4/5

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

There is no output schema, but the detail parameter's description in the input schema already explains the return structure for summary and full modes (hash/date/message/stats vs unified diff body). Combined with the tool description's rename tracking and diff stats, the agent has enough information to invoke and parse the tool. Minor details like ordering or pagination are not critical for this read-only history operation.

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 100%, with each parameter already well-documented: limit default, detail enum values, and file_path relative to the memory directory. The description mentions detail='full' but adds no new parameter semantics beyond what the schema already provides, so the baseline 3 applies.

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

Purpose4/5

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

The description begins with 'Show the change history of a memory file,' a specific verb+resource that clearly orients the agent. It also adds distinctive behavior ('Tracks renames (--follow)', 'diff stats per commit') that separates it from related siblings like palinode_diff or palinode_blame, though it does not explicitly name or contrast those alternatives.

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 use case is clearly stated ('change history of a memory file'), and the instruction 'Use detail='full' for the commit-level evolution view' gives concrete guidance on parameter selection. It does not explicitly exclude sibling tools or say when to choose history over blame/diff, but the context is unambiguous enough for correct selection.

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

palinode_ingestA

Fetch a URL and save it as a research reference in Palinode memory.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL to fetch and ingest
nameNoOptional title/name for the reference

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already indicate a write operation (readOnlyHint=false) and potential external side effects (openWorldHint=true). The description adds the specific 'save as research reference' context but does not detail error handling, idempotency, or other behaviors beyond the annotations.

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?

Single sentence with 12 words, front-loaded with the core action, no wasted words. Excellent conciseness.

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 is minimally adequate for a simple two-parameter tool with annotations. However, it lacks information about return values (no output schema), error handling, and the specific meaning of 'research reference' in the Palinode context. Given the number of sibling tools, more context could help differentiation.

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 100%, so the schema already explains both parameters. The description adds no additional meaning beyond the schema (e.g., what constitutes a 'research reference'). Baseline score of 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 clearly states the action ('fetch a URL and save it') and the resource ('research reference in Palinode memory'). It differentiates from siblings like palinode_save by specifying the external fetch aspect.

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

Usage Guidelines3/5

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

The description implies when to use it (when you want to import a web page) but does not explicitly state when not to use it or provide alternatives. No guidance on prerequisites or limitations.

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

palinode_lintA
Read-onlyIdempotent

Scan memory for health issues: orphaned files, stale active files (>90 days), missing frontmatter fields, and potential contradictions. Returns a report without modifying files.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint. The description adds value by specifying the types of health issues scanned and that it returns a report, which aligns with annotations and provides behavioral context beyond the structured fields.

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?

Two sentences, front-loaded with purpose, no fluff. Every sentence is informative.

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

Completeness4/5

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

Given no output schema, the description states it returns a report. Lacks details on report structure, but sufficient for a lint tool context.

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?

The tool has no parameters, so schema coverage is trivially 100%. The description does not need to add parameter information.

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 clearly states the tool scans memory for specific health issues (orphaned files, stale active files, missing frontmatter, contradictions) and returns a report without modifications. It distinguishes itself from siblings by listing the exact checks performed and emphasizing the read-only nature.

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

Usage Guidelines3/5

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

The description implies usage for health checks but does not explicitly state when to use this tool over siblings like palinode_doctor or palinode_orphan_repair. No when-not or alternative guidance is provided.

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

palinode_listA
Read-onlyIdempotent

List memory files, optionally filtered by category or core status. Use to browse what memories exist before reading or searching.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoFilter by category: people, projects, decisions, insights, research
core_onlyNoIf true, only return files with core: true in frontmatter

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds context about filtering but does not contradict annotations. It is not overly detailed beyond what annotations provide.

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 two sentences long with no wasted words. It front-loads the core action and follows with the usage context.

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?

For a simple listing tool with two optional parameters and rich annotations, the description is adequate but does not specify the output format or return value structure, which would be helpful given no output schema.

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%, and both parameters have descriptions in the schema. The description mentions the filtering options but does not add new meaning beyond what the schema provides.

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 clearly states the verb 'list', the resource 'memory files', and the optional filters by category or core status. It distinguishes itself from sibling tools like 'read' and 'search' by mentioning browsing before reading or searching.

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 provides explicit usage guidance: 'Use to browse what memories exist before reading or searching.' This implies when to use it, though it does not explicitly state alternatives or when not to use it.

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

palinode_orphan_repairA
Read-onlyIdempotent

Given a [[wikilink]] whose target file does not exist, return existing memory files semantically near the link target text. Use during wiki-maintenance passes to either propose a redirect (rename the link to point at an existing file) or to create the missing target file with informed context about its semantic neighbours. Accepts either [[name]] or bare name.

ParametersJSON Schema
NameRequiredDescriptionDefault
top_kNoMaximum number of candidate files to return. Default 10.
broken_linkYesThe wikilink text (e.g. '[[alice-meeting]]') or bare target slug.
min_similarityNoMinimum cosine similarity to surface (0.0–1.0). Default 0.65 — looser than dedup_suggest because the LLM picks from a wider slate.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds behavioral context: it is used for broken links, returns existing files, and is safe for maintenance. No contradictions with annotations.

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?

Description is concise (3-4 sentences) and front-loaded with the core function. Every sentence adds necessary context without redundancy.

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

Completeness4/5

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

Given no output schema, the description indicates the return type: existing memory files semantically near the link. It explains the tool's purpose for maintenance. Slightly missing explicit ordering or ranking info, but overall sufficient given parameter hints.

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% with descriptions. The description adds value beyond schema: it clarifies that broken_link accepts both [[name]] and bare name, and explains that min_similarity default is looser than dedup_suggest. This helps the agent understand parameter intent.

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?

Description clearly states the tool's function: given a wikilink to a missing file, return semantically near existing files. It distinguishes from sibling tools like dedup_suggest by specifying the context of orphan repair and the action of proposing redirects or creating new files.

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?

Explicitly mentions usage during 'wiki-maintenance passes' and describes two use cases: proposing a redirect or creating a missing file. However, it does not explicitly state when not to use it or name specific alternatives, though the context is clear.

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

palinode_promptA

List, read, or activate versioned LLM prompts stored as memory files in the prompts/ directory. Use 'list' to browse available prompts, 'read' to view a specific prompt's content, or 'activate' to set a prompt version as active (deactivates others of the same task).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoPrompt name (required for 'read' and 'activate')
taskNoFor 'list': filter by task type
actionYesAction to perform: 'list', 'read', or 'activate'list

TDQS

A4.5/5.0
Behavior4/5

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

Annotations set readOnlyHint=false, destructiveHint=false, etc. The description adds behavioral context: 'activate' deactivates others of the same task, indicating side effects. This goes beyond annotations by disclosing the deactivation behavior.

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 two sentences, front-loading the main purpose and then detailing actions. Every sentence is essential, no 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?

The tool has 3 parameters and no output schema. The description covers all actions, parameter dependencies, and side effects (deactivation). It is sufficient for an agent to correctly invoke the tool.

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 description coverage is 100%. The description adds value by explaining that 'name' is required for 'read' and 'activate', and 'task' is a filter for 'list'. It clarifies parameter usage beyond the schema's basic descriptions.

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 clearly states the tool's purpose: 'List, read, or activate versioned LLM prompts stored as memory files in the prompts/ directory.' It uses specific verbs (list, read, activate) and resource (prompts), distinguishing it from sibling tools that focus on other aspects like doctor, list, etc.

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 provides clear context for each action: 'Use 'list' to browse available prompts, 'read' to view a specific prompt's content, or 'activate' to set a prompt version as active (deactivates others of the same task).' It does not explicitly mention when not to use or alternatives, but the action enum itself covers the main choices.

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

palinode_pushA

Sync memory changes to GitHub for backup and cross-machine access.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations indicate non-read-only, non-destructive, and non-idempotent. The description adds the GitHub context but omits critical behavioral details like authentication requirements, error handling, or potential side effects (network calls). It provides moderate transparency.

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 a single, focused sentence with no redundancy. Every word adds value.

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

Completeness4/5

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

Given the tool has no parameters and no output schema, the description is complete for a simple push action. It covers the essential purpose, though additional context about prerequisites (e.g., GitHub repo setup) would be beneficial.

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?

There are zero parameters, and schema coverage is 100%. Per the rubric, a baseline of 4 applies when no parameters exist, as the description adds no further information.

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 clearly states the tool syncs memory changes to GitHub for backup and cross-machine access. It uses a specific verb ('sync') and resource ('memory changes to GitHub'), and it distinguishes from local operations like palinode_save.

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

Usage Guidelines2/5

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

The description provides no explicit guidance on when to use this tool versus alternatives (e.g., when to push vs. save locally). There are 29 sibling tools, but no differentiation criteria are given.

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

palinode_readA
Read-onlyIdempotent

Read the full contents of a memory file. Use after palinode_list or palinode_search to see the complete content of a specific file.

ParametersJSON Schema
NameRequiredDescriptionDefault
metaNoIf true, the response includes parsed frontmatter alongside the body. Default false (body only) to match prior behavior.
file_pathYesRelative path to the memory file (e.g., 'people/alice.md', 'projects/palinode-status.md')

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint. Description adds minimal context about returning full contents but doesn't elaborate on behavior beyond annotations.

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?

Extremely concise: two sentences, first states purpose, second gives usage guidance. No redundant words.

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?

Adequate for a simple read tool with annotations and full schema coverage. Could mention return value format, but not critical given context signals.

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 descriptions cover both parameters (meta and file_path) fully. Description does not add new semantic information beyond what schema provides.

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?

Clearly states it reads full contents of a memory file. Distinguishes from siblings by suggesting use after list/search for viewing complete content.

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?

Explicitly says to use after palinode_list or palinode_search to see complete content. Provides clear context but doesn't list alternative tools for other operations.

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

palinode_reviewA
Read-onlyIdempotent

Advisory project-memory review. Composes the deterministic health signals (stale files, long-unresolved open questions, open contradictions, orphans, missing descriptions, wiki drift) scoped to a project, and proposes corrective ops (PROPOSE_ARCHIVE/UPDATE/SUPERSEDE). Read-only — proposes, never applies. Omit project to review the whole store.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoProject slug (e.g. 'palinode') or typed ref ('project/palinode'). Omit to review the whole store.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and destructiveHint=false. The description reinforces this with 'Read-only — proposes, never applies', adding behavioral context about the nature of proposals. It also lists the health signals considered, which goes beyond what annotations provide. No contradiction.

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 extremely concise: two sentences that front-load the purpose and immediately address key behavioral and usage details. Every sentence adds value without redundancy.

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

Completeness4/5

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

Given the tool's simplicity (one optional parameter, no output schema, full annotations), the description adequately covers the tool's purpose, behavior, and usage. It lists health signals and proposed operations, which is sufficient for an agent to understand what the tool returns. However, the lack of any detail about the output format or structure (e.g., is it a list of proposals? JSON?) is a minor gap, but not critical given the advisory nature.

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?

The schema already describes the 'project' parameter with explanation of its meaning and default behavior. The description adds the instruction 'Omit `project` to review the whole store', which slightly clarifies usage but does not add significant new meaning beyond the schema. With 100% schema coverage, a baseline score of 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 clearly states the tool's purpose: composing deterministic health signals for a project and proposing corrective operations. It uses specific verbs ('composes', 'proposes') and a resource ('project-memory review'). It distinguishes itself from siblings like palinode_doctor by its advisory and non-applying nature, and by listing specific health signals.

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 provides explicit usage guidance: it is read-only and never applies changes, and it explains how to scope the review to a specific project or the whole store by omitting the 'project' parameter. It does not explicitly contrast with siblings or provide when-not-to-use scenarios, but the guidance is sufficient for safe invocation.

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

palinode_rollbackA
Destructive

Revert a memory file to a previous version. Safe: creates a new commit preserving the old version in history. Defaults to dry run.

ParametersJSON Schema
NameRequiredDescriptionDefault
commitNoTarget commit hash (from palinode_history). Default: previous version.
dry_runNoIf true (default), show what would change without applying.
file_pathYesMemory file path to rollback

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true, so the description adds valuable nuance by stating it is 'Safe' and explaining why: it creates a new commit and preserves the old version. 'Defaults to dry run' is also helpful behavioral context that goes beyond the annotation flags. No contradiction with annotations.

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 two sentences with no filler. Purpose is front-loaded, and the safety note plus dry-run default are packed into the second sentence without bloat.

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

Completeness4/5

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

For a simple 3-parameter tool with no output schema, the description covers what the tool does, why it is safe, and its default dry-run behavior. The schema covers the remaining parameter details. It could be slightly more explicit about what a non-dry-run rollback actually changes, but the current description is still adequately complete.

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 100%, so the schema already documents file_path, commit, and dry_run, including the dry_run default and the commit source from palinode_history. The description mostly restates the revert/previous-version concept and adds no additional parameter-level nuance.

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

Purpose4/5

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

The description states a specific action and resource: 'Revert a memory file to a previous version.' It also adds key semantics like 'creates a new commit preserving the old version in history,' which clarifies the operation, though it does not explicitly name sibling tools to differentiate from palinode_history or palinode_diff.

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

Usage Guidelines2/5

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

The description gives no clear 'when to use this vs alternatives' guidance. The only indirect cue is in the schema where commit is described as coming from palinode_history, but the tool description itself does not explain when rollback should be chosen over other memory tools.

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

palinode_saveA

Save a memory (fact, decision, insight, project update) worth keeping across sessions. Requires exactly one of type or ps=true. On timeout the save may still have committed — palinode_search a distinctive phrase before retrying, or you'll duplicate it.

ParametersJSON Schema
NameRequiredDescriptionDefault
psNoShorthand for type=ProjectSnapshot (the CLI `--ps` flag). If true, omit `type`; any other type value errors.
coreNoIf true, this memory is always injected at session start (core memory).
slugNoOptional URL-safe filename slug (auto-generated if omitted)
typeNoMemory type. Required unless `ps=true` is given.
titleNoHuman-readable title, used in list/search displays.
claimsNoBinds each claim to the source span justifying it. Read back via palinode_blame(claims=true).
sourceNoSource surface that created this memory.
contentYesThe memory content to save (markdown supported)
projectNoProject slug shorthand — 'palinode' becomes entity 'project/palinode'.
sourcesNoCitation anchors for passages this memory quotes.
entitiesNoRelated entity refs e.g. ['person/alice', 'project/alpha']
metadataNoAdditional frontmatter fields to merge into the saved memory.
priorityNoHuman-assigned memory priority (1–5). Stored as `priority` frontmatter; missing means normal (3).
backed_byNoRefs (category/slug) that support/back this memory (evidence links).
epistemicNoKind of claim: fact=observed, inference=derived, open_question=unresolved, unverified=asserted but unchecked. Omit to leave unmarked — unmarked is NOT fact.
confidenceNoConfidence in this memory's accuracy (0.0-1.0).
contradictsNoRefs (category/slug) this memory conflicts with; neither wins — surfaced for review.
external_refsNoSDLC object references such as github_pr or jira_issue.
update_policyNoSave behavior: append episodic memory or replace a living document.

TDQS

A3.9/5.0
Behavior4/5

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

It discloses a non-obvious behavioral trait: save may commit despite a timeout, and duplicate risk on retry. This goes beyond the annotations, which only state readOnly/idempotent hints (false). It adds useful operational context without contradicting the annotations.

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 two sentences, front-loaded with the action, and includes the most critical usage constraint and a caveat. Every clause earns its place with no redundancy or filler.

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?

Given the tool's complexity (19 params, nested objects, no output schema), the description covers the core constraint and timeout edge case but omits broader behaviors like whether save is an upsert, what is returned, or how it interacts with existing memories. The schema fills parameter-level gaps, but the description alone doesn't fully document the save workflow.

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 100%, and each parameter already has descriptive comments. The description only restates the mutual exclusion between `type` and `ps`, which is already in the schema. This is a baseline 3: schema does the heavy lifting and the description adds little extra meaning.

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

Purpose4/5

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

The description clearly states the verb and resource: 'Save a memory... worth keeping across sessions.' It enumerates memory types (fact, decision, insight, project update), making the purpose concrete. However, it doesn't explicitly differentiate from sibling tools like palinode_ingest or palinode_consolidate, so it falls short of a 5.

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 provides an explicit prerequisite ('Requires exactly one of `type` or `ps=true`') and practical retry guidance ('On timeout... palinode_search a distinctive phrase before retrying'). This is clear when-to-use context, though it doesn't compare this tool against alternatives for general use, so not a full 5.

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

palinode_session_endA

Call at the end of a coding or chat session to capture key outcomes to persistent memory. Writes a session summary to today's daily notes and appends status to relevant project files. Provide a brief summary of what was accomplished, decisions made, and any blockers.

ParametersJSON Schema
NameRequiredDescriptionDefault
pushNoPush the memory repo after committing the session note.
sourceNoSource surface that created this memory (e.g., 'claude-code', 'cursor', 'api'). Auto-detected if omitted.
dry_runNoValidate and render the entry without writing, committing, or pushing anything. Use to check a payload before committing it, or to diagnose a failing session-end without leaving entries behind in the daily note.
projectNoProject slug to append status to (e.g., 'palinode'). Auto-detected if omitted.
summaryYesWhat was accomplished in this session (1-3 sentences)
blockersNoOpen blockers or next steps (optional)
decisionsNoKey decisions made (optional)

TDQS

A4/5.0
Behavior4/5

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

The description adds behavioral context beyond annotations by disclosing it writes to today's daily notes and appends status to project files. It doesn't mention commit/push behavior, but the schema's push parameter covers that, and the description does not contradict annotations.

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?

Three sentences, front-loaded with the trigger and core action, then side effects, then user guidance. Every sentence earns its place with no redundancy.

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

Completeness4/5

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

The description is sufficient for a session-ending tool with 7 parameters, given that the schema covers all parameter details. It explains the main side effects and what the user should provide, though it could mention the optional dry_run for testing but that is covered in the schema.

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 baseline is 3. The description adds a brief mapping by mentioning 'accomplished, decisions made, and any blockers' to summary/decisions/blockers, but it does not add significant meaning beyond the schema for parameters like push, source, or dry_run.

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

Purpose4/5

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

The description clearly states the tool writes a session summary and appends status to project files, giving a specific verb+resource. However, it does not explicitly distinguish from sibling tools like palinode_save, relying on the name and title for differentiation.

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 'Call at the end of a coding or chat session', which is a clear temporal trigger. It does not mention when NOT to use it or name alternative tools, but the context is unambiguous.

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

palinode_session_initA
Read-onlyIdempotent

Session-start context: call this FIRST in a new conversation. Returns the resolved project scope with recent session snapshots, core memories, recent decisions, and open action items as a bounded digest.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNoWorking directory used to resolve the project scope. Defaults to the server process CWD when omitted.
projectNoExplicit project slug or entity ref; overrides cwd resolution.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations (readOnlyHint, idempotentHint, destructiveHint) already indicate safe, non-destructive behavior. The description adds value by explaining the tool returns a 'bounded digest' and listing its components, but it does not contradict annotations. No side effects or additional behavioral traits are disclosed beyond what annotations imply.

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 two sentences, front-loaded with the core purpose ('Session-start context'), and each sentence provides essential information with no redundancy or fluff.

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

Completeness4/5

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

Given the lack of an output schema, the description adequately explains the return value ('resolved project scope with... bounded digest'). It covers the essential aspects for a session init tool, though it could mention error handling or behavior on repeated calls, which is mitigated by the idempotent hint.

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 100%, and the description adds minimal information beyond what the schema already provides (default CWD behavior). The description does not elaborate on parameter semantics, so it meets the baseline for high coverage but does not exceed it.

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 clearly states the purpose ('Session-start context') and specifies that it should be called first in a new conversation. It also details the return content (project scope, session snapshots, core memories, etc.), distinguishing it from sibling tools that are not initialization tools.

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 'call this FIRST in a new conversation,' providing clear usage context. However, it does not mention when not to use it or suggest alternatives, though the sibling tool names imply that other tools are for different operations.

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

palinode_statusA
Read-onlyIdempotent

Check Palinode health: API reachability, index stats, last watcher run.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, non-destructive. Description adds specific health checks (API reachability, index stats, last watcher run), providing valuable behavioral context beyond annotations.

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?

Very concise single sentence, front-loaded with the action ('Check Palinode health'). No unnecessary words. Efficient and clear.

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

Completeness4/5

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

Adequate for a zero-parameter health check with good annotations. The description lists what is checked, but could improve by mentioning the output format (e.g., JSON status object).

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?

No parameters, so the description naturally does not need to explain them. The schema coverage is 100% (empty properties), and the tool's purpose is clear without parameter details.

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?

Description clearly states the tool checks Palinode health, listing specific aspects: API reachability, index stats, last watcher run. This distinguishes it from siblings like palinode_doctor (likely more detailed) and palinode_doctor_deep.

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

Usage Guidelines3/5

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

Implied use for quick health check but no explicit when-to-use or when-not-to-use. No alternatives mentioned. The description is sufficient for basic guidance but lacks explicit directives.

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

palinode_topic_coverageA
Read-onlyIdempotent

Given a topic phrase (not a file), check whether any wiki page already covers it. Returns {covered: bool, best_match: str | null, similarity: float}. Use BEFORE ingesting new content to ask 'is this already covered?'. Different framing from palinode_dedup_suggest: takes a short topic phrase rather than full draft content, and answers the binary 'already covered?' question.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesTopic phrase to check coverage for (e.g. 'machine learning deployment').
min_similarityNoMinimum cosine similarity to count as 'covered' (0.0–1.0). Default 0.78.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and idempotentHint true, destructiveHint false. Description adds context about return fields and usage, consistent with annotations.

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?

Concise, two sentences plus a comparison. No fluff, well-structured, immediately conveys purpose and usage.

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 low complexity (2 params, no output schema), description fully covers what the tool does, how to use it, when to use it, and return format. No gaps.

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 covers 100% of parameters with descriptions. Description adds no additional parameter meaning beyond the schema, so baseline 3.

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?

Description clearly states verb 'check' and resource 'wiki page coverage' for a topic phrase. Differentiates from sibling palinode_dedup_suggest by specifying input type and binary output.

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?

Explicitly says 'Use BEFORE ingesting new content' and contrasts with palinode_dedup_suggest, guiding when to use this tool vs alternative.

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

palinode_traceA
Read-onlyIdempotent

Compose the full provenance lineage of a memory file into one view: source citations, when it was first saved and last changed, the supersession trail, typed contradiction/evidence links, and how often it has been recalled. Rows whose provenance is not yet captured render an honest placeholder. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_pathYesMemory file path (e.g., 'decisions/auth-session-tokens.md')

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description's 'Read-only' tag is redundant but consistent. The description adds value by revealing that rows with uncaptured provenance render an 'honest placeholder', a behavioral trait not covered by annotations. No contradictions.

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 description is concise, using a single comma-separated list to enumerate output components and a separate sentence for the placeholder behavior. It ends with 'Read-only' which is slightly redundant given annotations, but overall efficient and front-loaded with the main action.

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

Completeness4/5

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

Given the simple parameter, absence of output schema, and comprehensive annotations, the description sufficiently explains what the tool returns and its behavior. The placeholder disclosure adds completeness. No missing critical information for an agent to invoke the tool correctly.

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% with a clear description for the single parameter 'file_path'. The tool description does not add additional semantics beyond what the schema provides, so the baseline score of 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 clearly states the tool composes the 'full provenance lineage' of a memory file, listing specific components (source citations, timestamps, supersession trail, contradiction/evidence links, recall count). This verb+resource specification distinguishes it from sibling tools like palinode_blame or palinode_history, which focus on different aspects.

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 provides clear context on what the tool outputs and implies its use for viewing comprehensive provenance. It does not explicitly state when-not-to-use or name alternatives, but the specific mention of 'provenance lineage' and components gives sufficient guidance for an agent to select it over siblings.

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

palinode_triggerA

Register or manage a prospective trigger for Palinode. When a future user message semantically matches the description, the specified memory file will be automatically injected.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform: 'create', 'list', or 'delete'create
thresholdNoFor 'create': Similarity threshold (0.0–1.0). Higher = stricter match required to fire. Default 0.75.
trigger_idNoFor 'delete' or 'create': Custom UUID or ID to delete/create
descriptionNoFor 'create': What context should fire this trigger (e.g., 'User is discussing deployment')
memory_fileNoFor 'create': Relative path to the memory file to inject when fired (e.g., 'projects/my-app.md')
cooldown_hoursNoFor 'create': Hours to wait between consecutive firings of the same trigger. Default 24.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations are neutral (no readOnlyHint, etc.), and the description adds value by explaining the trigger mechanism and automatic injection. It does not detail permissions or failure modes, but overall provides sufficient behavioral context.

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?

Two sentences: first states purpose, second explains behavior. No fluff, front-loaded, and every sentence adds value. Exemplary conciseness.

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

Completeness4/5

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

For a tool with no output schema, the description omits return values (e.g., what list returns). However, the parameter schema covers actions well, and the description gives enough to understand the tool's role. Slightly incomplete but still effective.

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 baseline is 3. Description adds context by explaining how semantic matching triggers injection, which clarifies the role of parameters like 'description' and 'memory_file'. This extra context raises the score.

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 clearly states the tool's purpose: managing triggers that inject memory files upon semantic match. It distinguishes from siblings like palinode_list by focusing on trigger management.

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 explains the tool's function (setting up automatic memory injection) but does not explicitly state when not to use it or provide alternatives. The context is clear enough for an agent to infer appropriate use.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 4 tool updatesv0.14.0
    • Changedpalinode_blame2 fields changed
      • removedInput schema / properties / file
        Removed value: -{
        -  "description": "Deprecated alias for `file_path`; use `file_path` instead.",
        -  "type": "string"
        -}
      • addedInput schema / required
        Added value: +[
        +  "file_path"
        +]
    • Changedpalinode_history1 field changed
      • changedInput schema / properties / detail / description
        Previous value: -"'summary' (default) returns hash/date/message/stats. 'full' additionally includes the unified diff body per commit (commit-level evolution view, formerly palinode_timeline)."New value: +"'summary' (default) returns hash/date/message/stats. 'full' additionally includes the unified diff body per commit (commit-level evolution view)."
    • Changedpalinode_rollback2 fields changed
      • removedInput schema / properties / file
        Removed value: -{
        -  "description": "Deprecated alias for `file_path`; use `file_path` instead.",
        -  "type": "string"
        -}
      • addedInput schema / required
        Added value: +[
        +  "file_path"
        +]
    • Removedpalinode_timeline
  2. 1 tool updatev0.13.0
    • Changedpalinode_search3 fields changed
      • changedInput schema / properties / limit / default
        Previous value: -10New value: +15
      • changedInput schema / properties / limit / description
        Previous value: -"Max results to return (default 10)"New value: +"Max results to return (default 15)"
      • addedInput schema / properties / limit / maximum
        Added value: +50
  3. 1 tool updatev0.10.1
    • Changedpalinode_consolidate1 field changed
      • addedInput schema / properties / sources
        Added value: +{
        +  "description": "Memory directories to consolidate, e.g. `[\"insights\"]`.  Defaults to `daily` only.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
  4. 2 tool updatesv0.10.0
    • Changedpalinode_save13 fields changed
      • changedInput schema / properties / claims / description
        Previous value: -"Claim-level source anchors: list of {text, source_id, span:{quote, quote_hash}} bindings resolving each claim to the source span that justifies it. claim_id is derived on save; read back via palinode_blame with claims=true."New value: +"Binds each claim to the source span justifying it. Read back via palinode_blame(claims=true)."
      • changedInput schema / properties / claims / items / properties / anchor_id / description
        Previous value: -"Optional opaque pointer within a large source (interop; nullable)."New value: +"Optional pointer within a large source."
      • changedInput schema / properties / claims / items / properties / claim_id / description
        Previous value: -"Optional stable claim id; content-addressed, derived on save if omitted."New value: +"Optional; derived on save."
      • changedInput schema / properties / claims / items / properties / source_id / description
        Previous value: -"Path under the memory dir of the source that justifies the claim (a sources[].ref)."New value: +"A sources[].ref that justifies the claim."
      • changedInput schema / properties / claims / items / properties / span / properties / quote / description
        Previous value: -"The exact passage in the source that justifies the claim."New value: +"The justifying passage in the source."
      • changedInput schema / properties / claims / items / properties / span / properties / quote_hash / description
        Previous value: -"Optional integrity hash; computed on save if omitted."New value: +"Optional; computed on save."
      • changedInput schema / properties / epistemic / description
        Previous value: -"Epistemic marker: 'fact' (observed/verified), 'inference' (derived, lower trust), 'open_question' (unresolved), or 'unverified' (asserted but not checked). Omit to leave the memory unmarked (no claim is made — not treated as fact)."New value: +"Kind of claim: fact=observed, inference=derived, open_question=unresolved, unverified=asserted but unchecked. Omit to leave unmarked — unmarked is NOT fact."
      • changedInput schema / properties / project / description
        Previous value: -"Project slug shorthand — e.g. 'palinode' becomes entity 'project/palinode'.  Pairs with `palinode_session_end`'s `project` field for consistent project tagging across save and session-end."New value: +"Project slug shorthand — 'palinode' becomes entity 'project/palinode'."
      • changedInput schema / properties / ps / description
        Previous value: -"Shorthand for type=ProjectSnapshot — matches the CLI `--ps` flag and the `/ps` slash command. If true, `type` may be omitted (or set to ProjectSnapshot redundantly); other type values conflict and error."New value: +"Shorthand for type=ProjectSnapshot (the CLI `--ps` flag). If true, omit `type`; any other type value errors."
      • changedInput schema / properties / sources / description
        Previous value: -"Source-citation anchors: list of {ref, quote, quote_hash} for passages this memory cites."New value: +"Citation anchors for passages this memory quotes."
      • changedInput schema / properties / sources / items / properties / quote / description
        Previous value: -"The exact passage cited from the source."New value: +"The exact passage cited."
      • changedInput schema / properties / sources / items / properties / quote_hash / description
        Previous value: -"Optional integrity hash; computed on save if omitted."New value: +"Optional; computed on save."
      • changedInput schema / properties / title / description
        Previous value: -"Optional human-readable title.  Stored in frontmatter and used in list/search displays."New value: +"Human-readable title, used in list/search displays."
    • Changedpalinode_session_end1 field changed
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "description": "Validate and render the entry without writing, committing, or pushing anything. Use to check a payload before committing it, or to diagnose a failing session-end without leaving entries behind in the daily note.",
        +  "type": "boolean"
        +}
  5. 30 tool updatesv0.9.5
    • First observedpalinode_archive
    • First observedpalinode_archive_expired
    • First observedpalinode_blame
    • First observedpalinode_cluster_neighbors
    • First observedpalinode_consolidate
    • First observedpalinode_dedup_suggest
    • First observedpalinode_depends
    • First observedpalinode_diff
    • First observedpalinode_doctor
    • First observedpalinode_doctor_deep
    • First observedpalinode_entities
    • First observedpalinode_history
    • First observedpalinode_ingest
    • First observedpalinode_lint
    • First observedpalinode_list
    • First observedpalinode_orphan_repair
    • First observedpalinode_prompt
    • First observedpalinode_push
    • First observedpalinode_read
    • First observedpalinode_review
    • First observedpalinode_rollback
    • First observedpalinode_save
    • First observedpalinode_search
    • First observedpalinode_session_end
    • First observedpalinode_session_init
    • First observedpalinode_status
    • First observedpalinode_timeline
    • First observedpalinode_topic_coverage
    • First observedpalinode_trace
    • First observedpalinode_trigger

TDQS

A3.6/5.0
Disambiguation3/5

Most tools target distinct operations, but there are overlapping clusters: status/doctor/doctor_deep, lint/review, and topic_coverage/dedup_suggest all sit on similar semantic ground. The descriptions do clarify the intended use, so an agent can disambiguate, but only with careful reading.

Naming Consistency3/5

All tools share the palinode_ snake_case prefix, which provides some consistency, but the pattern beyond that is mixed: bare verbs (save, read, search), nouns (status, history, entities), and compound names (dedup_suggest, orphan_repair, doctor_deep). It is readable and predictable at the prefix level, but not a consistent verb_noun convention.

Tool Count2/5

With 29 tools, the surface is well beyond the typical well-scoped 3-15 range. Many tools exist for narrow maintenance, health, and provenance scenarios, making the set feel heavy and harder for an agent to navigate efficiently.

Completeness4/5

The set covers the core memory lifecycle well: session init/end, save, list, read, search, archive, rollback, history, provenance, health checks, syncing, and dedup. Minor gaps like a first-class explicit update/rename tool or prompt creation are workarounds via save or manual handling, but no critical dead ends are visible.

Maintenance

ActivityActive
ResponsivenessWithin a week

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Open, Git-native memory protocol for MCP agents: stores memories as Markdown files in a Git repo, enabling portability, auditability, and human-editable memory across different AI agents.
    68
    15
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    A personal memory engine and MCP server that stores durable facts in markdown files managed via git, enabling hybrid search (lexical + semantic) through an MCP interface for persistent context across LLM sessions.
    3
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    A local MCP server that provides agents with tools to list, read, search, inspect history and diffs, and capture unstructured text in a user-owned Git repository of durable memory.
    5
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server providing persistent, local-first memory for AI agents via Markdown files in a git repo, with search, branching, and auditability.
    17
    2
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/phasespace-labs/palinode'

If you have feedback or need assistance with the MCP directory API, please join our Discord server