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
- In Claude (web or desktop), open Settings → Connectors and choose Add custom connector.
- Name it baseray, paste the server URL and choose Connect.
- Sign in to baseray and approve the access.
ChatGPT
- In ChatGPT, turn on developer mode under Settings → Apps → Advanced settings.
- Create an app, name it baseray and paste the server URL. Authentication is OAuth.
- Sign in to baseray and approve the access.
Claude Code
claude mcp add --transport http baseray https://api.baseray.ai/mcp - Run the command, then type
/mcpin Claude Code and choose baseray to sign in.
Cursor
{
"mcpServers": {
"baseray": {
"url": "https://api.baseray.ai/mcp"
}
}
} - Add the server to
~/.cursor/mcp.json(or.cursor/mcp.jsonin a project). Cursor asks you to sign in to baseray.
VS Code
{
"servers": {
"baseray": {
"type": "http",
"url": "https://api.baseray.ai/mcp"
}
}
} - Add the server to
.vscode/mcp.jsonand 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.
-
addressstring - A street address with the town, e.g. “Bulevardul Eroilor 10, Brașov”.
-
latitude, longitudenumber - A point, WGS84, instead of an address.
-
companyRegistrationNumberstring - A Romanian CUI or a Czech IČO, with
country(ROorCZ): the building the business is registered at. -
radiusMetersinteger - How far to look, 5 to 200 m. Default 40.
-
limitinteger - 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.
-
placestring - The area as a place name: a county, city, town or district, e.g. “Ilfov”, “Praha 5”.
-
boundingBoxobject - The area as
west,south,east,north, instead of a place. -
nearobject latitude,longitudeandradiusMeters(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.-
categoriesstring[] - Keep only these categories:
residential_house,apartment_block,commercial,industrial,agricultural,public,ancillary. -
buildingTypesstring[] - Granular types, combined with categories by OR, e.g.
office,warehouse,school,apartments,garage. -
minFootprintAreaSquareMeters, minHeightMeters, minFloors, minDwellingsnumber - Minimum size. Floors and dwellings filter where they are on record.
-
minVolumeCubicMeters, maxVolumeCubicMetersnumber - Volume bounds, where the volume is known.
-
onlyMeasuredVolumesboolean - 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, maxYearBuiltinteger - Completed in or after
minYearBuilt, and standing bymaxYearBuilt, as a national building register dates the building (a register that dates it by a census period counts formaxYearBuiltonly). A building with no year on record never matches, so an empty result says nothing about age. -
onlyWallPanelConstructionboolean - Keep buildings a national building register states are built of prefabricated concrete wall panels. Today only Czechia’s register states it.
-
hasRegisteredBusiness, minRegisteredBusinesses, registeredBusinessNameContains, minRegisteredBusinessEmployeesmixed - Filter on the businesses registered at the address.
-
minRegisteredBusinessTurnover, maxRegisteredBusinessTurnover, turnoverCurrencymixed - Latest turnover on record of a registered business, in
RONorCZK(turnoverCurrencyis required with either bound). A business with no turnover on record never matches a minimum. -
floodZonesstring[] 5_year,10_year,20_year,100_year,100_year_climate_change,500_yearor1000_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.-
seismicRiskClassesstring[] RsI(the highest risk) toRsIV, the older urgency classesU1toU3, orconsolidated, 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.-
existingSolarPanelsstring[] detected,none_seenorunclear, from dated roof photos. Roofs never checked are left out.-
minSolarCapacityKwpnumber - Minimum rooftop solar capacity in kWp.
-
sortBystring volume(default),footprint_area,height,business_employeesorbusiness_turnover(inturnoverCurrency), largest first.-
limit, offsetinteger - 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.
-
buildingIdsuuid[] required - 1 to 25 building ids from
search_buildingsorfind_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.
-
buildingIduuid required - The id from
find_buildingsorsearch_buildings. -
includeRegisteredBusinessesboolean - 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.
-
buildingIduuid required - The id from
find_buildingsorsearch_buildings. -
unitstring - The number or name of one unit to find, e.g. “275”, “12A” or “Parcare 3”. Leave out to list every unit.
-
limit, offsetinteger - 1 to 500 units a page (default 200);
offsetskips 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.
-
buildingIduuid required - The id from
find_buildingsorsearch_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.
-
querystring 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.
-
nameContainsstring - Keep lists whose name contains this text.
-
limitinteger - 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.
-
buildingIdsuuid[] required - 1 to 100 building ids.
-
leadListIduuid - An existing list, from
list_lead_lists. -
newListNamestring - Or a name for a new list.
What the answers hold
- Every building comes with a link that opens it in the baseray app.
- A building your workspace has not opened comes as a preview, marked
locked: sizes are ranges, and the house number, postcode, business names and register facts are withheld until you open it. - Unknown facts are
null, never zero. Each figure says what it rests on in abasisfield:measured(the building itself was measured),stated(an official record states it) orestimated(modelled); a floor area also gives itsscope, such as the gross area of the whole building. The assistant is told to present estimates as estimates. - Hazards say only what an official map or list states: a building outside every mapped zone or on no list is unknown, never safe.
- A business registered at an address is shown as a registered office, never as the owner or occupant of the building.
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.