Skip to content
Sign in Sign up

MCP server · Model Context Protocol

baseray in your AI assistant

Ask an AI assistant about buildings and it answers from baseray: the building at an address, the largest roofs in a town, the businesses registered at an address. It can save what it finds to your lead lists, and every answer links back to the building in the app. It knows the countries baseray covers, Romania and Czechia today; asked about a place in another country, it says baseray does not cover it yet and points to baseray.tech/countries, where you can request it.

Server URL

https://api.baseray.ai/mcp

Streamable HTTP with OAuth sign-in. Works with Claude, ChatGPT, Claude Code, Cursor, VS Code and any client that connects to remote MCP servers. You need a baseray account, and a new one opens 5 buildings free with no card. The assistant uses it with your workspace’s data and limits.

Ask it things like

  • “Which industrial buildings over 2,000 m² in Ilfov have a business registered at the address?”
  • “Find apartment blocks in Brno with no solar panels on the roof and rank them by height. Open the top five.”
  • “What building is Strada Memorandumului 28, Cluj-Napoca? Who is registered there?”
  • “Which floor is apartment 275 on in that block, and how many entrances does it have?”
  • “Save the ten largest commercial roofs in Timișoara to a new lead list called ‘Timișoara solar’.”

Connect an assistant

The server runs at one URL over Streamable HTTP. Add it to your assistant, sign in to baseray when it asks and approve the access.

Claude

  1. In Claude (web or desktop), open Settings → Connectors and choose Add custom connector.
  2. Name it baseray, paste the server URL and choose Connect.
  3. Sign in to baseray and approve the access.

ChatGPT

  1. In ChatGPT, turn on developer mode under Settings → Apps → Advanced settings.
  2. Create an app, name it baseray and paste the server URL. Authentication is OAuth.
  3. Sign in to baseray and approve the access.

Claude Code

claude mcp add --transport http baseray https://api.baseray.ai/mcp
  1. Run the command, then type /mcp in Claude Code and choose baseray to sign in.

Cursor

{
  "mcpServers": {
    "baseray": {
      "url": "https://api.baseray.ai/mcp"
    }
  }
}
  1. Add the server to ~/.cursor/mcp.json (or .cursor/mcp.json in a project). Cursor asks you to sign in to baseray.

VS Code

{
  "servers": {
    "baseray": {
      "type": "http",
      "url": "https://api.baseray.ai/mcp"
    }
  }
}
  1. Add the server to .vscode/mcp.json and start it from the editor. VS Code opens the baseray sign-in.

Any other client that supports remote MCP servers with OAuth connects the same way: give it the URL and it finds the sign-in by itself.

Sign-in and permissions

The assistant signs in as you, with OAuth 2.1 and PKCE. There is no key to copy: the first time the assistant uses baseray, a baseray page opens where you sign in, pick the workspace and approve what the assistant may do.

The consent page lists what the assistant asks for: buildings:read to search and read buildings and see your lead lists, and lead_lists:write to create lead lists and add buildings to them.

The assistant acts in one workspace with your rights there. If you leave the workspace, it stops working at once. Disconnect it any time under Settings → Connected apps in the app.

Tools

The assistant picks the tool; you ask in your own words. Each tool’s description tells it when to use it.

find_buildings read

Find the building at an address

The building at one address, point or company registration number, with its address, use, footprint, floor area, height, floors, volume, dwellings, what a national building register states about it (year built, floors, built area, units, cadastral number), the natural hazards at its site, solar potential, existing solar panels and the businesses registered at the address. Opens the nearest building (1 credit) and returns it in full; the other buildings found there come as free previews.

address string
A street address with the town, e.g. “Bulevardul Eroilor 10, Brașov”.
latitude, longitude number
A point, WGS84, instead of an address.
companyRegistrationNumber string
A Romanian CUI or a Czech IČO, with country (RO or CZ): the building the business is registered at.
radiusMeters integer
How far to look, 5 to 200 m. Default 40.
limit integer
Buildings to look at, 1 to 10. Default 3. Only the nearest is opened.

search_buildings read

Search buildings in an area

Find, count and rank buildings across an area, up to about a county, or within a circle around a point. Returns the total that match and one ranked page; page further with offset. Searching is free: a building your workspace has opened comes in full, every other row is a preview with its street (no number), locality, use, each size as a range (a volume of 539,393 m³ shows as 500,000 to 600,000), natural hazards, the solar panel verdict and how many businesses are registered there.

place string
The area as a place name: a county, city, town or district, e.g. “Ilfov”, “Praha 5”.
boundingBox object
The area as west, south, east, north, instead of a place.
near object
latitude, longitude and radiusMeters (1 to 50,000): keep buildings whose centre lies within that distance of the point. Give it instead of a place or bounding box to search just the circle; given with either, the circle must lie inside that area.
categories string[]
Keep only these categories: residential_house, apartment_block, commercial, industrial, agricultural, public, ancillary.
buildingTypes string[]
Granular types, combined with categories by OR, e.g. office, warehouse, school, apartments, garage.
minFootprintAreaSquareMeters, minHeightMeters, minFloors, minDwellings number
Minimum size. Floors and dwellings filter where they are on record.
minVolumeCubicMeters, maxVolumeCubicMeters number
Volume bounds, where the volume is known.
onlyMeasuredVolumes boolean
Keep only buildings whose volume comes from a measurement of the building itself (a survey, or a surface model measured over its roof), not from an assumed height.
minYearBuilt, maxYearBuilt integer
Completed in or after minYearBuilt, and standing by maxYearBuilt, as a national building register dates the building (a register that dates it by a census period counts for maxYearBuilt only). A building with no year on record never matches, so an empty result says nothing about age.
onlyWallPanelConstruction boolean
Keep buildings a national building register states are built of prefabricated concrete wall panels. Today only Czechia’s register states it.
hasRegisteredBusiness, minRegisteredBusinesses, registeredBusinessNameContains, minRegisteredBusinessEmployees mixed
Filter on the businesses registered at the address.
minRegisteredBusinessTurnover, maxRegisteredBusinessTurnover, turnoverCurrency mixed
Latest turnover on record of a registered business, in RON or CZK (turnoverCurrency is required with either bound). A business with no turnover on record never matches a minimum.
floodZones string[]
5_year, 10_year, 20_year, 100_year, 100_year_climate_change, 500_year or 1000_year: zones of an official flood hazard map, named by the return period of their flood. A building whose zone is unknown matches none, so an empty result is not evidence of low flood risk.
seismicRiskClasses string[]
RsI (the highest risk) to RsIV, the older urgency classes U1 to U3, or consolidated, as an official list of technically assessed buildings classes them (in Romania today, Bucharest’s AMCCRS list). A building on no list matches none, which says nothing of its risk.
existingSolarPanels string[]
detected, none_seen or unclear, from dated roof photos. Roofs never checked are left out.
minSolarCapacityKwp number
Minimum rooftop solar capacity in kWp.
sortBy string
volume (default), footprint_area, height, business_employees or business_turnover (in turnoverCurrency), largest first.
limit, offset integer
1 to 25 buildings a page (default 10); offset up to 500.

open_buildings read

Open buildings

Opens the buildings you pick from a search and returns each in full: address with its number and postcode, sizes with their basis, year built, dwellings, natural hazards, solar potential and the registered businesses’ count, largest stated size and turnover. 1 credit for each building your workspace has not opened in the last year, all or nothing.

buildingIds uuid[] required
1 to 25 building ids from search_buildings or find_buildings.

get_building read

Get building details

Every fact on one building returned by another tool, as the app’s building panel shows it. Beyond what find_buildings gives: addresses (every address of the building, each entrance of a block with the dwellings behind it, and whether its records agree on the number), units (the units and dwellings its record lists, floor by floor, against the totals the record states, the entrances they are reached by and the dwellings the record counts behind each entrance), recordSheet (the identity numbers its record carries, such as the cadastral or property number, a land book number only as filed in the register, unverified and often an old paper land book’s, and every other fact on record, by section as its register lays it out: use, areas, storeys, construction, heating and utilities, energy certificate, accessibility), roofAnalysis (the analysed roof plane by plane: facing, pitch, area, sunshine, panels), the local climate, gas and district-heating evidence, the heating estimate, and the businesses whose registered office is at its address: name, registration number and stated employees.

buildingId uuid required
The id from find_buildings or search_buildings.
includeRegisteredBusinesses boolean
List the businesses registered at the address. Default true.

list_building_units read

List a building’s units

The units a building’s record lists (flats, shops, parking spaces, storage), each with its number, name or door, its floor as the record words it and as a kind and number, its entrance, kind, use, area, rooms and cadastral number where the record states them. Answers “which floor is apartment 275 on?”. listIsComplete is false when a total the record states differs from its list: a unit missing from the list may still exist. A building with no units listed has unknown units, never none.

buildingId uuid required
The id from find_buildings or search_buildings.
unit string
The number or name of one unit to find, e.g. “275”, “12A” or “Parcare 3”. Leave out to list every unit.
limit, offset integer
1 to 500 units a page (default 200); offset skips the units already read.

analyse_roof read

Analyse a building’s roof

Reads one building’s roof from imagery and returns it plane by plane (facing, pitch, area, sunshine, panels) with the panels it can carry, their capacity and yearly yield. A roof already measured comes from the record at no cost. Otherwise a new analysis runs when you ask, with no confirmation step, and costs 1 credit when the roof could be measured. Where no imagery covers the roof, the figures are an estimate and say so.

buildingId uuid required
The id from find_buildings or search_buildings.

search_places read

Find a place

Coordinates and, for areas, a bounding box for a city, district, street or address in Romania or Czechia. Up to six matches, best first. A place in another country returns no match; that country can be requested at baseray.tech/countries.

query string required
The place as a person would write it, e.g. “Cluj-Napoca” or “Brno-střed”.

list_lead_lists read

List lead lists

The workspace’s lead lists, most recently changed first, with how many buildings each holds and a link to it.

nameContains string
Keep lists whose name contains this text.
limit integer
1 to 50. Default 20.

save_buildings_to_lead_list writes

Save buildings to a lead list

Add buildings to an existing lead list or create a new one with them. Saving a building already on the list changes nothing. The assistant is told to save only when you ask.

buildingIds uuid[] required
1 to 100 building ids.
leadListId uuid
An existing list, from list_lead_lists.
newListName string
Or a name for a new list.

What the answers hold

Limits

Each connection can make 60 tool calls a minute and 2,000 a day. Over a limit the tool answers with how long to wait, and the assistant tells you.

Searching is free. Opening a building costs 1 credit the first time your workspace opens it, then it stays free for a year: find_buildings opens the nearest building, open_buildings, get_building, list_building_units and analyse_roof open the buildings you name. A new roof analysis that measures the roof costs 1 more credit. A call that needs more credits than are left is refused whole, with how many it needs, and the assistant tells you. A new baseray account comes with 5 credits, so it opens 5 buildings free with no card; they last 30 days from sign-up.

One search covers at most 3 degrees of latitude and longitude, about the size of a county, and pages up to 500 buildings deep. For whole-country lists, use the REST API or CSV export.