Room MCP gives you programmatic access to the contents of a room . Unlike Agent MCP — which talks to a single deployed agent — Room MCP lets you enumerate a room’s workflows and their feature views , then download the underlying data as Parquet.
This is ideal for pulling Corvic-processed data into your own data stack, notebooks, or downstream pipelines.
Endpoint and credentials
Value MCP URL https://api.corvic.live/mcp/Auth Authorization: Bearer <ACCESS_TOKEN>Room ID The numeric ID of the target room
Never hard-code your access token. Load it from an environment variable or secrets manager, and keep it out of source control.
Tool Description list_data_appsList the workflows in a room (paginated). list_feature_viewsList a workflow’s feature views; each entry includes a Parquet url.
In the API, workflows are identified as data apps (list_data_apps, data_app_id). These map to the Workflows you build on the canvas.
Prerequisites
Install the MCP and HTTP client libraries:
Example
This script connects to Room MCP, lists the workflows in a room, lists a workflow’s feature views, and downloads a feature view’s Parquet payload.
import asyncio
import httpx
from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client
MCP_URL = "https://api.corvic.live/mcp/"
ACCESS_TOKEN = "<YOUR_ACCESS_TOKEN>" # load from env/secrets, do not hard-code
ROOM_ID = "<YOUR_ROOM_ID>"
async def run ():
headers = { "Authorization" : f "Bearer { ACCESS_TOKEN } " }
async with (
httpx.AsyncClient(
headers = headers,
follow_redirects = True ,
) as httpx_client,
streamable_http_client( MCP_URL , http_client = httpx_client) as (read, write, _),
):
async with ClientSession(read, write) as session:
await session.initialize()
# 1. List the workflows (data apps) in this room (paginated).
data_apps = await session.call_tool(
"list_data_apps" ,
arguments = { "room_id" : ROOM_ID , "entries_per_page" : 5 , "cursor" : None },
)
print (data_apps.content[ 0 ].text)
# 2. Pick a data_app_id from the response above, then list its
# feature views. Each entry includes a parquet `url`.
# data_app_id = "<DATA_APP_ID>"
# feature_views = await session.call_tool(
# "list_feature_views",
# arguments={"data_app_id": data_app_id, "entries_per_page": 5, "cursor": None},
# )
# print(feature_views.content[0].text)
# 3. Download a feature view's parquet payload using the same
# Bearer token the MCP server accepts.
# parquet_bytes = (await httpx_client.get(feature_view_url)).content
asyncio.run(run())
How it works
Connect
Open a streamable_http_client to the MCP URL with your Bearer token, then start a ClientSession and call initialize().
List workflows
Call list_data_apps with the room_id (paginate with entries_per_page and cursor).
List feature views
Pick a data_app_id from the result and call list_feature_views. Each feature view includes a Parquet url.
Download the data
Fetch the feature view’s url with the same authenticated HTTP client to get the raw Parquet bytes.
MCP Overview Agent vs. room access and credentials.
Agent MCP Talk to a deployed agent instead.
Workflows Build the pipelines exposed here.
Corvic Tables Understand feature views and tables.