Skip to main content

FactVerse MCP — Physical AI Tools for Any AI Agent

Expose FactVerse's physical world tools to any AI Agent via the Model Context Protocol (MCP).


What is MCP?

Model Context Protocol is an open standard that allows AI applications (such as Claude Desktop, Cursor, self-built Agents) to securely call external tools and data sources.

FactVerse splits its platform tools by the base / module taxonomy into peer governed slices. Each slice is its own endpoint, authenticated by a per-customer API key that resolves to a tenant + scopes:

SlicePurposeExample tools
baseGeneral reads + generic compute + cross-cutting actionsEquipment status, knowledge query, simulation, optimization, forecasting, create work order
trafficops (module)People/vehicle flow operationsTraffic forecast, checkpoint lanes, patrol scheduling, surge detection
pdm (module)Predictive maintenanceEquipment health, predictive maintenance summary/anomalies, filter intelligence
telcoops (module)Telco network operationsNetwork health, incident explanation, capacity forecast
semiops (module)Semiconductor / cleanroom / fab / SMTCleanroom status, particle/pressure, HEPA filter life, ISO 14644 compliance, fab PUE, SMT OEE

Additional customer-specific slices can be enabled separately when the deployment contract includes them.


Quick Integration

Examples below use the base slice (general reads + generic compute). To use a module, swap base in the URL for trafficops / pdm / telcoops / semiops and use a key that holds the matching scope.

Claude Desktop

Add to claude_desktop_config.json:

{
"mcpServers": {
"factverse-base": {
"url": "https://your-factverse-server/mcp/base/",
"headers": {
"X-API-Key": "fvk_your_scoped_key"
}
}
}
}

Cursor IDE

In .cursor/mcp.json:

{
"mcpServers": {
"factverse-base": {
"url": "https://your-factverse-server/mcp/base/",
"headers": {
"X-API-Key": "fvk_your_scoped_key"
}
}
}
}

Python Client

from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client

async def main():
async with streamablehttp_client(
"https://your-factverse-server/mcp/base/",
headers={"X-API-Key": "fvk_your_scoped_key"}
) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()

# List the tools this key can see
tools = await session.list_tools()
for tool in tools.tools:
print(f"{tool.name}: {tool.description[:60]}...")

# Call tool: query equipment status (base.read)
result = await session.call_tool(
"get_equipment_status",
{"equipment_id": "EQ-001"}
)
print(result)

# Run simulation (base.compute.run)
result = await session.call_tool(
"run_simulation",
{
"scene_type": "trafficops",
"scene_id": "rts-main-hall",
"simulation_time": 480
}
)
print(result)

Tool Categories (by slice)

base — general reads · scope base.read

Tool NameDescription
get_equipment_statusGet real-time equipment status and sensor readings
query_knowledgeQuery knowledge graph (equipment/faults/relationships)
search_documentsDocument search
get_equipment_documentsEquipment-related documents
list_connectorsData connector list
check_data_qualityData quality check
get_pending_tasksGet pending approval tasks (read-only)

base — generic compute (simulation/optimization/forecasting/analysis/spatial) · scope base.compute.run

Tool NameDescription
run_simulationRun DES simulation (traffic/HVAC/equipment)
run_doeRun design of experiments (identify key factors)
run_dag_simulationDAG checkpoint simulation + Sankey analysis
run_what_if_comparisonA/B scenario What-If comparison
run_optimizationNSGA-II multi-objective optimization
optimize_layoutFacility spatial layout optimization
get_optimization_recommendationOptimal personnel allocation under budget constraints

base — execution (write) · scope base.action.write (not granted by default)

Tool NameDescription
create_work_orderCreate work order from AI recommendation

pdm — predictive maintenance · scope pdm.read

Tool NameDescription
get_equipment_healthEquipment health score
get_pdm_summarypredictive maintenance overview
list_pdm_anomaliespredictive maintenance anomaly list

semiops — semiconductor / cleanroom / fab / SMT · scope semiops.read

Tool NameDescription
get_cleanroom_statusCleanroom environment status
get_particle_trendParticle trend
get_pressure_gradientPressure gradient
get_fab_pueFactory PUE value
get_filter_lifeHEPA filter lifespan
get_iso_complianceISO 14644 compliance status
get_smt_oeeSMT line OEE
get_utility_statusUtility (CDA/N2/water/power) status
analyze_env_correlationEnvironmental parameter correlation analysis
monitor_particlesReal-time particle monitoring
predict_env_trendEnvironment trend prediction
simulate_smt_bottleneckSMT line bottleneck simulation
forecast_fab_loadFab load forecast
optimize_chiller_copChiller COP optimization

trafficops / telcoops tool sets are visible via each slice's tools/list.


Authentication & authorization (key → tenant + scopes)

Every /mcp/<slice> is a governed endpoint: each request is authenticated with a per-customer API key that the server resolves to a tenant and a set of permission scopes — the client never passes a tenant and cannot use a shared key.

  • Header: X-API-Key: fvk_… (not Authorization: Bearer)
  • Keys are issued per tenant by an administrator (stored hashed, shown once); not self-minted.
  • No key → 403 at the gateway; invalid/revoked key → 401.

Scopes (which tools a key may call)

scopeslicetools
base.readbasegeneral reads (equipment status, knowledge query, documents, connectors, data quality, pending tasks)
base.compute.runbasegeneric compute (simulation, optimization, forecasting, analysis, spatial — tenant-agnostic)
base.action.writebaseexecution tools (create work orders, etc.; not granted by default)
trafficops.readtrafficopsTrafficOps module tools (traffic forecast, checkpoint lanes, patrol scheduling, etc.)
pdm.readpdmpredictive maintenance module tools (equipment health, predictive maintenance summary/anomalies, filter intelligence, etc.)
telcoops.readtelcoopsTelcoOps module tools (network health, incident explanation, capacity forecast)
semiops.readsemiopssemiconductor/cleanroom tools (cleanroom, particle/pressure, HEPA filter, ISO 14644, fab PUE, utilities, SMT OEE/defect classification)

Modules are isolated: a trafficops key cannot call pdm/telcoops/semiops tools, nor base tools. Grant a single key multiple scopes when cross-slice access is needed.

A tools/call for a tool whose scope the key lacks is refused fail-closed with missing required scope '…'. A key may hold multiple scopes.


Use Cases

1. Claude Directly Controls Facility

User: "How has chiller #7 been running lately? What if we reduce frequency to 42Hz?"

Claude calls:
→ get_equipment_status(equipment_id="CHILLER-007") # base.read
→ run_simulation(scene_type="fms", config_overrides={"frequency": 42}) # base.compute.run
→ Synthesizes analysis and responds

2. Self-Built Agent Automates Operations

# Check equipment health hourly (pdm.read); auto-open a work order on low scores (base.action.write)
health = await pdm_session.call_tool("get_equipment_health", {"equipment_name": "critical pump"})

for equipment in health.data["equipment"]:
if equipment["health_score"] < 60:
await base_session.call_tool("create_work_order", {
"equipment_id": equipment["id"],
"priority": "HIGH",
"title": "Review low health score",
"description": f"AI detected health score below 60: {equipment['health_score']}"
})

3. Query Production Data in Cursor

In Cursor IDE, connect the semiops slice and ask: "How's the particle trend in cleanroom CR-001?" → Cursor calls get_particle_trend via MCP.


Public deployment requirements

FactVerse MCP is exposed as governed HTTPS endpoints such as /mcp/base/, /mcp/trafficops/, /mcp/pdm/, /mcp/telcoops/, and /mcp/semiops/. The exact endpoint set depends on the modules enabled for the customer environment.

Production clients should use HTTPS, send X-API-Key on every request, and discover available tools at runtime through MCP. The trailing slash form /mcp/<slice>/ is the canonical endpoint shape.

The client should not pass tenant identifiers. The platform resolves tenant and scope from the issued key and refuses calls that require scopes the key does not hold.