Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
TACIT_API_KEYYesYour Tacit API key
TACIT_API_URLNoAPI base URL (for self-hosted deployments)https://app.betacit.com

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
tacit_list_sites

List all building sites the current API key has access to.

Each site represents a physical location (building, campus, warehouse) managed in Tacit. Sites are the top-level container. You need a site ID to query buildings, equipment, points, zones, and systems.

Returns: Array of sites with id, name, address, city, country, timezone.

Use this tool first to discover available sites before querying building data.

tacit_graphql

Execute a GraphQL query against the Tacit building digital twin API.

Compose any query using the Brick-compliant schema. Supports nested fields, filtering by Brick class, supply chain traversal (upstream/downstream), and recursive location hierarchy.

Use tacit_list_sites first to get a valid site ID, then construct queries freely.

Args:

  • site_id (string, required): The site ID (injected as siteId into your query variables)

  • query (string, required): GraphQL query string

  • variables (string, optional): JSON-encoded variables object (siteId is auto-injected)

Tacit GraphQL Schema - Brick-compliant Building API

Root Queries

All root queries require siteId (get from tacit_list_sites).

building(siteId!, id, name, nameMatch) → [Building] equipment(siteId!, id, name, nameMatch, locationId, locationName, systemId, is, hasProperty, propertyValue) → [Equipment] point(siteId!, id, name, nameMatch, equipmentId, locationId, locationName, zoneId, systemId, is, equipmentIs, hasProperty, propertyValue) → [Point] zone(siteId!, id, name, nameMatch, locationId, is, hasProperty, propertyValue) → [Zone] system(siteId!, name, nameMatch, is, hasProperty, propertyValue) → [System] location(siteId!, locationId!) → Location entityByIfcId(siteId!, ifcId!) → KgEntity (union: Building | Location | Zone | System | Equipment)

Types and Fields

Building { uri, id, name, type, ifcId, properties { name value unit } locations(name, nameMatch, is, recursive) → [Location] zones(name, nameMatch, is, recursive) → [Zone] systems(name, nameMatch, is, recursive) → [System] equipment(name, nameMatch, is, recursive) → [Equipment] points(name, nameMatch, is, recursive) → [Point] }

Equipment { uri, id, name, type, typeHierarchy, ifcId, properties { name value unit } points(name, nameMatch, is) → [Point] # sensors/actuators on this equipment parts(name, nameMatch, is) → [Equipment] # sub-components partOf → Equipment # parent equipment feeds(name, nameMatch, is) → [Equipment] # what this equipment feeds fedBy(name, nameMatch, is) → [Equipment] # what feeds this equipment upstream(maxDepth, medium, is) → [Equipment] # full upstream chain downstream(maxDepth, medium, is) → [Equipment] # full downstream chain location → Location systems → [System] }

Point { uri, id, name, type, typeHierarchy, unit, equipmentId, timeseriesId currentValue { value timestamp quality } # latest live reading (null if no data) properties { name value unit } equipment → Equipment location → Location }

Zone { uri, id, name, type, typeHierarchy, ifcId, properties { name value unit } points(name, nameMatch, is) → [Point] fedBy(name, nameMatch, is) → [Equipment] # equipment feeding this zone upstream(maxDepth, medium, is) → [Equipment] locations → [Location] }

System { uri, id, name, type, ifcId, properties { name value unit } equipment(name, nameMatch, is, recursive) → [Equipment] points(name, nameMatch, is, recursive) → [Point] }

Location { uri, id, name, type, ifcId, properties { name value unit } locations(name, nameMatch, is, recursive) → [Location] # child locations parent → Location equipment(name, nameMatch, is, recursive) → [Equipment] points(name, nameMatch, is, recursive) → [Point] zones → [Zone] }

Enums

NameMatch: CONTAINS | EXACT (default: CONTAINS)

Filter Parameter Guide

  • "is" filters by Brick class: "AHU", "VAV", "FCU", "Temperature_Sensor", "HVAC_Zone", etc.

  • "recursive: true" traverses the full hierarchy (e.g. all equipment in a building, not just direct children)

  • "nameMatch: EXACT" for exact name match, CONTAINS for partial

  • "upstream/downstream" traces the feeds/fedBy supply chain (use maxDepth to limit)

  • "medium" on upstream/downstream filters by medium type (e.g. "HOT_WATER", "CHILLED_WATER", "AIR")

  • "hasProperty" + "propertyValue" filter entities by custom properties

  • "equipmentIs" on points filters by the Brick class of the parent equipment

Example Queries

List AHUs with their sensor points

{ equipment(siteId: "x", is: "AHU") { name type points { name type unit timeseriesId } } }

Trace what feeds a zone

{ zone(siteId: "x", name: "Atrium") { name upstream(maxDepth: 3) { name type } } }

Building floor hierarchy with equipment

{ building(siteId: "x") { name locations(recursive: true) { name type equipment { name type } } } }

Equipment detail with parts and supply chain

{ equipment(siteId: "x", name: "AHU-001") { name type parts { name type } feeds { name type } fedBy { name type } points { name type unit timeseriesId } } }

All temperature sensors with current values

{ point(siteId: "x", is: "Temperature_Sensor") { name unit timeseriesId currentValue { value timestamp } equipment { name type } location { name } } }

Points on VAVs in a specific location

{ point(siteId: "x", locationName: "Tower West", equipmentIs: "VAV") { name type unit timeseriesId equipment { name } } }

Look up an entity by its IFC Global ID

{ entityByIfcId(siteId: "x", ifcId: "3Zu5Bv0LOHrPC6") { ... on Equipment { name type points { name } } ... on Location { name type } } }

tacit_timeseries

Query historical or live sensor data for one or more points.

Points are identified by their timeseriesId (UUID). Use tacit_graphql first to find points and their timeseriesId values.

Args:

  • site_id (string, required): The site ID

  • point_ids (string, required): Comma-separated timeseriesId UUIDs (max 200)

  • start (string, optional): Start time, relative like "-1h", "-24h", "-7d" or ISO 8601. Default: "-1h"

  • end (string, optional): End time, "now()" or ISO 8601. Default: "now()"

  • window (string, optional): Aggregation window like "5m", "1h", "1d". Only with aggregate.

  • aggregate (string, optional): Aggregation function: mean, min, max, sum, count, first, last. Default: "mean"

  • limit (number, optional): Max records per point (1-10000). Default: 1000

Common patterns:

  • Last hour raw: start="-1h" (default)

  • Daily averages for a week: start="-7d", window="1d", aggregate="mean"

  • Last 24h at 15-min intervals: start="-24h", window="15m"

For current/live values, use tacit_graphql with the currentValue { value timestamp quality } field on Point instead of this tool.

Returns: Array of series, each with timeseriesId, name, type, unit, equipment, and data records [{t, v}].

tacit_list_files

List documents and files associated with a site.

Returns metadata for files uploaded to a site: spec sheets, maintenance documents, BIM source files, 3D models, and knowledge graph data.

Useful for answering questions like "What documentation exists for this building?" or "Are there spec sheets for this equipment?"

Args:

  • site_id (string, required): The site ID (from tacit_list_sites)

  • category (string, optional): Filter by file type. One of: kg-csv, model-3d, bim-source, spec-sheet, maintenance, other

  • entity_uri (string, optional): Filter by associated entity URI (from GraphQL entity.uri field)

Returns: List of files with name, category, size, and upload date.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ucl-sbde/tacit-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server