graphql-introspection-mcp
Allows introspection of GraphQL schemas, filtering queries/mutations/types, and executing read-only queries (and optionally mutations) on any GraphQL endpoint.
Click on "Deploy 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., "@graphql-introspection-mcpshow me the GraphQL schema"
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.
GraphQL Introspection MCP Server
A Model Context Protocol (MCP) server that provides comprehensive GraphQL introspection capabilities with filtering and detailed analysis features.
Features
Complete Schema Introspection: Get full GraphQL schema with SDL and structured data
Smart Filtering: Filter queries, mutations, and types with search patterns
Detailed Analysis: Get comprehensive information about specific types and fields
Query Execution: Execute read-only GraphQL queries against any endpoint
Mutation Support: Execute GraphQL mutations with explicit opt-in via
ALLOW_MUTATIONSflagSafety Controls: 3-layer protection with tool listing, execution guards, and GraphQL AST validation
Related MCP server: mcp-graphql-tools
Safety & Permissions
Default Mode (Read-Only)
By default, only read-only operations are available:
All 6 introspection tools (schema, queries, mutations, types, type details, field details)
execute_query— executes GraphQL queries only
Dangerous Mode (Mutations Enabled)
To enable mutation execution, set the ALLOW_MUTATIONS environment variable:
ALLOW_MUTATIONS=true npx graphql-inspector-mcpOr in your MCP config:
{
"mcpServers": {
"graphql-introspection": {
"command": "npx",
"args": ["-y", "graphql-inspector-mcp"],
"env": {
"ALLOW_MUTATIONS": "true"
}
}
}
}When enabled, the execute_mutation tool becomes available.
Safety Architecture
Three layers of protection prevent unauthorized mutations:
Tool Listing:
execute_mutationis hidden from tool discovery whenALLOW_MUTATIONSis not setExecution Guard: Even if called directly,
execute_mutationrejects when not in dangerous modeAST Validation: GraphQL documents are parsed and validated — operation type is verified at the AST level, not string matching
MCP Annotations: All tools annotated with
readOnlyHintfor MCP-aware clientsAuthentication Support: Basic Auth and Bearer token authentication
Caching: In-memory caching with 5-minute expiration for better performance
AI-Friendly Output: Structured JSON responses optimized for AI agents
Installation
npm install
npm run buildUsage
Using npx
You can run the tool directly via npx:
npx graphql-inspector-mcpThis will start the MCP server and expose GraphQL introspection tools.
CLI Arguments
The following arguments can be provided via JSON config, environment variables, or MCP tool requests. They are not traditional CLI flags, but are passed as options to the server or tools.
Argument | Type | Description | Example Value |
| string | GraphQL endpoint URL (default: |
|
| string | Username for basic authentication (optional) |
|
| string | Password for basic authentication (optional) |
|
| string | Bearer token for authentication (optional) |
|
| string | Search pattern to filter queries, mutations, or types (case-insensitive) |
|
| boolean | Return detailed information (default: |
|
| string | Filter by type kind ( |
|
| string | Name of the type to get details for |
|
| string | Name of the field to get details for |
|
| string | Type of operation ( |
|
| string | GraphQL query or mutation string |
|
| object | Variables for the GraphQL operation (optional) |
|
| string | Name of the operation to execute (optional, for multi-operation documents) |
|
Usage Example
npx graphql-inspector-mcpWith config file (mcp.config.json):
{
"mcpServers": {
"graphql-introspection": {
"command": "npx",
"args": [
"-y",
"kokorolx/graphql-inspector-mcp"
],
"options": {
"endpoint": "http://localhost:5555/graphql"
}
}
}
}Or via environment variables:
export GRAPHQL_DEFAULT_ENDPOINT="http://localhost:4000/graphql"
export CACHE_DURATION_MS="600000"Or via MCP tool request JSON:
{
"endpoint": "http://localhost:5555/graphql",
"search": "user",
"detailed": true
}MCP Config File
The MCP config file allows you to customize server settings and tool behavior. By default, the config file should be named mcp.config.json and placed in your project root.
Example mcp.config.json:
{
"mcpServers": {
"graphql-introspection": {
"command": "npx",
"args": [
"-y",
"kokorolx/graphql-inspector-mcp"
],
"options": {
"endpoint": "http://localhost:5550/graphql"
}
}
}
}Location: Project root (e.g.,
./mcp.config.json)Format: Standard JSON
Usage: The MCP client will automatically detect and use this configuration when starting the server.
Available Tools
1. get_graphql_schema
Get complete GraphQL schema introspection with SDL and structured data.
{
"endpoint": "http://localhost:5555/graphql",
"username": "optional_username",
"password": "optional_password",
"bearer_token": "optional_bearer_token"
}2. filter_queries
Filter and list available GraphQL queries with optional search.
{
"endpoint": "http://localhost:5555/graphql",
"search": "user",
"detailed": true
}3. filter_mutations
Filter and list available GraphQL mutations with optional search.
{
"endpoint": "http://localhost:5555/graphql",
"search": "create",
"detailed": false
}4. filter_types
Filter and list available GraphQL types by kind and search pattern.
{
"endpoint": "http://localhost:5555/graphql",
"search": "User",
"kind": "OBJECT",
"detailed": true
}Supported type kinds:
OBJECT- Object typesSCALAR- Scalar typesENUM- Enumeration typesINTERFACE- Interface typesUNION- Union typesINPUT_OBJECT- Input object types
5. get_type_details
Get comprehensive information about a specific GraphQL type.
{
"type_name": "User",
"endpoint": "http://localhost:5555/graphql"
}6. get_field_details
Get detailed information about a specific query or mutation field.
{
"field_name": "getUser",
"operation_type": "query",
"endpoint": "http://localhost:5555/graphql"
}7. execute_query
Execute a read-only GraphQL query against the endpoint.
{
"query": "query { users { id name email } }",
"variables": {},
"endpoint": "http://localhost:5555/graphql"
}8. execute_mutation
Execute a GraphQL mutation (requires ALLOW_MUTATIONS=true).
{
"query": "mutation { createUser(name: \"John\") { id name } }",
"variables": {},
"endpoint": "http://localhost:5555/graphql"
}Authentication
The server supports multiple authentication methods:
Basic Authentication
{
"endpoint": "https://api.example.com/graphql",
"username": "your_username",
"password": "your_password"
}Bearer Token
{
"endpoint": "https://api.example.com/graphql",
"bearer_token": "your_jwt_token"
}Response Format
All responses are structured JSON optimized for AI processing:
Success Response
{
"success": true,
"endpoint": "http://localhost:5555/graphql",
"data": {
// ... relevant data
}
}Error Response
{
"success": false,
"error": "Error description",
"endpoint": "http://localhost:5555/graphql"
}Example Responses
Filter Queries (Summary)
{
"success": true,
"endpoint": "http://localhost:5555/graphql",
"search_term": "user",
"queries": [
{
"name": "getUser",
"description": "Fetch a user by ID",
"deprecated": false,
"deprecation_reason": null
},
{
"name": "searchUsers",
"description": "Search users by criteria",
"deprecated": false,
"deprecation_reason": null
}
],
"total": 2
}Filter Queries (Detailed)
{
"success": true,
"endpoint": "http://localhost:5555/graphql",
"queries": [
{
"name": "getUser",
"description": "Fetch a user by ID",
"deprecated": false,
"deprecation_reason": null,
"arguments": [
{
"name": "id",
"description": "User ID",
"type": {
"kind": "NON_NULL",
"of_type": {
"kind": "SCALAR",
"name": "ID"
},
"is_required": true
},
"default_value": null
}
],
"return_type": {
"kind": "OBJECT",
"name": "User",
"description": "A user in the system"
}
}
],
"total": 1
}Type Details
{
"success": true,
"endpoint": "http://localhost:5555/graphql",
"type": {
"name": "User",
"kind": "OBJECT",
"description": "A user in the system",
"fields": [
{
"name": "id",
"description": "Unique identifier",
"type": {
"kind": "NON_NULL",
"of_type": {
"kind": "SCALAR",
"name": "ID"
},
"is_required": true
},
"deprecated": false,
"deprecation_reason": null
},
{
"name": "email",
"description": "User email address",
"type": {
"kind": "SCALAR",
"name": "String"
},
"deprecated": false,
"deprecation_reason": null
}
],
"interfaces": [],
"possible_types": null
}
}Caching
The server implements in-memory caching with the following characteristics:
Cache Duration: 5 minutes
Cache Key: Combination of endpoint URL and authentication method
Automatic Invalidation: Expired entries are automatically removed
Performance: Subsequent requests to the same endpoint return cached data instantly
Error Handling
The server provides comprehensive error handling for:
Network Issues: Connection timeouts, DNS resolution failures
HTTP Errors: 4xx and 5xx responses from GraphQL endpoints
GraphQL Errors: Schema validation errors, introspection failures
Authentication Errors: Invalid credentials, expired tokens
Validation Errors: Missing required parameters, invalid type names
Development
Build
npm run buildDevelopment Mode
npm run devClean Build
npm run clean
npm run buildConfiguration
Default Settings
Default Endpoint:
http://localhost:5555/graphqlCache Duration: 5 minutes (300 seconds)
Timeout: Uses fetch default timeout
Max Cache Size: No limit (memory permitting)
Environment Variables
Variable | Default | Description |
|
| Default GraphQL endpoint |
|
| Cache duration in milliseconds (5 minutes) |
|
| Enable mutation execution ( |
Best Practices
For AI Agents
Use Detailed Mode: Set
detailed: truewhen you need comprehensive informationFilter Effectively: Use search patterns to reduce response size
Cache Awareness: Subsequent calls to the same endpoint will be faster due to caching
Error Handling: Always check the
successfield in responses
For Performance
Specific Searches: Use specific search terms to reduce response size
Type Filtering: Use the
kindparameter when filtering typesSummary Mode: Use
detailed: falsefor quick overviewsEndpoint Reuse: Reuse the same endpoint URL to benefit from caching
Troubleshooting
Common Issues
Schema not found
Verify the GraphQL endpoint URL is correct
Check if the endpoint requires authentication
Ensure the endpoint supports introspection queries
Authentication failures
Verify credentials are correct
Check if the endpoint expects Basic Auth or Bearer tokens
Ensure tokens haven't expired
Network timeouts
Check network connectivity to the GraphQL endpoint
Verify firewall settings allow outbound connections
Consider if the GraphQL server is running and responsive
Debug Mode
Enable debug logging by setting the environment variable:
export DEBUG=graphql-introspection:*License
MIT License - see LICENSE file for details.
Available Tools
7 toolsexecute_queryARead-only
Execute a read-only GraphQL query against the endpoint. Only query operations are allowed.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | GraphQL query document string | |
| endpoint | No | GraphQL endpoint URL (default: http://localhost:5555/graphql) | |
| password | No | Password for basic authentication (optional) | |
| username | No | Username for basic authentication (optional) | |
| variables | No | Variables for the GraphQL operation (optional) | |
| bearer_token | No | Bearer token for authentication (optional) | |
| operation_name | No | Operation name if document contains multiple operations (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, but the description adds a behavioral constraint beyond that: 'Only query operations are allowed.' This clarifies that mutations and subscriptions are not permitted, which is not inferable from readOnlyHint alone. The description also confirms the read-only nature, adding value without contradicting the annotation.
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 of about 15 words, front-loaded with the core action ('Execute a read-only GraphQL query'). Every word contributes to defining the tool's purpose and constraints. There is zero redundancy or filler.
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 tool with 7 parameters and no output schema, the description is sufficient for selection and invocation understanding. It specifies the endpoint, operation type, and read-only nature. It doesn't describe return format or authentication details, but those are covered by schema and the general understanding of GraphQL. The sibling context makes the role clear, so a 4 is adequate.
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 has 100% description coverage for all 7 parameters, so the baseline is 3. The description does not elaborate on any parameter meanings beyond what the schema provides. It adds no extra semantic context for parameters like 'query' or 'endpoint', so a score of 3 is 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 clearly states the tool's action: 'Execute a read-only GraphQL query against the endpoint.' The verb 'execute' and resource 'GraphQL query' are specific, and the restriction to 'query operations' differentiates it from sibling tools that explore schema (e.g., get_graphql_schema, filter_queries). It is a precise, unambiguous statement.
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 when to use the tool: for executing GraphQL queries, while sibling tools are for schema exploration. The statement 'Only query operations are allowed' provides a usage constraint, but it does not explicitly name alternatives or say 'use this instead of X'. The context signals and sibling names make the differentiation clear, earning a score of 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
filter_mutationsBRead-only
Filter and list available GraphQL mutations
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Search pattern to filter mutations (case-insensitive substring match) | |
| detailed | No | Return detailed information including arguments and return types (default: false) | |
| endpoint | No | GraphQL endpoint URL (default: http://localhost:5555/graphql) | |
| password | No | Password for basic auth (optional) | |
| username | No | Username for basic auth (optional) | |
| bearer_token | No | Bearer token (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, which is consistent with the description's 'Filter and list' wording. However, the description adds no behavioral context beyond that, such as whether the tool performs introspection, handles authentication, or what output format to expect.
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 directly states the tool's purpose. No filler or redundant information is present, making it highly concise and appropriately sized.
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?
With no output schema and a sparse description, the tool's return behavior, pagination (if any), and authentication requirements are left unexplained. The description covers only the basic action and resource, which is insufficient for an agent to fully anticipate tool behavior.
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 parameter semantics are fully handled by the schema. The description adds no extra meaning beyond indicating that 'filter' relates to the search parameter and 'list' to the overall operation, which is minimal added value.
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 'Filter and list' with a clear resource 'GraphQL mutations'. It distinguishes from sibling tools like filter_queries and filter_types by explicitly targeting mutations.
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 such as filter_queries or get_graphql_schema. The name and sibling context imply use for mutations, but the description itself gives no explicit usage context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
filter_queriesARead-only
Filter and list available GraphQL queries
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Search pattern to filter queries (case-insensitive substring match) | |
| detailed | No | Return detailed information including arguments and return types (default: false) | |
| endpoint | No | GraphQL endpoint URL (default: http://localhost:5555/graphql) | |
| password | No | Password for basic auth (optional) | |
| username | No | Username for basic auth (optional) | |
| bearer_token | No | Bearer token (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint=true, which already signals a safe read operation, so the description need not cover safety. The description adds minimal behavioral context beyond 'available' (suggesting introspection), but does not disclose details like whether queries are executed (they are not, per readOnlyHint) or response format. No contradiction with annotations.
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 no filler words. It is front-loaded with the key verb and resource, making it immediately understandable. Every word earns its place; ideal conciseness.
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 no output schema, the description should clarify what the tool returns (e.g., a list of query names and optionally details). The current statement 'list available GraphQL queries' is somewhat vague about the exact output and how filtering works. It is adequate for a simple listing tool but leaves some gaps in context.
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% for all 6 parameters, so the schema fully documents each parameter. The tool description does not add extra meaning to parameters; it only states the overall purpose. Baseline 3 applies as schema carries the burden.
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 'Filter and list available GraphQL queries' uses a specific verb ('Filter and list') and resource ('available GraphQL queries'), clearly distinguishing this tool from its siblings such as 'filter_mutations' and 'get_graphql_schema'. The scope (queries vs. mutations) is immediately obvious, making it a strong purpose statement.
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 need to list/filter GraphQL queries) but does not explicitly state when to use this tool over alternatives like 'filter_mutations' or 'get_graphql_schema'. It lacks explicit exclusions or alternative tool mentions, so guidance is only implied rather than direct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
filter_typesBRead-only
Filter and list available GraphQL types
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter by type kind (OBJECT, SCALAR, ENUM, INTERFACE, UNION, INPUT_OBJECT) | |
| search | No | Search pattern to filter types (case-insensitive substring match) | |
| detailed | No | Return detailed information including fields (default: false) | |
| endpoint | No | GraphQL endpoint URL (default: http://localhost:5555/graphql) | |
| password | No | Password for basic auth (optional) | |
| username | No | Username for basic auth (optional) | |
| bearer_token | No | Bearer token (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the agent knows it is a safe read. However, the description adds no further behavioral context (e.g., authentication, default endpoint, or response format), failing to go beyond the structured annotations.
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 redundant wording, earning a high score.
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 7 optional parameters and no output schema, the description gives no overview of the default behaviors or return structure. The schema covers parameters, but the description lacks contextual completeness for the tool's operation.
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 100% parameter descriptions, including enums and defaults. The tool description adds no additional parameter meaning, so schema coverage suffices.
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 ('filter and list') and identifies the resource ('GraphQL types'), clearly differentiating from sibling tools such as filter_queries and filter_mutations.
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 provides no guidance on when to use this tool versus alternatives like get_graphql_schema or get_type_details; it only states the function without context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_field_detailsBRead-only
Get detailed information about a specific query or mutation field
| Name | Required | Description | Default |
|---|---|---|---|
| endpoint | No | GraphQL endpoint URL (default: http://localhost:5555/graphql) | |
| password | No | Password for basic auth (optional) | |
| username | No | Username for basic auth (optional) | |
| field_name | Yes | Name of the field to get details for | |
| bearer_token | No | Bearer token (optional) | |
| operation_type | No | Type of operation (query or mutation) | query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read operation, but the description adds no behavioral context beyond that. It does not mention network access, authentication requirements, error behavior, or what 'detailed information' entails, leaving gaps despite the annotation.
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, front-loaded with the action and resource, containing no unnecessary words. It is perfectly concise and 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?
With no output schema, the description carries the burden of explaining what 'detailed information' means, but it does not. The tool involves six parameters including authentication, yet the description provides no context about return format, usage scenarios, or operational behavior, making it incomplete for a moderately complex tool.
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%, with all six parameters documented in the input schema, including defaults and the enum for operation_type. The description itself contributes no additional parameter semantics, so the baseline 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 clearly states the tool gets detailed information about a specific query or mutation field, using a specific verb and resource. It distinguishes itself from sibling tools like get_type_details (for types) and filter_queries/filter_mutations (for listing).
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. The description lacks explicit when/when-not statements or references to sibling tools, leaving the agent to infer usage purely from the action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_graphql_schemaBRead-only
Get complete GraphQL schema introspection
| Name | Required | Description | Default |
|---|---|---|---|
| endpoint | No | GraphQL endpoint URL (default: http://localhost:5555/graphql) | |
| password | No | Password for basic authentication (optional) | |
| username | No | Username for basic authentication (optional) | |
| bearer_token | No | Bearer token for authentication (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation indicates a safe read operation, and the description does not contradict it. The description adds the 'complete' scope but offers no additional behavioral context such as authentication requirements or potential response size. Given the annotation covers the safety profile, a 3 is appropriate.
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?
One sentence, perfectly front-loaded, and without any filler. It conveys the core purpose efficiently.
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 with four optional auth parameters and no output schema. The description states what it returns (the introspection), which is sufficient for the primary use case. However, it could mention authentication for protected endpoints and doesn't address when to use this vs siblings. Given the moderate complexity, a 3 is fair.
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 documents all four parameters with descriptions, providing 100% coverage. The description adds nothing about parameters, but the schema adequately explains endpoint, username, password, and bearer_token. Baseline 3.
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 retrieves the complete GraphQL schema via introspection, using a specific verb and resource. The 'complete' qualifier distinguishes it from sibling tools that filter or get details, but not explicitly.
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 usage guidance is provided. The description does not indicate when to use this tool versus filter_queries, get_type_details, or other siblings, nor does it mention any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_type_detailsBRead-only
Get detailed information about a specific GraphQL type
| Name | Required | Description | Default |
|---|---|---|---|
| endpoint | No | GraphQL endpoint URL (default: http://localhost:5555/graphql) | |
| password | No | Password for basic auth (optional) | |
| username | No | Username for basic auth (optional) | |
| type_name | Yes | Name of the type to get details for | |
| bearer_token | No | Bearer token (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint=true, and the description aligns with a read-only operation. It adds no extra behavioral context such as authentication details, rate limits, or response format, but because annotations already cover the safety profile, no contradiction exists.
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 redundant words. It efficiently communicates the core purpose without unnecessary elaboration.
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?
With no output schema, the description fails to clarify what 'detailed information' includes—such as fields, descriptions, or deprecation status. This is a notable gap for an agent deciding whether the tool meets its needs. The presence of sibling tools like get_field_details further emphasizes the need for more specific return-value context.
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 has 100% parameter description coverage, so the schema handles parameter semantics. The description adds little beyond mentioning 'specific GraphQL type', which maps to the type_name parameter, but provides no additional details about endpoint or auth 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 retrieves information about a specific GraphQL type, using a specific verb and resource. It distinguishes from siblings like get_graphql_schema (whole schema) and filter_types (filtering), though 'detailed information' remains vague about what exactly is returned.
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. It does not mention excluded use cases or point to sibling tools like get_field_details or filter_types. Sibling names offer context but the description itself gives no selection criteria.
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.
7 tool updates
v1.1.0- First observed
execute_query - First observed
filter_mutations - First observed
filter_queries - First observed
filter_types - First observed
get_field_details - First observed
get_graphql_schema - First observed
get_type_details
TDQS
Scored across 7 tools
Each tool has a clearly distinct purpose: schema retrieval, filtering queries, mutations, types, and fetching details for types and fields, plus query execution. No overlap or ambiguity exists.
Tool names consistently follow a verb_noun pattern with snake_case: get_graphql_schema, filter_queries, filter_mutations, filter_types, get_type_details, get_field_details, execute_query. Naming is predictable and unified.
With 7 tools, the set is well-scoped for a GraphQL introspection server. Each tool covers a necessary aspect without redundancy, making the count appropriate.
The surface covers schema introspection, listing queries/mutations/types, and detailed field/type info, plus query execution. The only notable gap is the absence of a filter for subscriptions, but core workflows are fully covered.
Maintenance
Related MCP Connectors
The Grafbase MCP server sits in front of a GraphQL API and exposes an MCP protocol-compliant interface that allows AI agents and LLMs to explore and query GraphQL APIs using natural language. It provides tools to search schemas, introspect types and fields, and execute GraphQL queries while minimizing context bloat by returning only relevant schema subsets, with built-in support for authentication, authorization, and configurable access control.
Gateway between LLM agents and world data through eight tools and a bundled endpoint catalog.
Safe, read-only Postgres and MySQL access for AI agents. Audit log + column-level controls.
Supervised API-write gateway for AI agents with policy, human approval and execution receipts.
Related MCP Servers
- FlicenseAqualityDmaintenanceConverts natural language queries into valid GraphQL queries and executes them against GraphQL APIs. Includes schema introspection, query validation, execution with authentication, and query history tracking.525-
- AlicenseBqualityDmaintenanceEnables AI assistants to execute GraphQL queries and retrieve schema information from any GraphQL endpoint.2223 npm8MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to interact with any GraphQL API by introspecting the schema and exposing queries and mutations as MCP tools, with built-in pagination, semantic search, and framework adapters.14 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables LLMs to interact with GraphQL APIs through schema introspection and query execution.1,006 npm1MIT