Skip to main content
Glama
letoribo

mcp-graphql-enhanced

mcp-graphql-enhanced

Glama mcp-graphql-enhanced MCP serverSmithery Listednpm versionMCP RegistryAgent Trust Fabric

An enhanced MCP (Model Context Protocol) server for GraphQL that fixes real-world interoperability issues between LLMs and GraphQL APIs.

Drop-in replacement for mcp-graphql β€” with dynamic headers, robust variables parsing, and zero breaking changes.

🎯 What is mcp-graphql-enhanced?

mcp-graphql-enhanced is a high-performance, federated GraphQL gateway designed to act as a workhorse for LLM agents. It bridges the gap between massive, complex GraphQL ecosystems and the context-limited environment of AI assistants. Unlike standard "all-or-nothing" introspection tools that crash under the weight of large schemas (like GitHub's or enterprise-grade Neo4j graphs), this server provides surgical control over how your agent perceives and interacts with your data.

πŸ’‘ Why do you need it?

If you have ever seen the<error>Tool result is too large</error>while trying to introspect your API, you are already hitting the limits of standard MCP implementations. Here is why mcp-graphql-enhanced is a practical choice for professional environments:

Avoid the 1MB Ceiling: It shifts the responsibility for scope from the server to the caller. Instead of a unilateral "everything or nothing" dump, you get granular control via typeNames and typeDepth parameters.

Surgical Precision: You can selectively introspect only the nodes you need (e.g., Repository, User, or Message), keeping your context window clean and your LLM focused.

Predictability over Immunity: It doesn't promise "unlimited" capacityβ€”it promises predictability. In enterprise systems, you need a tool that lets you navigate the graph surgically and fail predictably if you overstep, rather than a "black box" that dies on you the moment the schema grows.

Demonstration: See a real-world diagnostic test against the GitHub API that compares scoped and monolithic introspection: πŸ”— Diagnostic Case Study: Scoped vs. Monolithic Introspection (Shared Chat)

πŸ’¬ Community & Support

Join the conversation! If you have questions about using this bridge with Neo4j, Discord data graphs, or GraphQL in general, come hang out with us:

This is the best place to share your feedback, report issues, or suggest new "enhanced" features for the bridge.

Related MCP server: mcp-graphql-schema

✨ Key Enhancements

  • βœ… Dynamic Endpoint Switching β€” Hot-swap targets on the fly directly via tool arguments without restarting the server or losing session context.

  • βœ… Built-in GraphiQL IDE β€” Visual playground at / (or /graphql, /graphiql) with pre-configured headers for instant testing and introspection.

  • βœ… Dual Transport β€” Supports both STDIO (for local CLI/client tools) and HTTP/JSON-RPC (for external/browser clients).

  • βœ… Dynamic headers β€” pass Authorization, X-API-Key, etc., via tool arguments (no config restarts)

  • βœ… Robust variables parsing β€” fixes β€œQuery variables must be a null or an object” error

  • βœ… Smart introspection β€” supports filtered requests (via typeNames) and recursive depth control (via typeDepth) to minimize LLM context noise and optimize schema exploration.

  • βœ… Full MCP compatibility β€” works with Claude Desktop, Groq Desktop, Google Antigravity, Glama, Gemini CLI, Hermes Agent and any standard MCP client

  • βœ… Secure by default β€” mutations disabled unless explicitly enabled

  • βœ… Dynamic Schema Evolution β€” Smart diagnostics and gap analysis for servers that regenerate GraphQL types on-the-fly (like Neo4j).

  • βœ… Deep Observability β€” Automatic Cypher extraction and cleaning from GraphQL extensions.

πŸ”₯ Dynamic Endpoint Switching

The bridge allows LLMs or clients to dynamically target different GraphQL endpoints at runtime within a single session without requiring server restarts or configuration changes.

Simply pass the optional endpoint parameter in query-graphql or introspect-schema:

  • Zero Downtime: Hot-swaps the underlying schema and clears internal caches instantly.

  • Context Preservation: Keeps the MCP connection open while shifting queries between different environments (e.g., switching from a Discord ingest node to a Neo4j graph database).

πŸš€ Federated Multi-Node Architecture (since v3.9.1)

The server operates as a Federated GraphQL Gateway, merging independent nodes into a unified system.

  • Zero Breaking Changes: If you provide a single URL in ENDPOINT, the server behaves exactly as before.

  • Federated Introspection: Scans all endpoints simultaneously to build a global capability map.

  • Smart Aggregation: When multiple comma-separated URLs are provided, the server broadcasts queries and merges results using universal deep deduplication (object-level).

  • Conflict Handling: Identifies structural differences in identical Type names across nodes and exposes them uniquely.

  • Bypass Free Tier Limits: Perfect for users of "Free Tier" cloud databases (like Neo4j Aura). You can split your data across multiple free instances and use this bridge to query them as a single unified graph, effectively bypassing entity count limitations.

Proof of Concept:

See a real-world demonstration of the federated query synthesis in action, where the agent aggregates live Discord data with historical Neo4j insights: πŸ”— Live Federation Analysis (Shared Chat)

πŸ’‘ Use Case: Bridging WSL and Windows (PowerShell)

A common challenge for Windows developers is the network isolation between the Windows Subsystem for Linux (WSL) and the host OS. This feature allows you to bridge these two worlds into a "Unified Nervous System".

Example configuration for Claude Desktop:

{
  "ENDPOINT": "http://DESKTOP-NAME.local:2311/graphql,http://127.0.0.1:4000/graphql"
}
  • Hybrid Ecosystem: Seamlessly query and aggregate data across Windows-native processes (PowerShell) and Linux-based environments (WSL).

  • mDNS Support: By using .local addresses, the bridge automatically resolves the host machine's IP from within the WSL environment.

  • Transparent Aggregation: The AI assistant interacts with a single unified schema, unaware that the data is being fetched from different operating systems simultaneously.

πŸ” Advanced Observability & Cypher

The bridge provides deep insights into how the LLM interacts with your graph database.

πŸ•ΈοΈ Automated Cypher Extraction

For GraphQL server implementations that return query execution plans (like @neo4j/graphql), the bridge automatically:

  1. Detects extensions.cypher in the response.

  2. Sanitizes the output by stripping internal headers (like CYPHER 5 or empty PARAMS).

  3. Injects a clean Cypher block directly into the tool's output for the AI to analyze.

Note: This feature requires your GraphQL server to be configured to include debug information in the response extensions.


🎨 Visual Command Center (GraphiQL)

Unlike standard MCP servers, this one provides a visual interface for humans. When running with ENABLE_HTTP=true, you can open a full-featured GraphiQL IDE in your browser.

  • Endpoint: http://localhost:6274/ (or /graphql, /graphiql)

  • Header Sync: Any headers set in your environment (like GitHub tokens) are automatically injected into the GraphiQL "Headers" tab for immediate testing.

πŸ’» HTTP / Dual Transport

This server runs in dual transport mode, supporting both the standard STDIO communication (used by most MCP clients) and an HTTP JSON-RPC endpoint on port 6274.

This allows external systems, web applications, and direct curl commands to access the server's tools with live request logging in your terminal ([HTTP-RPC] logs).

Endpoint

Method

Description

/graphiql

GET

Human Interface: The visual GraphQL IDE.

/mcp

POST

The main JSON-RPC 2.0 endpoint for tool execution.

/health

GET

Simple health check, returns { status: 'ok' }.

Resolving Port Conflicts (EADDRINUSE) and Automatic Port Selection

The server defaults to port 6274. If you encounter an EADDRINUSE: address already in use :::6274 error (common in local development due to stale processes), the server will automatically find the next available port (up to 10 attempts, not spawning multiple servers).

This ensures the server starts successfully even when the default is blocked. Always check the server logs for the final bound port (e.g., [HTTP] Started server on http://localhost:6275) if your curl or client tool fails on the default 6274.

To force a specific port (e.g., for guaranteed external firewall settings), you can still explicitly set the MCP_PORT environment variable:

MCP_PORT=8080 npx @letoribo/mcp-graphql-enhanced

Testing the HTTP Endpoint

You can test the endpoint using curl as long as the server is running (e.g., via npm run dev):

Test the health check (assuming the server bound to the default or found the next available port)

curl http://localhost:6274/health

Testing the JSON-RPC Transport

curl -X POST http://localhost:6274/mcp  \
-H "Content-Type: application/json"  \
-d '{
  "jsonrpc":"2.0",
  "method":"tools/list",
  "params":{},
  "id":1
}'

curl -X POST http://localhost:6274/mcp \
-H "Content-Type: application/json" \
-d '{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "introspect-schema",
    "arguments": {}
  },
  "id": 2
}'

curl -X POST http://localhost:6274/mcp \
-H "Content-Type: application/json" \
-d '{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "introspect-schema",
    "arguments": {
      "endpoint": "https://mcp-neo4j-discord.vercel.app/api/graphiql"
    }
  },
  "id": 3
}'

curl -X POST http://localhost:6274/mcp \
-H "Content-Type: application/json" \
-d '{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "introspect-schema",
    "arguments": {
      "typeNames": ["User", "Message"]
    }
  },
  "id": 4
}'

curl -X POST http://localhost:6274/mcp \
-H "Content-Type: application/json" \
-d '{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "introspect-schema",
    "arguments": {
      "typeNames": ["Message"],
      "typeDepth": 4
    }
  },
  "id": 5
}'

curl -X POST http://localhost:6274/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "query-graphql",
      "arguments": {
        "query": "{ guildChannels(guild_id: \"1312302100125843476\") { name id topic } }"
      }
    },
    "id": 6
  }'

# Executing query with dynamic endpoint switching
curl -X POST http://localhost:6274/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "query-graphql",
      "arguments": {
        "endpoint": "https://mcp-neo4j-discord.vercel.app/api/graphiql",
        "query": "{ getGuilds { name } }"
      }
    },
    "id": 7
  }'

# Targeted introspection with depth control and dynamic endpoint switching
curl -X POST http://localhost:6274/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "introspect-schema",
      "arguments": {
        "endpoint": "https://mcp-neo4j-discord.vercel.app/api/graphiql",
        "typeNames": ["Message"],
        "typeDepth": 1
      }
    },
    "id": 8
  }'

(using port 6275 if 6274 was busy)

curl -X POST http://localhost:6275/mcp -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"query-graphql","arguments":{"query":"query { __typename }"}},"id":1}'

πŸ” Use the official MCP Inspector to test your server live:

npx @modelcontextprotocol/inspector \
  -e ENDPOINT=https://api.example.com/graphql \
  npx @letoribo/mcp-graphql-enhanced

Environment Variables

Note: As of version 1.0.0, command line arguments have been replaced with environment variables.

Environment Variable

Description

Default

ENDPOINT

GraphQL endpoint(s). Supports comma-separated list for Multi-Node Architecture.

https://mcp-discord.vercel.app/api/graphiql

HEADERS

JSON string containing headers for requests

{}

ALLOW_MUTATIONS

Enable mutation operations (disabled by default)

false

NAME

Name of the MCP server

mcp-graphql-enhanced

SCHEMA

Path to a local GraphQL schema file or URL

-

MCP_PORT

Port for the HTTP/JSON-RPC server.

6274

ENABLE_HTTP

Enable HTTP transport: auto (default), true, or false

auto

Note on ENABLE_HTTP:

  • auto (default): Automatically enables HTTP only when running in MCP Inspector.

  • true: Always enable HTTP server

  • false: Disable HTTP server completely

πŸš€ Examples

1. Quick Start

Basic startup using the default endpoint.

npx @letoribo/mcp-graphql-enhanced

2. Configuration & Authentication

Running with custom headers (e.g., for API keys or Bearer tokens).

ENDPOINT=https://api.example.com/graphql \
HEADERS='{"Authorization":"Bearer xyz"}' \
npx @letoribo/mcp-graphql-enhanced

3. Advanced Integration

Using a local .graphql file If you want to work with a local schema without querying the API directly.

ENDPOINT=http://localhost:3000/graphql \
SCHEMA=./schema.graphql \
npx @letoribo/mcp-graphql-enhanced

Enabling Mutations (Writes) Mutations are disabled by default for security. To enable them:

ENDPOINT=http://localhost:3000/graphql \
ALLOW_MUTATIONS=true \
npx @letoribo/mcp-graphql-enhanced

Multi-Node Architecture (Federation) Aggregating data from multiple sources into a single unified graph.

ENDPOINT=https://mcp-discord.vercel.app/api/graphiql,https://mcp-neo4j-discord.vercel.app/api/graphiql \
npx @letoribo/mcp-graphql-enhanced

4. Customizing Environment

Example of port configuration and development mode settings.

# Change the HTTP port
MCP_PORT=8080 npx @letoribo/mcp-graphql-enhanced

# Test targeted introspection and explore the schema visually:
ENDPOINT=https://api.github.com/graphql \
HEADERS='{"Authorization":"Bearer YOUR_GITHUB_TOKEN"}' \
ENABLE_HTTP=true \
npx @letoribo/mcp-graphql-enhanced

# Then visit http://localhost:6274/graphiql

If you want to skip manual environment variable setup, use our CLI tool available on npm. If installed globally (npm install -g @letoribo/mcpgql), simply run:

mcpgql

Alternatively, you can run it without global installation using:

npx @letoribo/mcpgql@latest
  • Zero-config start: Automatic discovery and template initialization.

  • Interactive selection: Toggle multiple endpoints and permissions on the fly.

  • Bridge mode: Automatically handles the Federated Bridge setup on localhost:6274.

☁️ Deploy to Cloud

This server is fully containerized and optimized for long-running processes.

Platform

Recommended PORT

Notes

Railway

8080

Set PORT in Variables and update Networking ingress port.

Render

10000

Set PORT in Environment Variables.

Azure Container Apps

8080

Set PORT and ENABLE_HTTP=true in Environment Variables, then enable Ingress targeting the same port.

Quick Azure CLI Deployment

az containerapp up \
  --name mcp-graphql-enhanced \
  --resource-group mcp-graphql-rg \
  --image ghcr.io/letoribo/mcp-graphql-enhanced:latest \
  --ingress external \
  --target-port 8080 \
  --env-vars ENABLE_HTTP=true PORT=8080

Deploy on Railway

Important:

  • For hosted environments, you must set the environment variable ENABLE_HTTP=true in your platform's settings to ensure the HTTP transport layer is active.

  • Ensure your hosting provider's public networking settings are configured to route traffic to the port defined in your PORT environment variable to avoid 502 Bad Gateway errors.

⚠️ Concurrent Cloud Usage & Dynamic Endpoints

While mcp-graphql-enhanced supports switching target endpoints on the fly via the optional endpoint argument, keep state mutability in mind when running in hosted/shared environments (e.g., Render, Railway, Smithery):

  • State Isolation: Providing an endpoint argument dynamically updates the active graph context for the server instance.

  • Best Practice for Concurrent Cloud Requests: If multiple clients, agent sessions, or automated workers share the same cloud instance, always pass the endpoint explicitly in every tool call (query-graphql and introspect-schema).

  • Preventing Context Drift: Relying on the implicitly cached endpoint in a shared environment can lead to race conditions where a concurrent call from another session switches the active upstream URL under your feet.

🌐 Public Live Gateways (Hosted SSE/HTTP Bridges)

If you want to test the bridge instantly without running local Node.js processes, use our hosted cloud endpoints:

Cloudflare Workers Vercel Deployment

Platform

Edge Runtime

Public MCP Endpoint

Cloudflare Workers

Workers V8 (Global Edge)

mcp-graphql-enhanced.letoribo.workers.dev/mcp

Vercel

Node.js Serverless

mcp-graphql-enhanced.vercel.app/mcp

Note: Public gateways operate in shared environments. Remember to supply your explicit endpoint and headers in tool calls to ensure request isolation.

πŸ–₯️ Claude Desktop Configuration Examples

You can connect Claude Desktop to your GraphQL API using either the npx package (recommended for simplicity) or the Docker image (ideal for reproducibility and isolation).

βœ… Option 1: Using npx

{
  "mcpServers": {
    "mcp-graphql-enhanced": {
      "command": "npx",
      "args": ["@letoribo/mcp-graphql-enhanced"],
      "env": {
        "ENDPOINT": "https://your-api.com/graphql"
      }
    }
  }
}

🐳 Option 2: Using Docker (auto-pull supported)

{
  "mcpServers": {
    "mcp-graphql-enhanced": {
      "command": "sh",
      "args": [
        "-c",
        "docker run --rm -i -e ENDPOINT=$ENDPOINT -e HEADERS=$HEADERS -e ALLOW_MUTATIONS=$ALLOW_MUTATIONS ghcr.io/letoribo/mcp-graphql-enhanced:main"
      ],
      "env": {
        "ENDPOINT": "https://your-api.com/graphql",
        "HEADERS": "{\"Authorization\": \"Bearer YOUR_TOKEN\"}",
        "ALLOW_MUTATIONS": "false"
      }
    }
  }
}

πŸ§ͺ Option 3: Using node with local build (for development)

If you’ve cloned the repo and built the project (npm run build β†’ outputs to dist/):

{
  "mcpServers": {
    "mcp-graphql-enhanced": {
      "command": "node",
      "args": ["dist/index.js"],
      "env": {
        "ENDPOINT": "https://your-api.com/graphql",
        "ALLOW_MUTATIONS": "true"
      }
    }
  }
}

πŸ–₯️ Live Playground Integration (mcp-graphiql)

Ever wished your GraphQL queries generated inside Claude Desktop or Antigravity would auto-populate directly into your GraphiQL playground in real time?

@letoribo/mcp-graphql-enhanced provides an HTTP/SSE bridge to mcp-graphiql. Whenever your AI agent calls query-graphql, the payload streams instantly into an active GraphiQL tab, while introspect-schema hot-reloads and updates the Docs explorer in real time when switching endpoints.

Resources

  • graphql-schema: The server exposes the GraphQL schema as a resource that clients can access. This is either the local schema file, a schema file hosted at a URL, or based on an introspection query.

Available Tools

The server provides two main tools:

  1. introspect-schema: Retrieves the GraphQL schema or a subset. Use this first to understand the graph structure.

  • Arguments:

    • typeNames (optional, array): List of specific types to introspect (e.g., ["User", "Message"]). Reduces noise by returning only relevant parts of the graph.

    • typeDepth (optional, number): Controls the recursion level of nested fields (Default: 2).

      Note: typeDepth is only functional when typeNames is provided to narrow the scope.

    • endpoint (optional, string): Target GraphQL HTTP/HTTPS URL to dynamically switch endpoint on the fly before executing introspection.

    • headers (optional, string): JSON stringified object of custom HTTP headers (e.g., '{"Authorization": "Bearer token"}').

  • Note: Filtered introspection is only available when querying a live GraphQL endpoint.

  1. query-graphql: Execute GraphQL queries against the endpoint. By default, mutations are disabled unless ALLOW_MUTATIONS is set to true.

  • Arguments:

    • query (required, string): The GraphQL query or mutation string.

    • variables (optional, string): JSON stringified object of variables.

    • endpoint (optional, string): Target GraphQL HTTP/HTTPS URL to dynamically switch endpoint on the fly before executing query.

    • headers (optional, string): JSON stringified object of custom HTTP headers (e.g., '{"Authorization": "Bearer token"}').

πŸ’‘ Note: Dynamic Headers vs Static env Previously, auth tokens had to be hardcoded statically at startup inside the configuration's "env" block (e.g., in claude_desktop_config.json).

With the optional headers argument added directly to query-graphql and introspect-schema, you get total dynamic control:

  • Keep Secrets in Your Terminal: You don't have to feed your private tokens (like GitHub PATs or Bearer keys) directly into Claude's prompt or static setup. Just set "ENABLE_HTTP": "true", run your cURL commands or local scripts directly in the terminal, and pass headers there. Any headers passed at runtime will override static tokens from your config file. Otherwise, Claude might just laugh at you for sharing your raw secret tokens in the chat!

  • On-the-Fly Switching: You can dynamically inject different auth headers per request or per endpoint right at execution time without restarting the MCP server.

Security Considerations

Mutations are disabled by default to prevent unintended data changes. Always validate HEADERS and SCHEMA inputs in production. Use HTTPS endpoints and short-lived tokens where possible.

Customize for your own server

This is a very generic implementation where it allows for complete introspection and for your users to do whatever (including mutations). If you need a more specific implementation I'd suggest to just create your own MCP and lock down tool calling for clients to only input specific query fields and/or variables. You can use this as a reference.


Note on Contributors

Claude Code was not used in this project. If you're curious how Claude ended up as a co-author via custom MCP architecture, feel free to ask!

Available Tools

2 tools
introspect-schemaA

Retrieve GraphQL schema details or system manifest. READ-ONLY: Non-destructive metadata discovery. Usage: 1. If 'typeNames' is provided: Returns the full SDL (Schema Definition Language) for the requested types, including fields and relations. 2. If 'typeNames' is omitted: Returns a Federated Manifestβ€”a high-level summary of connected nodes, their capabilities, and available domain entities (not the full schema). Use this to navigate the federated graph topology before executing queries.

NameRequiredDescriptionDefault
headersNoJSON stringified object of extra HTTP headers for the introspection request (e.g. '{"Authorization": "Bearer token"}').
endpointNoOptional target GraphQL HTTP/HTTPS URL to dynamically switch endpoint before execution.
typeDepthNoDepth of nested fields to retrieve (0 to 5, default: 2)
typeNamesNoList of specific GraphQL type names to introspect (max 20 types per request). If provided, returns the detailed SDL definitions for these types. If omitted, returns a system-wide Federated Manifest overview.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the safety burden and does so: it declares READ-ONLY/non-destructive and explains that the no-parameter mode returns a high-level summary rather than the full schema, preventing an agent from assuming completeness. It is silent on authentication expectations (only the schema's headers param hints at an Authorization header) and on introspection cost or depth limits beyond the parameter's own range.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then a short safety statement, then a numbered two-branch usage block. Every sentence changes how the tool would be called; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema and no annotations, so the description must explain return shapes, and it does for both branches (full SDL with fields/relations vs high-level manifest). It does not cover error behavior, what happens when 'endpoint' switches the target, or the 20-type limit's failure mode, leaving minor gaps for a 4-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are already documented, making 3 the baseline. The description reinforces the pivotal semantics of 'typeNames' (present vs absent changes the entire response shape), but adds nothing for 'endpoint', 'headers', or 'typeDepth' beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (retrieve) and resource (GraphQL schema/SDL or federated manifest), and clearly splits the two behaviors by the presence of 'typeNames'. The closing phrase 'before executing queries' implicitly distinguishes it from the query-graphql sibling, so an agent can tell the two apart without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use rules: supply 'typeNames' for detailed SDL, omit it for a federation-wide manifest, and use the manifest to orient before running queries. It stops short of naming query-graphql explicitly or stating when NOT to introspect (e.g. cost/latency of deep introspection).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query-graphqlA

Execute GraphQL operations (queries and mutations) against the federated system. WARNING: This tool performs remote operations. 'Mutation' operations will modify persistent state; execute these only when a state change is intended. Prerequisites: Verify schema structure using 'introspect-schema' before executing complex queries. Security: Inherits environment-based authentication. Returns: A JSON object containing the execution result ('data') or a list of 'errors' in case of failure.

NameRequiredDescriptionDefault
queryYesThe GraphQL query or mutation string. Example: 'query { guilds { id name } }'.
headersNoJSON stringified object of extra HTTP headers for the request.
endpointNoOptional target GraphQL HTTP/HTTPS URL to dynamically switch endpoint before execution.
variablesNoJSON stringified object of variables. Example: '{"id": "123"}'.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does so well: it discloses that the tool performs remote operations, that mutations modify persistent state, that authentication is inherited from the environment, and that failures return an errors list. These are the key behavioral facts an agent needs beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized into clear warning, prerequisite, security, and return-value statements with no filler. It is slightly longer than a minimal two-sentence description, but each section contributes a distinct piece of operational knowledge.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given four parameters and no output schema or annotations, the description covers the essential operating context: when to verify schema, mutation risk, authentication model, and expected return structure. No critical information needed to call the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description adds value by warning that the required query string may contain operations that mutate persistent state, and by noting the return shape. It does not repeat schema descriptions, but provides meaningful semantic context for the query parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action verb ('Execute') and target ('GraphQL operations ... against the federated system'), distinguishing this as the operation-execution tool while the sibling 'introspect-schema' is referenced only for schema verification. The clarification that it handles both queries and mutations further disambiguates its role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the sibling tool as a prerequisite step ('Verify schema structure using introspect-schema before executing complex queries'), and warns to execute mutations only when a state change is intended. This gives the agent clear when-to-use and when-not-to-use guidance for mutation operations.

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.

  1. 1 tool updatev4.15.4
    • Changedintrospect-schema2 fields changed
      • changedInput schema / properties / typeDepth / description
        Previous value: -"Depth of nested fields to retrieve (default: 2)"New value: +"Depth of nested fields to retrieve (0 to 5, default: 2)"
      • changedInput schema / properties / typeNames / description
        Previous value: -"List of specific GraphQL type names to introspect. If provided, returns the detailed SDL definitions for these types. If omitted, returns a system-wide Federated Manifest overview."New value: +"List of specific GraphQL type names to introspect (max 20 types per request). If provided, returns the detailed SDL definitions for these types. If omitted, returns a system-wide Federated Manifest overview."
  2. 2 tool updatesv4.15.2
    • Changedintrospect-schema2 fields changed
      • addedInput schema / properties / endpoint
        Added value: +{
        +  "description": "Optional target GraphQL HTTP/HTTPS URL to dynamically switch endpoint before execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / headers
        Added value: +{
        +  "description": "JSON stringified object of extra HTTP headers for the introspection request (e.g. '{\"Authorization\": \"Bearer token\"}').",
        +  "type": "string"
        +}
    • Changedquery-graphql1 field changed
      • addedInput schema / properties / endpoint
        Added value: +{
        +  "description": "Optional target GraphQL HTTP/HTTPS URL to dynamically switch endpoint before execution.",
        +  "type": "string"
        +}
  3. 1 tool updatev4.13.1
    • Addedintrospect-schema
  4. 1 tool updatev4.12.0
    • Removedintrospect-schema
  5. 1 tool updatev4.9.2
    • Changedintrospect-schema1 field changed
      • removedInput schema / properties / typeDepth / default
        Removed value: -2
  6. 2 tool updatesv4.8.0
    • Changedintrospect-schema2 fields changed
      • addedInput schema / properties / typeDepth
        Added value: +{
        +  "default": 2,
        +  "description": "Depth of nested fields to retrieve (default: 2)",
        +  "type": "number"
        +}
      • changedInput schema / properties / typeNames / description
        Previous value: -"List of specific GraphQL type names to introspect. If omitted, the full schema is returned (use with caution on large APIs)."New value: +"List of specific GraphQL type names to introspect. If provided, returns the detailed SDL definitions for these types. If omitted, returns a system-wide Federated Manifest overview."
    • Changedquery-graphql3 fields changed
      • changedInput schema / properties / headers / description
        Previous value: -"JSON string of extra HTTP headers for the request."New value: +"JSON stringified object of extra HTTP headers for the request."
      • changedInput schema / properties / query / description
        Previous value: -"The GraphQL query or mutation string."New value: +"The GraphQL query or mutation string. Example: 'query { guilds { id name } }'."
      • changedInput schema / properties / variables / description
        Previous value: -"JSON string of variables for the operation."New value: +"JSON stringified object of variables. Example: '{\"id\": \"123\"}'."
  7. 2 tool updatesv4.2.0
    • Changedintrospect-schema1 field changed
      • changedInput schema / properties / typeNames / description
        Previous value: -"List of type names to introspect"New value: +"List of specific GraphQL type names to introspect. If omitted, the full schema is returned (use with caution on large APIs)."
    • Changedquery-graphql3 fields changed
      • changedInput schema / properties / headers / description
        Previous value: -"JSON string of extra headers"New value: +"JSON string of extra HTTP headers for the request."
      • changedInput schema / properties / query / description
        Previous value: -"The GraphQL query or mutation string"New value: +"The GraphQL query or mutation string."
      • changedInput schema / properties / variables / description
        Previous value: -"JSON string of variables"New value: +"JSON string of variables for the operation."
  8. 2 tool updatesv3.9.3
    • Addedintrospect-schema
    • Addedquery-graphql

TDQS

A4.4/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have clearly distinct purposes: introspect-schema is read-only metadata discovery, while query-graphql executes queries and mutations. The descriptions explicitly contrast their roles and even recommend using one before the other.

Naming Consistency5/5

Both names use a consistent kebab-case verb-noun pattern (introspect-schema, query-graphql). The convention is predictable and easy to parse.

Tool Count3/5

Two tools is thin for a GraphQL server, even an enhanced one. The surface is minimal but arguably sufficient for introspection plus execution, though it feels under-scoped for broader GraphQL workflows.

Completeness4/5

The pair covers the core GraphQL lifecycle: schema discovery and operation execution, including mutations. Minor gaps exist, such as dedicated subscription support or validation utilities, but agents can work around them.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A MCP server that exposes GraphQL schema information to LLMs like Claude. This server allows an LLM to explore and understand large GraphQL schemas through a set of specialized tools, without needing to load the whole schema into the context
    22 npm
    46
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    GraphQL MCP Server that acts as a bridge allowing MCP clients (like Cursor or Claude Desktop) to interact with target GraphQL APIs through standard tools for schema introspection and operation execution.
    2
    7 npm
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP that can proxy any GraphQL API and expose graphql operations as mcp tools.
    21 npm
    18
    Apache 2.0