Bucky

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

我该使用它吗

质量与安全性

A
描述质量
99%
模式完整度
97%
命名质量
93%
投毒风险
100%
权限匹配度
100%
协议合规性
100%

基于对工具定义和协议合规性的自动分析。

上下文开销

~12,065token 数(工具定义)
~7.6 KB典型响应大小
对注意力有显著影响(占 128k 上下文窗口的 9.43%)

这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。

安装

一键安装

将以下内容添加到你的 `claude_desktop_config.json` 文件中:

{
  "mcpServers": {
    "bucky": {
      "url": "https://buckybuild.com/api/mcp"
    }
  }
}

远程端点

https://buckybuild.com/api/mcpstreamable-http

它能做什么

工具清单

工具(15)

🟢 只读🟡 写入🔴 删除⚪ 未知
🟢getBuckyMcpGuide(role, market, scale, context, llm_model, ...)

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.

输入模式

{
  "type": "object",
  "properties": {
    "role": {
      "description": "Who is asking. Answers \"Developer, GC, or municipal reviewer?\".",
      "type": "string",
      "enum": [
        "developer",
        "gc",
        "reviewer"
      ]
    },
    "market": {
      "description": "Which country the site is in. Answers \"US or Canada?\".",
      "type": "string",
      "enum": [
        "US",
        "CA"
      ]
    },
    "scale": {
      "description": "One site or several. Answers \"Single parcel, or a portfolio?\".",
      "type": "string",
      "enum": [
        "single_parcel",
        "portfolio"
      ]
    },
    "context": {
      "type": "string",
      "description": "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.\""
    },
    "llm_model": {
      "type": "string",
      "description": "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."
    },
    "conversation_id": {
      "type": "string",
      "description": "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."
    }
  },
  "required": [
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢explainFeasibilityStatus(status, context, llm_model, conversation_id)

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.

输入模式

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "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"
      ],
      "description": "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."
    },
    "context": {
      "type": "string",
      "description": "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.\""
    },
    "llm_model": {
      "type": "string",
      "description": "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."
    },
    "conversation_id": {
      "type": "string",
      "description": "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."
    }
  },
  "required": [
    "status",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢getFeasibilitySnapshot(address, source, context, llm_model, conversation_id)

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

输入模式

{
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "minLength": 3,
      "maxLength": 500,
      "description": "Street address to analyse, e.g. \"4170 Sophia St, Vancouver BC\"."
    },
    "source": {
      "default": "full",
      "description": "Which question the caller is answering. Used for attribution and to pick the link back; the payload is the same either way.",
      "type": "string",
      "enum": [
        "zoning_lookup",
        "lot_dimensions",
        "setback_lookup",
        "height_limit_lookup",
        "full"
      ]
    },
    "context": {
      "type": "string",
      "description": "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.\""
    },
    "llm_model": {
      "type": "string",
      "description": "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."
    },
    "conversation_id": {
      "type": "string",
      "description": "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."
    }
  },
  "required": [
    "address",
    "source",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢getBylawSection(sectionIds, geoDivisionId, zoneCode, sectionNumbers, context, ...)

Return the stored bylaw section text behind a snapshot citation. Pass `sectionIds` copied from `citations.*.knowledgeSectionId` on getFeasibilitySnapshot. 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. Ids or section numbers with no active chunk come back in `missing`.

输入模式

{
  "type": "object",
  "properties": {
    "sectionIds": {
      "minItems": 1,
      "maxItems": 4,
      "type": "array",
      "items": {
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "description": "Copy citations.*.knowledgeSectionId from getFeasibilitySnapshot. 1 to 4 ids."
    },
    "geoDivisionId": {
      "description": "coverage.geoDivisionId from getFeasibilitySnapshot.",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "zoneCode": {
      "description": "zone.code from getFeasibilitySnapshot, for example C-2.",
      "type": "string",
      "minLength": 1,
      "maxLength": 40
    },
    "sectionNumbers": {
      "minItems": 1,
      "maxItems": 4,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 64
      },
      "description": "Section numbers to read, for example 3.1 or 3.2. 1 to 4 numbers."
    },
    "context": {
      "type": "string",
      "description": "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.\""
    },
    "llm_model": {
      "type": "string",
      "description": "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."
    },
    "conversation_id": {
      "type": "string",
      "description": "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."
    }
  },
  "required": [
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢screenLots(city, geoDivisionId, profileId, thesis, criteria, ...)

Find the lots in one live Bucky city that match a buy box. Pass `city` or `geoDivisionId` with `thesis` (plain words), `criteria` (square feet, dollars), or both; or pass a saved `profileId`. Returns the total match count, the top lots ranked largest first with a pass, fail, or not_available verdict per filter, and every filter this city cannot apply. Report a not_available filter; never present the count as filtered by it. Each lot has `address` for getFeasibilitySnapshot and `parcelExternalId` for saveToProject. save=true saves the box (write scope) and returns a CSV link.

输入模式

{
  "type": "object",
  "properties": {
    "city": {
      "description": "City as the user said it, e.g. \"Laval\" or \"Bedford, MA\". Omit when you pass geoDivisionId or profileId.",
      "type": "string",
      "minLength": 2,
      "maxLength": 120
    },
    "geoDivisionId": {
      "description": "Division id, from an earlier screenLots or cityInventory result.",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "profileId": {
      "description": "Saved buy box id. Runs the saved city and criteria. Do not combine with city, thesis, or criteria.",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "thesis": {
      "description": "The buy box in plain words, e.g. \"industrial lots over half an acre outside the floodplain\".",
      "type": "string",
      "minLength": 3,
      "maxLength": 500
    },
    "criteria": {
      "description": "Structured criteria. A field set here replaces the same field read from thesis.",
      "type": "object",
      "properties": {
        "minAreaSqft": {
          "description": "Smallest lot, in square feet.",
          "type": "number",
          "minimum": 0
        },
        "maxAreaSqft": {
          "description": "Largest lot, in square feet.",
          "type": "number",
          "minimum": 0
        },
        "zoneCodes": {
          "description": "Zone codes from the city's own vocabulary, e.g. RM-4.",
          "maxItems": 50,
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32
          }
        },
        "namedAreaIds": {
          "description": "Submarket (named area) ids. Use `thesis` to match submarkets by name.",
          "maxItems": 50,
          "type": "array",
          "items": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          }
        },
        "overlayKinds": {
          "description": "Overlay kinds a lot must be inside.",
          "maxItems": 20,
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          }
        },
        "overlayExcludeKinds": {
          "description": "Overlay kinds a lot must be outside.",
          "maxItems": 20,
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          }
        },
        "minAssessed": {
          "description": "Lowest assessed total value, in dollars.",
          "type": "number",
          "minimum": 0
        },
        "maxAssessed": {
          "description": "Highest assessed total value, in dollars.",
          "type": "number",
          "minimum": 0
        },
        "minHomes": {
          "description": "Homes allowed, at least N. A zone-level estimate.",
          "type": "integer",
          "minimum": 1,
          "maximum": 1000
        },
        "ownership_form": {
          "type": "object",
          "properties": {
            "any_of": {
              "maxItems": 10,
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 256
              }
            },
            "none_of": {
              "maxItems": 10,
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 256
              }
            }
          },
          "additionalProperties": false,
          "description": "Ownership form: fee_simple (land title), strata_condo, co_op, leasehold, mixed. \"Land title only\" is { none_of: [\"strata_condo\", \"co_op\", \"leasehold\", \"mixed\"] }, which keeps lots whose form is unknown; any_of drops them."
        },
        "titled_unit_count": {
          "type": "object",
          "properties": {
            "min": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            },
            "max": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            }
          },
          "additionalProperties": false,
          "description": "Titled units on the parcel: 1 for a land-title lot, the strata unit count otherwise."
        },
        "improvement_land_ratio": {
          "type": "object",
          "properties": {
            "min": {
              "type": "number",
              "minimum": 0
            },
            "max": {
              "type": "number",
              "minimum": 0
            }
          },
          "additionalProperties": false,
          "description": "Assessed building (improvement) value divided by land value, as a ratio: 0.25 = the building is worth a quarter of the land. A teardown screen is { max: 0.25 }."
        },
        "year_built": {
          "type": "object",
          "properties": {
            "min": {
              "type": "integer",
              "minimum": 1600,
              "maximum": 2100
            },
            "max": {
              "type": "integer",
              "minimum": 1600,
              "maximum": 2100
            }
          },
          "additionalProperties": false,
          "description": "Year the main building was built, inclusive bounds."
        },
        "existing_coverage_pct": {
          "type": "object",
          "properties": {
            "min": {
              "type": "number",
              "minimum": 0
            },
            "max": {
              "type": "number",
              "minimum": 0
            }
          },
          "additionalProperties": false,
          "description": "Building footprint area on the lot as a percentage of lot area, 0-100. An underbuilt screen is { max: 20 }. Footprints can be years old: check the city honesty note."
        },
        "existing_use_class": {
          "type": "object",
          "properties": {
            "any_of": {
              "maxItems": 10,
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 256
              }
            },
            "none_of": {
              "maxItems": 10,
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 256
              }
            }
          },
          "additionalProperties": false,
          "description": "What stands on the lot: place_of_worship (church, temple, mosque, synagogue…), fuel_station, auto_service (repair, body, car wash), auto_sales (car dealer), else vacant, surface_parking or built. \"Vacant lots or surface parking\" is { any_of: [\"vacant\", \"surface_parking\"] }; \"gas stations\" is { any_of: [\"fuel_station\"] }; \"church sites\" is { any_of: [\"place_of_worship\"] }. Vacant means no building over 20 m² in any footprint source and no assessed building worth over 20% of the land. Québec lots without footprints use the assessment roll land-use code (CUBF 9100 = vacant). A mapped business on the lot wins over the footprint class. Fuel and auto-service sites are a contamination risk flag, not a site investigation."
        },
        "contamination_risk": {
          "type": "object",
          "properties": {
            "is": {
              "type": "boolean"
            }
          },
          "required": [
            "is"
          ],
          "additionalProperties": false,
          "description": "true: a gas station or auto-service business (repair, body shop, car wash) is mapped on the lot. { is: false } excludes those lots. A risk flag from OpenStreetMap and city business licences, not a site investigation: it misses former and unmapped businesses."
        },
        "place_of_worship": {
          "type": "object",
          "properties": {
            "is": {
              "type": "boolean"
            }
          },
          "required": [
            "is"
          ],
          "additionalProperties": false,
          "description": "true: a church, temple, mosque, synagogue or other place of worship is mapped on the lot (OpenStreetMap, city heritage registers). { is: false } excludes those lots. Same lots as existing_use_class place_of_worship."
        },
        "subdivision_yield": {
          "type": "object",
          "properties": {
            "min": {
              "type": "number",
              "minimum": 0
            },
            "max": {
              "type": "number",
              "minimum": 0
            }
          },
          "additionalProperties": false,
          "description": "Lot area divided by the zone's minimum lot area: how many minimum-size lots the parcel could hold by area. \"Could be subdivided\" is { min: 2 }; \"into 3 lots\" is { min: 3 }. Ignores frontage, streets and lot shape: a candidate, not a subdivision approval."
        },
        "zone_family": {
          "type": "object",
          "properties": {
            "any_of": {
              "maxItems": 10,
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 256
              }
            },
            "none_of": {
              "maxItems": 10,
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 256
              }
            }
          },
          "additionalProperties": false,
          "description": "The zone's dominant use from the Québec zone letter: residential (H), mixed (M), commercial (C), industrial (I), public (P, U), recreation (R), agricultural (A), forest (F). \"Zoned residential or mixed\" is { any_of: [\"residential\", \"mixed\"] }. Québec cities only. The letter names the dominant use; the zone grid still decides which uses are permitted."
        }
      },
      "additionalProperties": false
    },
    "save": {
      "description": "true saves the buy box to the account. Default false: nothing is written.",
      "type": "boolean"
    },
    "saveName": {
      "description": "Name for a saved box.",
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "limit": {
      "description": "Lots to return. Default 10. The total match count is always returned.",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "context": {
      "type": "string",
      "description": "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.\""
    },
    "llm_model": {
      "type": "string",
      "description": "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."
    },
    "conversation_id": {
      "type": "string",
      "description": "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."
    }
  },
  "required": [
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢runFeasibilityAnalysis(projectId, project, context, llm_model, conversation_id)

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.

输入模式

{
  "type": "object",
  "properties": {
    "projectId": {
      "description": "Project UUID. Omit if you pass `project`.",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "project": {
      "description": "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.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "context": {
      "type": "string",
      "description": "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.\""
    },
    "llm_model": {
      "type": "string",
      "description": "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."
    },
    "conversation_id": {
      "type": "string",
      "description": "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."
    }
  },
  "required": [
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢getProjectContext(projectId, project, documentsLimit, evidenceLimit, include, ...)

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

输入模式

{
  "type": "object",
  "properties": {
    "projectId": {
      "description": "Project UUID. Omit if you pass `project`.",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "project": {
      "description": "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.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "documentsLimit": {
      "default": 20,
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "evidenceLimit": {
      "default": 20,
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "include": {
      "default": [],
      "description": "Optional extra sections. Default is none, so the payload matches a call without include. tasks, members, insights, capital, and visualEvidence each reuse the matching product read — they are not separate tools. Writes stay on the Bucky CLI.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "tasks",
          "members",
          "insights",
          "capital",
          "visualEvidence"
        ]
      }
    },
    "context": {
      "type": "string",
      "description": "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.\""
    },
    "llm_model": {
      "type": "string",
      "description": "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."
    },
    "conversation_id": {
      "type": "string",
      "description": "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."
    }
  },
  "required": [
    "documentsLimit",
    "evidenceLimit",
    "include",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡saveToProject(action, name, address, lat, lng, ...)

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.

输入模式

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "create",
        "attach_reference",
        "attach_parcels"
      ],
      "description": "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": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "address": {
      "description": "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.",
      "type": "string",
      "minLength": 3,
      "maxLength": 200
    },
    "lat": {
      "description": "Latitude from getFeasibilitySnapshot. Supplied coordinates are never re-geocoded.",
      "type": "number"
    },
    "lng": {
      "description": "Longitude from getFeasibilitySnapshot.",
      "type": "number"
    },
    "projectId": {
      "description": "Existing project UUID. Required by attach_parcels and attach_reference unless you pass `project`; ignored by create.",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "project": {
      "description": "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.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "sectionUuid": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "parcelExternalIds": {
      "description": "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.",
      "minItems": 1,
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 160
      }
    },
    "role": {
      "description": "build is the lot being developed; context is surrounding land. Default build.",
      "type": "string",
      "enum": [
        "build",
        "context"
      ]
    },
    "radiusM": {
      "description": "Search half-width in metres when resolving parcel ids. Default 150.",
      "type": "integer",
      "minimum": 10,
      "maximum": 400
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128
    },
    "externalRef": {
      "description": "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.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "preview": {
      "default": false,
      "description": "When true, return the field-level diff and write nothing.",
      "type": "boolean"
    },
    "context": {
      "type": "string",
      "description": "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.\""
    },
    "llm_model": {
      "type": "string",
      "description": "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."
    },
    "conversation_id": {
      "type": "string",
      "description": "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."
    }
  },
  "required": [
    "action",
    "preview",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡updateProject(projectId, project, name, lifecycleStatus, externalRef, ...)

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.

输入模式

{
  "type": "object",
  "properties": {
    "projectId": {
      "description": "Project UUID. Omit if you pass `project`.",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "project": {
      "description": "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.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "lifecycleStatus": {
      "type": "string"
    },
    "externalRef": {
      "description": "Provenance of an imported project. Canonical form is `<system>:<id>` (e.g. `notion:<page-id>`). Unique per creator when set. Pass null to clear.",
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 200
        },
        {
          "type": "null"
        }
      ]
    },
    "preview": {
      "default": false,
      "description": "When true, return the field-level diff and write nothing. Combined with undoOperationId, returns the stored receipt.",
      "type": "boolean"
    },
    "undoOperationId": {
      "description": "Receipt id from a prior updateProject write. Restores the captured prior fields. With preview=true, inspects the receipt instead.",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "context": {
      "type": "string",
      "description": "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.\""
    },
    "llm_model": {
      "type": "string",
      "description": "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."
    },
    "conversation_id": {
      "type": "string",
      "description": "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."
    }
  },
  "required": [
    "preview",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡setProjectMapListing(projectId, project, listed, preview, context, ...)

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.

输入模式

{
  "type": "object",
  "properties": {
    "projectId": {
      "description": "Project UUID. Omit if you pass `project`.",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "project": {
      "description": "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.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "listed": {
      "type": "boolean",
      "description": "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": {
      "default": false,
      "description": "When true, return the current listing state, the pin that would be published, and any privacy warning, and write nothing.",
      "type": "boolean"
    },
    "context": {
      "type": "string",
      "description": "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.\""
    },
    "llm_model": {
      "type": "string",
      "description": "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."
    },
    "conversation_id": {
      "type": "string",
      "description": "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."
    }
  },
  "required": [
    "listed",
    "preview",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢produceProjectReport(projectId, project, audience, detail, request, ...)

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.

输入模式

{
  "type": "object",
  "properties": {
    "projectId": {
      "description": "Project UUID. Omit if you pass `project`.",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "project": {
      "description": "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.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "audience": {
      "default": "owner",
      "type": "string",
      "enum": [
        "investor",
        "owner",
        "board",
        "resident"
      ]
    },
    "detail": {
      "default": "detailed",
      "type": "string",
      "enum": [
        "brief",
        "detailed"
      ]
    },
    "request": {
      "type": "string",
      "minLength": 3,
      "maxLength": 4000
    },
    "preview": {
      "default": false,
      "description": "When true, compose only — no export meter spend and no download URL.",
      "type": "boolean"
    },
    "confirm": {
      "default": false,
      "description": "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.",
      "type": "boolean"
    },
    "planName": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "context": {
      "type": "string",
      "description": "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.\""
    },
    "llm_model": {
      "type": "string",
      "description": "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."
    },
    "conversation_id": {
      "type": "string",
      "description": "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."
    }
  },
  "required": [
    "audience",
    "detail",
    "preview",
    "confirm",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡submitBuckyFeedback(submissionId, affectedToolName, context, llm_model, conversation_id)

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.

输入模式

{
  "type": "object",
  "properties": {
    "submissionId": {
      "description": "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.",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "affectedToolName": {
      "description": "Tool the user is commenting on, when already known",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "context": {
      "type": "string",
      "description": "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.\""
    },
    "llm_model": {
      "type": "string",
      "description": "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."
    },
    "conversation_id": {
      "type": "string",
      "description": "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."
    }
  },
  "required": [
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢previewSiteCoverage(address, context, llm_model, conversation_id)

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 getFeasibilitySnapshot. That call asks the user to sign in.

输入模式

{
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "minLength": 3,
      "maxLength": 500,
      "description": "Street address to analyse, e.g. \"4170 Sophia St, Vancouver BC\"."
    },
    "context": {
      "type": "string",
      "description": "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.\""
    },
    "llm_model": {
      "type": "string",
      "description": "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."
    },
    "conversation_id": {
      "type": "string",
      "description": "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."
    }
  },
  "required": [
    "address",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢cityInventory(cityName, lat, lng, geoDivisionId, context, ...)

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. If Bucky has not mapped the place, the result points to recording demand. It does not record demand by itself.

输入模式

{
  "type": "object",
  "properties": {
    "cityName": {
      "type": "string",
      "minLength": 2,
      "maxLength": 100
    },
    "lat": {
      "type": "number",
      "minimum": -90,
      "maximum": 90
    },
    "lng": {
      "type": "number",
      "minimum": -180,
      "maximum": 180
    },
    "geoDivisionId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "context": {
      "type": "string",
      "description": "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.\""
    },
    "llm_model": {
      "type": "string",
      "description": "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."
    },
    "conversation_id": {
      "type": "string",
      "description": "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."
    }
  },
  "required": [
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢uiGetAnalysisStatus(projectId, context, llm_model, conversation_id)

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

输入模式

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "context": {
      "type": "string",
      "description": "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.\""
    },
    "llm_model": {
      "type": "string",
      "description": "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."
    },
    "conversation_id": {
      "type": "string",
      "description": "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."
    }
  },
  "required": [
    "projectId",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

社区

评价此服务器

证据

最近观测

已验证未记录版本15 个工具
已验证未记录版本13 个工具
已验证未记录版本11 个工具