MCP Tool Reference
Generated reference for the Bucky tools exposed over the Model Context Protocol.
These tools are exposed over Bucky's MCP server at POST /api/mcp. Each entry is
generated from the runtime registry. tools/list advertises the full catalog to every
caller; authenticated tools still require a Bucky account at call time.
Guidance
Get the Bucky MCP guide
getBuckyMcpGuide
Call with no arguments on first contact. Optional role, market, and scale answer the first-call questions on a second call. Returns what this session should do next.
Read-only: yes
Parameters:
role(enum: "developer" | "gc" | "reviewer", optional) — Who is asking. Answers "Developer, GC, or municipal reviewer?".market(enum: "US" | "CA", optional) — Which country the site is in. Answers "US or Canada?".scale(enum: "single_parcel" | "portfolio", optional) — One site or several. Answers "Single parcel, or a portfolio?".
Explain a Bucky feasibility status
explainFeasibilityStatus
Explain one Bucky coverage or per-fact provenance status and the safe next action. This is a pure static lookup: it does not inspect an address, retrieve property data, or call a database, geocoder, AI model, or third-party API. Accepts exactly one of: live, live_unavailable, planned_not_live, geo_division_uncatalogued, unseeded_place, geocode_failed, cited, cited_conditional, conditional_unresolved, no_limit_in_bylaw, not_extracted, site_specific_schedule, unverified_default, derived_from_cited, defaulted, missing. Copy the status verbatim from a feasibility result. An unknown status returns this list instead of failing.
Read-only: yes
Parameters:
status(enum: "live" | "live_unavailable" | "planned_not_live" | "geo_division_uncatalogued" | "unseeded_place" | "geocode_failed" | "cited" | "cited_conditional" | "conditional_unresolved" | "no_limit_in_bylaw" | "not_extracted" | "site_specific_schedule" | "unverified_default" | "derived_from_cited" | "defaulted" | "missing", required) — A Bucky coverage resolution status or per-fact provenance status returned by a feasibility result. Copy it verbatim. Do not paraphrase or invent a status.
Feasibility
Get feasibility snapshot for an address
getFeasibilitySnapshot
Look up lot, zone, and building envelope for one street address in Canada or the US. Pass address. One address per call; cannot search or compare. Every envelope value carries a status. Never report not_extracted or site_specific_schedule as no limit or as zero — call explainFeasibilityStatus first.
Read-only: yes
Parameters:
address(string, required) — Street address to analyse, e.g. "4170 Sophia St, Vancouver BC".source(enum: "zoning_lookup" | "lot_dimensions" | "setback_lookup" | "height_limit_lookup" | "full", required) — Which question the caller is answering. Used for attribution and to pick the link back; the payload is the same either way.
Projects
Run project feasibility analysis
runFeasibilityAnalysis
Enqueue a fresh deterministic analysis run for a saved project. Pass projectId, or project with the name the user said; with neither, the result lists their projects and nothing is queued. Returns immediately with agentStatus (queued, running, current, failed, or none) and a receipt id; does not block on completion. Irreversible: a queued run cannot be un-queued from MCP. Re-check with getProjectContext, but no more than once every 15 seconds — it is a multi-query bundle, not a status endpoint.
Read-only: no
Parameters:
projectId(string, optional) — Project UUID. Omit if you passproject.project(string, optional) — Project name to match, when you do not have the UUID. Case-insensitive; an exact name wins over a partial one. Matching more than one lists the candidates instead of guessing.
Get project context bundle
getProjectContext
Load one project with analysis envelope, compact agentStatus, document summaries, evidence summaries, the project memory digest, and external_ref when the project was imported from another system. You do not need a UUID: pass project with the name the user said, or call with neither and the result lists their projects to choose from. Use before composing reports or after scheduling analysis.
Read-only: yes
Parameters:
projectId(string, optional) — Project UUID. Omit if you passproject.project(string, optional) — Project name to match, when you do not have the UUID. Case-insensitive; an exact name wins over a partial one. Matching more than one lists the candidates instead of guessing.documentsLimit(integer, required)evidenceLimit(integer, required)
Create or attach to a project
saveToProject
Create 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.
Read-only: no
Parameters:
action(enum: "create" | "attach_reference" | "attach_parcels", required) — 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.name(string, optional)address(string, optional) — Street address of the site. Oncreatethis is geocoded server-side when lat/lng are not supplied, and is what gets recorded as the project address.lat(number, optional) — Latitude from getFeasibilitySnapshot. Supplied coordinates are never re-geocoded.lng(number, optional) — Longitude from getFeasibilitySnapshot.projectId(string, optional) — Existing project UUID. Required by attach_parcels and attach_reference unless you passproject; ignored by create.project(string, optional) — 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.sectionUuid(string, optional)parcelExternalIds(string[], optional) — 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.role(enum: "build" | "context", optional) — build is the lot being developed; context is surrounding land. Default build.radiusM(integer, optional) — Search half-width in metres when resolving parcel ids. Default 150.idempotencyKey(string, optional)externalRef(string, optional) — 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.preview(boolean, required) — When true, return the field-level diff and write nothing.
Update project fields
updateProject
Patch project metadata (name, lifecycle status, externalRef). Pass projectId, or project with the name the user said; with neither, the result lists their projects and nothing is written. preview=true returns the field-level diff and writes nothing. A write returns a receipt; undoOperationId restores the captured prior fields. Does not archive or delete.
Read-only: no
Parameters:
projectId(string, optional) — Project UUID. Omit if you passproject.project(string, optional) — Project name to match, when you do not have the UUID. Case-insensitive; an exact name wins over a partial one. Matching more than one lists the candidates instead of guessing.name(string, optional)lifecycleStatus(string, optional)externalRef(one of, optional) — Provenance of an imported project. Canonical form is\<system>:\<id>(e.g.notion:\<page-id>). Unique per creator when set. Pass null to clear.preview(boolean, required) — When true, return the field-level diff and write nothing. Combined with undoOperationId, returns the stored receipt.undoOperationId(string, optional) — Receipt id from a prior updateProject write. Restores the captured prior fields. With preview=true, inspects the receipt instead.
List or unlist a project on the public map
setProjectMapListing
Put a project on the public Bucky map, or take it off. Pass projectId, or project with the name the user said; with neither, the result lists their projects and nothing is published. Listing publishes the build-lot centroid, the project name, its zone category, typology and lifecycle status to anyone — signed in or not. Nothing else about the project is published. The project must have a build lot with a centroid; a project that has only an address and no attached build parcel cannot be pinned. Ask the human before listing a site that is not already public knowledge. A client, a friend, or a private residence is theirs to publish, not yours. preview=true returns the current state, the exact pin that would be published, and any privacy warning, and writes nothing. Unlisting removes the pin but does not un-share anything already collected while it was public.
Read-only: no
Parameters:
projectId(string, optional) — Project UUID. Omit if you passproject.project(string, optional) — Project name to match, when you do not have the UUID. Case-insensitive; an exact name wins over a partial one. Matching more than one lists the candidates instead of guessing.listed(boolean, required) — true lists the project on the public map; false removes it. Listing publishes the build-lot centroid and the project name to anyone, signed in or not.preview(boolean, required) — When true, return the current listing state, the pin that would be published, and any privacy warning, and write nothing.
Compose and export a project report PDF
produceProjectReport
Compose a project report PDF. Pass projectId or project; with neither, the result lists projects and no meter is spent. preview=true composes without spending. confirm=true exports, spends records.exports, and is irreversible. Returns a signed download URL, never PDF bytes.
Read-only: no
Parameters:
projectId(string, optional) — Project UUID. Omit if you passproject.project(string, optional) — Project name to match, when you do not have the UUID. Case-insensitive; an exact name wins over a partial one. Matching more than one lists the candidates instead of guessing.audience(enum: "investor" | "owner" | "board" | "resident", required)detail(enum: "brief" | "detailed", required)request(string, optional)preview(boolean, required) — When true, compose only — no export meter spend and no download URL.confirm(boolean, required) — When true, compose (if needed), save, export PDF, and return a download URL. Required when preview is false. Spends records.exports and cannot be undone.planName(string, optional)
Feedback
Submit feedback to Bucky
submitBuckyFeedback
Open a human-reviewed feedback form and submit it to the Bucky product team. Call only when the user explicitly asks to send feedback, report a problem, suggest an improvement, or praise something. The server asks the MCP client to show the form; nothing is saved unless the human accepts it. Do not use for silent agent self-reporting.
Read-only: no
Parameters:
submissionId(string, optional) — Optional. A UUID for this submission; generated server-side when omitted. Pass the same UUID when retrying this exact feedback so it is not recorded twice.affectedToolName(string, optional) — Tool the user is commenting on, when already known