Skip to main content
Glama

@mnemoverse/mcp-memory-server

npm version npm downloads MCP Registry License: MIT Research: SLoD arXiv Glama quality

AI 에이전트를 위한 호스팅 메모리로, 어떤 사실이 중요한지 스스로 학습합니다. 피드백은 유사도 점수가 아니라 예측 오차에 대한 Rescorla-Wagner 업데이트로 회상을 재정렬합니다. 따라서 도움이 된 정보는 떠오르고, 오해를 불러일으킨 정보는 가라앉으며, 최신 기억에는 제한된 최신성 타이브레이커가 적용됩니다. 이 엔진은 통합 기능(HDBSCAN 클러스터링, Von Restorff 보호로 독특한 기억이 압축에서 살아남음)도 제공합니다. 하나의 API 키로 Claude, Cursor, VS Code, ChatGPT 및 모든 MCP 클라이언트에서 사용할 수 있습니다.

세션, 프로젝트, 도구를 넘나들며 지속되고 사용할수록 개선되는 메모리. 호스팅 방식이라 인프라를 운영할 필요가 없고, 특정 클라우드에 종속되지 않습니다.

⭐ Mnemoverse가 에이전트에게 컨텍스트를 다시 설명하는 수고를 덜어준다면, 저장소에 스타를 남겨주세요. 다른 개발자들이 이 프로젝트를 찾는 데 도움이 됩니다.

빠른 시작

1. 무료 API 키 받기

console.mnemoverse.com에서 가입하세요 — 30초면 충분하며, 신용카드는 필요 없습니다.

2. AI 도구에 연결하기

Claude Code — CLI로 추가:

claude mcp add mnemoverse -s user \
  -e MNEMOVERSE_API_KEY=mk_live_YOUR_KEY \
  -e MNEMOVERSE_API_URL=https://core.mnemoverse.com/api/v1 \
  -- npx -y @mnemoverse/mcp-memory-server@latest

Cursor — 클릭하여 설치하거나 .cursor/mcp.json에 추가:

Add to Cursor

{
  "mcpServers": {
    "mnemoverse": {
      "command": "npx",
      "args": [
        "-y",
        "@mnemoverse/mcp-memory-server@latest"
      ],
      "env": {
        "MNEMOVERSE_API_KEY": "mk_live_YOUR_KEY",
        "MNEMOVERSE_API_URL": "https://core.mnemoverse.com/api/v1"
      }
    }
  }
}

VS Code — .vscode/mcp.json에 추가 (참고: VS Code는 mcpServers가 아닌 servers를 사용합니다):

{
  "servers": {
    "mnemoverse": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@mnemoverse/mcp-memory-server@latest"
      ],
      "env": {
        "MNEMOVERSE_API_KEY": "mk_live_YOUR_KEY",
        "MNEMOVERSE_API_URL": "https://core.mnemoverse.com/api/v1"
      }
    }
  }
}

Windsurf — ~/.codeium/windsurf/mcp_config.json에 추가:

{
  "mcpServers": {
    "mnemoverse": {
      "command": "npx",
      "args": [
        "-y",
        "@mnemoverse/mcp-memory-server@latest"
      ],
      "env": {
        "MNEMOVERSE_API_KEY": "mk_live_YOUR_KEY",
        "MNEMOVERSE_API_URL": "https://core.mnemoverse.com/api/v1"
      }
    }
  }
}

기타 MCP 클라이언트 — 동일한 서버, 다른 설정 파일:

Zed — ~/.config/zed/settings.json에 추가 (Zed는 context_servers를 사용하며 "source": "custom"이 필수입니다):

{
  "context_servers": {
    "mnemoverse": {
      "source": "custom",
      "command": "npx",
      "args": [
        "-y",
        "@mnemoverse/mcp-memory-server@latest"
      ],
      "env": {
        "MNEMOVERSE_API_KEY": "mk_live_YOUR_KEY",
        "MNEMOVERSE_API_URL": "https://core.mnemoverse.com/api/v1"
      }
    }
  }
}

JetBrains (AI Assistant) — *Settings → Tools → AI Assistant → Model Context Protocol (MCP)*로 이동한 후 붙여넣기:

{
  "mcpServers": {
    "mnemoverse": {
      "command": "npx",
      "args": [
        "-y",
        "@mnemoverse/mcp-memory-server@latest"
      ],
      "env": {
        "MNEMOVERSE_API_KEY": "mk_live_YOUR_KEY",
        "MNEMOVERSE_API_URL": "https://core.mnemoverse.com/api/v1"
      }
    }
  }
}

Cline — MCP Servers → Configure (또는 cline_mcp_settings.json 편집). Cline은 env 값을 문자 그대로 읽으므로 실제 키를 붙여넣어야 합니다 — ${VAR} 참조가 아닙니다:

{
  "mcpServers": {
    "mnemoverse": {
      "command": "npx",
      "args": [
        "-y",
        "@mnemoverse/mcp-memory-server@latest"
      ],
      "env": {
        "MNEMOVERSE_API_KEY": "mk_live_YOUR_KEY",
        "MNEMOVERSE_API_URL": "https://core.mnemoverse.com/api/v1"
      }
    }
  }
}

Continue — ~/.continue/mcpServers/mnemoverse.yaml 추가 (Continue는 YAML 사용):

mcpServers:
  - name: mnemoverse
    command: npx
    args:
      - "-y"
      - "@mnemoverse/mcp-memory-server@latest"
    env:
      MNEMOVERSE_API_KEY: "mk_live_YOUR_KEY"
      MNEMOVERSE_API_URL: "https://core.mnemoverse.com/api/v1"

@latest를 사용하는 이유? npx @mnemoverse/mcp-memory-server는 npm이 무기한 캐시하여 레지스트리 재확인을 중단합니다. @latest 접미사는 Claude Code / Cursor / VS Code 세션 시작 시마다 메타데이터 조회(~100-300ms)를 강제하여 새 릴리스를 항상 받을 수 있게 합니다.

⚠️ 설정을 편집한 후 AI 클라이언트를 재시작하세요. MCP 서버는 클라이언트 시작 시에만 로드됩니다.

3. 사용해 보기 — 30초면 작동 확인 가능

AI 채팅에 다음을 붙여넣으세요:

"제가 가장 좋아하는 TypeScript 프레임워크는 Hono입니다. memory_write를 호출해서 저장해 주세요."

에이전트가 memory_write를 호출하고 메모리가 저장되었는지 확인해야 합니다.

그런 다음 새 채팅 / 새 세션을 열고(이것이 핵심입니다 — 메모리는 재시작 후에도 유지됩니다) 다음과 같이 물어보세요:

"제가 가장 좋아하는 TypeScript 프레임워크는 무엇인가요?"

에이전트가 memory_read를 호출하고 항목을 찾아 "Hono"라고 답해야 합니다. 그렇다면 연결이 완료된 것입니다. 이제 원하는 내용을 자유롭게 저장하세요.

기억하지 못한다면: 클라이언트가 완전히 재시작되었는지, 설정에 실제 mk_live_... 키가 placeholder가 아닌지 확인하세요.

Related MCP server: memmd-mcp

도구

도구

기능

memory_write

메모리 저장 — 통찰, 선호도, 교훈

memory_read

자연어 쿼리로 메모리 검색 (선택적 최신순 정렬, 시간 범위, 작성자 제외)

memory_list_recent

최신 메모리부터 나열 — 쿼리 없음; since/until 범위(포함) + 커서 페이지네이션

memory_feedback

메모리를 도움이 되었는지 평가 (향후 회상 개선)

memory_stats

저장된 메모리 수, 존재하는 도메인 확인

memory_create_room

공유 메모리 룸 생성; 해당 주소는 쓰기/읽기 시 domain으로 사용 가능

memory_invite_to_room

소유한 룸에 대한 일회용 초대장(코드 + 링크) 발급

memory_join_room

초대 코드(mnvr_...)로 공유 룸 참여

memory_list_rooms

소유하거나 참여한 룸 목록, 각 룸의 주소를 domain으로 사용 가능

vault_list

별칭과 용도별 Vault 비밀번호 목록 — 비밀 값은 절대 반환되지 않음

저장할 만한 아이디어

  • 사용자 선호도: "저는 다크 모드를 사용합니다", "CSS 모듈보다 Tailwind를 선호합니다"

  • 프로젝트 컨텍스트: "이 프로젝트는 PostgreSQL + Prisma를 사용합니다", "Railway에 배포합니다"

  • 교훈: "이 저장소에서는 푸시 전에 항상 테스트를 실행하세요"

  • 결정 사항: "캐싱 단순성 때문에 GraphQL 대신 REST를 선택했습니다"

  • 사람과 역할: "Alice는 디자이너이고, Bob은 API를 담당합니다"

  • 과거 실수: "금요일에는 배포하지 마세요 — 뼈저리게 배웠습니다"

범용 메모리

동일한 API 키가 모든 도구에서 작동합니다. Claude Code에서 메모리를 저장하면 Cursor에서 읽을 수 있습니다. VS Code에서 배운 내용은 GPT Custom Action도 알고 있습니다.

                    ┌── Claude Code (this MCP server)
                    ├── Cursor (this MCP server)
   Mnemoverse API ──├── VS Code (this MCP server)
   (one memory)     ├── GPT (Custom Actions)
                    ├── Python SDK (pip install mnemoverse)
                    └── REST API (curl)

설정

환경 변수

필수 여부

기본값

MNEMOVERSE_API_KEY

모든 도구 호출에 필요 — 서버는 이 키 없이도 시작되어 도구를 나열합니다

—

MNEMOVERSE_API_URL

아니요

https://core.mnemoverse.com/api/v1

링크

설정 및 참조

배경 자료

프로젝트

개인정보 보호정책

이 서버는 API 키로 인증된 Mnemoverse API(core.mnemoverse.com)에 도구 호출이 전달하는 내용만 보내며, 그 외에는 아무것도 볼 수 없습니다. AI 클라이언트의 대화 기록, 로컬 파일, 또는 memory_* / vault_* 도구에 전달하지 않은 어떤 것도 읽지 않습니다. 저장된 메모리는 사용자 계정 아래에 있으며, Mnemoverse는 이를 판매하지 않으며 자체적으로 공유하지도 않습니다. 유일한 공유 경로는 사용자가 직접 만드는 것입니다: 누군가를 공유 룸에 초대하면 그 사람의 어시스턴트가 해당 룸의 메모리에 접근할 수 있으며, 초대 범위에 따라 제한됩니다.

각 도구가 보내는 데이터:

도구

전송되는 데이터

memory_write

전달한 content, concepts, domain

memory_read

query 및 필터: domain, since/until, exclude_author, top_k, order_by

memory_list_recent

피드 필터: domain, since/until, exclude_author, limit, cursor

memory_feedback

평가 중인 atom_ids와 outcome 점수

memory_create_room

룸의 name과 description

memory_invite_to_room

room_id, 초대 scope, 만료 시간

memory_join_room

초대 code

memory_stats / memory_list_rooms / vault_list

요청 본문 없음 — 인증된 GET 요청

명시적으로 요청하지 않은 한 가지가 나갑니다: 0.8.1부터 검색이나 피드가 비어 있을 때, 서버는 빈 응답이 무엇을 다루지 않았는지 설명할 수 있도록 인증된 읽기 전용 GET 프로브(/memory/rooms 및/또는 /memory/stats)를 한두 개 보냅니다. 프로브는 API 키 외에는 아무것도 전달하지 않으며, 저장된 상태를 변경하지 않고, CHANGELOG에 공개되어 있습니다.

개인정보 처리방침

https://mnemoverse.com/privacy

보관 및 삭제

잘못되었거나 오래된 기억은 새 기억을 작성하여 수정하십시오. 삭제는 REST API의 관리 작업으로, 이 MCP 서버를 통해서는 노출되지 않습니다.

문의

hello@mnemoverse.com

라이선스

MIT © Mnemoverse

Available Tools

11 tools
memory_create_roomAInspect

Create a SHARED memory room — a space OTHER people's assistants can read, and write too when their invite granted read_write (the default scope), across Claude/ChatGPT/Cursor. Use when the user wants to share context or collaborate with someone else (e.g. 'make a room for me and my teammate'). Returns the room's address; pass that address as the domain on memory_write/memory_read to use it, and on memory_list_recent to catch up on what others added. People join through an invite minted with memory_invite_to_room.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesRoom name, unique within your account (e.g. 'launch-team').
descriptionNoOptional description of the room.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoThe room name as stored.
addressYesDomain address (xroom:<id>); pass as `domain` on read/write.
room_idYesThe room's id (room_...); pass to memory_invite_to_room.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only declare the generic safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false). The description adds the substantive traits: the room is shared/cross-vendor (Claude/ChatGPT/Cursor), the default invite scope is read_write, and it returns an address to be reused as the `domain` argument elsewhere. It does not address name-collision behavior for a non-idempotent create, which leaves one gap.

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

Conciseness4/5

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

Front-loads the definition of the room before the usage trigger and the follow-on tools. It is a long sentence chain but each clause carries distinct information (scope, cross-platform reach, default invite scope, return value, next steps); minor tightening is possible but nothing is fat.

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?

An output schema exists, so line-by-line return documentation is unnecessary, yet the description still tells the agent what the address is for. Combined with the invite/read/write follow-on pointers, an agent has enough to create and then use a room; only edge cases (duplicate names, permissions to create) are unaddressed.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents `name` (unique within account) and the optional `description`; the baseline is 3. The description adds no additional meaning about the two parameters themselves (the uniqueness rule it references is already in the schema).

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

Purpose5/5

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

States a specific verb+resource ('Create a SHARED memory room') and immediately distinguishes it from siblings by defining what a room is (a space other people's assistants can read/write). An agent can tell it apart from memory_list_rooms, memory_join_room, and memory_invite_to_room without opening any schema.

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

Usage Guidelines4/5

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

Gives an explicit trigger condition and a concrete user-utterance example ('make a room for me and my teammate'), plus points to memory_invite_to_room as the way people join. It stops short of stating when NOT to create a room or how it differs for solo use, so it is clear context rather than full routing guidance.

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

memory_feedbackAInspect

Report whether memories returned by memory_read were actually helpful. This is a learning signal, not a log: positive feedback raises a memory's ranking so it surfaces faster next time (across all of the user's tools), negative feedback lowers it so other memories out-rank it — nothing is erased and nothing decays with time. Use it after an answer that relied on or rejected memories from memory_read: pass the ids of those memories as memory_ids, with outcome 1 when they helped and -1 when they were wrong or stale. For memories read from a shared room, also pass that room's address as domain; your own memories need no domain. A read-only room member cannot rate the room's memories.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoOnly for memories read from a shared room: that room's address (xroom:...), exactly as you read it. Omit it for your own memories, which are rated by id alone.
outcomeYesHow helpful was this? 1.0 = very helpful, 0 = neutral, -1.0 = harmful/wrong
memory_idsYesIDs of the memories to rate, the `id:` line of each memory_read result.

Output Schema

ParametersJSON Schema
NameRequiredDescription
avg_valenceNoAverage valence of the rated memories after the update. Reported as 0 in an asynchronous acknowledgement, where the real value is computed later — a 0 here is therefore not evidence of a neutral outcome.
updated_countYesHow many memories the service reports it applied the rating to. Processed synchronously this is the real count of memories that existed and were updated; processed asynchronously it is a best-effort ACCEPTED-count estimate — the number of IDs submitted — and the authoritative number is not known until the background worker runs. Zero means no submitted ID matched in the service's resolved request scope.
coactivation_edgesNoNumber of links between query concepts and result concepts that this rating changed. This server does not send query_concepts, so live calls through this tool report 0; asynchronous acknowledgements also report 0.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false; the description goes well beyond them by explaining the actual effect (positive raises ranking across all the user's tools, negative lowers it so other memories out-rank it), the non-destructive boundary ('nothing is erased and nothing decays with time'), and the permission limitation. No statement conflicts with 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.

Conciseness5/5

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

Three sentences, each carrying distinct load: purpose, effect model, and invocation rules. The purpose and ranking consequence are front-loaded before the edge cases, with no filler.

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

Completeness5/5

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

With an output schema present, return values need no explanation. The description covers the mutation effect, the value convention, the conditional domain argument, and the permission edge case, leaving nothing an agent needs in order to call it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all three parameters; the baseline would be 3. The description adds situational meaning by tying memory_ids to 'the ids of those memories' just consumed and restricting domain to shared-room addresses read as xroom, which helps the agent supply them correctly in context.

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

Purpose5/5

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

The description states a specific verb+resource ('Report whether memories returned by memory_read were actually helpful') and immediately frames the tool's role as a learning signal rather than a log, which cleanly separates it from siblings like memory_read and memory_write. An agent can identify this as the ranking-feedback tool without opening any schema.

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

Usage Guidelines5/5

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

It gives explicit when-to-use conditions ('after an answer that relied on or rejected memories from memory_read'), the exact value convention for outcome (1 helpful, -1 wrong/stale), and a conditional rule for domain (shared-room reads only). It even names an exclusion: a read-only room member cannot rate the room's memories.

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

memory_graphA
Read-onlyIdempotent
Inspect

Reads the association edges around given concepts: which concepts the memory has linked together, with each link's weight, outcome valence and co-activation count. Use to inspect what a memory store has learned or to explain why a read expanded to a concept. Reads your own graph, or a shared room's when its address is passed as domain; any other domain value has no effect. At depth 2 or 3 the engine drops edges below weight 0.05 unless min_weight is set. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoHops to expand from the seeds (1-3, default 1). At depth 2 or 3, if min_weight is omitted the engine floors edge weight at 0.05 at EVERY hop — including the first — so a hub concept cannot fan out across the whole store before limit applies; pass min_weight explicitly (0 included) to see every edge anyway.
limitNoMax edges to return (1-500, default 100 — mirrors memory_read's top_k bounds).
seedsYesConcepts to center the graph on (1-20, each ≤200 chars, non-blank) — e.g. ['deploy', 'staging']. An unrecognised concept simply contributes no edges; it is not an error.
domainNoRead a shared room's graph instead of your own: pass that room's address (e.g. 'xroom:room_01ABC'). Find room addresses with memory_list_rooms. Unlike memory_read, any OTHER value has no effect here — the association store has no domain column, so a plain domain name behaves exactly like omitting this field.
min_weightNoOnly include edges at or above this weight (≥ 0). Omit for no floor at depth 1; at depth 2/3 the engine applies its own 0.05 floor when this is omitted (see depth) — pass 0 to see every edge at every depth.

Output Schema

ParametersJSON Schema
NameRequiredDescription
edgesYesAssociation edges found within the requested depth.
nodesYesConcepts touched by edges below. A seed with no surviving edge (unrecognised concept, or every edge fell below the weight floor) is not listed.
truncatedYesTrue when a per-hop server cap or limit cut the walk short — the store may hold more edges than are reported here.
min_weight_appliedYesThe weight floor actually used at every hop: your min_weight when you set one (0 included); otherwise 0.05 from depth 2, or 0 at depth 1.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description reinforces 'Read-only.' Beyond that it discloses genuinely non-obvious behavior: the depth 2/3 weight floor of 0.05 applied at every hop, and the fact that a non-room domain value silently has no effect. It stops short of describing result ordering or truncation semantics.

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

Conciseness4/5

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

Front-loaded with purpose, then scope, then caveats, in roughly four dense sentences with no filler. It is information-rich but borders on restating schema detail, slightly reducing economy.

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

Completeness5/5

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

An output schema exists so return shape need not be explained, and annotations cover the safety profile. The description fills the remaining gaps an agent needs: the shared-room domain exception, the cross-hop weight floor, and the non-error handling of unrecognized seeds.

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

Parameters3/5

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

Schema description coverage is 100%, so all five parameters are already documented in the schema, including the depth/min_weight interaction and the domain address format. The description restates this at a high level rather than adding syntax or semantics the schema lacks, which is the expected baseline.

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

Purpose5/5

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

States a specific verb and resource ('Reads the association edges around given concepts') and enumerates what each edge carries (weight, outcome valence, co-activation count). It is distinguishable from the closer sibling memory_read, which is referenced by role ('explain why a read expanded to a concept').

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

Usage Guidelines4/5

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

Gives two concrete use cases — inspecting what the store learned and explaining an expansion — which implicitly contrasts with memory_read. However, it never states when NOT to use this tool, e.g. when a flat top_k read is sufficient, so the routing is clear but incomplete.

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

memory_invite_to_roomAInspect

Mint an invite for a room you own and get a ready-to-forward message. An invite is single-use by default; pass max_uses to let several people join with the same one. The user sends that message to the person they want to add (any messenger); the recipient opens the link or tells THEIR assistant the code to join. Use when the user asks to invite someone to a room they own, including one just created with memory_create_room.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoRole the invitee gets — 'read' or 'read_write' (default read_write).
room_idYesThe room's id (room_...), from memory_create_room.
max_usesNoHow many people may join with this invite (default 1, single-use).
expires_in_daysNoDays until the invite expires (default 7).

Output Schema

ParametersJSON Schema
NameRequiredDescription
codeNoThe invite code (mnvr_...). Single-use by default, with a configurable use limit. Shown once.
scopeNoRole the invitee will get.
join_urlNoLanding URL the invitee can open to join.
expires_atNoISO 8601 expiry, or null.
room_addressNoThe room's domain address (xroom:<id>).
share_messageYesReady-to-forward invite text.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only carry the generic mutation profile (readOnlyHint=false, idempotentHint=false), so the description must add the real behavior — and it does: invites are single-use by default, max_uses lets one invite admit several people, and it explains the out-of-band delivery flow (user forwards the message, recipient either opens the link or dictates the code to their own assistant). That is exactly the kind of non-obvious semantics 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.

Conciseness5/5

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

The core action is front-loaded in the first sentence, followed by invite lifetime semantics and then the routing condition. Four sentences, each carrying distinct information, with no filler.

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

Completeness5/5

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

For a small mutation tool with an output schema (so return shape needn't be described) and full schema coverage, the description supplies the missing pieces: the invite artifact, its default single-use behavior, and the human-in-the-loop forwarding step. Nothing an agent needs to invoke it correctly is absent.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all four parameters, setting a baseline of 3. The description still adds meaning about max_uses by framing the default as 'single-use' and the override as letting 'several people join with the same one,' which clarifies intent rather than restating the field. scope and expires_in_days are left to the schema.

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

Purpose5/5

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

States a specific verb and resource ('Mint an invite for a room you own') plus the concrete deliverable ('ready-to-forward message'), which separates it cleanly from memory_join_room and memory_create_room. An agent can pick this tool without opening the schema.

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

Usage Guidelines4/5

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

Gives an explicit trigger condition ('Use when the user asks to invite someone to a room they own') and connects it to memory_create_room for the just-created-room case. It does not state when not to use it, e.g. that the recipient side belongs to memory_join_room, so it stops short of a full when/when-not/alternatives treatment.

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

memory_join_roomA
Idempotent
Inspect

Join a shared memory room using an invite code (starts with 'mnvr_'). Use when the user pastes an invite code or says something like 'join room with code ...'. The result gives the room's address, which is the domain for reading the shared room with memory_read, and tells you what you may do with it: memory_write to that address is only allowed when your membership scope is read_write; a read-only membership has that write refused; and when the server does not report a scope, whether memory_write would succeed is stated as unknown rather than promised either way.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe invite code (mnvr_...).

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoThe room name.
scopeNoYour role in the room ('read' | 'read_write').
addressYesDomain address (xroom:<id>); pass as `domain` on read/write.
room_idYesThe room's id (room_...).
next_stepsYesHow to use the room now.
already_memberNoTrue if you were already a member (no-op join).

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only carry readOnlyHint/idempotent/destructive flags; the description adds real behavioral context beyond them: the result yields the room's address used as `domain`, and it explains that memory_write succeeds only with read_write scope, is refused for read-only membership, and is reported as unknown when the server gives no scope. This is honest, non-contradictory disclosure that an agent could not infer from 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.

Conciseness4/5

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

Purpose and trigger are front-loaded, and every sentence carries information. The final scope sentence is long and clause-heavy, but its content (write permission semantics) earns its place.

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

Completeness5/5

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

With an output schema present, the description need not enumerate return fields, yet it still explains the key returned address and its role as the `domain` for memory_read/memory_write, plus the membership-scope outcomes. Nothing needed to invoke or chain this tool is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter is documented there, including the 'mnvr_...' format. The description repeats the same prefix hint but adds no syntax or validation detail beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Join a shared memory room') plus the required credential ('invite code, starts with mnvr_'), which cleanly separates it from siblings like memory_create_room and memory_invite_to_room.

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

Usage Guidelines4/5

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

Gives explicit trigger conditions ('use when the user pastes an invite code or says join room with code ...') and names the downstream tools (memory_read, memory_write) this enables. It stops short of naming an alternative tool or an explicit when-not-to-use case, so it is not a full 5.

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

memory_list_recentA
Read-onlyIdempotent
Inspect

List the NEWEST memories first — no search query needed. Semantic search answers 'what do I know about X'; this answers 'what happened lately': resuming work after a break, catching up on a shared room ('any new messages?'), or reviewing what was saved recently. Pass since (your last-seen time) to get only what's new, and page through older entries with the returned cursor. Complete by construction WITHIN ONE SCOPE — nothing is skipped there, unlike a semantic search. A page is also bounded by SIZE, so a page of long entries comes back shorter than limit and hands you a cursor for the rest — nothing is dropped, and following the cursor is how you get it. To catch up on a shared room you MUST pass its address as domain: rooms are separate stores and an unscoped call never covers them.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMost entries per page (default: 20). Newest first. ⚠️ A CEILING, not a promise: the page is ALSO bounded by size, so a page of long entries stops early and returns a cursor for the rest. In rooms whose entries run long, ask for 5–10 — a large `limit` there buys nothing the size budget will not take back, and costs round trips.
sinceNoOnly entries created at/after this ISO-8601 instant (naive = UTC) — your novelty watermark.
untilNoOnly entries created at/before this ISO-8601 instant (inclusive). Pair with `since` to read a closed window — 'what happened on Monday' — instead of paging back from now.
cursorNoOpaque cursor from a previous page's 'More older entries exist' line — continues the listing without skips or duplicates.
domainNoRestrict to one domain. REQUIRED to read a shared room — pass its address ('xroom:room_01ABC'), because rooms are separate stores that an unscoped feed does NOT cover. Omit only when you mean your own domains. Room addresses come from memory_list_rooms. Room entries are often long — a room feed usually reaches its size budget after a handful of them, so expect to page (see `limit`).
exclude_authorNoDrop entries written by this author PRINCIPAL. ⚠️ NOT USABLE FROM HERE YET — the principal is never shown in these results, so there is no value you can get through this tool; a guess like 'me' filters nothing, silently. Same caveat as on memory_read.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesEntries newest-first (creation time descending).
next_cursorNoPass back as cursor for the next (older) page; null = listing complete. Absent when the service sent a continuation token this client will not pass on; the text then says the token could not be displayed.

TDQS

A5/5.0
Behavior5/5

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

Annotations already mark the tool read-only and idempotent, and the description adds genuinely useful behavioral context: pages are complete within a scope, size-bounded pages can return fewer than `limit`, cursors are required to avoid dropped entries, and rooms are separate stores. No contradiction with the annotations.

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

Conciseness5/5

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

Dense and front-loaded: the core action appears in the first sentence, and every caveat earns its place by either explaining a consequence or a required condition. Warnings such as size budgeting and room separation are actionable rather than filler.

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

Completeness5/5

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

The description covers everything needed to invoke correctly: when to use it, when to scope by domain, how paging works, and where room addresses come from memory_list_rooms. Since an output schema exists, the lack of return-format explanation is not a gap.

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

Parameters5/5

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

Even with 100% schema coverage, the description adds meaning beyond the schema: `since` is framed as a novelty watermark, cursors continue listings without skips/duplicates, `limit` is a ceiling affected by page size, and `domain` unlocks shared rooms. The schema already documents syntax well, and the description reinforces behavior around it.

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

Purpose5/5

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

States the exact behavior—lists the newest memories first—and immediately distinguishes itself from semantic search by contrasting 'what do I know about X' with 'what happened lately.' This also cleanly separates it from sibling tools like memory_read and memory_list_rooms.

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?

Gives explicit use cases (resuming work, catching up on a shared room, reviewing recent activity), tells when to pass `since`, and when `domain` is mandatory. It even specifies the exclusion condition: an unscoped call never covers rooms, so an agent knows exactly when to supply the room address.

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

memory_list_roomsA
Read-onlyIdempotent
Inspect

List the shared memory rooms you can use — the ones you OWN plus the ones you've JOINED — each with the address to pass as domain on memory_read, and on memory_write too where your membership scope is read_write; a read-only membership has that write refused. Use this to RE-FIND a room in a new session (e.g. 'what rooms do I have?', 'resume the room with my teammate') instead of having to create or re-join it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
roomsYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuinely new behavior: which rooms are returned, that the returned address feeds the `domain` argument on memory_read/memory_write, and that read-only membership causes writes to be refused. Return value shaping isn't described, but the key membership caveat is.

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

Conciseness4/5

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

One dense sentence that front-loads the core scope (owned + joined) and then the usage rationale. Every clause earns its place, though the em-dash interjection about read_write scope makes it slightly heavy for a list tool.

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

Completeness5/5

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

An output schema exists, so return-format explanation is not required, yet the description still conveys the practically important bit of the output (the address for use as `domain`). For a zero-param, read-only list tool, nothing an agent needs is missing.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. The description's mention of the `domain` address is output-to-other-tools mapping rather than input semantics, but it adds useful cross-tool meaning without overloading the empty schema.

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

Purpose5/5

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

States a specific verb+resource (list shared memory rooms) and immediately scopes it to the two membership sources (OWNED + JOINED). Clearly differentiates from siblings like memory_create_room and memory_join_room by framing this as the discovery operation.

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

Usage Guidelines5/5

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

Explicitly says when to use it ('RE-FIND a room in a new session') and when not to (instead of having to create or re-join it), giving concrete trigger phrasings. The alternative tools are implied by name and purpose.

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

memory_readA
Read-onlyIdempotent
Inspect

Search long-term memory for user preferences, past decisions, project setup, people, or earlier context. The memory persists across sessions and across every AI tool the user has connected (Claude, ChatGPT, Cursor, VS Code). It applies when an answer may depend on something from an earlier session or another tool; it is not needed for general world knowledge. Returns matches ranked by relevance (or newest-first with order_by: 'recency'); each result carries an id; after the answer, memory_feedback takes these ids to record which memories helped. A wrong or stale memory is corrected by writing a fresh one with memory_write, not by deleting it.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesNatural-language description of what you're looking for, e.g. 'database choice for the API' or 'user's preferred testing framework'.
sinceNoOnly memories created at/after this ISO-8601 instant (naive = UTC) — e.g. your last-seen watermark in a shared room.
top_kNoRequested number of results (default: 5, what this server asks for when you omit it; the engine's own default of 10 never applies, because the field is always sent). ⚠️ Not a hard cap: association expansion can return MORE than this, and the relevance floor can return fewer — raising it does not reliably widen the result set. For a complete, exactly-bounded listing use memory_list_recent instead.
untilNoOnly memories created at/before this ISO-8601 instant.
domainNoRestrict the search to one domain namespace (e.g. 'project:acme'). Omitting it searches your OWN domains — it does NOT include shared rooms, which are separate stores: to search a room, pass its address here (e.g. 'xroom:room_01ABC'). Find room addresses with memory_list_rooms.
order_byNo'relevance' (default) = ranking order. 'recency' = the matched set re-sorted newest-first. For a complete newest-first feed with no search at all, use memory_list_recent instead.
diversityNo0 (default) returns the matches as ranked. Above 0, a match that is a near-copy of one already picked gives its slot to the next distinct memory (maximal marginal relevance); 1 lets similarity alone decide after the first pick. It changes which memories come back, not their scores, and applies only when there are more matches than top_k and top_k is below 200.
exclude_authorNoDrop memories written by this author PRINCIPAL — the server-side identity. ⚠️ NOT USABLE FROM HERE YET: the principal is not shown in these results, so there is no value you can obtain through this tool, and a guess like 'me' silently matches nothing and filters nothing. Only pass it if your system knows the exact principal from elsewhere (e.g. the REST API).

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesMatching memories, ordered per order_by.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the readOnly/idempotent annotations by disclosing that results are relevance-ranked (or newest-first via order_by), that each result carries an id, that memory persists across sessions and across other AI tools, and that corrections happen by rewriting rather than deleting. This is substantive operational context.

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

Conciseness4/5

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

The content is front-loaded with purpose and use conditions, and each sentence carries information. It is fairly dense but a couple of the trailing sentences (feedback, correction) sit slightly awkwardly at the end rather than being tight to the core search purpose.

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

Completeness5/5

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

With an output schema present and 100% schema coverage, the description need not explain return shapes, and it still supplies the cross-session/cross-tool persistence model and the correction workflow. Nothing an agent needs to select and call the tool correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already explains order_by, top_k caveats, domain scoping, etc. in depth. The description's mention of order_by: 'recency' and id-carrying results largely restates what the schema documents, so it does not add meaningful new parameter semantics.

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

Purpose5/5

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

States a specific verb+resource ('Search long-term memory') and immediately names the scope of retrievable content (preferences, decisions, project setup, people, earlier context). It also implicitly distinguishes itself from memory_list_recent by framing the operation as a relevance-ranked search rather than a brute listing.

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

Usage Guidelines5/5

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

Explicitly states when to use it ('applies when an answer may depend on something from an earlier session or another tool') and when not to ('not needed for general world knowledge'). It also routes the agent to siblings: memory_feedback for recording usefulness, memory_write for correcting a stale memory rather than deleting.

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

memory_statsA
Read-onlyIdempotent
Inspect

Get an overview of the stored memory: total count, the number of learned concept associations, the list of domains, and average quality scores. This memory is shared across all AI tools the user has connected to Mnemoverse. Use it to orient yourself, to confirm the exact domain name before writing to it, or when the user asks what you remember. Read-only — changes nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
domainsYesUser-defined memory domains.
episodesNoNumber of individual memories (not merged into a summary).
prototypesNoNumber of summary memories merged from several individual ones. Consolidation is not running on the hosted service, so this count does not currently grow.
avg_valenceNoAverage valence of stored memories: how well recalls turned out, on a scale from -1 to 1.
memory_countYesNumber of saved memories.
hebbian_edgesNoNumber of learned concept-to-concept associations; memory_graph reads them.
avg_importanceNoAverage importance of stored memories, on a scale from 0 to 1.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and idempotentHint=true, so 'Read-only — changes nothing' is reinforcement rather than new information. However, the claim that the memory is shared across all connected AI tools is a genuinely useful scope disclosure not present in any structured field.

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

Conciseness4/5

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

Front-loaded with purpose, then scope, then usage, then safety — a sensible order. Three sentences with little waste, though the closing 'Read-only — changes nothing' repeats what the annotations already certify.

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

Completeness5/5

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

For a zero-parameter tool with an output schema and full annotation coverage, the description supplies everything an agent needs: what the call returns, whose data it reflects, and when it is worth calling. No gaps remain.

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

Parameters4/5

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

The tool takes zero parameters, so per the rubric the baseline is 4. The description correctly adds background on what the shared store is, which is the only meaningful 'parameter-like' context available for a no-arg call.

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?

States a specific verb and resource ('Get an overview of the stored memory') and enumerates exactly what the overview contains: total count, concept associations, domains, average quality scores. It is unambiguous within the sibling set, though it never names a sibling like memory_read or memory_list_recent to draw the boundary explicitly.

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

Usage Guidelines4/5

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

Gives three concrete triggers: orienting yourself, confirming the exact domain name before writing, and answering 'what do you remember'. That is clear when-to-use guidance, but it offers no exclusion or explicit alternative (e.g. use memory_read when you need the raw contents).

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

memory_writeAInspect

Store a long-term memory that persists across sessions and across every AI tool the user has connected to Mnemoverse (Claude, ChatGPT, Cursor, VS Code). Suited to durable information: a stated preference, a decision, a fact about people, roles or project setup, a lesson learned; transient chatter that only matters this turn does not belong here. Never store passwords, API keys, payment data, MFA codes, government IDs, or health records. Behavior: outside shared rooms, a novelty gate refuses a write the embedder cannot tell apart from a memory already stored in the same domain, so the result tells you whether the memory was stored or refused. Write content as a self-contained statement that still makes sense when recalled out of context.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoNamespace to organize memories (e.g. 'engineering', 'user:alice', 'project:acme'). Matched byte-for-byte — a leading space, a different case, or an invisible character opens a SEPARATE, permanent store, so reuse an exact name from memory_stats rather than retyping one. To write into a shared room, pass its address here instead (e.g. 'xroom:room_01ABC'). Find room addresses with memory_list_rooms.
contentYesThe memory to store as a self-contained statement, e.g. 'User prefers TypeScript strict mode' or 'Decided to deploy the API on Cloudflare Workers (2026-06)'.
conceptsNoKey concepts for linking related memories (e.g. ['deploy', 'friday', 'staging'])

Output Schema

ParametersJSON Schema
NameRequiredDescription
reasonNoThe memory service's own explanation of this outcome, quoted as sent — when stored is false this is the ONLY statement of WHY, e.g. "Below importance threshold (0.047 < 0.1)". Ordinary text is preserved exactly; only control, bidi, zero-width, and repeated-whitespace characters are normalized before display, and the value is capped at 400 characters. Absent when the service sent no explanation, or when nothing remains after that normalization.
storedYesWhether the memory passed the novelty gate and was stored.
memory_idYesIdentifier of the stored memory, or null when it was not stored.
importanceNoNovelty score for this write (0-1): how much it adds over the nearest memories already saved in the same domain. Outside shared rooms, a write that scores below the service's importance threshold is not stored, and `reason` says why when the service sends one. The score is approximate and can read lower for non-English text. It is not a verdict on whether the memory was worth keeping. Absent when the service sent no score.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only cover the safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false); the description goes well beyond them. It discloses the novelty gate that refuses near-duplicate writes outside shared rooms, states that the result reports stored-vs-refused, and enumerates prohibited content classes (passwords, keys, payment data, MFA, IDs, health records). The refused-write behavior particularly explains why the call is not idempotent.

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

Conciseness4/5

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

Front-loaded with purpose, then when-to-use, prohibitions, runtime behavior, and content advice in a logical order. Slightly dense and a bit long for one paragraph, but every sentence carries distinct information with no filler.

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

Completeness5/5

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

An output schema exists, so return values need no explanation, and the description still covers purpose, usage boundaries, safety prohibitions, duplicate-refusal behavior, and cross-tool persistence. Nothing an agent needs in order to decide whether and how to call this tool is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so domain, content, and concepts are already well documented in the schema, including the byte-for-byte domain matching warning. The description's only parameter guidance, writing content as a self-contained statement, largely restates the schema's own wording. Baseline 3 is appropriate when structured fields carry the parameter detail.

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

Purpose5/5

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

The first sentence gives a specific verb and resource (store a memory) plus a distinguishing scope: long-term persistence across sessions and across every connected AI tool. That scope cleanly separates it from memory_read, memory_list_recent, and memory_stats. An agent knows exactly what this tool produces without opening the schema.

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

Usage Guidelines4/5

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

The description gives explicit inclusion criteria (stated preferences, decisions, facts about people/roles/project setup, lessons learned) and an explicit exclusion (transient chatter that only matters this turn). It also names memory_stats and memory_list_rooms as sources for exact domain/room names, though that routing guidance lives in the schema rather than the description. Clear context and exclusions, but no direct pointer to the read side for retrieving what was written.

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

vault_listA
Read-onlyIdempotent
Inspect

List the secrets stored in your Mnemoverse Vault — by ALIAS and purpose only; the secret VALUE is never returned or shown to you, and no tool on this server returns it. Use this to check WHICH secrets the user has stored and under what alias (e.g. the user says 'do I have a GitHub token saved?'). Only YOUR account's secrets are listed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
secretsYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, destructiveHint), the description adds a critical behavioral guarantee: 'the secret VALUE is never returned or shown to you, and no tool on this server returns it' and 'Only YOUR account's secrets are listed'. These privacy and scoping constraints are not derivable from annotations and are essential for correct use, making this a strong behavioral disclosure.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, immediately followed by the most critical constraint (value never returned), then a practical use case and account scoping. Every sentence serves a distinct purpose; even the seemingly repetitive privacy clauses add nuance (not returned, not shown, not available from any tool). It is efficient and highly informative.

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

Completeness5/5

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

Given the tool has no parameters, an output schema exists, and the annotations cover safety properties, the description provides everything an agent needs: what the tool lists, privacy guarantees, and account scope. There is no missing information that would affect correct invocation.

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

Parameters4/5

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

The tool has zero parameters, so the schema fully covers parameter semantics (100% coverage trivially). The baseline for 0 parameters is 4; the description adds no parameter-specific info, but none is needed, so a 4 is appropriate.

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

Purpose5/5

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

The description clearly states the tool 'List the secrets stored in your Mnemoverse Vault' with a specific verb and resource, and specifies the output is limited to 'ALIAS and purpose only'. It differentiates from the sibling memory_* tools by explicitly scoping to the vault and secrecy domain, so an agent can instantly recognize its function.

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

Usage Guidelines4/5

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

The description gives an explicit when-to-use case: 'Use this to check WHICH secrets the user has stored and under what alias' with a concrete example. It does not mention when not to use or alternative tools, but since the sibling tools are all in a different domain, the guidance is sufficient for the context.

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.

  1. 1 tool updatev0.15.0
    • Changedmemory_read1 field changed
      • addedInput schema / properties / diversity
        Added value: +{
        +  "description": "0 (default) returns the matches as ranked. Above 0, a match that is a near-copy of one already picked gives its slot to the next distinct memory (maximal marginal relevance); 1 lets similarity alone decide after the first pick. It changes which memories come back, not their scores, and applies only when there are more matches than top_k and top_k is below 200.",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
  2. 5 tool updatesv0.14.2
    • Changedmemory_create_room1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"Room name, unique within your account (e.g. 'me-and-olya')."New value: +"Room name, unique within your account (e.g. 'launch-team')."
    • Changedmemory_feedback1 field changed
      • changedOutput schema / properties / coactivation_edges / description
        Previous value: -"Number of feedback-driven query/result concept co-activation edges changed by the service. This is separate from ordinary Hebbian strengthening among a memory's own concepts. This server does not send query_concepts, so live calls through this tool report 0; asynchronous acknowledgements also report 0."New value: +"Number of links between query concepts and result concepts that this rating changed. This server does not send query_concepts, so live calls through this tool report 0; asynchronous acknowledgements also report 0."
    • Changedmemory_read1 field changed
      • changedInput schema / properties / exclude_author / description
        Previous value: -"Drop memories written by this author PRINCIPAL — the server-side identity. ⚠️ NOT USABLE FROM HERE YET: the principal is not shown in these results, so there is no value you can obtain through this tool, and a guess like 'me' silently matches nothing and filters nothing. Only pass it if your system knows the exact principal from elsewhere (e.g. the REST API). A self-exclusion shortcut is planned."New value: +"Drop memories written by this author PRINCIPAL — the server-side identity. ⚠️ NOT USABLE FROM HERE YET: the principal is not shown in these results, so there is no value you can obtain through this tool, and a guess like 'me' silently matches nothing and filters nothing. Only pass it if your system knows the exact principal from elsewhere (e.g. the REST API)."
    • Changedmemory_stats3 fields changed
      • changedOutput schema / properties / episodes / description
        Previous value: -"Number of episodic (not yet consolidated) memories."New value: +"Number of individual memories (not merged into a summary)."
      • changedOutput schema / properties / hebbian_edges / description
        Previous value: -"Number of Hebbian concept-to-concept links, learned from concepts that occur together as memories are stored and used."New value: +"Number of learned concept-to-concept associations; memory_graph reads them."
      • changedOutput schema / properties / prototypes / description
        Previous value: -"Number of consolidated prototype memories."New value: +"Number of summary memories merged from several individual ones. Consolidation is not running on the hosted service, so this count does not currently grow."
    • Changedmemory_write1 field changed
      • changedOutput schema / properties / importance / description
        Previous value: -"Novelty score for this write (0-1): how much it adds over the nearest memories already saved in the same domain. A first-generation metric UNDER ACTIVE DEVELOPMENT and known to be unreliable — the same content has measured ~0.08 in Russian against ~0.55 in English, so it under-reads non-English text. It is not a verdict on whether the memory was worth keeping. Absent when the service sent no score."New value: +"Novelty score for this write (0-1): how much it adds over the nearest memories already saved in the same domain. Outside shared rooms, a write that scores below the service's importance threshold is not stored, and `reason` says why when the service sends one. The score is approximate and can read lower for non-English text. It is not a verdict on whether the memory was worth keeping. Absent when the service sent no score."
  3. 1 tool updatev0.13.0
    • Changedmemory_feedback3 fields changed
      • removedInput schema / properties / atom_ids
        Removed value: -{
        -  "description": "Deprecated since 0.11, removed in 0.13: atom_ids is the old name of memory_ids, still accepted on its own until then. Pass memory_ids instead.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "minItems": 1,
        -  "type": "array"
        -}
      • changedInput schema / properties / memory_ids / description
        Previous value: -"Required: IDs of the memories to rate, the `id:` line of each memory_read result. (Optional in this schema only while the deprecated atom_ids is still accepted in its place.)"New value: +"IDs of the memories to rate, the `id:` line of each memory_read result."
      • changedInput schema / required
        Previous value: -[
        -  "outcome"
        -]New value: +[
        +  "memory_ids",
        +  "outcome"
        +]
  4. 4 tool updatesv0.12.1
    • Changedmemory_feedback1 field changed
      • changedInput schema / properties / atom_ids / description
        Previous value: -"Deprecated since 0.11, removed in 0.12: atom_ids is the old name of memory_ids, still accepted on its own until then. Pass memory_ids instead."New value: +"Deprecated since 0.11, removed in 0.13: atom_ids is the old name of memory_ids, still accepted on its own until then. Pass memory_ids instead."
    • Addedmemory_graph
    • Changedmemory_list_rooms1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "rooms": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "address": {
        +            "description": "Domain address (xroom:<id>); pass as `domain` on read/write.",
        +            "type": "string"
        +          },
        +          "archived": {
        +            "description": "True if archived (owned rooms only).",
        +            "type": "boolean"
        +          },
        +          "name": {
        +            "description": "The room name.",
        +            "type": "string"
        +          },
        +          "role": {
        +            "description": "'owner' or 'member'.",
        +            "type": "string"
        +          },
        +          "room_id": {
        +            "description": "The room's id (room_...).",
        +            "type": "string"
        +          },
        +          "scope": {
        +            "description": "'read' or 'read_write'.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "room_id",
        +          "address",
        +          "role",
        +          "archived"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "rooms"
        +  ],
        +  "type": "object"
        +}
    • Changedvault_list1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "secrets": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "alias": {
        +            "description": "The secret's alias — the reference you use, never the value.",
        +            "type": "string"
        +          },
        +          "concepts": {
        +            "description": "Concept tags.",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "context": {
        +            "description": "The secret's purpose/context — never the value.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "alias",
        +          "context",
        +          "concepts"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "secrets"
        +  ],
        +  "type": "object"
        +}
  5. 8 tool updatesv0.11.0
    • Changedmemory_create_room1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "address": {
        +      "description": "Domain address (xroom:<id>); pass as `domain` on read/write.",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "The room name as stored.",
        +      "type": "string"
        +    },
        +    "room_id": {
        +      "description": "The room's id (room_...); pass to memory_invite_to_room.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "room_id",
        +    "address"
        +  ],
        +  "type": "object"
        +}
    • Changedmemory_feedback1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "avg_valence": {
        +      "description": "Average valence of the rated memories after the update. Reported as 0 in an asynchronous acknowledgement, where the real value is computed later — a 0 here is therefore not evidence of a neutral outcome.",
        +      "type": "number"
        +    },
        +    "coactivation_edges": {
        +      "description": "Number of feedback-driven query/result concept co-activation edges changed by the service. This is separate from ordinary Hebbian strengthening among a memory's own concepts. This server does not send query_concepts, so live calls through this tool report 0; asynchronous acknowledgements also report 0.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "updated_count": {
        +      "description": "How many memories the service reports it applied the rating to. Processed synchronously this is the real count of memories that existed and were updated; processed asynchronously it is a best-effort ACCEPTED-count estimate — the number of IDs submitted — and the authoritative number is not known until the background worker runs. Zero means no submitted ID matched in the service's resolved request scope.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "updated_count"
        +  ],
        +  "type": "object"
        +}
    • Changedmemory_invite_to_room2 fields changed
      • changedInput schema / properties / max_uses / maximum
        Previous value: -9007199254740991New value: +1000
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "code": {
        +      "description": "The invite code (mnvr_...). Single-use by default, with a configurable use limit. Shown once.",
        +      "type": "string"
        +    },
        +    "expires_at": {
        +      "description": "ISO 8601 expiry, or null.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "join_url": {
        +      "description": "Landing URL the invitee can open to join.",
        +      "type": "string"
        +    },
        +    "room_address": {
        +      "description": "The room's domain address (xroom:<id>).",
        +      "type": "string"
        +    },
        +    "scope": {
        +      "description": "Role the invitee will get.",
        +      "type": "string"
        +    },
        +    "share_message": {
        +      "description": "Ready-to-forward invite text.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "share_message"
        +  ],
        +  "type": "object"
        +}
    • Changedmemory_join_room1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "address": {
        +      "description": "Domain address (xroom:<id>); pass as `domain` on read/write.",
        +      "type": "string"
        +    },
        +    "already_member": {
        +      "description": "True if you were already a member (no-op join).",
        +      "type": "boolean"
        +    },
        +    "name": {
        +      "description": "The room name.",
        +      "type": "string"
        +    },
        +    "next_steps": {
        +      "description": "How to use the room now.",
        +      "type": "string"
        +    },
        +    "room_id": {
        +      "description": "The room's id (room_...).",
        +      "type": "string"
        +    },
        +    "scope": {
        +      "description": "Your role in the room ('read' | 'read_write').",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "room_id",
        +    "address",
        +    "next_steps"
        +  ],
        +  "type": "object"
        +}
    • Changedmemory_list_recent1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "items": {
        +      "description": "Entries newest-first (creation time descending).",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "author": {
        +            "description": "Sanitized AGENT identity of the writer (never the human principal) — attribution in shared rooms.",
        +            "type": "string"
        +          },
        +          "content": {
        +            "description": "Stored memory content.",
        +            "type": "string"
        +          },
        +          "created_at": {
        +            "description": "UTC creation instant, ISO-8601; absent on legacy memories without a timestamp.",
        +            "type": "string"
        +          },
        +          "domain": {
        +            "description": "User-defined memory namespace or domain.",
        +            "type": "string"
        +          },
        +          "memory_id": {
        +            "description": "Identifier needed to rate or manage this saved memory.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "memory_id",
        +          "content",
        +          "domain"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "next_cursor": {
        +      "description": "Pass back as cursor for the next (older) page; null = listing complete. Absent when the service sent a continuation token this client will not pass on; the text then says the token could not be displayed.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "items"
        +  ],
        +  "type": "object"
        +}
    • Changedmemory_read3 fields changed
      • changedInput schema / properties / top_k / description
        Previous value: -"Requested number of results (default: 5). ⚠️ Not a hard cap: association expansion can return MORE than this, and the relevance floor can return fewer — raising it does not reliably widen the result set. For a complete, exactly-bounded listing use memory_list_recent instead."New value: +"Requested number of results (default: 5, what this server asks for when you omit it; the engine's own default of 10 never applies, because the field is always sent). ⚠️ Not a hard cap: association expansion can return MORE than this, and the relevance floor can return fewer — raising it does not reliably widen the result set. For a complete, exactly-bounded listing use memory_list_recent instead."
      • changedInput schema / properties / top_k / maximum
        Previous value: -50New value: +500
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "items": {
        +      "description": "Matching memories, ordered per order_by.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "author": {
        +            "description": "Sanitized AGENT identity of the writer (never the human principal) — attribution in shared rooms.",
        +            "type": "string"
        +          },
        +          "content": {
        +            "description": "Stored memory content.",
        +            "type": "string"
        +          },
        +          "created_at": {
        +            "description": "UTC creation instant, ISO-8601; absent on legacy memories without a timestamp.",
        +            "type": "string"
        +          },
        +          "domain": {
        +            "description": "User-defined memory namespace or domain.",
        +            "type": "string"
        +          },
        +          "memory_id": {
        +            "description": "Identifier needed to rate or manage this saved memory.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "memory_id",
        +          "content",
        +          "domain"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "items"
        +  ],
        +  "type": "object"
        +}
    • Changedmemory_stats1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "avg_importance": {
        +      "description": "Average importance of stored memories, on a scale from 0 to 1.",
        +      "type": "number"
        +    },
        +    "avg_valence": {
        +      "description": "Average valence of stored memories: how well recalls turned out, on a scale from -1 to 1.",
        +      "type": "number"
        +    },
        +    "domains": {
        +      "description": "User-defined memory domains.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "episodes": {
        +      "description": "Number of episodic (not yet consolidated) memories.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "hebbian_edges": {
        +      "description": "Number of Hebbian concept-to-concept links, learned from concepts that occur together as memories are stored and used.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "memory_count": {
        +      "description": "Number of saved memories.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "prototypes": {
        +      "description": "Number of consolidated prototype memories.",
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "memory_count",
        +    "domains"
        +  ],
        +  "type": "object"
        +}
    • Changedmemory_write3 fields changed
      • addedInput schema / properties / concepts / maxItems
        Added value: +256
      • addedInput schema / properties / domain / maxLength
        Added value: +100
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "importance": {
        +      "description": "Novelty score for this write (0-1): how much it adds over the nearest memories already saved in the same domain. A first-generation metric UNDER ACTIVE DEVELOPMENT and known to be unreliable — the same content has measured ~0.08 in Russian against ~0.55 in English, so it under-reads non-English text. It is not a verdict on whether the memory was worth keeping. Absent when the service sent no score.",
        +      "type": "number"
        +    },
        +    "memory_id": {
        +      "description": "Identifier of the stored memory, or null when it was not stored.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "reason": {
        +      "description": "The memory service's own explanation of this outcome, quoted as sent — when stored is false this is the ONLY statement of WHY, e.g. \"Below importance threshold (0.047 < 0.1)\". Ordinary text is preserved exactly; only control, bidi, zero-width, and repeated-whitespace characters are normalized before display, and the value is capped at 400 characters. Absent when the service sent no explanation, or when nothing remains after that normalization.",
        +      "type": "string"
        +    },
        +    "stored": {
        +      "description": "Whether the memory passed the novelty gate and was stored.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "stored",
        +    "memory_id"
        +  ],
        +  "type": "object"
        +}
  6. 2 tool updatesv0.10.2
    • Changedmemory_feedback4 fields changed
      • changedInput schema / properties / atom_ids / description
        Previous value: -"IDs of memories to give feedback on (from memory_read results)"New value: +"Deprecated since 0.11, removed in 0.12: atom_ids is the old name of memory_ids, still accepted on its own until then. Pass memory_ids instead."
      • addedInput schema / properties / domain
        Added value: +{
        +  "description": "Only for memories read from a shared room: that room's address (xroom:...), exactly as you read it. Omit it for your own memories, which are rated by id alone.",
        +  "type": "string"
        +}
      • addedInput schema / properties / memory_ids
        Added value: +{
        +  "description": "Required: IDs of the memories to rate, the `id:` line of each memory_read result. (Optional in this schema only while the deprecated atom_ids is still accepted in its place.)",
        +  "items": {
        +    "type": "string"
        +  },
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "atom_ids",
        -  "outcome"
        -]New value: +[
        +  "outcome"
        +]
    • Changedmemory_invite_to_room1 field changed
      • addedInput schema / properties / max_uses
        Added value: +{
        +  "description": "How many people may join with this invite (default 1, single-use).",
        +  "maximum": 9007199254740991,
        +  "minimum": 1,
        +  "type": "integer"
        +}
  7. 2 tool updatesv0.10.0
    • Changedmemory_list_recent2 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Restrict to one domain. REQUIRED to read a shared room — pass its address ('xroom:room_01ABC'), because rooms are separate stores that an unscoped feed does NOT cover. Omit only when you mean your own domains. Room addresses come from memory_list_rooms."New value: +"Restrict to one domain. REQUIRED to read a shared room — pass its address ('xroom:room_01ABC'), because rooms are separate stores that an unscoped feed does NOT cover. Omit only when you mean your own domains. Room addresses come from memory_list_rooms. Room entries are often long — a room feed usually reaches its size budget after a handful of them, so expect to page (see `limit`)."
      • changedInput schema / properties / limit / description
        Previous value: -"Page size (default: 20). Newest first."New value: +"Most entries per page (default: 20). Newest first. ⚠️ A CEILING, not a promise: the page is ALSO bounded by size, so a page of long entries stops early and returns a cursor for the rest. In rooms whose entries run long, ask for 5–10 — a large `limit` there buys nothing the size budget will not take back, and costs round trips."
    • Changedmemory_write1 field changed
      • changedInput schema / properties / domain / description
        Previous value: -"Namespace to organize memories (e.g. 'engineering', 'user:alice', 'project:acme')"New value: +"Namespace to organize memories (e.g. 'engineering', 'user:alice', 'project:acme'). Matched byte-for-byte — a leading space, a different case, or an invisible character opens a SEPARATE, permanent store, so reuse an exact name from memory_stats rather than retyping one. To write into a shared room, pass its address here instead (e.g. 'xroom:room_01ABC'). Find room addresses with memory_list_rooms."
  8. 2 tool updatesv0.9.0
    • Removedmemory_delete
    • Removedmemory_delete_domain
  9. 2 tool updatesv0.8.1
    • Changedmemory_list_recent3 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Restrict to one domain (e.g. a shared room address 'xroom:...'); omit for all your domains."New value: +"Restrict to one domain. REQUIRED to read a shared room — pass its address ('xroom:room_01ABC'), because rooms are separate stores that an unscoped feed does NOT cover. Omit only when you mean your own domains. Room addresses come from memory_list_rooms."
      • addedInput schema / properties / exclude_author
        Added value: +{
        +  "description": "Drop entries written by this author PRINCIPAL. ⚠️ NOT USABLE FROM HERE YET — the principal is never shown in these results, so there is no value you can get through this tool; a guess like 'me' filters nothing, silently. Same caveat as on memory_read.",
        +  "maxLength": 200,
        +  "type": "string"
        +}
      • addedInput schema / properties / until
        Added value: +{
        +  "description": "Only entries created at/before this ISO-8601 instant (inclusive). Pair with `since` to read a closed window — 'what happened on Monday' — instead of paging back from now.",
        +  "type": "string"
        +}
    • Changedmemory_read3 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Restrict the search to one domain namespace (e.g. 'project:acme'); omit to search across all domains."New value: +"Restrict the search to one domain namespace (e.g. 'project:acme'). Omitting it searches your OWN domains — it does NOT include shared rooms, which are separate stores: to search a room, pass its address here (e.g. 'xroom:room_01ABC'). Find room addresses with memory_list_rooms."
      • changedInput schema / properties / exclude_author / description
        Previous value: -"Drop memories written by this author PRINCIPAL (the server-side identity, not shown in these results). Useful when your system knows principals (e.g. via the REST API); a self-exclusion shortcut is planned server-side."New value: +"Drop memories written by this author PRINCIPAL — the server-side identity. ⚠️ NOT USABLE FROM HERE YET: the principal is not shown in these results, so there is no value you can obtain through this tool, and a guess like 'me' silently matches nothing and filters nothing. Only pass it if your system knows the exact principal from elsewhere (e.g. the REST API). A self-exclusion shortcut is planned."
      • changedInput schema / properties / top_k / description
        Previous value: -"Max results to return (default: 5)"New value: +"Requested number of results (default: 5). ⚠️ Not a hard cap: association expansion can return MORE than this, and the relevance floor can return fewer — raising it does not reliably widen the result set. For a complete, exactly-bounded listing use memory_list_recent instead."
  10. 4 tool updatesv0.7.0
    • Addedmemory_list_recent
    • Addedmemory_list_rooms
    • Changedmemory_read4 fields changed
      • addedInput schema / properties / exclude_author
        Added value: +{
        +  "description": "Drop memories written by this author PRINCIPAL (the server-side identity, not shown in these results). Useful when your system knows principals (e.g. via the REST API); a self-exclusion shortcut is planned server-side.",
        +  "maxLength": 200,
        +  "type": "string"
        +}
      • addedInput schema / properties / order_by
        Added value: +{
        +  "description": "'relevance' (default) = ranking order. 'recency' = the matched set re-sorted newest-first. For a complete newest-first feed with no search at all, use memory_list_recent instead.",
        +  "enum": [
        +    "relevance",
        +    "recency"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / since
        Added value: +{
        +  "description": "Only memories created at/after this ISO-8601 instant (naive = UTC) — e.g. your last-seen watermark in a shared room.",
        +  "maxLength": 40,
        +  "type": "string"
        +}
      • addedInput schema / properties / until
        Added value: +{
        +  "description": "Only memories created at/before this ISO-8601 instant.",
        +  "maxLength": 40,
        +  "type": "string"
        +}
    • Addedvault_list
  11. 3 tool updatesv0.5.0
    • Addedmemory_create_room
    • Addedmemory_invite_to_room
    • Addedmemory_join_room

TDQS

A4.3/5.0

Scored across 11 tools

Disambiguation4/5

Most tools target clearly distinct operations: semantic search (memory_read) vs recency listing (memory_list_recent) are explicitly contrasted, and the room lifecycle tools (create/invite/join/list) each handle a separate step. The cluster of read-oriented tools (memory_read, memory_list_recent, memory_stats, memory_graph) is largely disambiguated by descriptions, though an agent could occasionally hesitate between them.

Naming Consistency4/5

Nearly all tools follow a memory_<verb>_<noun> pattern (memory_write, memory_read, memory_create_room, memory_join_room), which is predictable and readable. vault_list is the one deviation, using a different prefix, though it still follows the verb_noun shape.

Tool Count5/5

Eleven tools is well within the healthy range and each earns its place, covering memory CRUD-ish operations, feedback, stats, shared-room management, vault listing, and graph inspection. Nothing feels redundant or padded.

Completeness4/5

The surface covers the core memory lifecycle (write/read/list/feedback/stats/graph) plus a full shared-room flow (create/invite/join/list). Gaps are minor and partly by design: no delete/update for memories (correction is via a fresh write) and no room leave/delete or vault-write tool, but agents can work around these.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Persistent memory API for AI agents — store, recall, and inject semantically-searchable context across sessions. EU-hosted, GDPR-compliant. Supports Claude, Cursor, Cline, and any MCP-compatible client.
    4
    2
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    A shared memory layer for AI agents — one memory.md synced across Claude Desktop, Cursor, Claude Code, OpenAI Codex, and any MCP client.
    4
    2
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Persistent memory for AI coding agents that stores and recalls preferences, decisions, and conventions via semantic similarity, with zero cloud dependencies and plug-and-play MCP integration for Claude Code.
    Apache 2.0