keepygaga
This server is the Keepygaga core-memory MCP server: it lets agents read and deliberately maintain a small Markdown-based long-term memory across hosts.
list – Get the live catalog of canonical memory page paths, descriptions, and aliases.
read – Read up to 20 canonical pages at once, returning their Facts, opaque write versions, and capacity signals.
create – Create new dynamic memory pages under
topics/,areas/, orpeople/, with descriptions, aliases, and initial Facts.add – Append independent Facts to existing pages, using version snapshots to avoid conflicts.
update – Replace an exact Fact or update page metadata (description/aliases) with optimistic version checks.
move – Move exact Facts between existing pages using both pages' latest snapshots.
rename – Rename dynamic pages to new canonical slugs.
delete – Delete exact Facts or whole dynamic pages, but only after explicit current-turn user authorization.
Write discipline – Mutations are batch-validated, version-guarded, and designed so agents can reuse returned snapshots instead of repeatedly reading or listing.
Allows Hermes agents to use the same shared core memory, letting them read and update durable user facts and memory pages across sessions and hosts.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@keepygagaRemember that I prefer meetings in the morning."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Keepygaga
A small, deliberate core memory shared by every coding agent.
AI agents do not get better by remembering everything. If every conversation, temporary state, and project detail is pushed into long-term memory, useful facts are buried under stale and irrelevant context. Memory without selection is noise.
Keepygaga keeps only a small set of durable facts that remain useful across tasks: who the user is, how they want an Agent to work, and a few ongoing topics, projects, responsibilities, or relationships. Temporary state stays in the current conversation or its direct source, such as a calendar, task manager, project documentation, issue tracker, or Git history. A fact enters core memory only when it has been deliberately judged useful across tasks.
That carefully selected core memory belongs to the user and follows them across Codex, Claude Code, WorkBuddy, Grok, Hermes, and Antigravity CLI instead of being trapped in separate host silos. Its source of truth is readable Markdown in one private Memory Root, preferably inside an Obsidian vault; any Markdown editor remains compatible.
The product has three deliberately separate surfaces:
Obsidian or another Markdown editor is where people inspect, correct, and organize memory.
MCP, Hooks, and the Agent Contract let agents read and update that memory under explicit constraints.
The
keepygagaCLI is a thin installation and operations control plane for host wiring, status, diagnostics, repair, upgrades, and uninstall. It is not a daily memory browser or editor.
Keepygaga ships the complete runtime: an eight-tool MCP server, a concise global Agent Contract, built-in cross-host Hooks, and the CLI control plane. It does not require a database, embeddings, a source checkout, or an external Hook runtime. Obsidian is the recommended human interface, not a runtime dependency.
Core memory contains profile.md, preferences.md, and direct pages below topics/, areas/, and people/. Ongoing projects share the optional canonical index areas/projects.md, created with its first project Fact: one Fact per project holds a brief, its canonical Authority, and its latest verified integrated outcome and release status when available, with later changes replacing that Fact and no major-milestone threshold. For Git projects, verify the canonical remote primary branch; record a published version only when a published Release points to a tag commit containing that outcome. Complete history, terminology, architecture, operating guides, decisions, and current state remain in the repository or another direct project source.
Host-native memories can continue to own host-specific conversation recall and project learning. Keepygaga owns the small set of stable user facts that should follow the user across hosts. A durable instruction admitted to source selection has exactly two possible owners: preferences.md when every connected Agent should follow it, or one host's effective global-rules entry when only that Agent should. Prose style and code style do not determine ownership by themselves. When the user has not specified the intended scope, the Agent must ask first, and one meaning may have only one source. Project rules stay in the project Authority and do not enter this choice.
The public MCP surface is exactly list, read, create, add, update, move, rename, and delete.
Session bootstrap injects only profile.md, preferences.md, a shared routing rule, and descriptions of the three dynamic scopes. Agents treat those descriptions as first-stage semantic routes: when a task depends on covered information that the current request or a live direct source does not already provide, they call list for that scope and select pages from the returned path, description, and aliases before reading them. New or semantically updated Facts receive a Store-owned local date suffix; existing undated Facts remain readable and upgrades do not rewrite the Memory Root.
Contract 3 users with existing project pages should follow the project-index migration before their next project-memory write under the current Agent Contract.
Install
Requirements: Python 3.12+ and uv.
Agent-guided installation (recommended)
Give the Agent host you are currently using this one sentence:
Quickly install or update Keepygaga for the Agent you are running in now from the latest official Release at https://github.com/TimWongUp/keepygaga: automatically choose install, update, current-host repair, or no action; preserve existing configuration and memory; ask me only for first-time initialization, a conflict, or a possible overwrite; then report the result and any restart requirement.
The Agent Fast Install To-do is the authoritative procedure for this path. It checks the installed version before downloading, limits work to the selected lifecycle branch and current Agent, and reuses existing data. The heavier Home Page source migration is loaded only for first initialization or a concrete duplicate. Host-native memory remains unchanged; when requested, the Agent supplies current official host documentation for user-managed configuration.
Manual installation
Download the keepygaga-X.Y.Z-py3-none-any.whl asset and SHA256SUMS from the same latest GitHub Release to private, non-symlinked paths. Immediately before installation, verify the exact wheel's SHA-256 entry and execute that same absolute path, replacing X.Y.Z below with the release version:
uv tool install /absolute/private/path/keepygaga-X.Y.Z-py3-none-any.whl
uv tool update-shellRestart the terminal so the tool directory is on PATH, then run keepygaga install.
The checksum detects corruption or an asset mismatch. It is not a signature, provenance proof, independent publisher authentication, or verification of dependencies resolved from the package index.
Interactive installation first offers a Memory Root path, then detects available hosts without selecting them on the user's behalf. Point it at an existing agents-memory tree to connect another Agent to the same memory. Once configured, later installs reuse that root automatically. Automation must name every target explicitly:
keepygaga install --yes --host codex --host claude-codeSupported adapters are Codex, Claude Code, WorkBuddy, Grok, Hermes, and Antigravity CLI. Each adapter manages only its keepygaga MCP registration, the Keepygaga-owned Agent Contract block, and Keepygaga-owned Hook entries. Unrelated host configuration is preserved.
The default configuration and memory paths are platform-native. To reuse an existing private memory tree non-interactively, pass --memory-root during the first install. Do not place the memory tree in a public or automatically published directory.
New installations include five optional memory-capacity settings with the current defaults and adjustment notes. Existing configuration files are never rewritten. Edit the live config.toml; the next MCP call reloads these Store-only limits without requiring a schema refresh:
[memory.limits]
# Raise for richer profile/preferences; lower to reduce baseline context.
fixed_page_chars = 2000
# Raise for fewer, larger routed pages; lower to encourage earlier splitting.
dynamic_page_chars = 5000
# Raise to allow more topic pages; lowering never deletes existing pages.
topics_pages = 50
# Raise to allow more area pages; lowering never deletes existing pages.
areas_pages = 50
# Raise to allow more people pages; lowering never deletes existing pages.
people_pages = 100Every value must be a positive integer. Lower limits report existing excess through Doctor and constrain later growth; they do not delete or rewrite memory. The bounded repair input is derived as twice dynamic_page_chars.
Related MCP server: aurum-recall
Operate
keepygaga status
keepygaga status --latest-version vX.Y.Z --host codex
keepygaga repair --yes
keepygaga doctor --json
keepygaga uninstall --yesstatus treats the install-state file as discovery data only and reports when live host verification is still required. With the latest official release tag and current host, it returns a read-only lifecycle action: update, initialize, activate, repair, no_op, or manual_review. A missing launcher is the separate clean-install case. repair reconciles recorded hosts from their current configuration. uninstall removes only Keepygaga host wiring; it preserves the configuration and memory tree.
For a current-host-only update, download the newer wheel and matching SHA256SUMS, rehash the exact absolute wheel path, set UV_TOOL_DIR to the lifecycle.tool_root returned by planned status for that command, run uv tool install --force /absolute/private/path/keepygaga-X.Y.Z-py3-none-any.whl, then run keepygaga install --yes --host HOST. Run keepygaga repair --yes instead only when you intentionally want to reconcile every recorded host.
Advanced deterministic host commands remain available as keepygaga host setup|uninstall HOST.
How integration works
keepygaga-mcpis the stable MCP launcher used by host registrations.The short managed Agent Contract contains only durable safety and routing rules.
The full read, convergence, mutation, conflict, and receipt protocol is delivered through negotiated MCP server instructions (modern discovery or the legacy initialize handshake).
Built-in Context Bootstrap and stateless Memory Route reminders are projected through each host's supported native events. Routing reminders include completion checks; there is no PostToolUse closeout Hook. Unsupported surfaces use documented fallbacks; Grok uses the managed Agent Contract for memory guidance.
Application, Agent Contract, Hook protocol, installer state, and memory schema versions evolve independently.
Configuration-level tests prove projection, preservation, idempotency, and failure boundaries. A host is live-verified only after its real client or official diagnostic confirms the keepygaga registration and all eight tools.
Development
uv sync
uv run pytest -q
uv run ruff check .
uv run pyright
uv run python scripts/smoke_mcp_server.py
uv build
uv run python scripts/check_distribution.py dist/*The keepygaga-knowledge sibling project is separate and is neither packaged nor imported by Keepygaga. See Architecture, Operations, and Contributing.
Acknowledgements
Keepygaga's core memory design was inspired by Claude Code's memory system.
Thanks also to the Claude Code team for their pioneering work on AI memory.
Security and license
Memory files are trusted local input and may contain personal data. Keep the memory root private, review changes before committing them anywhere, and report vulnerabilities through GitHub private vulnerability reporting.
MIT licensed. See LICENSE.
Available Tools
8 toolsaddADestructive
Add independent Facts and optionally replace the page description using its latest Page Snapshot. Group Facts for one page in one operation. On applied, reuse returned Page Snapshots and receipts; do not verify with read or list.
| Name | Required | Description | Default |
|---|---|---|---|
| operations | Yes | Fact additions validated as one batch; each path must be unique. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false; the description confirms this by saying the page description may be 'replace[d]'. It adds meaningful context beyond annotations: the operation is snapshot-versioned ('using its latest Page Snapshot'), batch-validated, and returns snapshots/receipts that should be reused rather than verified via read/list — a workflow contract the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: core purpose, batching rule, and post-apply workflow. The main function is front-loaded in sentence one, and there is zero filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderately complex batch-write tool, the combination is complete: a rich 100%-coverage schema documents every parameter, annotations cover the safety profile, an output schema exists, and the description supplies the missing operational nuance (snapshot provenance, no-verify rule, grouping). The only small gap is that the description never explains where the initial Page Snapshot comes from, though the schema's if_version description partially covers this.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents operations, path, if_version, facts, basis, content, and description. The description adds only marginal value by linking 'latest Page Snapshot' to the if_version parameter and reinforcing the batching semantics of operations. At 100% coverage the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Add independent Facts' to a page, with a secondary behavior of optionally replacing the page description. This clearly separates it from read/list in intent. However, it does not explicitly distinguish itself from the closely related mutation siblings create and update — the differentiation is implied by the word 'Add' rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives operational guidance: 'Group Facts for one page in one operation' (batching instruction) and 'do not verify with read or list' (an explicit when-not for named alternatives). But it lacks selection criteria for the primary choice among mutation siblings — an agent is not told when to choose add over create or update for adding facts vs. modifying existing content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
createA
Create new dynamic pages after full-batch validation. On applied, reuse returned Page Snapshots and receipts; do not call read or list solely to verify success.
| Name | Required | Description | Default |
|---|---|---|---|
| operations | Yes | Page creations validated as one batch; repeated paths are rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are mostly negative flags and provide little behavioral context. The description adds meaningful behavior: full-batch validation, applied-mode side effects, and a prohibition on verification reads. It does not describe failure or partial-failure behavior, but the added context is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first scopes the action, and the second provides the most important post-call behavior and an explicit exclusion of read/list verification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich input schema and an output schema available, the description covers the key operational context: batch validation, snapshot/receipt reuse, and not re-reading to verify. Minor gaps are the undefined 'dynamic pages' term and lack of failure behavior, but they do not block correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, operations, is fully documented in the schema including CreateOperation fields, constraints, and repeated-path rejection. The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Create new dynamic pages after full-batch validation.' The batch behavior is clear, but 'dynamic pages' is not defined and the sibling 'add' is not explicitly differentiated, so it does not earn a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit post-call guidance: reuse returned Page Snapshots and receipts, and do not call read or list solely to verify success. This is strong when-not/alternative guidance, though it does not clarify when create should be chosen over the sibling add.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deleteADestructive
Delete exact Facts with an optional page description, or delete dynamic pages, only after explicit current-turn user authorization. On applied, reuse surviving Page Snapshots and receipts; do not verify with read or list.
| Name | Required | Description | Default |
|---|---|---|---|
| operations | Yes | Authorized exact deletions; each path must be unique. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as destructive, but the description adds substantial behavioral context: the authorization prerequisite, the two distinct delete targets, and the unusual post-apply instruction to reuse surviving Page Snapshots and receipts rather than re-verifying. This goes well beyond the structured annotation hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with no filler. The core action and authorization gate are front-loaded, and the post-apply guidance about reuse and non-verification earns its place by conveying critical workflow details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive write operation with a detailed schema, annotations, and output schema, the description supplies the necessary prerequisites, acceptable targets, and post-apply behavior. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with rich per-property explanations for path, if_version, target, authorization, and FactSelector. The description adds only high-level context such as optional page description and exact facts, which is useful but not necessary since the schema already documents all parameters thoroughly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resources: 'Delete exact Facts with an optional page description, or delete dynamic pages.' This clearly distinguishes the tool from siblings like read, list, move, and update, and leaves no doubt about what operation it performs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states the required condition: 'only after explicit current-turn user authorization.' It also gives direct behavioral guidance by saying 'do not verify with read or list,' which steers the agent away from sibling tools and clarifies the expected workflow after deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listARead-onlyIdempotent
Return one complete live topics, areas, or people Route Catalog. No search, matching, pagination, Facts, or write versions.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/idempotent/destructive behavior. The description adds useful traits beyond annotations: it returns a 'complete' and 'live' snapshot, and explicitly rules out search, matching, pagination, Facts, and write variants. This is meaningful addition, though it could disclose response size or performance behavior in more detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one sentence with the primary action front-loaded and the exclusions packed into a short, scannable list. Every clause earns its place; there is no filler or redundant restating of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and a single enum parameter, the description covers the key operational constraints: complete return, live data, no pagination/search/write behavior. It is slightly incomplete in not explaining what a 'Route Catalog' is or what 'Facts' means, but that does not block a competent agent from invoking list correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no parameter descriptions (0% coverage), so the description must compensate. The description does repeat the three scope choices from the enum and relates them to the Route Catalog, but it adds little semantic detail beyond the enum values themselves. For a single required enum parameter this is adequate but not rich.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb (Return) and resource (topics, areas, or people Route Catalog), and the scope enum makes the target resource concrete. It does not, however, name the sibling 'read' tool or explain the difference between listing the full catalog and reading a single entry, so sibling differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'No search, matching, pagination, Facts, or write versions' gives clear when-not-to-use guidance and implies that other sibling tools handle those operations. It stops short of naming those alternatives explicitly, so an agent must infer which sibling to switch to for search or single-item reads.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moveADestructive
Move exact Facts and optionally replace source or existing-destination descriptions, or atomically create a bounded new destination. Preserve Fact dates and leave at least one source Fact. On applied, reuse returned Page Snapshots and receipts; do not verify with read or list.
| Name | Required | Description | Default |
|---|---|---|---|
| operations | Yes | Exact Fact moves validated as one batch. Use one operation per disjoint source/destination pair and include all Facts for that pair in facts; every page path may appear only once across the batch. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses atomic creation, preservation of Fact dates, the invariant that at least one source Fact must remain, and the side-effect protocol to reuse returned Page Snapshots and receipts instead of re-reading. These are substantive behavioral traits an agent could not infer from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences front-load the core action and then pack the critical post-conditions and validation guidance. Every clause earns its place: the operation scope, invariants, and the explicit don't-verify instructions. No filler or redundant restating of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a complex oneOf operation schema and a nested facts array, the description covers the main behavioral caveats (atomicity, source preservation, date preservation, no post-verification) while the rich input schema covers structural details. Since an output schema exists, the description need not explain return values, and nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline applies and the schema already documents operations, facts, paths, versions, aliases, and descriptions. The description only adds high-level constraints like bounded new destination and preserving dates, without detailing individual parameters. This is sufficient, but it does not add much beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause 'Move exact Facts' names the verb and resource immediately, and the two follow-up options (replace source/existing-destination descriptions, or atomically create a bounded new destination) delineate the operation's scope against create/update/rename. It also explicitly distances itself from siblings read/list by instructing the agent not to verify with them after apply.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when move is appropriate: moving exact Facts, optionally replacing descriptions, or creating a bounded destination. It explicitly tells the agent what not to do afterwards ('do not verify with read or list'), which is a direct usage exclusion, though it does not compare against update/rename in general terms.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readARead-onlyIdempotent
Use before mutation unless current Page Snapshots are already available. Read unique canonical paths together; returned files contain Facts, opaque write versions, and capacity signals.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | Unique canonical page paths from the current Route Catalog. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavioral context beyond the annotations: reads are batched ('together'), and results contain 'Facts, opaque write versions, and capacity signals.' The annotations already cover read-only and idempotent safety, so the description enhances rather than repeats them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the most critical usage guidance, followed by return-content context. Every sentence earns its place and there is no redundant restating of the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema, detailed annotations, and a single well-documented parameter, the description covers the essential decisions: when to call, how to call, and what to expect. The only minor gap is that 'Page Snapshots' is not expanded, but it is likely domain-standard enough for the intended agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes the 'paths' parameter with 100% coverage, including uniqueness and canonical path requirements. The description adds only a mild batch-hint with 'together,' so it does not significantly expand parameter semantics beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource action: 'Read unique canonical paths together.' It also clarifies what returned files contain. However, it does not explicitly differentiate itself from sibling 'list', so the agent must infer the distinction between reading specific paths and listing the catalog.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use before mutation unless current Page Snapshots are already available' gives explicit when-to-use guidance and names the condition under which it can be skipped. It does not explicitly state when alternatives like list should be preferred, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renameADestructive
Rename dynamic pages using latest Page Snapshots, one operation per page. On applied, reuse returned Page Snapshots and receipts; do not verify with read or list.
| Name | Required | Description | Default |
|---|---|---|---|
| operations | Yes | Dynamic page renames; every old and new path must be unique. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and non-idempotent, and the description meaningfully adds behavioral guidance beyond them: reuse returned Page Snapshots and receipts, and avoid read/list verification. This is exactly the kind of operational nuance an agent needs and cannot infer from the schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler. The purpose is front-loaded, and the second sentence delivers critical post-action guidance. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations, rich input schema, and output schema, the description covers the essential contract: what the tool does, the snapshot requirement, per-page limits, and post-call behavior. It could slightly improve by contrasting with the 'move' sibling, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 useful semantic context by saying 'one operation per page' and connecting the operation to 'latest Page Snapshots,' which clarifies how to construct operations and use if_version, though the individual parameter details are already well documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Rename dynamic pages') and the resource type, with a distinguishing mechanism ('using latest Page Snapshots'). It also imposes a clear scope ('one operation per page'), making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational context: use the latest Page Snapshots, and after a successful rename do not verify via read or list. It does not explicitly compare this tool to siblings like move or update, so it falls short of a full when-to-use-vs-alternatives explanation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
updateADestructive
Replace an exact Fact with an optional page description, update page metadata alone, or mechanically repair a repairable page using its latest version. On applied, reuse returned Page Snapshots and receipts; do not verify with read or list.
| Name | Required | Description | Default |
|---|---|---|---|
| operations | Yes | Exact updates validated as one batch; each path must be unique. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavior beyond the destructiveHint annotation: replacements are exact and version-based, repair is mechanical, and returned receipts/snapshots are authoritative so read/list verification is discouraged. It avoids contradicting the annotation set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler. The first sentence front-loads the three operation modes and the second adds a concise workflow directive. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description orients the agent to all three operation types and the post-invocation behavior, while the rich schema and output schema cover parameter detail and return values. No critical calling information is missing for an agent to invoke update correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 parameters and operation discriminators in detail. The description reinforces 'exact Fact', 'latest version', and optional description, but adds no new parameter-level constraints; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names specific operations and resources: replacing an exact Fact, updating page metadata, and mechanically repairing a page. This clearly separates the tool's three target modes and distinguishes it from generic sibling names like create, rename, or delete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational context: updates target existing exact Facts/page metadata, and after success the agent should reuse returned Page Snapshots and receipts rather than verify with read or list. It does not explicitly contrast update with create/add/rename/delete, but the post-invocation guidance and mode list make the intended usage fairly clear.
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.
4 tool updates
v0.7.2- Changed
add1 field changed- added
Input schema / $defs / AddOperation / properties / descriptionAdded value: +{ + "anyOf": [ + { + "maxLength": 80, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Replacement page description to apply with the Fact addition.", + "title": "Description" +}
- Changed
delete1 field changed- added
Input schema / $defs / DeleteFactOperation / properties / descriptionAdded value: +{ + "anyOf": [ + { + "maxLength": 80, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Replacement page description to apply with the Fact deletion.", + "title": "Description" +}
- Changed
move4 fields changed- changed
Input schema / $defs / MoveOperation / oneOfPrevious value: -[ - { - "properties": { - "aliases": { - "type": "null" - }, - "description": { - "type": "null" - }, - "destination_path": { - "type": "string" - }, - "destination_version": { - "type": "string" - }, - "new_path": { - "type": "null" - } - }, - "required": [ - "destination_path", - "destination_version" - ] - }, - { - "properties": { - "aliases": { - "type": "array" - }, - "description": { - "type": "string" - }, - "destination_path": { - "type": "null" - }, - "destination_version": { - "type": "null" - }, - "new_path": { - "type": "string" - } - }, - "required": [ - "new_path", - "description", - "aliases" - ] - } -]New value: +[ + { + "properties": { + "aliases": { + "type": "null" + }, + "destination_path": { + "type": "string" + }, + "destination_version": { + "type": "string" + }, + "new_path": { + "type": "null" + } + }, + "required": [ + "destination_path", + "destination_version" + ] + }, + { + "properties": { + "aliases": { + "type": "array" + }, + "description": { + "type": "string" + }, + "destination_path": { + "type": "null" + }, + "destination_version": { + "type": "null" + }, + "new_path": { + "type": "string" + } + }, + "required": [ + "new_path", + "description", + "aliases" + ] + } +] - added
Input schema / $defs / MoveOperation / properties / aliases / descriptionAdded value: +"Required initial aliases for a new destination; omit for an existing destination and update them separately with target=page." - added
Input schema / $defs / MoveOperation / properties / description / descriptionAdded value: +"Replacement description for an existing destination or required initial description for a new destination." - added
Input schema / $defs / MoveOperation / properties / source_descriptionAdded value: +{ + "anyOf": [ + { + "maxLength": 80, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Replacement source page description to apply with the Fact move.", + "title": "Source Description" +}
- Changed
update1 field changed- added
Input schema / $defs / UpdateFactOperation / properties / descriptionAdded value: +{ + "anyOf": [ + { + "maxLength": 80, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Replacement page description to apply with the Fact update.", + "title": "Description" +}
8 tool updates
v0.7.0- Changed
add4 fields changed- changed
Input schema / $defs / AddOperation / properties / facts / maxItemsPrevious value: -50New value: +30 - changed
Input schema / $defs / Fact / properties / basis / descriptionPrevious value: -"Evidence basis: stated for the user's explicit statement; observed only where the Agent Contract permits a repeated behavioral observation."New value: +"Evidence basis: stated for the user's explicit statement; observed for Agent derivation or inference from current visible material." - changed
Input schema / $defs / Fact / properties / content / maxLengthPrevious value: -4096New value: +800 - changed
Input schema / properties / operations / maxItemsPrevious value: -20New value: +15
- Changed
create6 fields changed- changed
Input schema / $defs / CreateOperation / properties / aliases / maxItemsPrevious value: -8New value: +6 - added
Input schema / $defs / CreateOperation / properties / description / maxLengthAdded value: +80 - changed
Input schema / $defs / CreateOperation / properties / facts / maxItemsPrevious value: -50New value: +30 - changed
Input schema / $defs / Fact / properties / basis / descriptionPrevious value: -"Evidence basis: stated for the user's explicit statement; observed only where the Agent Contract permits a repeated behavioral observation."New value: +"Evidence basis: stated for the user's explicit statement; observed for Agent derivation or inference from current visible material." - changed
Input schema / $defs / Fact / properties / content / maxLengthPrevious value: -4096New value: +800 - changed
Input schema / properties / operations / maxItemsPrevious value: -20New value: +15
- Changed
delete4 fields changed- changed
Input schema / $defs / DeleteFactOperation / properties / fact / $refPrevious value: -"#/$defs/Fact"New value: +"#/$defs/FactSelector" - removed
Input schema / $defs / FactRemoved value: -{ - "additionalProperties": false, - "properties": { - "basis": { - "description": "Evidence basis: stated for the user's explicit statement; observed only where the Agent Contract permits a repeated behavioral observation.", - "enum": [ - "stated", - "observed" - ], - "title": "Basis", - "type": "string" - }, - "content": { - "description": "One complete, independently maintainable, single-line assertion.", - "maxLength": 4096, - "title": "Content", - "type": "string" - } - }, - "required": [ - "basis", - "content" - ], - "title": "Fact", - "type": "object" -} - added
Input schema / $defs / FactSelectorAdded value: +{ + "additionalProperties": false, + "properties": { + "basis": { + "description": "Evidence basis: stated for the user's explicit statement; observed for Agent derivation or inference from current visible material.", + "enum": [ + "stated", + "observed" + ], + "title": "Basis", + "type": "string" + }, + "content": { + "description": "Exact basis and content copied from an existing Page Snapshot.", + "maxLength": 4096, + "title": "Content", + "type": "string" + } + }, + "required": [ + "basis", + "content" + ], + "title": "FactSelector", + "type": "object" +} - changed
Input schema / properties / operations / maxItemsPrevious value: -20New value: +15
- Changed
list2 fields changed- added
Input schema / properties / scopeAdded value: +{ + "enum": [ + "topics", + "areas", + "people" + ], + "title": "Scope", + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "scope" +]
- Changed
move18 fields changed- removed
Input schema / $defs / FactRemoved value: -{ - "additionalProperties": false, - "properties": { - "basis": { - "description": "Evidence basis: stated for the user's explicit statement; observed only where the Agent Contract permits a repeated behavioral observation.", - "enum": [ - "stated", - "observed" - ], - "title": "Basis", - "type": "string" - }, - "content": { - "description": "One complete, independently maintainable, single-line assertion.", - "maxLength": 4096, - "title": "Content", - "type": "string" - } - }, - "required": [ - "basis", - "content" - ], - "title": "Fact", - "type": "object" -} - added
Input schema / $defs / FactSelectorAdded value: +{ + "additionalProperties": false, + "properties": { + "basis": { + "description": "Evidence basis: stated for the user's explicit statement; observed for Agent derivation or inference from current visible material.", + "enum": [ + "stated", + "observed" + ], + "title": "Basis", + "type": "string" + }, + "content": { + "description": "Exact basis and content copied from an existing Page Snapshot.", + "maxLength": 4096, + "title": "Content", + "type": "string" + } + }, + "required": [ + "basis", + "content" + ], + "title": "FactSelector", + "type": "object" +} - added
Input schema / $defs / MoveOperation / oneOfAdded value: +[ + { + "properties": { + "aliases": { + "type": "null" + }, + "description": { + "type": "null" + }, + "destination_path": { + "type": "string" + }, + "destination_version": { + "type": "string" + }, + "new_path": { + "type": "null" + } + }, + "required": [ + "destination_path", + "destination_version" + ] + }, + { + "properties": { + "aliases": { + "type": "array" + }, + "description": { + "type": "string" + }, + "destination_path": { + "type": "null" + }, + "destination_version": { + "type": "null" + }, + "new_path": { + "type": "string" + } + }, + "required": [ + "new_path", + "description", + "aliases" + ] + } +] - added
Input schema / $defs / MoveOperation / properties / aliasesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "maxItems": 6, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Aliases" +} - added
Input schema / $defs / MoveOperation / properties / descriptionAdded value: +{ + "anyOf": [ + { + "maxLength": 80, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Description" +} - added
Input schema / $defs / MoveOperation / properties / destination_path / anyOfAdded value: +[ + { + "description": "Canonical existing page path from the current Route Catalog.", + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / $defs / MoveOperation / properties / destination_path / defaultAdded value: +null - removed
Input schema / $defs / MoveOperation / properties / destination_path / descriptionRemoved value: -"Canonical existing page path from the current Route Catalog." - removed
Input schema / $defs / MoveOperation / properties / destination_path / typeRemoved value: -"string" - added
Input schema / $defs / MoveOperation / properties / destination_version / anyOfAdded value: +[ + { + "description": "Opaque version from the latest Page Snapshot of this page; pass unchanged.", + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / $defs / MoveOperation / properties / destination_version / defaultAdded value: +null - removed
Input schema / $defs / MoveOperation / properties / destination_version / descriptionRemoved value: -"Opaque version from the latest Page Snapshot of this page; pass unchanged." - removed
Input schema / $defs / MoveOperation / properties / destination_version / typeRemoved value: -"string" - changed
Input schema / $defs / MoveOperation / properties / facts / items / $refPrevious value: -"#/$defs/Fact"New value: +"#/$defs/FactSelector" - changed
Input schema / $defs / MoveOperation / properties / facts / maxItemsPrevious value: -50New value: +30 - added
Input schema / $defs / MoveOperation / properties / new_pathAdded value: +{ + "anyOf": [ + { + "description": "New direct topics/, areas/, or people/ Markdown path using a canonical slug.", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "New Path" +} - changed
Input schema / $defs / MoveOperation / requiredPrevious value: -[ - "source_path", - "source_version", - "destination_path", - "destination_version", - "facts" -]New value: +[ + "source_path", + "source_version", + "facts" +] - changed
Input schema / properties / operations / maxItemsPrevious value: -20New value: +15
- Changed
read1 field changed- changed
Input schema / properties / paths / maxItemsPrevious value: -20New value: +15
- Changed
rename1 field changed- changed
Input schema / properties / operations / maxItemsPrevious value: -20New value: +15
- Changed
update10 fields changed- changed
Input schema / $defs / Fact / properties / basis / descriptionPrevious value: -"Evidence basis: stated for the user's explicit statement; observed only where the Agent Contract permits a repeated behavioral observation."New value: +"Evidence basis: stated for the user's explicit statement; observed for Agent derivation or inference from current visible material." - changed
Input schema / $defs / Fact / properties / content / maxLengthPrevious value: -4096New value: +800 - added
Input schema / $defs / FactSelectorAdded value: +{ + "additionalProperties": false, + "properties": { + "basis": { + "description": "Evidence basis: stated for the user's explicit statement; observed for Agent derivation or inference from current visible material.", + "enum": [ + "stated", + "observed" + ], + "title": "Basis", + "type": "string" + }, + "content": { + "description": "Exact basis and content copied from an existing Page Snapshot.", + "maxLength": 4096, + "title": "Content", + "type": "string" + } + }, + "required": [ + "basis", + "content" + ], + "title": "FactSelector", + "type": "object" +} - added
Input schema / $defs / RepairPageOperationAdded value: +{ + "additionalProperties": false, + "properties": { + "if_version": { + "description": "Opaque version from the latest Page Snapshot of this page; pass unchanged.", + "title": "If Version", + "type": "string" + }, + "path": { + "description": "Canonical existing page path from the current Route Catalog.", + "title": "Path", + "type": "string" + }, + "target": { + "const": "repair", + "description": "Mechanically canonicalize one repairable page without semantic edits.", + "title": "Target", + "type": "string" + } + }, + "required": [ + "path", + "if_version", + "target" + ], + "title": "RepairPageOperation", + "type": "object" +} - changed
Input schema / $defs / UpdateFactOperation / properties / old_fact / $refPrevious value: -"#/$defs/Fact"New value: +"#/$defs/FactSelector" - changed
Input schema / $defs / UpdatePageOperation / properties / aliases / anyOfPrevious value: -[ - { - "items": { - "type": "string" - }, - "maxItems": 8, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "type": "string" + }, + "maxItems": 6, + "type": "array" + }, + { + "type": "null" + } +] - changed
Input schema / $defs / UpdatePageOperation / properties / description / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 80, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / operations / items / discriminator / mapping / repairAdded value: +"#/$defs/RepairPageOperation" - changed
Input schema / properties / operations / items / oneOfPrevious value: -[ - { - "$ref": "#/$defs/UpdateFactOperation" - }, - { - "$ref": "#/$defs/UpdatePageOperation" - } -]New value: +[ + { + "$ref": "#/$defs/UpdateFactOperation" + }, + { + "$ref": "#/$defs/UpdatePageOperation" + }, + { + "$ref": "#/$defs/RepairPageOperation" + } +] - changed
Input schema / properties / operations / maxItemsPrevious value: -20New value: +15
1 tool update
v0.6.0- Changed
move4 fields changed- removed
Input schema / $defs / MoveOperation / properties / factRemoved value: -{ - "$ref": "#/$defs/Fact" -} - added
Input schema / $defs / MoveOperation / properties / factsAdded value: +{ + "description": "All exact Facts to move between this source/destination pair in one operation; copy them unchanged from the latest source Page Snapshot.", + "items": { + "$ref": "#/$defs/Fact" + }, + "maxItems": 50, + "minItems": 1, + "title": "Facts", + "type": "array" +} - changed
Input schema / $defs / MoveOperation / requiredPrevious value: -[ - "source_path", - "source_version", - "destination_path", - "destination_version", - "fact" -]New value: +[ + "source_path", + "source_version", + "destination_path", + "destination_version", + "facts" +] - changed
Input schema / properties / operations / descriptionPrevious value: -"Exact Fact moves; every source and destination path must be unique."New value: +"Exact Fact moves validated as one batch. Use one operation per disjoint source/destination pair and include all Facts for that pair in facts; every page path may appear only once across the batch."
8 tool updates
v0.1.0- First observed
add - First observed
create - First observed
delete - First observed
list - First observed
move - First observed
read - First observed
rename - First observed
update
TDQS
Each tool targets a distinct operation: inspection (list/read), page lifecycle (create/rename/delete), and Fact lifecycle (add/update/move/delete). The descriptions clearly separate page-level from Fact-level mutations, leaving no realistic confusion between tools.
All tool names are single-word lowercase verbs (list, read, create, add, update, move, rename, delete), forming a consistent and predictable pattern. While not verb_noun, the convention is uniform across the entire set.
Eight tools is a well-scoped size for a content management server covering both pages and Facts. Each tool earns its place and none feel redundant or excessively granular.
The surface covers the full lifecycle: discovering (list), reading (read), creating pages (create), adding Facts (add), modifying Facts/metadata (update), moving Facts (move), renaming pages (rename), and deleting (delete). No obvious dead ends or missing core operations for the stated domain.
Maintenance
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
Graph-native persistent memory for AI agents — 33 MCP tools, zero-LLM writes.
Portable memory for AI agents: capture once, recall across Claude, Cursor, and any MCP client.
Long-term memory for AI agents: durable records, observable retrieval, governed context assembly.
Shared long-term memory vault for AI agents with 20 MCP tools.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to have persistent, self-managing memory with bi-temporal supersession, timely forgetting, and recall under a limited context window, using MCP protocol.MIT
- AlicenseAqualityBmaintenanceA memory system for AI agents that maintains a human-readable, typed Markdown knowledge base with an always-in-context index, enabling recall, correction, and trust decay through MCP.71Apache 2.0
- AlicenseNot gradedqualityAmaintenanceMarkdown-first long-term memory for AI coding agents, enabling hybrid search over local files via MCP tools.13Apache 2.0
- FlicenseNot gradedqualityBmaintenanceProvides persistent, causal memory for AI agents with semantic recall, causal tracking, and importance-based forgetting through MCP tools.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/TimWongUp/keepygaga'
If you have feedback or need assistance with the MCP directory API, please join our Discord server