A long-lived server cached query_graph's tools/list description after opening a project store. When a sibling CLI, MCP, or HTTP worker atomically replaced that database, graph queries reopened the new file but tools/list could continue advertising the old labels indefinitely because no in-process publication flag was available.
query_graph_tool_description at src/mcp/mcp.c:2959 now asks resolve_store to perform the existing O(1) backing-file identity check before serving a cached description. resolve_store marks the description stale on a replacement, then the request-owning thread closes the old read-only handle and rebuilds schema; unchanged relists perform no graph scan, database copy, write, or cross-process lock. mcp_copy_schema_project_name copies only the bounded project name so reopening cannot invalidate the argument pointer.
tests/test_mcp.c:11664 extends the atomic-publication fixture with distinct before/after labels and relists before any graph query. The test failed because AfterExternalLabel was absent, then passed 1/1 under ASan/UBSan. Verified scripts/check-source-safety.sh, git diff --check, git clang-format --diff, and staged private-path scan.
Signed-off-by: Andrew Hundt <ATHundt@gmail.com>