{
  "schema_version": "1.0",
  "tool": "@modelcontextprotocol/server-filesystem",
  "session": 2,
  "claim_tested": {
    "text": "Roots notified by Client to Server, completely replace any server-side Allowed directories when provided.",
    "source": "https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem",
    "confirmed": true
  },
  "checks": [
    {
      "id": "server-requests-roots",
      "expected": "Server sends roots/list to a client that advertises the capability",
      "observed": {
        "roots_requests": 1,
        "first_returned": 1
      },
      "passed": true
    },
    {
      "id": "roots-directory-listed",
      "expected": "Declared root appears in list_allowed_directories",
      "observed": {
        "listed": "Allowed directories:\n<LAB>/roots-dir",
        "is_error": false
      },
      "passed": true
    },
    {
      "id": "read-inside-roots",
      "expected": "Read inside the declared root succeeds",
      "observed": {
        "is_error": false,
        "text": "Fictional roots-dir marker.\n"
      },
      "passed": true
    },
    {
      "id": "args-directory-replaced",
      "expected": "Read in the command-line directory is refused once roots are provided",
      "observed": {
        "is_error": true,
        "text": "Access denied - path outside allowed directories: <LAB>/args-dir/note.txt not in <LAB>/roots-dir"
      },
      "passed": true
    },
    {
      "id": "outside-both-denied",
      "expected": "Read outside both directories is refused",
      "observed": {
        "is_error": true,
        "text": "Access denied - path outside allowed directories: <LAB>/outside/note.txt not in <LAB>/roots-dir"
      },
      "passed": true
    },
    {
      "id": "roots-removal-revokes",
      "expected": "After an empty roots list, reads are refused without restarting the server",
      "observed": {
        "read_is_error": true,
        "read_text": "Access denied - no allowed directories: the client exposes no valid roots (<LAB>/roots-dir/note.txt)",
        "listed": "Allowed directories:\n",
        "listed_is_error": false,
        "roots_requests": 2
      },
      "passed": true
    }
  ],
  "version": "2.0.0",
  "tested_at": "2026-10-21T13:22:11.891Z",
  "environment": {
    "platform": "linux",
    "architecture": "x64",
    "node": "v26.7.0"
  },
  "package_integrity": "sha512-JT+bt9wrNIMqhGvOr49vEE9NpbkBxdjQxyLVqh3lYHsB2zGgbzePmDOGrm1glBT1DPR5YvkM6h/NXztWSRhywg==",
  "lock_sha256": "7684c15c7ea5128363a6d6e8a936990ce85f8dcb7d05d9aa815ba20ecececc00",
  "entry_sha256": "ed5efae0e3597236ba1f170ce8d903280c1f58b36dd7a7ad53891ed634c7e996",
  "transport": "stdio",
  "configuration": {
    "allowed_directories": [
      "<LAB>/args-dir"
    ],
    "client_roots_capability": true,
    "roots_declared": [
      "<LAB>/roots-dir"
    ]
  },
  "scope": "Synthetic files only; one client implementation, one package version, one platform. No LLM, desktop client, OS sandbox or race-condition testing.",
  "negotiated_protocol": "2025-11-25",
  "server_info": {
    "name": "secure-filesystem-server",
    "version": "2.0.0"
  },
  "roots_capability_echo": null,
  "tools": [
    {
      "name": "read_file",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "read_text_file",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "read_media_file",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "read_multiple_files",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "write_file",
      "annotations": {
        "readOnlyHint": false,
        "idempotentHint": true,
        "destructiveHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "edit_file",
      "annotations": {
        "readOnlyHint": false,
        "idempotentHint": false,
        "destructiveHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "create_directory",
      "annotations": {
        "readOnlyHint": false,
        "idempotentHint": true,
        "destructiveHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "list_directory",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_directory_with_sizes",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "directory_tree",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "move_file",
      "annotations": {
        "readOnlyHint": false,
        "idempotentHint": false,
        "destructiveHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "search_files",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_file_info",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_allowed_directories",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    }
  ],
  "run_completed": true,
  "server_stderr": "Secure MCP Filesystem Server running on stdio\nUpdated allowed directories from MCP roots: 1 valid directories\nNo valid root directories provided by client; access revoked until it exposes a root again\n"
}
