MCP HeartbeatTHE MCP OBSERVATORY
Public workspace

Explore

Evidence for your next connection.

Independent measurements of remote MCP servers. Every observation has a timestamp.

Read-only probes

MCP server · Data access / search

Bucky

Zoning, parcel, and development feasibility for a street address in Canada and the US.

Checks passed
14 / 22

1 failed · 7 not measured

Median response
877 ms

Median of successful probes over 7 days

30-day uptime
Not measured

Share of countable probes over 30 days, including daily rollups. Auth challenges are excluded.

Discovered tools
17

Tool definitions returned by this server

Independent monitoring

Health & checks

Status history

Responded

The server completed its last measured handshake. This is an observation, not a guarantee.

Last checked
Check summary by test group
Test areaPassedFailedUnmeasured
ConnectionCan a client connect and discover tools?
500
Reliability & speedDoes it respond consistently and quickly?
103
Access & authenticationWhat is required to use this server?
102
Tool qualityAre the tool definitions usable by an agent?
310
Publisher identityCan the publisher be traced to its source?
402

Unmeasured means there is not enough evidence to decide. How these checks work

Inspect individual checks 22 recorded

Core

  • Pass
    Reachable

    Latest probe returned HTTP 200 in 955 ms.

  • Pass
    Valid handshake

    protocolVersion 2025-11-25, serverInfo.name bucky.

  • Pass
    Lists tools

    tools/list returned 17 tools.

  • Pass
    Current protocol

    Negotiated 2025-11-25. The bar is 2025-06-18 or newer.

  • Pass
    HTTPS

    The endpoint URL is https.

Performance

  • Not measured
    Fast (p50)

    Median latency 877 ms over 2 samples in 7 days. The bar is 1000 ms. Need at least 5 samples.

  • Not measured
    Consistent (p95)

    95th percentile 947 ms over 2 samples in 7 days. The bar is 3000 ms. Need at least 20 samples.

  • Not measured
    Reliable (uptime)

    2 of 2 attempts returned a tool list in 30 days (100%). The bar is 99%. Need at least 30 samples.

  • Pass
    Stable tool list

    No tool was removed and no required parameter was added in the last 30 days.

Access

  • Pass
    Open access

    tools/list succeeded with no credential, and the record declares none.

  • Not measured
    Standard auth

    Auth is not required, so the OAuth metadata check does not apply.

  • Not measured
    Free tier cited

    No publisher quote has been checked.

Tools

  • Pass
    Tools described

    Every tool description is at least 20 characters.

  • Pass
    Valid input schemas

    Every inputSchema is a JSON Schema object.

  • Fail
    Parameters documented

    142 of 230 parameters have a description (62%). The bar is 80%.

  • Pass
    Safety hints

    Every tool sets readOnlyHint or destructiveHint.

Publisher

  • Pass
    Verified namespace

    Listed in the Official MCP Registry.

  • Pass
    Website matches publisher

    The website host matches the reverse-domain namespace.

  • Pass
    Source repo linked

    A repository URL is on file.

  • Not measured
    Repo owner matches

    This namespace is not an io.github login, so the owner comparison does not apply.

  • Pass
    Recently updated

    Updated 2026-09-21T19:28:32.276971Z, within 180 days.

  • Not measured
    Open-source licence

    The GitHub licence lookup has not returned an OSI result yet.

Start using Bucky

Connect to this server

Choose your client, copy the configuration, then enable the server in your client’s MCP settings.

Run this command in your terminal, then restart Claude Code.

Claude Code

claude mcp add --transport http bucky https://buckybuild.com/api/mcp

Capabilities

Tools 17

checkSite

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. Read exception before searching: its parcel zone label identifies the site-specific exception, chain contains the cited text and required references. Use that text first. text_missing means incomplete evidence, never no exception. Prevailing by-laws can be address-specific; do not apply every listed address provision to this lot. A live answer uses one site check from the monthly plan allowance; `usage` says if it was charged and how many are left. getBuckyMcpGuide reports the allowance for free. CMHC rental survey figures describe purpose-built rentals; the new-build proxy is the 2000 or later band. Missing facts are not surveyed or unavailable, never zero. Cite RMS figures as Source: CMHC, Rental Market Survey, October YYYY using referencePeriod. Cite starts and completions with their own source and period. Every envelope value carries a `status`. Never report `not_extracted` or `site_specific_schedule` as no limit or as zero — call `explainFeasibilityStatus` first. Envelope numbers are extracted ceilings. Call `getBylawSection` with a citation `knowledgeSectionId`, or with `coverage.geoDivisionId`, `zone.code`, and the section number, before treating a number as available on this lot. Do not fetch `zone.bylawSourceUrl`. `lot.minLotFrontageM` is the zone minimum. `lot.lotConformity` compares lot width, lot area, and floor area per unit to those minima. A missing input is `unknown`, never a pass. State every fail before quoting a unit count.

Discovered
cityInventory

Public city catalogue inventory. Pass exactly one of: cityName, lat and lng together, or geoDivisionId. A city name with multiple matches returns choices; after the user chooses, call again with that candidate geoDivisionId. Never pass a slug. Shows datasets grouped by topic as on file, not loaded yet, unavailable, or not confirmed. This is city coverage, not lot feasibility or operator health. CMHC rental survey figures describe purpose-built rentals; the new-build proxy is the 2000 or later band. Missing facts are not surveyed or unavailable, never zero. Cite RMS figures as Source: CMHC, Rental Market Survey, October YYYY using referencePeriod. Cite starts and completions with their own source and period. If Bucky has not mapped the place, the result points to recording demand. It does not record demand by itself.

Discovered
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, published, 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.

Discovered
findPlacesByMarket

Find which places to look at by their rental market: filter and rank every structured-live place on market facts and signals. Signed-in only; read scope. Pass `country` (CA or US; places rank only within one country) and a `preset` (CA: tight-rental, fast-rent-growth, undersupplied, mli-select-headroom; US: low-rental-vacancy, car-light), `filters` ({ key, min, max }, inclusive), or both; optional `region` (province or state, as a code or name), `sort`, `limit` (default 20, max 50) and `offset`. An unknown key returns the filterable keys. Returns counts { places, matched, inPlan, excluded, unknown }, matched places with their values and `access`, and the unknown places with their missing keys. Report the unknown count: a place missing a filtered value is not a match and not a fail. Places are compared on one survey period. `truncation` says what was left out: `places` pages with `truncation.places.nextOffset` as the next `offset`; `unknown` lists at most 50 places by name, `counts.unknown` is the total. To run a saved filter set, pass `setId` (from listPlaceMarketSets) with `limit` and `offset` only. The result adds `set` and `unavailableFilters`: stored filters whose key Bucky no longer filters on. Those are left out and the rest run; tell the user which filters were skipped. Cite every figure with the `sources` lines (CMHC licence for CA, ACS for US). Market data filters places, not lots: use screenLots for lots inside a place. Every structured-live place is searched, not only the user's. Each matched place has `access`: `in_plan` (the user can screen its lots), `available` (Bucky sells it; the user can upgrade to add it) or `not_sold` (Bucky does not sell it yet; the user can request it). `counts.inPlan` is how many matches are in the user's plan. Say how many matches are in the plan, and offer Upgrade or Request for the others; never offer to screen lots in a place that is not `in_plan`. To find lots in the matched places, this is two steps: this call ranks places by market, then call screenLots once per matched place with `access: in_plan`, passing its `geoDivisionId`, at most 10 places in rank order. Never screen unknown places or places that are not `in_plan`; say how many were left out and why. Tell the user it was two steps, and credit the market `sources` for the first. Turning a question into filters: pick the country from the place named (Ontario, Texas). Put a province or state in `region`. Map each condition to the closest key below. "Tight" or "low vacancy" is a max on a vacancy key; "growing" or "rising" is a min on a change key; "above" is min, "below" is max. Percent bounds are numbers: 5 means 5%. Money bounds are in the country's own dollars. A relative question ("top quarter for rent growth", "lowest 10% vacancy in the province") is a percentile filter: `top` keeps the highest-valued share of places, `bottom` the lowest, as a percent (25 = 25%), instead of min and max. It ranks within the request's places, so give a region for "in the province". Each result filter states the cut value it resolved to in `text`. Never invent a key. If no key below measures what was asked (for example a comparison to a provincial median), say so, name the nearest key, and use a numeric bound you state. Tell the user every filter you used, in plain words with units, before or with the result: each result filter has a `text` field for this. On an UNKNOWN_KEY or CROSS_SCOPE error, read `errorDetails` and call again in the same turn with a key or region from it. CA keys: population_density_per_sq_km: Density (people per km²). median_age: Median age (years). median_household_income: Median household income (CAD dollars). Nominal dollars of the income year, not adjusted for inflation. owner_occupied_pct: Owner-occupied (%). renter_occupied_pct: Renter-occupied (%). median_home_value: Median home value (CAD dollars). Nominal dollars of the data year (for the ACS, the 5-year release’s end year), not adjusted for inflation. median_gross_rent: Median gross rent (CAD dollars). cmhc_rental_vacancy_rate: Purpose-built rental vacancy (%). cmhc_rental_availability_rate: Purpose-built rental availability (%). cmhc_avg_rent_studio: Avg rent, studio (purpose-built) (CAD dollars). cmhc_avg_rent_1br: Avg rent, 1BR (purpose-built) (CAD dollars). cmhc_avg_rent_2br: Avg rent, 2BR (purpose-built) (CAD dollars). cmhc_avg_rent_3br_plus: Avg rent, 3BR+ (purpose-built) (CAD dollars). cmhc_avg_rent_total: Avg rent, all units (purpose-built) (CAD dollars). cmhc_median_rent_total: Median rent, all units (purpose-built) (CAD dollars). cmhc_avg_rent_built_2000_plus: Avg rent, built 2000 or later (purpose-built) (CAD dollars). cmhc_avg_rent_change_pct: Avg rent change, same units (purpose-built) (%). signal_rent_cagr_5y_pct: Rent change, annualized over 5 years (%). Annualized change between two published rent levels, in nominal dollars. signal_rental_vacancy_trend_3y_pp: Purpose-built rental vacancy change over 3 years (percentage points). signal_new_build_rent_premium_pct: Newer-building rent difference (built 2000 or later vs all units) (%). Compares average rent in buildings constructed in 2000 or later with average rent across all surveyed units. signal_rental_pipeline_pct: Rental units under construction as a share of purpose-built rental units (%). signal_rental_starts_momentum_pct: Rental starts, last 12 months vs the 12 months before (%). signal_mli_affordability_gap_pct: MLI Select rent difference as a share of average rent (%). Average rent minus the MLI Select reference rent ceiling, divided by average rent. signal_population_cagr_census_5y_pct: Population change per year, Census 2016 to 2021 (%). Annualized change in the Census of Population count between 2016 and 2021. signal_household_income_cagr_census_5y_pct: Median household income change per year, Census 2016 to 2021 (2015 to 2020 incomes, nominal) (%). Annualized change in median total household income, not adjusted for inflation. US keys: population_density_per_sq_km: Density (people per km²). median_age: Median age (years). acs_households_no_vehicle_pct: Households with no vehicle (%). Share of occupied households by vehicles available, ACS 5-year estimate. acs_households_one_vehicle_pct: Households with one vehicle (%). acs_households_two_plus_vehicles_pct: Households with two or more vehicles (%). acs_vehicles_per_household: Vehicles per household (vehicles per household). Aggregate vehicles available divided by occupied households, ACS 5-year estimate. acs_commute_drove_alone_pct: Commute: drove alone (%). Share of workers age 16 and over by means of transportation to work, including those who worked from home; ACS 5-year estimate. acs_commute_carpool_pct: Commute: carpool (%). acs_commute_transit_pct: Commute: public transit (%). acs_commute_walk_pct: Commute: walked (%). acs_commute_work_from_home_pct: Worked from home (%). median_household_income: Median household income (USD dollars). Nominal dollars of the income year, not adjusted for inflation. hud_ami_median_family_income: HUD area median family income (USD dollars). owner_occupied_pct: Owner-occupied (%). renter_occupied_pct: Renter-occupied (%). vacancy_rate: Vacancy rate (%). median_home_value: Median home value (USD dollars). Nominal dollars of the data year (for the ACS, the 5-year release’s end year), not adjusted for inflation. median_gross_rent: Median gross rent (USD dollars). acs_rental_vacancy_rate: ACS rental vacancy rate (all rental units) (%). ACS 5-year rental vacancy rate, including all rental units, not only purpose-built rentals. acs_median_gross_rent_built_2020_plus: ACS median gross rent, built 2020 or later (all rental units) (USD dollars). ACS 5-year median gross rent for renter-occupied units paying cash rent in structures built 2020 or later; nominal dollars for the release. hud_fmr_efficiency: HUD FMR — efficiency (USD dollars). hud_fmr_one_bedroom: HUD FMR — 1BR (USD dollars). hud_fmr_two_bedroom: HUD FMR — 2BR (USD dollars). hud_fmr_three_bedroom: HUD FMR — 3BR (USD dollars). hud_fmr_four_bedroom: HUD FMR — 4BR (USD dollars). signal_rent_cagr_5y_pct: Rent change, annualized over 5 years (%). Annualized change between two published rent levels, in nominal dollars. signal_rental_vacancy_trend_5y_pp: Rental vacancy change over 5 years (all rental units) (percentage points). ACS rental vacancy rate in the 2020–2024 release minus the 2015–2019 release, in points. signal_rent_premium_built_2020_plus_pct: Newer-building rent difference (built 2020 or later vs all units) (%). ACS median gross rent in structures built 2020 or later, compared with median gross rent across all renter-occupied units, from the same release. signal_multifamily_permits_pct: Units permitted in 5+ unit buildings, 12 months, as a share of renter-occupied units (%). Census Building Permits Survey units authorized in buildings of 5 or more units over the latest 12 months, divided by ACS renter-occupied units. signal_multifamily_permits_momentum_pct: Units permitted in 5+ unit buildings, last 12 months vs the 12 months before (%). Permits, not construction. signal_lihtc_rent_gap_pct: LIHTC 2-bedroom rent limit difference as a share of median gross rent (%). ACS median gross rent minus the LIHTC 60% AMI rent limit for a 2-bedroom unit (30% of the HUD 3-person 60% income limit, per month), divided by median gross rent. signal_population_cagr_acs_5y_pct: Population change per year, ACS 2015–2019 to 2020–2024 (%). Annualized change in total population between the 2015–2019 and 2020–2024 ACS 5-year releases. signal_household_income_cagr_acs_5y_pct: Median household income change per year, ACS 2015–2019 to 2020–2024 (nominal) (%). Annualized change in median household income between the 2015–2019 and 2020–2024 ACS 5-year releases, in each release’s own dollars, not adjusted for inflation. signal_home_value_cagr_acs_5y_pct: Median home value change per year, ACS 2015–2019 to 2020–2024 (nominal) (%). Annualized change in the median value owners report for owner-occupied homes, between the 2015–2019 and 2020–2024 ACS 5-year releases, not adjusted for inflation.

Discovered
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. Signed in, it also returns `profile`: the standing answers Bucky has for this user and the questions still open; save answers with updateMyProfile.

Discovered
getBylawSection

Return the stored bylaw section text behind a snapshot citation. Pass `sectionIds` copied from `citations.*.knowledgeSectionId` on checkSite. Or pass `geoDivisionId` from `coverage.geoDivisionId`, `zoneCode` from `zone.code`, and `sectionNumbers` such as 3.1 or 3.2. The markdown is the schedule text. A number in the snapshot can still be conditional on frontage, tenure, or adjoining district. Each section returns at most 12,000 characters. A cut section has `truncated: true`, `totalChars` and `nextOffset`: call again with that section id and `textOffset: nextOffset` for the rest. Ids or section numbers with no active chunk come back in `missing`.

Discovered
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. Pass `include` for optional sections: tasks, members, insights, capital, visualEvidence. Default is none, so the payload stays the same as a call without include. Documents and evidence return up to `documentsLimit` / `evidenceLimit` (default 20, max 50); each include list returns up to 20. `truncation` gives `total`, `returned` and `truncated` for every list that can be cut. Writes to those sections stay on the Bucky CLI. 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.

Discovered
previewSiteCoverage

Free preview, no sign-in needed. For one street address in Canada or the US, it says whether Bucky covers the place and which zoning facts it holds for the lot (lot boundary, zone, height, density, setbacks, permitted uses, overlays, parking): found, partly on file, or not on file. It returns no values: no zone code, heights, setbacks or areas. The lot outline is a shape with no scale. Use it when the user is not signed in and asks what they can build at an address. For the numbers, call checkSite. That call asks the user to sign in.

Discovered
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 and returns `previewId`. confirm=true with that `previewId` exports exactly the text that was previewed; without it, confirm composes again. Export spends records.exports and is irreversible. Returns a signed download URL, never PDF bytes.

Discovered
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.

Discovered
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, pass a WGS84 GeoJSON polygon (up to 500 selected parcels), or copy `lot.parcelExternalId` from checkSite. Polygon cannot be combined with parcelExternalIds or radiusM. Results report source truncation and attached count. preview=true returns the diff and writes nothing. A write returns a receipt. Not reversible on this surface.

Discovered
screenLots

Find the lots in one live Bucky city that match a list. Pass `city` or `geoDivisionId` with `thesis` (plain words), `criteria` (square feet, dollars), or both; or pass a saved `profileId`. Returns countOutcome (exact, partial, at_least, estimate, or unavailable), screeningRunId, and selected lots ranked largest first with a pass, fail, or not_available verdict per filter. totalMatches is a compatibility value and can be returned-page size when the total is unavailable. Report a not_available filter; never present the count as filtered by it. The execution preserves selection for optional candidate assessment; assessment candidate counts are separate from search totals. Returns candidates, counted suggestions and savedMatches. Candidate/suggestion criteria use the same square-foot boundary as the input, including canonical registry values and strategies. Present these alternatives before asking to save. Pass the selected criteria with save=true only after explicit approval, without re-reading the thesis. For a height the user wants to build ("10 to 14 storeys"), use criteria.permitted_stories or permitted_height_m: the maximum the lot's zone allows. criteria.stories is the building standing on the lot. Each lot has `lotId` for updateSaved (action save), `address` for checkSite and `parcelExternalId` for saveToProject. Assembly lots carry the same ids. At most 25 lots per call (`limit`, default 10). `page` says which matches these are (offset, returned, total, truncated); when truncated, call screenLots with `page.next` for the next lots. Paging reads only: it saves nothing and uses no list quota. save=true saves the list (write scope, counts against the plan list limit) and returns a CSV link of every match; the CSV needs a saved list, so links.csv is null without one.

Discovered
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. To undo, call again with `listed` set to the opposite value (`listed: false` after listing); the result repeats this as `undo`.

Discovered
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.

Discovered
uiGetAnalysisStatus

Return only the analysis `agentStatus` for a project. Cheap enough to poll. Used by the Bucky app view; the model should call getProjectContext instead.

Discovered
uiRequestSignIn

Return `signedIn: true` for a signed-in caller. An anonymous call gets the sign-in challenge. Used by the Bucky app view; the model should call the tool it needs instead.

Discovered
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.

Discovered

Recent measurements

Probe history

View status
Latest stored probes. Raw probe rows are kept for 14 days.
CheckedResultResponseTools
Connected955 ms17
Connected798 ms17