Use the CLAIRE Data Exploration Agent MCP server to give AI agents and applications direct access to the data in Data Governance and Catalog and MDM SaaS. The server can sample, filter, join, and aggregate rows and columns. The server can also preview rows and surface key insights about the data.
It enables AI agents to explore data in these services using natural language, without writing a query or extracting data from a table or dashboard. Use this server directly for requests that only need to explore data or look up a master record.
For example, a customer retention analyst wants to identify customers likely to churn. The CLAIRE Data Exploration Agent MCP server explores the identified order data set and returns the churn rate and a list of at-risk customers directly in the same conversation.
In another scenario, a sales operations analyst wants the full profile of a customer before a renewal call. The analyst prompts the server with "Explore the data of John Doe and provide insights into the record." The server retrieves matching data from MDM SaaS based on the specified business entity. A follow-up question, such as "Provide insights into the loyalty programs that John subscribed." reveals how master records are related.
Key capabilities
Use the MCP server to perform the following tasks:
•Query the raw content of a cataloged data set, including its rows, columns, values, and key insights.
•Look up master records across Customer, Product, and other MDM domains in MDM SaaS.
•Ask contextual follow-up questions in the same conversation, using the shared conversation ID.
•Infer relationships between tables by examining the values they contain, even when column and table names don't reveal the connection.
•Compute a business metric, such as a churn rate, by running the calculation against live data.
Prerequisites
Before you begin, verify the following prerequisites:
•Licenses to access Data Governance and Catalog and MDM SaaS.
•A running Secure Agent with a valid, active connection to the source system. The server needs this connection to fetch live data.
•A valid authentication token generated by a user who has the role-based access control permissions required to view the data. The agent inherits permissions from this user.
•The data exploration privilege for the user.
Server URL
Use the following server URLs to access the CLAIRE Data Exploration Agent MCP server:
Use the following sample prompts with the CLAIRE Data Exploration Agent MCP server:
•Show customer data sets in the Snowflake_Prod connection.
•Profile the ORDERS table and list columns with null values.
•Find duplicate records in the product catalog.
•Show customer churn rate from 2023 to 2024 for top Acme customers.
•Preview the DIM_CUSTOMER table, then filter it to customers in France.
•Show John living in Seattle.
•Show the shipping address for John Smith.
•Show records created between January and March 2024.
•How is John living in California related to Google?
Available tools
The CLAIRE Data Exploration Agent MCP server provides the following tools:
data_explore
Explores the raw content of cataloged data sets in Data Governance and Catalog. Sample, filter, join, and aggregate rows and columns, and returns key insights, such as a churn rate, against live data.
Pass the user request as a complete, unedited prompt so CLAIRE can route and answer it correctly. Requires an active Secure Agent connection.
Parameters:
- artifacts. Names of any files you've already uploaded with request_upload_url that you want this request to use. Exclude the parameter if there's no uploaded file to reference.
- conversation_id. Session identifier that links a follow-up prompt to the results of an earlier prompt. Omit it on your first call. CLAIRE returns a conversation_id to reuse on every later call in the same conversation. If you omit it on a later call, CLAIRE starts a new session and loses prior context.
- deferred. Flag that determines whether the response streams incrementally through get_skill_execution_updates or blocks until it returns the complete response in a single call. Default is true. Set it to false to block the call until the skill finishes, which can time out for long-running requests and prevent results from streaming to you.
- events. Step-by-step execution log of the actions CLAIRE took to answer the prompt, such as which sub-skills it invoked and in what order. Default is true. Set it to false to remove the execution log that get_skill_execution_updates needs to render results correctly.
- external_id. External identifier of the data set that you want to explore, such as the Data Governance and Catalog asset externalId. Required on every call.
- history. Ordered list of prior conversation messages that gives CLAIRE context when you can't pass a conversation_id, such as from a stateless or embedded client that manages its own state. Each entry needs a role value of user, assistant, or system, and a content value with the text of that message. Use conversation_id or history in the same request, not both. conversation_id is the preferred option.
- name. Name of the table, data set, connection, or other catalog object you're asking about. Required on every call.
- prompt. Natural-language instruction that names the data source, the entity, and the action you want, such as "Profile the ORDERS table and list columns with null values." A vague prompt, such as "show data," might lead CLAIRE to ask a clarifying question instead of returning a result.
- reasoning. Internal reasoning CLAIRE used to interpret the prompt, choose an approach, and resolve any ambiguity. Default is true. Set it to false to remove the reasoning trace that get_skill_execution_updates needs to render results correctly.
get_skill_execution_updates
Returns a slice of a live output stream. Everything in items[] is finished, user-facing text that CLAIRE already produced. Render it to the user before calling this tool again. Render every item exactly as it arrives and in order. Never summarize, paraphrase, translate, reorder, omit, restructure, rename, or truncate a frame, and don't collect items across polls to deliver one summary at the end. Don't wait to assemble one complete answer before responding. Render each slice as it arrives. Delivering an accurate answer only at the end is still incorrect, because the user needs the output in real time.
The following table describes how to render each frame type:
Frame type
How to render a frame
REASONING_TRACE
Verbatim, prefixed "CLAIRE reasoning:"
EXECUTION_INSIGHT
Verbatim, prefixed "Step:"
TOKEN
Buffer payload.content between the enclosing STREAM_STATUSSTARTED and COMPLETED. Emit the concatenated text as one block on COMPLETED. Never emit individual fragments. A run might span polls. Keep the buffer across calls.
STREAM_STATUS
Not rendered. Drives the TOKEN flush.
HUMAN_PROBE
Verbatim. Stop polling and wait for the user to reply.
PLAN
Plan text verbatim, then list suggestedPrompts.
ARTIFACT
Render each entry of payload.data[] by viewType, using the viewType table below.
The following table describes how to render each viewType in an ARTIFACT frame type:
View Type
How to render a view
GridView
Markdown table with every column in schema_definitions and every row in items. Use each column label as the header, unchanged. Don't remove columns that look internal, don't shorten cell values, don't split one grid into multiple tables, and don't add columns.
BlockText
The text content only. Strip HTML tags and custom elements such as <infa-grid>. Render any text that they wrap. If a frame is only markup with no text, render nothing for it.
PropertiesView
Key/value list.
TreeView
Indented tree.
GraphView
Source-to-target list.
DataExploreResult
SQL in a code block, then rows.
AnalyticsView
Metric list.
This list isn't exhaustive. For any viewType not listed, render the payload content in the closest matching plain-markdown form, preserving every field and value. Never skip an unknown viewType, and never describe an artifact instead of rendering it.
Skip only frames with text that is exactly the control marker {"type":"END_OF_ANSWER"}, and BlockText frames that contain no text after markup is stripped. Nothing else is skippable.
After invoking a skill with deferred: true that returns status: "IN_PROGRESS", call get_skill_execution_updates in a loop:
1Render every item in items[] based on the rendering rules.
2Wait for pagination.poll_interval_ms milliseconds before calling again. Default is 1000 milliseconds.
3Call again with pagination.cursor passed back verbatim. Keep message_id and conversation_id unchanged.
4Stop polling when status is terminal (SUCCESS | PARTIAL_SUCCESS | FAILED) and pagination.has_more is false.
On the first call, take message_id and conversation_id from context in the initial response, and pass 0 as the cursor. An empty items[] is normal. Keep polling. The response includes a render_note field only when there's output to emit. Don't call other tools between polls unless the user sends a new prompt.
Each call to this tool is a stateless, independent read of the event stream. The stream is resumable. To replay from the beginning after a crash, re-poll with cursor: "0". Because the server owns cursor advancement, always pass back the last pagination.cursor unchanged.
Parameters:
- conversation_id. Session identifier from the original data_explore or master_data_explore response. The server verifies that the message_id you pass belongs to this conversation on every call.
- cursor. Opaque position marker from the pagination.cursor value in the previous response. Pass 0, or omit this parameter, on your first call, then pass back the cursor value from the previous response on each later call. Default is 0. To replay the stream from the beginning, such as after a client crash or when a second client reads the same execution independently, you can pass 0 again at any time.
- events. Flag that includes the step-by-step execution log in each slice of results. Default is true. Set it to false to remove the execution log from the results, so the rendering described for EXECUTION_INSIGHT frames above never happens.
- message_id. Identifier for the specific prompt for which you're retrieving results. Use the message_id value that CLAIRE returned in the initial response.
- reasoning. Flag that includes the CLAIRE reasoning trace in each slice of results. Default is true. Set it to false to remove the reasoning trace from the results, so the rendering described for REASONING_TRACE frames above never happens.
master_data_explore
Looks up master records across Customer, Product, and other MDM domains in MDM SaaS. Use it for resolved entity lookups, merged record views, duplicate detection, match and merge rules, and relationships between entities.
Pass the user request as a complete, unedited prompt so CLAIRE can route and answer it correctly.
Parameters:
- artifacts. Names of any files you've already uploaded with request_upload_url that you want this request to use. Leave this parameter out if there's no uploaded file to reference.
- conversation_id. Session identifier that links a follow-up prompt to the results of an earlier prompt. Omit it on your first call. CLAIRE returns a conversation_id for you to reuse on every later call in the same conversation. If you omit it on a later call, CLAIRE starts a new session and loses prior context.
- deferred. Flag that determines whether the response streams incrementally through get_skill_execution_updates or blocks until it returns the complete response in a single call. Default is true. Set it to false to block the call until the skill finishes, which can time out for long-running requests and prevent results from streaming to you.
- events. Step-by-step execution log of the actions CLAIRE took to answer the prompt, such as which sub-skills it invoked and in what order. Default is true. Set it to false to remove the execution log that get_skill_execution_updates needs to render results correctly.
- external_id. Internal ID of the business entity associated with the record that you want to explore. Required on every call.
- history. Ordered list of prior conversation messages that gives CLAIRE context when you can't pass a conversation_id, such as from a stateless or embedded client that manages its own state. Each entry needs a role value of user, assistant, or system, and a content value with the text of that message. Use conversation_id or history in the same request, not both. conversation_id is the preferred option.
- name. Name of the business entity, such as Person or Organization. Required on every call.
- prompt. Natural-language instruction that names the business entity and the action you want. For example, "Show John living in Seattle" or "How is John living in California related to Google?"
- reasoning. Internal reasoning CLAIRE used to interpret the prompt, choose an approach, and resolve any ambiguity. Default is true. Set it to false to remove the reasoning trace that get_skill_execution_updates needs to render results correctly.
request_upload_url
Returns a short-lived, single-use PUT URL to upload a file into a CLAIRE conversation. Call this first, then upload the file with the returned curl command.
If conversation_id is omitted, a new conversation is created. The URL expires in 5 minutes and can be used only once. On HTTP 401 from the PUT, call this tool again to create a fresh URL and retry.
Parameters:
- content_type. MIME type of the file you're uploading, such as text/csv, application/pdf, or application/json. Set the Content-Type header of your upload request to the same value. A mismatched value causes the upload to fail with an HTTP 415 error.
- conversation_id. Existing CLAIRE conversation to attach the uploaded file to. Omit this parameter to create a new conversation. CLAIRE names a new conversation after display_name, or after filename if you omit display_name, and returns the new conversation ID in the response.
- description. Short, one-to-two-sentence description of what the file contains and why you're uploading it. CLAIRE surfaces this description in the artifact metadata for the file and in the conversation history.
- display_name. Friendly name for the file that CLAIRE displays in the conversation list. CLAIRE also uses this name for a new conversation it creates for this upload. If you omit this parameter, CLAIRE uses the filename instead.
- filename. Name of the file you're uploading, including its extension, such as sales_q3.csv. CLAIRE needs the extension to identify the file type.
- size_bytes. Exact size of the file, in bytes. The value must not exceed the server upload limit of 104,857,600 bytes, or 100 MB.
Sample request and response schemas
The following schemas show how you can define a request for each tool on the CLAIRE Data Exploration Agent MCP server and the response it returns:
data_explore
Request schema:
{ "id": "<unique_request_id>", "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "data_explore", "arguments": { "name": "DIM_CUSTOMER", "external_id": "f4e4a973-ef74-3eac-8e16-c64c0dc2dd42://DF_DEMO/SALES/DIM_CUSTOMER~com.infa.odin.models.relational.Table", "prompt": "Show how many customers are active and how many of them made a purchase in the last month", "events": true, "reasoning": true, "deferred": true } } }
The call returns immediately with status: "IN_PROGRESS" and an empty items array. Take message_id and conversation_id from context and call get_skill_execution_updates to retrieve the actual answer.
get_skill_execution_updates
Request schema:
{ "id": "<unique_request_id>", "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "get_skill_execution_updates", "arguments": { "conversation_id": "<conversation_id from the previous response>", "message_id": "<message_id from the previous response>", "cursor": "0", "events": true, "reasoning": true } } }
Response schema:
{ "status": "SUCCESS", "context": { "message_id": "<message_id from the request>", "conversation_id": "<conversation_id from the request>" }, "items": [ { "responseType": "EXECUTION_INSIGHT", "payload": { "text": "Generating Results..." } }, { "responseType": "REASONING_TRACE", "payload": { "thought": "<CLAIRE's interpretation of the prompt>" } }, { "responseType": "STREAM_STATUS", "payload": { "status": "STARTED" } }, { "responseType": "TOKEN", "payload": { "content": "Out of 1,000 total active customers, 201 made a purchase in the last month.", "index": 1 } }, { "responseType": "STREAM_STATUS", "payload": { "status": "COMPLETED", "usage": { "total_tokens": 16 } } }, { "responseType": "ARTIFACT", "payload": { "summary": "Preview generated from Arrow stream. Rows: 1", "data": [{ "viewType": "DataExploreResult", "title": "Result Set", "schema_definitions": [ { "fieldName": "total_active_customers", "label": "total_active_customers", "dataType": "STRING" }, { "fieldName": "customers_purchased_last_month", "label": "customers_purchased_last_month", "dataType": "STRING" } ], "items": [[ { "value": "1000" }, { "value": "201" } ]] }] } }, { "responseType": "ARTIFACT", "payload": { "data": [{ "viewType": "BlockText", "text": "{\"type\":\"END_OF_ANSWER\"}" }] } } ], "pagination": { "cursor": "<opaque cursor value, pass back verbatim on the next call>", "has_more": false, "poll_interval_ms": 1000, "polling_tool": "get_skill_execution_updates" } }
This example shows a completed run. While the skill is still working, status is IN_PROGRESS, pagination.has_more is true, and items might be empty or contain only EXECUTION_INSIGHT and REASONING_TRACE frames. Render each item based on the rendering rules. Then poll again with the returned cursor until status is terminal and has_more is false.
master_data_explore
Request schema:
{ "id": "<unique_request_id>", "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "master_data_explore", "arguments": { "name": "Person", "external_id": "c360.person", "prompt": "Explore the record of Abran Adrian Gladyer", "events": true, "reasoning": true, "deferred": true } } }
Like data_explore, the call returns immediately with status: "IN_PROGRESS". Poll get_skill_execution_updates with the returned message_id and conversation_id for the resolved master record or relationship data.
{ "conversation_id": "<new or existing conversation ID>", "upload_url": "<short-lived, single-use PUT URL>", "expires_in_seconds": 300, "curl_command": "curl -X PUT -H \"Content-Type: text/csv\" --upload-file customers.csv \"<upload_url>\"" }
Use the returned upload_url and curl_command to upload the file within 5 minutes. Reference the uploaded file in a later data_explore or master_data_explore call through the artifacts parameter.