Create or attach to a project
saveToProjectCreate a project (create), attach lots (attach_parcels), or attach a knowledge reference (attach_reference). Pass projectId or project; with neither, the result lists projects and writes nothing. For attach_parcels, copy lot.parcelExternalId from getFeasibilitySnapshot. preview=true returns the diff and writes nothing. A write returns a receipt. Not reversible on this surface.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude from getFeasibilitySnapshot. Supplied coordinates are never re-geocoded. | |
| lng | No | Longitude from getFeasibilitySnapshot. | |
| name | No | ||
| role | No | build is the lot being developed; context is surrounding land. Default build. | |
| action | Yes | create: new project from a site. attach_parcels: attach lots to an existing project (use lot.parcelExternalId from getFeasibilitySnapshot). attach_reference: link a knowledge section to an existing project. | |
| address | No | Street address of the site. On `create` this is geocoded server-side when lat/lng are not supplied, and is what gets recorded as the project address. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| preview | Yes | When true, return the field-level diff and write nothing. | |
| project | No | Project name to match instead of a UUID, for attach_parcels and attach_reference. Matching more than one lists the candidates instead of guessing. Ignored by create. | |
| radiusM | No | Search half-width in metres when resolving parcel ids. Default 150. | |
| llm_model | Yes | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| projectId | No | Existing project UUID. Required by attach_parcels and attach_reference unless you pass `project`; ignored by create. | |
| externalRef | No | Provenance of an imported project. Canonical form is `<system>:<id>` (e.g. `notion:<page-id>`). Unique per creator when set. Returned on getProjectContext. Distinct from idempotencyKey. | |
| sectionUuid | No | ||
| idempotencyKey | No | ||
| conversation_id | No | Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. | |
| parcelExternalIds | No | Source parcel ids to attach. Copy lot.parcelExternalId from getFeasibilitySnapshot. If they are not in the current area, pass a larger radiusM on attach_parcels. |