Getting Started with Informatica MCP Servers > Shared MCP servers > CLAIRE Data Exploration Agent MCP server
  

CLAIRE Data Exploration Agent MCP server

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:

Prerequisites

Before you begin, verify the following prerequisites:

Server URL

Use the following server URLs to access the CLAIRE Data Exploration Agent MCP server:

Example prompts

Use the following sample prompts with the CLAIRE Data Exploration Agent MCP server:

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:
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_STATUS STARTED 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:
  1. 1Render every item in items[] based on the rendering rules.
  2. 2Wait for pagination.poll_interval_ms milliseconds before calling again. Default is 1000 milliseconds.
  3. 3Call again with pagination.cursor passed back verbatim. Keep message_id and conversation_id unchanged.
  4. 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:
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:
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:

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
}
}
}
Response schema:
{
"status": "IN_PROGRESS",
"context": {
"message_id": "<unique message ID for this prompt>",
"conversation_id": "<unique conversation ID>",
"skill": "data_explore"
},
"items": [],
"pagination": {
"cursor": "0",
"has_more": true,
"poll_interval_ms": 1000,
"polling_tool": "get_skill_execution_updates"
}
}
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
}
}
}
Response schema:
Response 1:
{
"status": "IN_PROGRESS",
"context": {
"message_id": "<unique message ID for this prompt>",
"conversation_id": "<unique conversation ID>",
"skill": "master_data_explore"
},
"items": [],
"pagination": {
"cursor": "0",
"has_more": true,
"poll_interval_ms": 1000,
"polling_tool": "get_skill_execution_updates"
}
}
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.
request_upload_url
Request schema:
{
"id": "<unique_request_id>",
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "request_upload_url",
"arguments": {
"filename": "customers.csv",
"size_bytes": 204800,
"content_type": "text/csv",
"display_name": "Customer list",
"description": "List of customers to profile"
}
}
}
Response schema:
{
"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.