gx-mcp-server
Supports Bearer token authentication using JWTs from Auth0.
Supports Bearer token authentication using JWTs from Okta.
Enables distributed tracing via OpenTelemetry exporter.
Exposes Prometheus metrics for monitoring the server.
Allows loading tables from Snowflake as datasets for validation.
Provides SQLite-based storage for datasets and validation results.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@gx-mcp-serverLoad CSV file 'data.csv' and verify column 'age' is not null"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Great Expectations MCP Server
Expose Great Expectations data-quality checks as MCP tools for LLM agents.
Table of Contents
Related MCP server: MCP Task Assistant
Motivation
Large Language Model (LLM) agents often need to interact with and validate data. Great Expectations is a powerful open-source tool for data quality, but it's not natively accessible to LLM agents. This server bridges that gap by exposing core Great Expectations functionality through the Model Context Protocol (MCP), allowing agents to:
Programmatically load datasets from various sources.
Define data quality rules (Expectations) on the fly.
Run validation checks and interpret the results.
Integrate robust data quality checks into their automated workflows.
Quick Start
Docker (Recommended):
# Run in default stdio mode
docker run --rm -i davidf9999/gx-mcp-server:latest
# Run in http mode
docker run -d -p 8000:8000 --name gx-mcp-server -e MCP_MODE=http davidf9999/gx-mcp-server:latest
claude mcp add gx-mcp-server --transport http http://localhost:8000/mcp/
claude "Load CSV data id,age
1,25
2,19
3,45 and validate ages 21-65, show failed records"Local Development:
git clone https://github.com/davidf9999/gx-mcp-server && cd gx-mcp-server
just install
claude mcp add gx-mcp-server-local -- uv run python -m gx_mcp_serverInstallation & Usage
Features
Load CSV data from file, URL, or inline (up to 1 GB, configurable)
Load tables from Snowflake or BigQuery using URI prefixes
Define and modify ExpectationSuites (profiler flag is deprecated)
Validate data and fetch detailed results (sync or async)
Choose in-memory (default) or SQLite storage for datasets & results
Optional Basic or Bearer token authentication for HTTP clients
Configure HTTP rate limiting per minute
Restrict origins with
--allowed-originsPrometheus metrics on
--metrics-portOpenTelemetry tracing via
--trace(OTLP exporter)Multiple transport modes: STDIO, HTTP, Inspector (GUI)
Development Setup:
just install # Install dependencies
just serve # Run HTTP server
just run-examples # Try examples
just test # Run tests
just ci # Lint and type-checkServer Modes:
uv run python -m gx_mcp_server # STDIO (for AI clients)
uv run python -m gx_mcp_server --http # HTTP (for web clients)
uv run python -m gx_mcp_server --inspect # Inspector GUIWith Authentication:
uv run python -m gx_mcp_server --http --basic-auth user:pass
uv run python -m gx_mcp_server --http --rate-limit 30MCP Client Configuration
Configure any MCP-compatible client (Claude Desktop, Claude CLI, custom applications) to connect to the server.
Claude CLI Setup
Local Development (STDIO):
claude mcp add gx-mcp-server-local -- uv run python -m gx_mcp_serverClaude CLI with Docker (stdio)
claude mcp add gx-stdio \
-- docker run --rm -i \
-e MCP_MODE=stdio \
-e PYTHONUNBUFFERED=1 \
gx-mcp-servercline with Docker (stdio)
{
"mcpServers": {
"gx": {
"command": "docker",
"args": [
"run","--rm","-i",
"--network","none", // optional isolation
"-e","MCP_MODE=stdio", // your new switch
"-e","PYTHONUNBUFFERED=1", // avoid buffering
"davidf9999/gx-mcp-server:latest"
],
"alwaysAllow": ["*"],
"timeout": 60
}
}
}Docker without Authentication:
```bash
docker run -d -p 8000:8000 --name gx-mcp-server davidf9999/gx-mcp-server:latest
claude mcp add gx-mcp-server --transport http http://localhost:8000/mcp/Docker with Basic Authentication:
docker run -d -p 8000:8000 --name gx-mcp-server \
-e MCP_SERVER_USER=myuser -e MCP_SERVER_PASSWORD=mypass \
davidf9999/gx-mcp-server:latest
claude mcp add gx-mcp-server --transport http \
--header "Authorization: Basic $(echo -n 'myuser:mypass' | base64)" \
http://localhost:8000/mcp/Remote Server with JWT:
claude mcp add gx-mcp-server-remote --transport http \
--header "Authorization: Bearer YOUR_JWT_TOKEN" \
https://your-server.com:8000/mcp/Manual Configuration
For custom MCP clients, add to your config file:
STDIO Mode:
{
"mcpServers": {
"gx-mcp-server": {
"type": "stdio",
"command": "uv",
"args": ["run", "python", "-m", "gx_mcp_server"]
}
}
}HTTP Mode with Authentication:
{
"mcpServers": {
"gx-mcp-server": {
"type": "http",
"url": "https://your-server.com:8000/mcp/",
"headers": {
"Authorization": "Basic dXNlcjpwYXNz"
}
}
}
}Testing & Management
Test the Server:
claude "Load CSV data id,age\n1,25\n2,19\n3,45 and validate ages 21-65, show failed records"Manage Multiple Servers:
claude mcp add gx-local -- uv run python -m gx_mcp_server
claude mcp add gx-docker --transport http http://localhost:8000/mcp/
claude mcp list
claude mcp remove gx-localTroubleshooting
Connection Issues:
# Check server health (HTTP mode)
curl http://localhost:8000/mcp/health
# Check MCP server status
claude mcp list
# Test with verbose logging
claude mcp add gx-debug -- uv run python -m gx_mcp_server --log-level DEBUGCommon Issues:
"Failed to connect": Ensure server is running and port is accessible
"Authentication failed": Verify credentials and auth headers are correct
"401 Unauthorized": Check if server requires authentication but none provided
"403 Forbidden": Authentication succeeded but insufficient permissions
"File not found": For local files, ensure paths are correct relative to server working directory
"Permission denied": Check file permissions for mounted volumes in Docker
Authentication Debugging:
# Test server health (no auth required)
curl http://localhost:8000/mcp/health
# Test with basic auth
curl -H "Authorization: Basic $(echo -n 'user:pass' | base64)" \
http://localhost:8000/mcp/health
# Test with bearer token
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
http://localhost:8000/mcp/healthAuthentication
By default, the server runs without any authentication enabled. For production or secure environments, you should enable one of the supported methods below.
The server supports two authentication methods for the HTTP and Inspector modes: Basic and Bearer.
Basic Authentication
Use a simple username and password to protect the server. You can provide credentials via command-line arguments or environment variables.
Command-line argument:
uv run python -m gx_mcp_server --http --basic-auth myuser:mypasswordEnvironment variables:
export MCP_SERVER_USER=myuser
export MCP_SERVER_PASSWORD=mypassword
uv run python -m gx_mcp_server --httpBearer Authentication
For more secure, token-based authentication, you can use bearer tokens (JWTs). This is the recommended approach for production environments.
How it Works: The gx-mcp-server acts as a resource server and validates JWTs. It does not issue them. Your AI agent (the client) must first obtain a JWT from a dedicated Identity Provider (like Auth0, Okta, or a custom auth service).
Configuration:
# Example using a public key file
uv run python -m gx_mcp_server --http \
--bearer-public-key-file /path/to/public_key.pem \
--bearer-issuer https://my-auth-provider.com/ \
--bearer-audience https://my-api.com
# Example using a JWKS URL
uv run python -m gx_mcp_server --http \
--bearer-jwks https://my-auth-provider.com/.well-known/jwks.json \
--bearer-issuer https://my-auth-provider.com/ \
--bearer-audience https://my-api.com--bearer-public-key-file: Path to the RSA public key for verifying the JWT signature.--bearer-jwks: URL of the JSON Web Key Set (JWKS) to fetch the public key.--bearer-issuer: The expected issuer (iss) claim in the JWT.--bearer-audience: The expected audience (aud) claim in the JWT.
Legacy Environment Variables (for custom clients): Some clients may expect these environment variables:
export MCP_SERVER_URL=http://localhost:8000/mcp/
export MCP_AUTH_TOKEN="myuser:mypassword" # For basic auth
export MCP_AUTH_TOKEN="YOUR_JWT_TOKEN" # For bearer authConfiguration
CSV File Size Limit
Default: 50 MB. Override via environment variable:
export MCP_CSV_SIZE_LIMIT_MB=200 # 1–1024 MB allowedWarehouse Connectors
Install extras:
uv pip install -e .[snowflake]
uv pip install -e .[bigquery]Use URI prefixes:
load_dataset("snowflake://user:pass@account/db/schema/table?warehouse=WH")
load_dataset("bigquery://project/dataset/table")load_dataset automatically detects these prefixes and delegates to the appropriate connector.
Metrics and Tracing
Prometheus metrics:
http://localhost:9090/metricsOpenTelemetry:
uv run python -m gx_mcp_server --http --trace
Docker
Using Pre-built Images (Recommended)
The easiest way to run gx-mcp-server is using the official Docker image. By default, the container runs in stdio mode. You can switch to http mode by setting the MCP_MODE environment variable to http.
# Run latest stable version in stdio mode
docker run --rm -i davidf9999/gx-mcp-server:latest
# Run latest stable version in http mode
docker run -d -p 8000:8000 --name gx-mcp-server -e MCP_MODE=http davidf9999/gx-mcp-server:latest
# Run with authentication
docker run -d -p 8000:8000 --name gx-mcp-server \
-e MCP_MODE=http \
-e MCP_SERVER_USER=myuser \
-e MCP_SERVER_PASSWORD=mypass \
davidf9999/gx-mcp-server:latest
# Run with file access (for loading local CSV files)
docker run -d -p 8000:8000 --name gx-mcp-server \
-e MCP_MODE=http \
-v "$(pwd)/data:/app/data" \
davidf9999/gx-mcp-server:latestBuilding Local Images
Build and run the server from source:
# Build the production image
just docker-build
# Run the server
just docker-runThe server will be available at http://localhost:8000.
For development, you can build a development image that includes test dependencies and run tests or examples:
# Build the development image
just docker-build-dev
# Run tests
just docker-test
# Run examples (requires OPENAI_API_KEY in .env file)
just docker-run-examplesDevelopment
just install
cp .env.example .env # optional: add your OpenAI API key
just run-examplesTelemetry
Great Expectations sends anonymous usage data by default. Disable:
export GX_ANALYTICS_ENABLED=falseCurrent Limitations
Stores last 100 datasets/results only
In-process asyncio concurrency (no external queue)
API may evolve as project stabilizes
Security
Run behind a reverse proxy (Nginx, Caddy, cloud LB) in production
Supply
--ssl-certfile/--ssl-keyfileonly if the proxy cannot terminate TLSAnonymous sessions use UUIDv4; persistent apps should use
secrets.token_urlsafe(32)
Project Roadmap
See ROADMAP-v2.md for upcoming sprints.
License & Contributing
MIT License – see CONTRIBUTING.md for how to help!
Author
David Front – dfront@gmail.com | GitHub: davidf9999
Available Tools
7 toolsadd_expectationA
Add a single expectation to an existing suite (or create it).
| Name | Required | Description | Default |
|---|---|---|---|
| kwargs | Yes | Parameters for the expectation (e.g., {"column": "status", "value_set": ["active", "inactive"]}) | |
| suite_name | Yes | Name of the expectation suite | |
| expectation_type | Yes | Type of expectation (e.g., "expect_column_values_to_be_in_set") |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It reveals that the tool may create a suite, but does not disclose whether expectations are appended or overwritten, how errors are handled, or any side effects. This leaves significant ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no wasted words. It front-loads the primary action and includes the key behavioral nuance about creating the suite.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, rich schema, and presence of an output schema, the description addresses the core purpose and the create-if-missing behavior. It is slightly thin on edge cases but sufficient for a tool of this simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers all three parameters with descriptions and an example for kwargs. The tool description adds no additional parameter detail, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'add' and the resource 'expectation to a suite', and even clarifies the behavior when the suite doesn't exist ('or create it'). This distinguishes it from siblings like create_suite, which would only create the suite.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used to add an expectation and optionally create the suite, but does not explicitly contrast with alternatives or provide when/when-not guidance. The context is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_suiteA
Create a named ExpectationSuite, optionally profiled from a dataset.
| Name | Required | Description | Default |
|---|---|---|---|
| profiler | No | Whether to auto-generate expectations via profiling (deprecated) | |
| suite_name | Yes | Name for the new expectation suite | |
| dataset_handle | Yes | Handle to dataset (currently unused, for future profiling) |
Output Schema
| Name | Required | Description |
|---|---|---|
| suite_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does not disclose side effects, error behavior, idempotency, or what happens if the suite already exists. The only transparency is the schema's note that dataset_handle is unused, but the description itself offers little beyond the basic create action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single clear, front-loaded sentence conveys the core purpose without wasted words. It is appropriately sized for a simple create operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, all parameters are fully described in the schema, and an output schema exists. The description is sufficient for basic usage, though it could mention behavioral outcomes or prerequisites for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds 'optionally profiled from a dataset,' but this is already reflected in the profiler parameter. It does not clarify the deprecation or the unused nature of dataset_handle beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb ('Create') and resource ('named ExpectationSuite'), clearly distinguishing from siblings like add_expectation. It also mentions optional profiling, which adds useful scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for creating a new suite, optionally with profiling, but offers no explicit guidance on when to use it versus alternatives like add_expectation or run_checkpoint. There is no exclusion or alternative tool mention.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_validation_resultA
Fetch detailed validation results for a prior validation run.
| Name | Required | Description | Default |
|---|---|---|---|
| validation_id | Yes | ID returned from run_checkpoint() |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| results | Yes | |
| success | Yes | |
| statistics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It correctly implies a read-only operation ('fetch'), but does not disclose potential edge cases such as behavior for invalid/missing validation_id, data freshness, or whether the tool has side effects. For a simple retrieval tool this is minimally adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that conveys the essential purpose with no filler. Every word contributes meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one parameter, one clearly defined action) and an output schema is present, so the description does not need to detail return values. The description is sufficient for the tool's complexity, though it could have briefly mentioned that this is the follow-up to run_checkpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides full coverage for the single parameter, including an explicit note that validation_id is 'ID returned from run_checkpoint().' The description adds no further parameter-level meaning, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch') and identifies a clear resource ('detailed validation results') scoped to 'a prior validation run.' This clearly distinguishes it from sibling tools like run_checkpoint, which presumably initiates the run.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for a prior validation run' implies this tool should be used after run_checkpoint has been called. No explicit exclusions or alternative tools are named, but the context is clear enough for an agent to infer when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_versionA
Return the API version for MCP server.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must convey behavior. The verb 'Return' implies a safe read operation with no side effects, but the description does not explicitly mention that it is non-destructive or disclose any error handling or return format. However, the existence of an output schema mitigates the need to describe the return value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with six words, front-loaded and free of any irrelevant information. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter utility tool that simply returns a version, the description is fully complete. The presence of an output schema covers the return format, and the distinguishing sibling tools are all different in purpose, so no additional context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema is empty with 100% coverage. The description does not need to add parameter details. Per the rubric, a baseline of 4 applies when there are no parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Return the API version for MCP server.' It uses a specific verb ('Return') and a specific resource ('API version') and is easily distinguishable from sibling tools such as ping or get_validation_result.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used to retrieve the server's API version, but provides no explicit when-to-use guidance or alternatives. Given the simplicity of the tool and lack of similar siblings, the implied usage is sufficient, but no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_datasetA
Load data (CSV string, URL, or local file) into memory and return a handle.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Path to file, URL, or inline CSV string | |
| max_rows | No | Maximum rows to read (None for all) | |
| use_polars | No | Use ``polars.scan_csv`` for reading if available | |
| source_type | No | Type of source - "file", "url", or "inline" | file |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing behavior. It mentions that data is loaded into memory and that a handle is returned, which are key behavioral traits. However, it fails to note whether the operation is read-only, whether network access is needed for URLs, or potential memory implications. It is not misleading, but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-formed sentence that efficiently conveys the core functionality without unnecessary detail. It is front-loaded with the action and ends with the return value, making it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema (though not shown) and comprehensive parameter descriptions, so return values are likely covered. However, the description does not explain what the 'handle' is or how it should be used with sibling tools like run_checkpoint. The lack of usage context makes it less complete for an agent unfamiliar with the workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents all parameters with descriptions. The description adds minimal semantic value by enumerating sources (CSV string, URL, local file) which aligns with the source_type parameter, but this is also captured in the schema's 'source' description. No additional parameter guidance is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool loads data from CSV string, URL, or local file into memory and returns a handle. This is a specific verb (load) with a clear resource (data) and enumerates the source types, effectively distinguishing it from sibling tools that operate on checkpoints or validation results.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. The description does not mention prerequisites, such as needing to load data before running a checkpoint, nor does it reference any alternative loading mechanisms. It simply states what the tool does without context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pingA
Return basic health status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosure. It clearly states the action but doesn't explicitly mention side effects (or lack thereof) or any read-only nature. For a ping/health check, this is implicit, but the description is sparse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. Every word is meaningful and directly conveys the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple health-check tool with no parameters and an output schema, the description is complete. It fully captures what the tool does, and the output schema handles return value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, the baseline is 4. The description correctly has no parameter details, as there is nothing to explain. This is fully appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Return basic health status' uses a specific verb and resource, clearly distinguishing it from siblings like run_checkpoint and get_validation_result. The purpose is immediately apparent and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (when you want a health check) but provides no explicit context, exclusions, or alternatives. Given the simplicity of the tool, this is acceptable, but it doesn't offer guidance beyond what might be assumed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_checkpointB
Run a validation checkpoint against a dataset using an expectation suite.
| Name | Required | Description | Default |
|---|---|---|---|
| suite_name | Yes | Name of the expectation suite to validate against | |
| dataset_handle | Yes | Handle to the dataset to validate | |
| checkpoint_name | No | Optional name for the checkpoint (unused currently) | |
| background_tasks | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| validation_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits, but it only states the obvious action. It omits details on whether the operation is synchronous, if it creates background jobs, side effects, or what the output contains. The schema notes checkpoint_name is unused, but the description doesn't clarify this.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word contributes to stating the tool's basic function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description lacks workflow context and behavioral details. It fails to mention that checkpoint_name is unused, background_tasks behavior, or how this relates to sibling tools like create_suite and get_validation_result. A more complete description would clarify the operation's nature and placement in the pipeline.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so most parameters are already documented. The description adds minimal semantic context by mapping 'expectation suite' to suite_name and 'dataset' to dataset_handle, but it doesn't explain the undocumented background_tasks parameter or the 'unused' checkpoint_name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's action as running a validation checkpoint on a dataset with an expectation suite. It uses a specific verb and resource, distinguishing it from siblings like get_validation_result (retrieval) and create_suite (creation).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives or how it fits into the workflow. It does not mention prerequisites (e.g., suite must exist) or contrast with get_validation_result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
7 tool updates
v2.0.3- First observed
add_expectation - First observed
create_suite - First observed
get_validation_result - First observed
get_version - First observed
load_dataset - First observed
ping - First observed
run_checkpoint
TDQS
Each tool addresses a distinct concern: health/version, data loading, suite/expectation management, and validation execution/result retrieval. There is no overlap between run_checkpoint and get_validation_result, as one performs the validation and the other retrieves its output.
All tools follow a snake_case verb_noun pattern (run_checkpoint, get_validation_result, load_dataset, create_suite, add_expectation, get_version), with 'ping' as the only exception but it is a standard health-check name. The convention is uniform and predictable.
Seven tools is well within the ideal range for a focused MCP server. Each tool serves a necessary function for the core workflow of building and running data validation, with no redundancy or scope creep.
The set covers the primary workflow (load data, create suite, add expectation, run checkpoint, get result), but lacks read operations for existing suites or expectations, and has no update/delete capabilities. Agents cannot discover or manage existing validation assets without extending the surface.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Related MCP Servers
- FlicenseAqualityDmaintenanceExposes two MCP tools (discover and execute) that enable agents to query an OpenAPI schema via natural language and execute matched API operations.2-
- FlicenseNot gradedqualityCmaintenanceExposes task management (add, list, complete tasks) and document search (RAG) as MCP tools for AI agents.-
- AlicenseNot gradedqualityBmaintenanceExposes Iceberg-backed ontology objects, links, and actions as typed MCP tools for LLM agents, enabling governed data access and operations without raw SQL.MIT
- FlicenseNot gradedqualityBmaintenanceExposes schema, lineage, and data-quality trust signals from a SQLite-backed catalog as MCP tools, enabling AI agents to answer grounded questions about datasets without hallucinating.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/davidf9999/gx-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server