{
  "schemaVersion": 1,
  "evaluation": {
    "id": "memory-reference-mcp",
    "testedOn": "2026-10-18",
    "coverage": "local-runtime",
    "summary": "Eleven checks exercised local graph creation, validation, search, plaintext storage, restart persistence and deletion. Two entities and one relation survived restart; deleting one entity removed its relation.",
    "identity": {
      "version": "1.0.0",
      "target": "@modelcontextprotocol/server-memory",
      "integrity": "sha512-UDMtMrw2xeI16mcn7O4fesp9Pf3hYh91thuU5KSz0BxKqwnTwEytZKjHfkrqxxmKp0r4QHoiEkMV99UmadmODw== (official npm distribution integrity; exact dependency lock retained)"
    },
    "environment": [
      "Windows 11 build 26200; Node.js 24.18.0; @modelcontextprotocol/server-memory 1.0.0.",
      "Launch: node <PACKAGES>/@modelcontextprotocol/server-memory/dist/index.js with MEMORY_FILE_PATH=<FIXTURE>/graph.jsonl and fresh home/config/temp directories.",
      "Synthetic graph only: FixtureProject (project, observation Synthetic pilot only), FixtureGuide (document, observation Draft one), and relation FixtureProject uses FixtureGuide. Restart the process with the same configured file for the persistence check."
    ],
    "checks": [
      {
        "id": "initialize",
        "name": "Initialize",
        "method": "{\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2025-03-26\",\"capabilities\":{},\"clientInfo\":{\"name\":\"ionbin-fixture-eval\",\"version\":\"1.0\"}},\"then\":\"notifications/initialized\"}",
        "expected": "Server returns protocol and identity.",
        "observed": "JSON-RPC result: protocolVersion=2025-03-26; serverInfo={\"name\":\"memory-server\",\"version\":\"1.0.0\"}.",
        "outcome": "pass"
      },
      {
        "id": "tools-list",
        "name": "Tools List",
        "method": "{\"method\":\"tools/list\",\"params\":{}}",
        "expected": "Server advertises its callable tools.",
        "observed": "JSON-RPC result: 9 tools; names=create_entities, create_relations, add_observations, delete_entities, delete_observations, delete_relations, read_graph, search_nodes, open_nodes.",
        "outcome": "pass"
      },
      {
        "id": "create-entities",
        "name": "Create Entities",
        "method": "{\"method\":\"tools/call\",\"params\":{\"name\":\"create_entities\",\"arguments\":{\"entities\":[{\"name\":\"FixtureProject\",\"entityType\":\"project\",\"observations\":[\"Synthetic pilot only\"]},{\"name\":\"FixtureGuide\",\"entityType\":\"document\",\"observations\":[\"Draft one\"]}]}}}",
        "expected": "Two synthetic entities are created.",
        "observed": "JSON-RPC/tool result: [\n  {\n    \"name\": \"FixtureProject\",\n    \"entityType\": \"project\",\n    \"observations\": [\n      \"Synthetic pilot only\"\n    ]\n  },\n  {\n    \"name\": \"FixtureGuide\",\n    \"entityType\": \"document\",\n    \"observations\": [\n      \"Draft one\"\n    ]\n  }\n]",
        "outcome": "pass"
      },
      {
        "id": "create-relation",
        "name": "Create Relation",
        "method": "{\"method\":\"tools/call\",\"params\":{\"name\":\"create_relations\",\"arguments\":{\"relations\":[{\"from\":\"FixtureProject\",\"to\":\"FixtureGuide\",\"relationType\":\"uses\"}]}}}",
        "expected": "A relation joins the two existing entities.",
        "observed": "JSON-RPC/tool result: [\n  {\n    \"from\": \"FixtureProject\",\n    \"to\": \"FixtureGuide\",\n    \"relationType\": \"uses\"\n  }\n]",
        "outcome": "pass"
      },
      {
        "id": "duplicate-entity",
        "name": "Duplicate Entity",
        "method": "{\"method\":\"tools/call\",\"params\":{\"name\":\"create_entities\",\"arguments\":{\"entities\":[{\"name\":\"FixtureGuide\",\"entityType\":\"document\",\"observations\":[\"SHOULD_NOT_MERGE\"]}]}}}",
        "expected": "Creating an existing entity does not silently merge a new observation.",
        "observed": "JSON-RPC/tool result: []\nSkipped 1 entity that already exists: FixtureGuide. Its observations were not added; use add_observations for existing entities.",
        "outcome": "pass"
      },
      {
        "id": "missing-relation-target",
        "name": "Missing Relation Target",
        "method": "{\"method\":\"tools/call\",\"params\":{\"name\":\"create_relations\",\"arguments\":{\"relations\":[{\"from\":\"FixtureProject\",\"to\":\"MissingFixture\",\"relationType\":\"uses\"}]}}}",
        "expected": "A relation to an absent entity is rejected.",
        "observed": "Tool result isError=true: Entity with name MissingFixture not found",
        "outcome": "pass"
      },
      {
        "id": "search-observation",
        "name": "Search Observation",
        "method": "{\"method\":\"tools/call\",\"params\":{\"name\":\"search_nodes\",\"arguments\":{\"query\":\"Synthetic pilot\"}}}",
        "expected": "Search finds the entity whose observation matches.",
        "observed": "JSON-RPC/tool result: {\n  \"entities\": [\n    {\n      \"name\": \"FixtureProject\",\n      \"entityType\": \"project\",\n      \"observations\": [\n        \"Synthetic pilot only\"\n      ]\n    }\n  ],\n  \"relations\": [\n    {\n      \"from\": \"FixtureProject\",\n      \"to\": \"FixtureGuide\",\n      \"relationType\": \"uses\"\n    }\n  ]\n}",
        "outcome": "pass"
      },
      {
        "id": "plaintext-storage",
        "name": "Plaintext Storage",
        "method": "{\"operation\":\"Read configured synthetic MEMORY_FILE_PATH from disk\"}",
        "expected": "Graph content is persisted locally and is readable as text.",
        "observed": "Observed: {\"body\":\"{\\\"type\\\":\\\"entity\\\",\\\"name\\\":\\\"FixtureProject\\\",\\\"entityType\\\":\\\"project\\\",\\\"observations\\\":[\\\"Synthetic pilot only\\\"]}\\n{\\\"type\\\":\\\"entity\\\",\\\"name\\\":\\\"FixtureGuide\\\",\\\"entityType\\\":\\\"document\\\",\\\"observations\\\":[\\\"Draft one\\\"]}\\n{\\\"type\\\":\\\"relation\\\",\\\"from\\\":\\\"FixtureProject\\\",\\\"to\\\":\\\"FixtureGuide\\\",\\\"relationType\\\":\\\"uses\\\"}\\n\"}",
        "outcome": "pass"
      },
      {
        "id": "restart-persistence",
        "name": "Restart Persistence",
        "method": "{\"method\":\"tools/call\",\"params\":{\"name\":\"read_graph\",\"arguments\":{}},\"sequence\":\"Close first server; start another with same MEMORY_FILE_PATH; initialize; read_graph.\"}",
        "expected": "Restarting with the same memory file retains two entities and their relation.",
        "observed": "JSON-RPC/tool result: {\n  \"entities\": [\n    {\n      \"name\": \"FixtureProject\",\n      \"entityType\": \"project\",\n      \"observations\": [\n        \"Synthetic pilot only\"\n      ]\n    },\n    {\n      \"name\": \"FixtureGuide\",\n      \"entityType\": \"document\",\n      \"observations\": [\n        \"Draft one\"\n      ]\n    }\n  ],\n  \"relations\": [\n    {\n      \"from\": \"FixtureProject\",\n      \"to\": \"FixtureGuide\",\n      \"relationType\": \"uses\"\n    }\n  ]\n}",
        "outcome": "pass"
      },
      {
        "id": "delete-entity",
        "name": "Delete Entity",
        "method": "{\"method\":\"tools/call\",\"params\":{\"name\":\"delete_entities\",\"arguments\":{\"entityNames\":[\"FixtureGuide\"]}}}",
        "expected": "Delete the selected entity.",
        "observed": "JSON-RPC/tool result: Entities deleted successfully",
        "outcome": "pass"
      },
      {
        "id": "deletion-cascade",
        "name": "Deletion Cascade",
        "method": "{\"method\":\"tools/call\",\"params\":{\"name\":\"read_graph\",\"arguments\":{}}}",
        "expected": "Deleting the entity also removes its relation.",
        "observed": "JSON-RPC/tool result: {\n  \"entities\": [\n    {\n      \"name\": \"FixtureProject\",\n      \"entityType\": \"project\",\n      \"observations\": [\n        \"Synthetic pilot only\"\n      ]\n    }\n  ],\n  \"relations\": []\n}",
        "outcome": "pass"
      }
    ],
    "findings": [
      {
        "title": "Records persisted as readable local text",
        "basis": "observed",
        "severity": "medium",
        "detail": "Direct disk inspection found the authored observations in JSONL. After a server restart, read_graph returned two entities and one relation. The fixture did not use an encrypted storage layer.",
        "practicalAdvice": "Choose an explicit path with appropriate file permissions and retention/backup policy; avoid secrets in graph observations."
      },
      {
        "title": "Creation and deletion have distinct semantics",
        "basis": "observed",
        "severity": "informational",
        "detail": "Recreating FixtureGuide skipped it without merging SHOULD_NOT_MERGE. A missing relation endpoint was rejected. Deleting FixtureGuide left one entity and zero relations.",
        "practicalAdvice": "Use observation update tools for existing records and review relationship loss before deletion."
      }
    ],
    "caveats": [
      "Reference-server status means this is educational/prototype code, not a production-ready storage endorsement.",
      "The search result included a relation to an entity outside its returned entity subset; callers should not assume every search result is a closed subgraph.",
      "Single-process restart success does not establish multi-user access control, concurrent-writer safety or recovery after a crash."
    ],
    "notTested": [
      "Concurrent writers, crash recovery, network filesystems and access by multiple users were not tested.",
      "Large graphs, backup restoration, encryption and malicious stored-content handling were not evaluated."
    ],
    "sources": [
      {
        "label": "Memory reference documentation",
        "url": "https://github.com/modelcontextprotocol/servers/blob/main/src/memory/README.md"
      },
      {
        "label": "Current reference-server status",
        "url": "https://github.com/modelcontextprotocol/servers"
      },
      {
        "label": "License terms",
        "url": "https://github.com/modelcontextprotocol/servers/blob/main/LICENSE"
      },
      {
        "label": "Implementation",
        "url": "https://github.com/modelcontextprotocol/servers/blob/main/src/memory/index.ts"
      }
    ],
    "reportUrl": "/interface-evaluations/memory-reference-mcp.json"
  }
}
