Skip to main content
Glama

Project Memory

project_memory

Manage project memory: store versioned plans, experiments, decisions, and ontology with corrections, lineage, and local search.

Instructions

PROJECT MEMORY MANAGEMENT. With research enabled, one local broker lets multiple MCP sessions query the same knowledge base concurrently and orders writes safely. It links session intent, immutable plan revisions, experiments, decisions, versioned ontology, and bitemporal data lineage; corrections can use entity merge or split without discarding history. Use project_update for revision-checked changes to an existing project profile; context reads that same versioned profile. Use query_status/query_cancel with a caller-supplied search request_id to inspect or cooperatively stop a long retrieval. Use context for the bounded current project view; current to generate a compact CURRENT.md; get/get_batch for exact records and body spans; record/record_batch for durable idempotent writes; timeline/diff for history; sync for declared source deltas; job_status/job_wait/job_cancel for background progress and safe stage-boundary cancellation; verify for preservation levels; snapshot/snapshot_import/snapshot_rollback for versioned offline transfer and append-only recovery; doctor for passive diagnostics; rebuild for derived indexes; export for graph views; and forget for reversible deletion. Typed record writes return compact receipts and never echo submitted bodies. action=search remains a compatibility alias, but project_memory_search should be used for local knowledge retrieval. Ontology revisions use supersedes_term_id. Corrections preserve bitemporal data lineage and support assertion replacement plus entity merge or split. rebuild indexes approved local roots and code structure into a reproducible snapshot; export writes an interactive HTML viewer, Graphviz DOT, D3 JSON, or a Neo4j import bundle. HTML always includes PKM, Lineage, and Ontology tabs, an embedded-project selector, empty-canvas focus reset, and visible PNG or JSON download. forget previews impact before reversible project or assertion deletion. Search, search_parallel, scholar_search, and extract automatically capture sources and provenance; project_memory manages their durable structure.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
bodyNoComplete UTF-8 record body. Typed writes preserve it losslessly and return byte counts plus an exact get route.
nameNoProject name for create/project_update, or entity name lookup for show.
afterNo
as_ofNoFor context, reconstruct the project and plan view at this effective or recorded time.
limitNoMaximum local RAG results for action=search.
queryNoRequired for action=search. Searches stored local knowledge only and does not start live web discovery.
rootsNoApproved local roots and optional path-independent role/alias manifest. sync merges roots by default; removal is explicit.
titleNoPlan title, experiment name, or decision title.
actionYesTyped project-memory operation. create: project_id and name required. project_update: versioned profile update with expected_revision and idempotency_key. get/get_batch: exact IDs and bounded body spans; body_bytes=0 returns metadata only. record/record_batch: typed durable writes with idempotency_key. context/current/timeline/diff: compact current or historical views. query_status/query_cancel: inspect or cooperatively cancel caller-identified local retrieval. sync/rebuild: incremental source and derived indexing. job_status/job_wait/job_cancel: durable background work. snapshot/snapshot_import/snapshot_rollback: offline transfer and append-only recovery. export: HTML, DOT, JSON, or Neo4j. forget: reversible deletion preview and confirmation. Unrelated local questions use project_memory_search.
beforeNo
fieldsNoTyped structured fields stored with the record revision. measurement requires metric, value, unit, evaluator_contract, dataset, split, tokenizer, context_length, targets, carrier_precision, and source_locator; byte_ledger requires byte_components, denominator, and scope. Put unknown required values in missing_fields.
intentNoDurable intent for record_type=session.
job_idNo
reasonNoRequired reason for any correction.
statusNoUse success, failed, or inconclusive to finish an experiment. Omit or use running when starting it.
aliasesNoOntology term aliases, or aliases moved during entity_split.
dry_runNo
filtersNoOptional project, source, type, role, lane, and recorded-time filters. Excluded lanes are not executed.
metricsNoTerminal experiment metrics.
purposeNo
queriesNoIndependent questions returned as separate ranked groups inside one broker request.
recordsNo
summaryNoExperiment result or decision summary.
versionNoOntology revision number. Defaults to 1 or the superseded term version plus one.
asset_idNoStable logical identity. Revisions remain under this ID.
git_rootNoOptional Git root recorded with a rebuild snapshot.
revisionNo
valid_toNoCorrected assertion valid-time end.
artifactsNoLegacy experiment artifact paths. Typed writes should use artifact_references; no values are silently sliced.
body_pathNoLocal UTF-8 file for a streamed versioned body attachment up to 256 MiB. Use instead of body; only a compact receipt is returned.
operationNoTyped durable write operation. Use with asset_kind and idempotency_key.
protectedNo
record_idNoKnown exact record or alias ID for get, diff, or verify.
root_modeNo
target_idNoAssertion or entity id for show or correction.
asset_kindNo
body_bytesNoUTF-8 bytes to return. Use 0 for metadata-only readback; use a positive value and next_body_offset for exact paging.
hypothesisNoHypothesis when starting an experiment.
project_idNoStable project id. For search, this is the write-isolated primary scope. Omit to list projects or use all_projects.
record_idsNo
request_idNoCaller-chosen ID for one local query. Supply it before a long request so project_memory query_status/query_cancel can inspect or cancel the same operation.
source_idsNoEntity ids merged into target_id by entity_merge.
valid_fromNoCorrected assertion valid-time start.
access_tierNoOperational access tier. It does not rank scientific quality.
body_offsetNo
export_viewNoInitial HTML tab or non-HTML export scope. graph is PKM; ontology shows types, shared schema, verified identity links, and typed instances; lineage shows aligned data and research lineage.graph
forget_modeNoPreview first. Apply requires its confirm_token. Restore reverses deletion.
record_typeNoRequired for record. session stores intent; plan creates an immutable revision; experiment starts or finishes a run; decision links a conclusion; ontology creates a versioned type or relation; correction replaces an assertion or merges/splits entities.
replacementNoNew assertion value, or new entity name for entity_split.
set_currentNoFor plan writes, select this revision as current. Defaults to true; use false for historical imports.
to_revisionNo
all_projectsNoSearch or export every active named project. Excludes Inbox and cannot be combined with project ids.
budget_bytesNo
detail_levelNoFor show with project_id and no target_id, both values return a bounded summary. full is retained only for compatibility and never returns every durable record body.summary
effective_atNo
evidence_idsNoEvidence retained on a corrected assertion.
cancel_reasonNo
change_reasonNoReason for a new plan revision.
changed_pathsNoExplicit root-relative files or collection boundaries to re-read. Existing roots and all unlisted entries are preserved.
confirm_tokenNoToken returned by the matching forget preview.
experiment_idNoExperiment to finish or associate with a decision.
export_formatNoVisualization file format. html writes one offline explorer with PKM, Lineage, Ontology, project selection, and current-view PNG or anonymized JSON download; d3 writes node-link JSON; dot writes Graphviz DOT; neo4j writes an import-ready CSV and Cypher bundle.d3
from_revisionNo
memory_handleNoExisting project session handle for a session intent revision.
ontology_kindNoOntology term kind for record_type=ontology.
removed_pathsNoExplicit root-relative entries to remove from the active snapshot. Historical snapshots remain addressable.
snapshot_pathNo
after_revisionNo
artifact_limitNo
missing_fieldsNo
query_variantsNoOptional local retrieval variants for action=search. They run inside one broker request and are fused before one rerank.
since_revisionNo
artifact_offsetNo
correction_kindNoCorrection operation. Defaults to assertion.
idempotency_keyNoStable operation key. Reuse it after an uncertain response.
source_sequenceNo
wait_timeout_msNo
plan_revision_idNoPlan revision associated with an experiment or decision.
source_referenceNo
user_constraintsNo
correction_reasonNo
expected_revisionNoOptimistic concurrency revision. Stale values return a conflict.
supersedes_term_idNoPrior ontology term replaced by this revision.
verification_levelNo
artifact_referencesNo
include_project_idsNoAdditional read-only projects for one local search or integrated visualization export.
protected_parent_idsNo
response_deadline_msNoCaller-selected 1-300 second response deadline. Returns available lane results or QUERY_TIMEOUT with request_id. Native reads remain tracked until they settle; stored evidence and writes are unaffected.
response_budget_bytesNoExplicit result-array byte budget. Without an override, summaries adapt to unique result, question and source-family counts. Stored bodies and retrieval scope are not truncated by this budget; envelope metadata is separate.
based_on_experiment_idNoExperiment that motivated a plan revision.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
jobNo
diffNo
metaNo
errorNo
indexNo
plansNo
queryNo
doctorNo
entityNo
forgetNo
groupsNo
memoryNo
recordNo
contextNo
currentNo
projectNo
receiptNo
recordsNo
resultsNo
sessionNo
entitiesNo
importedNo
projectsNo
receiptsNo
snapshotNo
timelineNo
assertionNo
decisionsNo
elapsed_msNo
job_countsNo
plan_countNo
experimentsNo
entity_countNo
query_statusNo
verificationNo
memory_handleNo
session_countNo
visualizationNo
decision_countNo
document_countNo
assertion_countNo
correction_countNo
experiment_countNo
search_event_countNo
source_entry_countNo
active_source_snapshotNo
entity_operation_countNo
citation_observation_countNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed84 schema fields changedv1.1.3
    • addedInput schema / properties / access_tier
      Added value: +{
      +  "description": "Operational access tier. It does not rank scientific quality.",
      +  "enum": [
      +    "hot",
      +    "warm",
      +    "cold"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / action / description
      Previous value: -"create: project_id and name required. show: inspect a known project, assertion, entity, or durable record. search: compatibility alias for project_memory_search. record: project_id and record_type required. rebuild: project_id required; roots optional. export: project_id, include_project_ids, or all_projects=true required. forget: project_id and forget_mode required; apply also requires confirm_token."New value: +"Typed project-memory operation. create: project_id and name required. project_update: versioned profile update with expected_revision and idempotency_key. get/get_batch: exact IDs and bounded body spans; body_bytes=0 returns metadata only. record/record_batch: typed durable writes with idempotency_key. context/current/timeline/diff: compact current or historical views. query_status/query_cancel: inspect or cooperatively cancel caller-identified local retrieval. sync/rebuild: incremental source and derived indexing. job_status/job_wait/job_cancel: durable background work. snapshot/snapshot_import/snapshot_rollback: offline transfer and append-only recovery. export: HTML, DOT, JSON, or Neo4j. forget: reversible deletion preview and confirmation. Unrelated local questions use project_memory_search."
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "create",
      -  "show",
      -  "search",
      -  "record",
      -  "rebuild",
      -  "export",
      -  "forget"
      -]New value: +[
      +  "create",
      +  "project_update",
      +  "show",
      +  "search",
      +  "record",
      +  "record_batch",
      +  "get",
      +  "get_batch",
      +  "context",
      +  "timeline",
      +  "diff",
      +  "sync",
      +  "job_status",
      +  "job_wait",
      +  "job_cancel",
      +  "query_status",
      +  "query_cancel",
      +  "verify",
      +  "current",
      +  "snapshot",
      +  "snapshot_import",
      +  "snapshot_rollback",
      +  "doctor",
      +  "rebuild",
      +  "export",
      +  "forget"
      +]
    • addedInput schema / properties / after
      Added value: +{
      +  "type": "string"
      +}
    • addedInput schema / properties / after_revision
      Added value: +{
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / artifact_limit
      Added value: +{
      +  "maximum": 1000,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / artifact_offset
      Added value: +{
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / artifact_references
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "artifact_id": {
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "available": {
      +        "type": "boolean"
      +      },
      +      "content_hash": {
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "location": {
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "media_type": {
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "member": {
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "observed_at": {
      +        "format": "date-time",
      +        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
      +        "type": "string"
      +      },
      +      "path": {
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "role": {
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "size": {
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "verification": {
      +        "enum": [
      +          "declared",
      +          "present",
      +          "hash_verified",
      +          "restore_tested",
      +          "replayed"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "artifact_id"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 50000,
      +  "type": "array"
      +}
    • changedInput schema / properties / artifacts / description
      Previous value: -"Experiment artifact paths or identifiers."New value: +"Legacy experiment artifact paths. Typed writes should use artifact_references; no values are silently sliced."
    • changedInput schema / properties / artifacts / maxItems
      Previous value: -100New value: +50000
    • addedInput schema / properties / as_of
      Added value: +{
      +  "description": "For context, reconstruct the project and plan view at this effective or recorded time.",
      +  "format": "date-time",
      +  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
      +  "type": "string"
      +}
    • addedInput schema / properties / asset_id
      Added value: +{
      +  "description": "Stable logical identity. Revisions remain under this ID.",
      +  "maxLength": 500,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / asset_kind
      Added value: +{
      +  "enum": [
      +    "project",
      +    "plan",
      +    "task",
      +    "method",
      +    "experiment",
      +    "attempt",
      +    "arm",
      +    "measurement",
      +    "byte_ledger",
      +    "artifact",
      +    "document",
      +    "decision",
      +    "session"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / before
      Added value: +{
      +  "type": "string"
      +}
    • changedInput schema / properties / body / description
      Previous value: -"Plan body for record_type=plan."New value: +"Complete UTF-8 record body. Typed writes preserve it losslessly and return byte counts plus an exact get route."
    • changedInput schema / properties / body / maxLength
      Previous value: -50000New value: +4194304
    • addedInput schema / properties / body_bytes
      Added value: +{
      +  "description": "UTF-8 bytes to return. Use 0 for metadata-only readback; use a positive value and next_body_offset for exact paging.",
      +  "maximum": 1048576,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / body_offset
      Added value: +{
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / body_path
      Added value: +{
      +  "description": "Local UTF-8 file for a streamed versioned body attachment up to 256 MiB. Use instead of body; only a compact receipt is returned.",
      +  "maxLength": 4000,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / budget_bytes
      Added value: +{
      +  "maximum": 1000000,
      +  "minimum": 1000,
      +  "type": "integer"
      +}
    • addedInput schema / properties / cancel_reason
      Added value: +{
      +  "maxLength": 500,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / changed_paths
      Added value: +{
      +  "description": "Explicit root-relative files or collection boundaries to re-read. Existing roots and all unlisted entries are preserved.",
      +  "items": {
      +    "properties": {
      +      "path": {
      +        "maxLength": 2000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "root": {
      +        "maxLength": 32,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "root",
      +      "path"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 100000,
      +  "type": "array"
      +}
    • addedInput schema / properties / correction_reason
      Added value: +{
      +  "maxLength": 2000,
      +  "type": "string"
      +}
    • addedInput schema / properties / dry_run
      Added value: +{
      +  "type": "boolean"
      +}
    • addedInput schema / properties / effective_at
      Added value: +{
      +  "format": "date-time",
      +  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
      +  "type": "string"
      +}
    • addedInput schema / properties / expected_revision
      Added value: +{
      +  "description": "Optimistic concurrency revision. Stale values return a conflict.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / fields
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Typed structured fields stored with the record revision. measurement requires metric, value, unit, evaluator_contract, dataset, split, tokenizer, context_length, targets, carrier_precision, and source_locator; byte_ledger requires byte_components, denominator, and scope. Put unknown required values in missing_fields.",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / filters
      Added value: +{
      +  "description": "Optional project, source, type, role, lane, and recorded-time filters. Excluded lanes are not executed.",
      +  "properties": {
      +    "kinds": {
      +      "items": {
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 20,
      +      "type": "array"
      +    },
      +    "recorded_after": {
      +      "format": "date-time",
      +      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
      +      "type": "string"
      +    },
      +    "recorded_before": {
      +      "format": "date-time",
      +      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
      +      "type": "string"
      +    },
      +    "retrieval_lanes": {
      +      "items": {
      +        "enum": [
      +          "exact",
      +          "bm25",
      +          "vector",
      +          "graph"
      +        ],
      +        "type": "string"
      +      },
      +      "maxItems": 4,
      +      "type": "array"
      +    },
      +    "roles": {
      +      "items": {
      +        "enum": [
      +          "experiment_record",
      +          "result",
      +          "method",
      +          "log",
      +          "paper",
      +          "plan",
      +          "config",
      +          "source",
      +          "report",
      +          "other"
      +        ],
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    },
      +    "source_families": {
      +      "items": {
      +        "enum": [
      +          "document",
      +          "code",
      +          "graph"
      +        ],
      +        "type": "string"
      +      },
      +      "maxItems": 3,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / from_revision
      Added value: +{
      +  "maximum": 9007199254740991,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / idempotency_key
      Added value: +{
      +  "description": "Stable operation key. Reuse it after an uncertain response.",
      +  "maxLength": 500,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / job_id
      Added value: +{
      +  "maxLength": 500,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / missing_fields
      Added value: +{
      +  "items": {
      +    "maxLength": 500,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "maxItems": 1000,
      +  "type": "array"
      +}
    • changedInput schema / properties / name / description
      Previous value: -"Project name for create, or entity name lookup for show."New value: +"Project name for create/project_update, or entity name lookup for show."
    • addedInput schema / properties / operation
      Added value: +{
      +  "description": "Typed durable write operation. Use with asset_kind and idempotency_key.",
      +  "enum": [
      +    "create",
      +    "patch",
      +    "append_evidence",
      +    "relocate",
      +    "correct"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / protected
      Added value: +{
      +  "type": "boolean"
      +}
    • addedInput schema / properties / protected_parent_ids
      Added value: +{
      +  "items": {
      +    "maxLength": 500,
      +    "type": "string"
      +  },
      +  "maxItems": 10000,
      +  "type": "array"
      +}
    • addedInput schema / properties / purpose
      Added value: +{
      +  "maxLength": 10000,
      +  "type": "string"
      +}
    • addedInput schema / properties / queries
      Added value: +{
      +  "description": "Independent questions returned as separate ranked groups inside one broker request.",
      +  "items": {
      +    "properties": {
      +      "id": {
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "limit": {
      +        "maximum": 20,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "query": {
      +        "maxLength": 400,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "query_variants": {
      +        "items": {
      +          "maxLength": 400,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 19,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "query"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 20,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / record_id
      Added value: +{
      +  "description": "Known exact record or alias ID for get, diff, or verify.",
      +  "maxLength": 500,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / record_ids
      Added value: +{
      +  "items": {
      +    "maxLength": 500,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "maxItems": 100,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / records
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "access_tier": {
      +        "enum": [
      +          "hot",
      +          "warm",
      +          "cold"
      +        ],
      +        "type": "string"
      +      },
      +      "aliases": {
      +        "items": {
      +          "maxLength": 2000,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 1000,
      +        "type": "array"
      +      },
      +      "artifact_references": {
      +        "items": {
      +          "properties": {
      +            "artifact_id": {
      +              "maxLength": 500,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "available": {
      +              "type": "boolean"
      +            },
      +            "content_hash": {
      +              "maxLength": 200,
      +              "type": "string"
      +            },
      +            "location": {
      +              "maxLength": 2000,
      +              "type": "string"
      +            },
      +            "media_type": {
      +              "maxLength": 200,
      +              "type": "string"
      +            },
      +            "member": {
      +              "maxLength": 2000,
      +              "type": "string"
      +            },
      +            "observed_at": {
      +              "format": "date-time",
      +              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
      +              "type": "string"
      +            },
      +            "path": {
      +              "maxLength": 2000,
      +              "type": "string"
      +            },
      +            "role": {
      +              "maxLength": 200,
      +              "type": "string"
      +            },
      +            "size": {
      +              "maximum": 9007199254740991,
      +              "minimum": 0,
      +              "type": "integer"
      +            },
      +            "verification": {
      +              "enum": [
      +                "declared",
      +                "present",
      +                "hash_verified",
      +                "restore_tested",
      +                "replayed"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "artifact_id"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 50000,
      +        "type": "array"
      +      },
      +      "asset_id": {
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "body": {
      +        "maxLength": 4194304,
      +        "type": "string"
      +      },
      +      "body_path": {
      +        "maxLength": 4000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "correction_reason": {
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "effective_at": {
      +        "format": "date-time",
      +        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
      +        "type": "string"
      +      },
      +      "evidence_ids": {
      +        "items": {
      +          "maxLength": 500,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50000,
      +        "type": "array"
      +      },
      +      "expected_revision": {
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "fields": {
      +        "additionalProperties": {},
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "idempotency_key": {
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "kind": {
      +        "enum": [
      +          "project",
      +          "plan",
      +          "task",
      +          "method",
      +          "experiment",
      +          "attempt",
      +          "arm",
      +          "measurement",
      +          "byte_ledger",
      +          "artifact",
      +          "document",
      +          "decision",
      +          "session"
      +        ],
      +        "type": "string"
      +      },
      +      "missing_fields": {
      +        "items": {
      +          "maxLength": 500,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 1000,
      +        "type": "array"
      +      },
      +      "operation": {
      +        "enum": [
      +          "create",
      +          "patch",
      +          "append_evidence",
      +          "relocate",
      +          "correct"
      +        ],
      +        "type": "string"
      +      },
      +      "protected": {
      +        "type": "boolean"
      +      },
      +      "set_current": {
      +        "type": "boolean"
      +      },
      +      "source_reference": {
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "source_sequence": {
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "operation",
      +      "idempotency_key"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 100,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / removed_paths
      Added value: +{
      +  "description": "Explicit root-relative entries to remove from the active snapshot. Historical snapshots remain addressable.",
      +  "items": {
      +    "properties": {
      +      "path": {
      +        "maxLength": 2000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "root": {
      +        "maxLength": 32,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "root",
      +      "path"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 100000,
      +  "type": "array"
      +}
    • addedInput schema / properties / request_id
      Added value: +{
      +  "description": "Caller-chosen ID for one local query. Supply it before a long request so project_memory query_status/query_cancel can inspect or cancel the same operation.",
      +  "maxLength": 200,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / response_budget_bytes
      Added value: +{
      +  "description": "Explicit result-array byte budget. Without an override, summaries adapt to unique result, question and source-family counts. Stored bodies and retrieval scope are not truncated by this budget; envelope metadata is separate.",
      +  "maximum": 1000000,
      +  "minimum": 1000,
      +  "type": "integer"
      +}
    • addedInput schema / properties / response_deadline_ms
      Added value: +{
      +  "description": "Caller-selected 1-300 second response deadline. Returns available lane results or QUERY_TIMEOUT with request_id. Native reads remain tracked until they settle; stored evidence and writes are unaffected.",
      +  "maximum": 300000,
      +  "minimum": 1000,
      +  "type": "integer"
      +}
    • addedInput schema / properties / revision
      Added value: +{
      +  "maximum": 9007199254740991,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / root_mode
      Added value: +{
      +  "enum": [
      +    "merge",
      +    "replace",
      +    "remove"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / roots / description
      Previous value: -"Approved local roots to index. Omit to rebuild derived state from stored sources."New value: +"Approved local roots and optional path-independent role/alias manifest. sync merges roots by default; removal is explicit."
    • addedInput schema / properties / roots / items / properties / manifest
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "aliases": {
      +        "items": {
      +          "maxLength": 2000,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 100,
      +        "type": "array"
      +      },
      +      "path": {
      +        "maxLength": 2000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "role": {
      +        "enum": [
      +          "experiment_record",
      +          "result",
      +          "method",
      +          "log",
      +          "paper",
      +          "plan",
      +          "config",
      +          "source",
      +          "report",
      +          "other"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "path",
      +      "role"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 100000,
      +  "type": "array"
      +}
    • addedInput schema / properties / roots / items / properties / role
      Added value: +{
      +  "enum": [
      +    "experiment_record",
      +    "result",
      +    "method",
      +    "log",
      +    "paper",
      +    "plan",
      +    "config",
      +    "source",
      +    "report",
      +    "other"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / roots / maxItems
      Previous value: -8New value: +64
    • addedInput schema / properties / set_current
      Added value: +{
      +  "description": "For plan writes, select this revision as current. Defaults to true; use false for historical imports.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / since_revision
      Added value: +{
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / snapshot_path
      Added value: +{
      +  "maxLength": 4000,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / source_reference
      Added value: +{
      +  "maxLength": 2000,
      +  "type": "string"
      +}
    • addedInput schema / properties / source_sequence
      Added value: +{
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / to_revision
      Added value: +{
      +  "maximum": 9007199254740991,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / user_constraints
      Added value: +{
      +  "items": {
      +    "maxLength": 2000,
      +    "type": "string"
      +  },
      +  "maxItems": 1000,
      +  "type": "array"
      +}
    • changedInput schema / properties / valid_from / pattern
      Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    • changedInput schema / properties / valid_to / pattern
      Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    • addedInput schema / properties / verification_level
      Added value: +{
      +  "enum": [
      +    "declared",
      +    "present",
      +    "hash_verified",
      +    "restore_tested",
      +    "replayed"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / wait_timeout_ms
      Added value: +{
      +  "maximum": 60000,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / context
      Added value: +{
      +  "additionalProperties": {},
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / current
      Added value: +{
      +  "additionalProperties": {},
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / diff
      Added value: +{
      +  "additionalProperties": {},
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / doctor
      Added value: +{
      +  "additionalProperties": {},
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / error / properties / cancel_reason
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / error / properties / phase
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / error / properties / request_id
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / groups
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / imported
      Added value: +{
      +  "additionalProperties": {},
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / job
      Added value: +{
      +  "additionalProperties": {},
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / query_status
      Added value: +{
      +  "additionalProperties": {},
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / receipt
      Added value: +{
      +  "additionalProperties": {},
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / receipts
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / records
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / results / items / properties / body_handle
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / results / items / properties / index_freshness
      Added value: +{
      +  "enum": [
      +    "current",
      +    "stale"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / results / items / properties / record_id
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / results / items / properties / revision_id
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / results / items / properties / source_span
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "end": {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "start": {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "start",
      +    "end"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / snapshot
      Added value: +{
      +  "additionalProperties": {},
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / timeline
      Added value: +{
      +  "additionalProperties": {},
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / verification
      Added value: +{
      +  "additionalProperties": {},
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
  2. Changed4 schema fields changedv1.0.6
    • addedInput schema / properties / detail_level
      Added value: +{
      +  "default": "summary",
      +  "description": "For show with project_id and no target_id, both values return a bounded summary. full is retained only for compatibility and never returns every durable record body.",
      +  "enum": [
      +    "summary",
      +    "full"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / decision_count
      Added value: +{
      +  "type": "number"
      +}
    • addedOutput schema / properties / experiment_count
      Added value: +{
      +  "type": "number"
      +}
    • addedOutput schema / properties / plan_count
      Added value: +{
      +  "type": "number"
      +}
  3. Changed1 schema field changedv1.0.4
    • addedInput schema / properties / query_variants
      Added value: +{
      +  "description": "Optional local retrieval variants for action=search. They run inside one broker request and are fused before one rerank.",
      +  "items": {
      +    "maxLength": 400,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "maxItems": 19,
      +  "type": "array"
      +}
  4. Changed2 schema fields changedv1.0.2
    • addedOutput schema / properties / results / items / properties / source_length
      Added value: +{
      +  "type": "number"
      +}
    • addedOutput schema / properties / results / items / properties / truncated
      Added value: +{
      +  "type": "boolean"
      +}
  5. Addedv1.0.0

TDQS

A4/5.0
Behavior4/5

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

Annotations are all false (readOnlyHint=false, openWorldHint=false, idempotentHint=false), so they declare nothing positive and the description carries the burden. It adds meaningful behavioral context: concurrent querying with safe write ordering, 'Typed record writes return compact receipts and never echo submitted bodies,' corrections that 'preserve bitemporal data lineage and support assertion replacement plus entity merge or split,' forget that 'previews impact before reversible project or assertion deletion,' and that search-family tools 'automatically capture sources and provenance.' No contradiction with annotations. Small deduction for not covering auth requirements, rate limits, or failure semantics beyond hints like QUERY_TIMEOUT.

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

Conciseness3/5

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

The description is dense and every sentence carries information, but it is a very long wall of text with essentially no paragraph breaks for scannability. The central routing sentence is a massive run-on listing 15+ action mappings in one clause ('Use context for the bounded current project view; current to generate a compact CURRENT.md; get/get_batch for exact records and body spans; record/record_batch for durable idempotent writes; ...'). The core concept is front-loaded well, but an agent parsing this would benefit from bullets or segmentation. Appropriately sized for the tool's complexity, poorly structured for consumption.

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 90-parameter destination tool with an output schema, this is near-complete: it covers the broker/concurrency model, what the store links, a full action routing table, behavior of writes, correction semantics, export output characteristics, and sibling differentiation. The output schema means return values need no explanation. Deductions for not addressing access control/permissions, rate limits, or multi-step error-recovery flows beyond idempotency-key mentions. Given the enormous scope, the coverage is strong but not exhaustive.

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 66%, so the schema already documents most parameters and the baseline is 3. The description adds value mostly at the action-routing level (which parameter combinations belong to which action) and via behavioral notes like 'Ontology revisions use supersedes_term_id' and export format specifics (HTML always includes PKM, Lineage, and Ontology tabs). However, it does not deeply compensate for the remaining undocumented ~34% of parameters; many parameter meanings are only discoverable through the schema or the action enum's own long description. Marginal addition over the schema, hence a 3.

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 role: a local broker that lets multiple MCP sessions query the same knowledge base concurrently while ordering writes safely, and it enumerates what the store links (session intent, plan revisions, experiments, decisions, versioned ontology, bitemporal lineage). It also distinguishes itself from siblings by explicitly naming project_memory_search as the sibling for local knowledge retrieval. Slight deduction because the tool is a 25-plus-action dispatcher, so the 'purpose' is necessarily broad rather than a single verb+resource.

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

Usage Guidelines5/5

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

The description provides an explicit routing map for nearly every action: 'Use project_update for revision-checked changes...', 'Use context for the bounded current project view; current to generate a compact CURRENT.md; get/get_batch for exact records...', plus job_*, snapshot_*, doctor, rebuild, export, and forget. It also gives a negative rule: 'action=search remains a compatibility alias, but project_memory_search should be used' and 'Unrelated local questions use project_memory_search.' This is model-guidance of the highest quality.

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