---
title: Project-scoped ownership
description: Safely own tdmcp packages and MCP client registration per TouchDesigner project.
---
# Project-scoped ownership
Wave 3 makes local setup explicit, inspectable, and reversible. Package files
can belong to one project instead of an implicit global cache, and client setup
can target one verified native config without replacing unrelated entries.
## Package storage
User scope remains compatible with existing installs:
```text
~/.tdmcp/packages
```
Project scope is opt-in and requires the project directory:
```text
/.tdmcp/packages
```
```bash
tdmcp packages path --scope project --project-dir "$PWD" --json
tdmcp list --installed --scope project --project-dir "$PWD" --json
tdmcp install raytk --scope project --project-dir "$PWD" --dry-run --json
```
The same contract is available through `manage_packages`, while
`install_library_package` accepts project scope without requiring a legacy
`dest_dir`. Project scope rejects a competing `packages_root`, missing project
directories, and symlinked ownership roots.
## Client setup
Native targets in this wave are:
| Client | Project | User |
| --- | --- | --- |
| Claude Code | `/.mcp.json` | `~/.claude.json` |
| Cursor | `/.cursor/mcp.json` | `~/.cursor/mcp.json` |
| Codex | Unsupported, fail closed | `~/.codex/config.toml` |
Plan and inspect before applying:
```bash
tdmcp install-client claude --scope project --project-dir "$PWD" --diff --json
tdmcp install-client claude --scope project --project-dir "$PWD" --write --json
tdmcp install-client claude --scope project --project-dir "$PWD" --check --json
```
Remove only the owned name:
```bash
tdmcp install-client claude --scope project --project-dir "$PWD" --remove --diff --json
tdmcp install-client claude --scope project --project-dir "$PWD" --remove --write --json
```
`--name` selects one safe registration name. JSON keys and TOML sections owned
by other tools are preserved. Invalid, oversized, symlinked, or concurrently
changed configs are rejected. `--write` promotes an atomic sibling file and
verifies the bytes after promotion. Output reports token presence, never the
token value.
Calling `tdmcp install-client ` without a scope or action still prints
the legacy ready-to-paste snippet. Explicit `--write --path ` also remains
available for compatibility, but native scoped targets are preferred.
## Doctor namespace
The top-level command now has one meaning:
```bash
tdmcp doctor --json
tdmcp doctor --fix
```
Package dependency guidance is explicit:
```bash
tdmcp packages doctor raytk --json
```
Known `tdmcp doctor ` calls still route to the package doctor with a
deprecation warning. New scripts should use the namespaced command.
## Evidence language
- **PASS** — offline tests proved scoped resolution, preservation of unrelated
config, redacted planning, check/remove, concurrent-change rejection, atomic
read-back, and namespace compatibility.
- **FAIL** — invalid input or unsafe filesystem state is rejected with no tdmcp
write; a non-zero result is expected.
- **UNVERIFIED — pending bridge** — live package import and reconciliation with
operators already loaded in TouchDesigner were not claimed without a running
bridge.
`tdmcp status --json` reports the default `tdmcp` registration at each supported
native target without exposing paths or secret values. Arbitrary `--name`
entries are intentionally not scanned.