{"version":"2.1.174","anchor":"projects-tool-read-and-write-claude-ai-project-docs","canonical_anchor":"projects-tool-read-and-write-claude-ai-project-docs","heading":"Projects Tool \u2014 Read and Write claude.ai Project Docs","tier":null,"area":null,"scope":null,"heads_up":null,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.174\/e\/projects-tool-read-and-write-claude-ai-project-docs","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.174","markdown":"### Projects Tool \u2014 Read and Write claude.ai Project Docs\n\n**What**\n\nClaude Code can now interact with the claude.ai Project attached to a session. Project docs persist across sessions and surfaces (chat, Cowork, Claude Code), so anything written here is visible to the user and their team on claude.ai.\n\n**Usage**\n\nThe session is attached to a project automatically when `CLAUDE_PROJECT_UUID` is set in the environment (the harness sets this). Claude uses five methods dispatched on a `method` field:\n\n- `project_info` \u2014 retrieve project name, description, custom instructions, doc list, and knowledge-base budget stats\n- `project_read` \u2014 read one doc by path; large docs are written to a local temp file\n- `project_search` \u2014 run a RAG query against the project's knowledge base\n- `project_write` \u2014 create or replace a doc (inline `content` or `local_path` upload)\n- `project_delete` \u2014 delete a doc by path\n\n**Details**\n\n- Requires claude.ai authentication. Not available via Bedrock, Vertex, or other third-party providers.\n- OAuth scopes `user:projects:read` and `user:projects:write` are requested automatically; if absent, the token is refreshed.\n- Blocked if `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` is set or if the org's compliance policy (e.g. HIPAA) disables project writes.\n- The project's docs are injected verbatim into every chat turn while total knowledge is under the search threshold (~50k tokens). Above that threshold, chat degrades to retrieval (RAG) mode.\n- `project_write` checks the budget before writing. Passing `force: true` overrides the injection-threshold guard but not the hard cap.\n- Writing a new bare filename (no `\/`) namespaces it to `claude\/<name>` automatically; pass an explicit nested path to override.\n- `local_path` uploads a file from the working directory directly \u2014 its contents never enter the model's context window.\n\n**Evidence**\n\nProjects tool implementation (search for `\"project_info\"`, `\"project_read\"`, `\"project_write\"`, `\"project_search\"`, `\"project_delete\"` together in a method dispatch, or `\"Projects API:\"` in the error class name `ProjectsApiError`)"}