# Projects

Every tool takes `project_id`; the session remembers nothing — pass it on every call.

This topic is for MCP (Claude Desktop / claude.ai connector); the in-app copilot is bound to the open workspace.

## Pattern

1. Call `bi_list_projects`.
2. Choose a `project_id`.
3. Pass that `project_id` on every later tool call, including parallel chats.

## OAuth and API keys

OAuth writes without `project_id` fail with `PROJECT_ID_REQUIRED`. OAuth reads without it still run against home until 2026-10-09, then they fail the same way. API keys fall back to the bound project. A different accessible id on a key applies to that call only and does not re-bind the key.

## Errors

- `PROJECT_ID_REQUIRED` — the call needs `project_id`.
- `ACCESS_DENIED` — the declared project is not reachable. The call never falls back to home.
- `FEATURE_DISABLED` — that project has no marketing console.
- Warning `PROJECT_ID_REQUIRED_soon` — an OAuth read fell back to home before 2026-10-09.

## The project echo

Every successful result includes `project` with `id`, `display_name`, and `partnership_id`. Check `display_name` before a write.

## bi_use_project

OAuth: it only verifies. Nothing is stored. Pass `project_id` on every call. API keys: it re-binds the key, and later calls that omit `project_id` use that bound project.

## Two chats

Two chats do not share a project. Each call names its own `project_id`. A write in one chat cannot land in the other workspace.
