get_linked_project
Reads the project linked to a block of THIS project, THROUGH the link — a PREVIEW (title, counts, block skeleton: id, name, type, parent, desc, and the link each block itself carries), not the detailed content. With depth, DESCENDS the chain over several levels and returns a nested array — enough to build a destination table over an entire tree WITHOUT switching from project to project. With includeBlockTitles, attaches to each block the inventory of its content blocks (id, type, TITLE — without the entries): this is what lets you decide to ADD a block or MERGE with an existing block. The read honors what each link grants and NOTHING more, and access is RE-RESOLVED at EACH level (a right on a project does not open what it links): PINNED version if the link carries one, SCOPE if access comes from a shared block (access.boundedToCell then says so explicitly). Requires READ access to the target project — a project role, even plain viewer, or a block share; otherwise the call refuses and says why, and a refused level does not interrupt the others. An API key BOUNDED to projects does not reach a project excluded from its scope either: it is OMITTED and the refusal is named (out_of_key_scope) rather than returned empty. ⚠️ truncated says whether this project links projects that THIS call did NOT read, and why (requestedDepth: a deeper request is needed · depthCeiling: ceiling reached, open the project directly · projectBudget: aim at a more precise branch) — null means everything that hangs below is in the response. ⚠️ notIncluded lists what the preview does NOT carry: its silence does not prove that the target project has none. To WRITE into this project (if you have access to it): writing into it requires TARGETING it — over MCP, expectedProjectId on each write or set_active_project; in the in-app chat neither exists: nothing is written there this turn, the interface (or focus_view dive, run at turn end) dives in, and the writing happens on the NEXT turn.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | How many link LEVELS to descend. 1 (default): only the project linked to this block. 2 and more: the projects that THAT one links, and so on — the response then gains a `nested` array, one element per level, each with its own access resolution. Useful to build a destination table over a tree WITHOUT switching from project to project. Ceiling 4; at most 12 projects read per call, the head target included in the budget. Any branch left aside is DECLARED (`truncated`) rather than silent. | |
| cellId | Yes | ID of the block of THIS project that carries the link to read. The read goes THROUGH the link: it honors its possible PINNED version and its scope, and never gives more than this link grants. | |
| expectedProjectId | No | UUID of the project targeted by THIS call. ACTUALLY targets this project instead of the session project. Refused without changing anything if access is not granted. | |
| includeBlockTitles | No | Attach to each block the inventory of its content blocks — id, type and TITLE, without the entries or the text. This is what lets you decide to ADD a block or MERGE with an existing block without carrying its content. FALSE by default. Applies to ALL levels, not only the first. |