Skip to main content
Glama
k-edge

mcp-graphql-bridge

by k-edge

mcp-graphql-bridge

npm version CI License: MIT Node.js >= 20

A generic MCP (Model Context Protocol) server that bridges any GraphQL API to Claude Code. It introspects your GraphQL schema and exposes each query and mutation as an individual tool, letting Claude interact with your API directly.

How it works

On startup the server will:

  1. Look for a schema-introspection.json file in the working directory (fast, no network call)

  2. If not found, run live introspection against GRAPHQL_INTROSPECTION_URL

  3. Register one tool per query (query__<name>) and one per mutation (mutation__<name>)

  4. Always register a generic execute_graphql fallback tool and a get_type_details explorer tool

Related MCP server: mcp-graphql-tools

Requirements

  • Node.js >= 20

Setup

Step 1: Install

npm install -g mcp-graphql-bridge

Option B: Clone and build from source

git clone https://github.com/murilojrpereira/mcp-graphql-bridge.git
cd mcp-graphql-bridge
npm install
npm run build

Step 2: Configure environment variables

Variable

Required

Description

GRAPHQL_API_URL

No

Endpoint used for queries and mutations. Defaults to a public demo API (countries.trevorblades.com) if unset — replace with your own for real use.

GRAPHQL_INTROSPECTION_URL

No

Endpoint used for schema introspection. Defaults to GRAPHQL_API_URL if unset.

GRAPHQL_TOKEN

No

Bearer token for GraphQL authentication (used for query/mutation execution). Omit for public APIs.

GRAPHQL_INTROSPECTION_TOKEN

No

Bearer token for schema introspection, if it requires different credentials than execution (e.g. a separate schema registry). Defaults to GRAPHQL_TOKEN if unset.

MCP_AUTH_TOKEN

No

Bearer token required by the hosted /mcp HTTP endpoint when MCP_TRANSPORT=http

GRAPHQL_MAX_TOOLS

No

Maximum number of query/mutation tools to register. Queries are prioritized over mutations when truncating. Default 128.

GRAPHQL_INCLUDE_MUTATIONS

No

Set to false to exclude every mutation field entirely, for a read-only deployment. Default true.

GRAPHQL_MAX_RETRIES

No

Retries (0–5) for 429/502/503/504 responses, honoring Retry-After when present. Default 0 (disabled).

For schemas with hundreds of fields (GitHub's GraphQL API has 284 root fields — 32 queries, 252 mutations), GRAPHQL_MAX_TOOLS and GRAPHQL_INCLUDE_MUTATIONS are what keep registration bounded and predictable. If the cap truncates the schema, stderr logs exactly how many queries/mutations were registered vs. available.

No configuration is required to try the server — with nothing set, it starts against the public demo API above and logs that it's doing so. See docs/architecture.md for the full token model and why the GraphQL endpoint is fixed per deployment rather than a per-request parameter.

You can set these in a .env file at the project root:

GRAPHQL_API_URL=https://your-api.example.com/graphql
GRAPHQL_INTROSPECTION_URL=https://your-api.example.com/graphql
GRAPHQL_TOKEN=your-bearer-token

Or pass them directly via the claude mcp add command (see below).

Step 3: (Optional) Pre-generate schema snapshot

By default the server introspects your schema live on startup — no file needed, and it automatically retries at a shallower query depth if your API rejects the full-depth attempt (some APIs, especially CDN-fronted ones, enforce a query depth limit). Use this step only if your API has introspection disabled entirely in production, or you want faster startup times:

curl -s -X POST https://your-api.example.com/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer your-bearer-token" \
  -d '{"query":"{ __schema { queryType { fields { name description args { name description defaultValue type { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name } } } } } } } } type { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name } } } } } } } } } mutationType { fields { name description args { name description defaultValue type { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name } } } } } } } } type { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name } } } } } } } } } } }"}' \
  > schema-introspection.json

If your API rejects this with a depth/complexity-limit error, shrink the ofType { ... } nesting (each level resolves one more NonNull/List wrapper — most real-world types need 2-3 levels; only doubly-wrapped lists like [[Int!]!]! need more).

Adding to Claude Code

Option A: User scope (just for you)

If installed from npm:

claude mcp add --transport stdio \
  --env GRAPHQL_API_URL=https://your-api.example.com/graphql \
  --env GRAPHQL_INTROSPECTION_URL=https://your-api.example.com/graphql \
  --env GRAPHQL_TOKEN=your-bearer-token \
  graphql-bridge -- mcp-graphql-bridge

If cloned from source:

claude mcp add --transport stdio \
  --env GRAPHQL_API_URL=https://your-api.example.com/graphql \
  --env GRAPHQL_INTROSPECTION_URL=https://your-api.example.com/graphql \
  --env GRAPHQL_TOKEN=your-bearer-token \
  graphql-bridge -- node /absolute/path/to/mcp-graphql-bridge/dist/index.js

Important: Make sure to use mcp-graphql-bridge/dist/index.js (the compiled output), not mcp-graphql-bridge/index.js. The TypeScript source must be built first with npm run build, and the entry point is in the dist/ folder.

Option B: Project scope (shared with your team via .mcp.json)

claude mcp add --transport stdio --scope project \
  --env GRAPHQL_API_URL=https://your-api.example.com/graphql \
  --env GRAPHQL_INTROSPECTION_URL=https://your-api.example.com/graphql \
  --env GRAPHQL_TOKEN=your-bearer-token \
  graphql-bridge -- mcp-graphql-bridge

Note: Use absolute paths. All --env and --transport flags must come before the server name.

Verify the connection

claude mcp list

Then in a Claude Code session, run /mcp to see available servers and tools.

Examples

Two worked walkthroughs — a small public schema with no configuration needed, then a large, real enterprise-scale schema requiring auth and tool-count limits.

Example 1: Countries API (small schema, no auth)

This is the zero-config default — nothing to install or configure beyond the server itself.

  1. Add the server with no environment variables at all:

    claude mcp add --transport stdio graphql-countries -- mcp-graphql-bridge
  2. Restart Claude Code (or run /mcp to confirm graphql-countries is connected). You should see tools like query__country, query__countries, and query__continents.

  3. Ask Claude:

    Using graphql-countries, find the country with code "BR", then list its continent's other countries.

    Claude calls query__country({ code: "BR", __fields: "{ name continent { code name } }" }), then query__continent or query__countries({ __fields: "{ name }" }) filtered by the result.

  4. Try an invalid code to see error passthrough:

    Look up the country with code "ZZZ".

    Returns the GraphQL API's own error text — the bridge passes it through rather than masking it.

Example 2: GitHub GraphQL API (large schema, auth + tool limits)

GitHub's GraphQL API has 284 root fields (32 queries, 252 mutations) — far more than the GRAPHQL_MAX_TOOLS default of 128, and it needs a token for every request, including introspection (unlike GitHub's REST API, which allows some anonymous reads).

  1. Add the server, scoped to read-only access:

    export GH_TOKEN=ghp_your_personal_access_token  # or: source a gitignored .env file first
    
    claude mcp add --transport stdio graphql-github \
      --env GRAPHQL_API_URL=https://api.github.com/graphql \
      --env GRAPHQL_INTROSPECTION_URL=https://api.github.com/graphql \
      --env GRAPHQL_TOKEN=$GH_TOKEN \
      --env GRAPHQL_INCLUDE_MUTATIONS=false \
      graphql-bridge -- mcp-graphql-bridge

    GRAPHQL_INCLUDE_MUTATIONS=false registers all 32 (read-only) queries and zero mutations — comfortably under the cap, and a meaningfully safer default for an AI agent than exposing all 252 write operations.

  2. Ask Claude:

    Using graphql-github, look up the repository facebook/react and tell me its star count.

    Claude calls query__repository({ owner: "facebook", name: "react", __fields: "{ name stargazerCount }" }).

  3. To also reach mutations, drop GRAPHQL_INCLUDE_MUTATIONS=false and raise the cap (GRAPHQL_MAX_TOOLS=400), understanding that this exposes write access to your GitHub account scoped to whatever permissions your token has.

Available tools

Tool

Description

query__<name>

One tool per GraphQL query field

mutation__<name>

One tool per GraphQL mutation field

execute_graphql

Generic fallback — run any query or mutation (mutations rejected if GRAPHQL_INCLUDE_MUTATIONS=false)

get_type_details

Explore fields of a specific GraphQL type

All per-operation tools accept a special __fields argument where you can provide a custom GraphQL selection set (e.g. { id name status }). If omitted, only scalar fields are returned.

Per-call auth override: every tool (including execute_graphql) also accepts bearer_token and custom_headers arguments. If provided, they override GRAPHQL_TOKEN/no-auth for that single request only, letting Claude switch credentials per call without restarting the server.

Security

  • The target API is fixed per deployment, never a per-request parameter. Individual tool calls can override credentials (bearer_token, custom_headers) but never the destination host — GRAPHQL_API_URL is set once at deployment time. A shared server that let callers redirect it to an arbitrary destination would be a Server-Side Request Forgery (SSRF) primitive; this design rules that out by construction.

  • Configured and per-call secrets are redacted from every response before it reaches the calling LLM.

  • GRAPHQL_INCLUDE_MUTATIONS=false excludes every mutation field from registration for a genuinely read-only deployment — a meaningful trust boundary GraphQL's type system already encodes, rather than relying on token scope alone. This is enforced for execute_graphql too: it parses the query and rejects any mutation when this flag is off, rather than only omitting the convenience mutation__* tools while leaving the generic fallback able to run anything.

  • MCP_AUTH_TOKEN gates the HTTP transport's /mcp endpoint for public-routable deployments; requests are capped at 10MB.

See docs/architecture.md for the full design rationale and SECURITY.md to report a vulnerability.

Docker

Build the image

docker build -t mcp-graphql-bridge .

Add to Claude Code via Docker

claude mcp add --transport stdio \
  --env GRAPHQL_API_URL=https://your-api.example.com/graphql \
  --env GRAPHQL_INTROSPECTION_URL=https://your-api.example.com/graphql \
  --env GRAPHQL_TOKEN=your-bearer-token \
  graphql-bridge -- docker run -i --rm \
  -e GRAPHQL_API_URL -e GRAPHQL_INTROSPECTION_URL -e GRAPHQL_TOKEN \
  mcp-graphql-bridge

Note: The -i flag (no -t) is required — it keeps stdin open for the MCP stdio protocol.

HTTP deployment

For hosted MCP access, run the HTTP transport instead of stdio:

docker build -f Dockerfile.http -t mcp-graphql-bridge-http .
docker run --rm -p 8080:8080 \
  -e GRAPHQL_API_URL=https://your-api.example.com/graphql \
  -e GRAPHQL_INTROSPECTION_URL=https://your-api.example.com/graphql \
  -e GRAPHQL_TOKEN=your-bearer-token \
  mcp-graphql-bridge-http

Health checks are available at /health; MCP requests are served at /mcp.

For public-routable deployments, set MCP_AUTH_TOKEN and configure clients to send Authorization: Bearer <token> to /mcp.

See docs/deployment.md for AWS, Cloudflare, and other container hosting options.

Development

npm run dev   # watch mode: rebuilds and restarts on file changes
npm run build # one-off TypeScript compile
npm start     # run the compiled server

Troubleshooting

Error: Cannot find module '.../index.js'

If you see an error like:

Error: Cannot find module '/path/to/mcp-graphql-bridge/index.js'

You are pointing to the wrong file. The TypeScript source must be compiled first, and the entry point is in the dist/ folder:

Correct path: /path/to/mcp-graphql-bridge/dist/index.js Wrong path: /path/to/mcp-graphql-bridge/index.js

Fix:

  1. Ensure you ran npm run build (creates the dist/ folder)

  2. Update your MCP configuration to use the full path ending in /dist/index.js

Schema introspection fails

If the server starts but shows "Schema introspection failed", your GraphQL API may have introspection disabled in production. Use the curl command in step 3 of Setup to pre-generate a schema-introspection.json file.

Tools not appearing in Claude Code

  1. Run claude mcp list to verify the server is registered

  2. Run /mcp in a Claude Code session to see available tools

  3. Check that your GraphQL API's environment variables are set correctly (GRAPHQL_API_URL, GRAPHQL_INTROSPECTION_URL, GRAPHQL_TOKEN) — these are optional and default to a public demo API, so if tools still aren't appearing with your own API configured, check its credentials and endpoint URLs

Available Tools

8 tools
execute_graphqlA

Execute any GraphQL query or mutation against the API. Use this when no specific tool exists for your operation.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesFull GraphQL query or mutation string including selection set
variablesNoVariables for the operation
bearer_tokenNoBearer token to authenticate this request (overrides GRAPHQL_TOKEN)
custom_headersNoAdditional request headers as key-value pairs, e.g. {"X-Tenant-ID": "abc"}

TDQS

A3.6/5.0
Behavior2/5

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

No annotations are provided, so the description bears full responsibility for behavior disclosure. It notes that mutations can be executed, implying side effects, but does not warn about destructiveness, authentication requirements, rate limits, or error behavior. For a tool that can run arbitrary mutations, this is a significant omission.

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?

Two sentences with no filler: the action is front-loaded, and the usage routing condition follows directly. Every clause earns its place.

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

Completeness2/5

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

With no output schema and a high-complexity tool that accepts raw GraphQL, the description should clarify the response format and caution about side effects. It only covers purpose and usage, leaving invocation semantics like response handling and safety incomplete.

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?

Input schema covers 100% of parameters with descriptions, so baseline 3 applies. The tool description itself adds no parameter meaning beyond the schema, but the schema already documents each field's purpose adequately.

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 ('Execute') and resource ('any GraphQL query or mutation against the API'), and distinguishes itself from siblings by positioning itself as the generic fallback when no specific tool exists. The behavior is immediately clear and unambiguous.

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?

Explicitly says 'Use this when no specific tool exists for your operation,' which is a clear positive condition and implies the exclusion when a specific tool is available. It doesn't name the specific sibling tools, but the condition is sufficient for routing an agent to look for more targeted alternatives.

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

get_type_detailsA

Get fields of a specific GraphQL type to know what to put in __fields

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNameYesGraphQL type name, e.g. 'Repository', 'User', 'Issue'

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It correctly implies a read-only introspection operation, but it does not describe the output shape, behavior for unknown types, or any side effects.

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?

The description is one concise sentence with no redundant words. The main action and purpose are front-loaded immediately.

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?

For a single-parameter read-only introspection helper, the description provides enough context to call it correctly. Minor gaps like exact output structure or error behavior do not seriously hinder use.

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?

The single typeName parameter is already fully documented in the schema, including examples. The description adds no additional parameter-level detail, only overall purpose.

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?

The description names a specific resource ('fields of a specific GraphQL type') and a concrete use case ('to know what to put in __fields'). This makes it easy to distinguish from sibling tools like execute_graphql.

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?

It clearly indicates when to use the tool: when the agent needs to know the fields to supply to __fields. It does not explicitly name sibling alternatives or exclusions, so it stops short of full routing guidance.

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

query__continentD

[QUERY] continent

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes(ID!)
__fieldsNoGraphQL selection set for the return type, e.g. '{ id name description }'. If omitted, only scalar/id fields are returned.
bearer_tokenNoBearer token to authenticate this request (overrides GRAPHQL_TOKEN)
custom_headersNoAdditional request headers as key-value pairs, e.g. {"X-Tenant-ID": "abc"}

TDQS

D1.9/5.0
Behavior1/5

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

With no annotations, the description must disclose behavior, but it reveals nothing beyond the word 'query'. It does not mention authentication requirements, read-only nature, error behavior, pagination, or any side effects.

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

Conciseness2/5

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

The description is extremely short, but this is under-specification rather than effective conciseness. It provides no useful information beyond the tool name and does not earn its place as a functional description.

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

Completeness1/5

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

The tool has 4 parameters, nested objects, no output schema, and no annotations, yet the description offers no context about return shape, how to use the required code parameter, or how this query behaves. An agent cannot reliably select or invoke this tool based on the description alone.

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 the schema already documents all parameters including code, __fields, bearer_token, and custom_headers. The description adds no parameter-level meaning, but the baseline of 3 applies because the schema carries the burden.

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

Purpose2/5

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

The description '[QUERY] continent' merely restates the tool name and does not explain what querying a continent returns or how it differs from siblings like query__continents, query__countries, or query__country. It names a resource but provides no distinguishing information.

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

Usage Guidelines2/5

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 such as query__continents or query__countries. The description gives no context about selection criteria, prerequisites, or situations where a different tool would be appropriate.

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

query__continentsC

[QUERY] continents

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNo(ContinentFilterInput)
__fieldsNoGraphQL selection set for the return type, e.g. '{ id name description }'. If omitted, only scalar/id fields are returned.
bearer_tokenNoBearer token to authenticate this request (overrides GRAPHQL_TOKEN)
custom_headersNoAdditional request headers as key-value pairs, e.g. {"X-Tenant-ID": "abc"}

TDQS

C2.1/5.0
Behavior2/5

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

With no annotations, the description bears the full burden of behavioral disclosure. '[QUERY]' at least implies a read operation, but nothing is said about side effects, authentication expectations, filtering behavior, pagination, or return shape.

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

Conciseness2/5

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

The description is extremely short, but this is under-specification rather than useful conciseness. A two-word label cannot convey the behavior or selection criteria an agent needs.

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

Completeness1/5

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

This tool has four parameters, no output schema, no annotations, and many sibling query tools, yet the description provides no operational context. An agent cannot reliably know what filter formats are expected, whether __fields is required, or how this differs from the singular continent query.

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?

The input schema already documents all four parameters with 100% coverage. The description adds no additional meaning to filter, __fields, bearer_token, or custom_headers, so baseline 3 is appropriate.

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

Purpose2/5

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

The description is simply '[QUERY] continents', which essentially restates the tool name. It offers no meaningful explanation of what the tool returns or how it differs from the sibling query__continent.

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

Usage Guidelines2/5

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 query__continent, query__countries, or execute_graphql. The agent must infer the intended usage entirely from the name, with no explicit context or exclusions.

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

query__countriesD

[QUERY] countries

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNo(CountryFilterInput)
__fieldsNoGraphQL selection set for the return type, e.g. '{ id name description }'. If omitted, only scalar/id fields are returned.
bearer_tokenNoBearer token to authenticate this request (overrides GRAPHQL_TOKEN)
custom_headersNoAdditional request headers as key-value pairs, e.g. {"X-Tenant-ID": "abc"}

TDQS

D1.9/5.0
Behavior1/5

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

No annotations are present, so the description carries full responsibility for behavioral disclosure. It only says 'query countries' and mentions no auth requirements, read-only nature, pagination, filtering behavior, or return format. This is effectively a missing behavioral description.

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

Conciseness2/5

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

The description is extremely short, but this is under-specification rather than effective conciseness. It provides no front-loaded useful structure because it contains almost no substantive content beyond the tool name.

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

Completeness1/5

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

With no annotations, no output schema, and multiple sibling tools, the description is far too thin to help an agent call this tool correctly. It fails to explain what countries data is returned, how filtering works, what fields are available, or how this differs from query__country.

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 the baseline is 3 even though the description itself says nothing about parameters. The schema already documents filter, __fields, bearer_token, and custom_headers, so the description does not need to add much here.

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

Purpose2/5

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

The description is "[QUERY] countries", which simply restates the tool name query__countries. It indicates the operation and resource but adds no information beyond the name itself, so it falls into tautology rather than a meaningful purpose statement.

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

Usage Guidelines2/5

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

There is no guidance about when to use this tool versus siblings like query__country or query__continents. The plural 'countries' weakly implies listing multiple countries, but the description offers no explicit context, conditions, or exclusions.

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

query__countryC

[QUERY] country

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes(ID!)
__fieldsNoGraphQL selection set for the return type, e.g. '{ id name description }'. If omitted, only scalar/id fields are returned.
bearer_tokenNoBearer token to authenticate this request (overrides GRAPHQL_TOKEN)
custom_headersNoAdditional request headers as key-value pairs, e.g. {"X-Tenant-ID": "abc"}

TDQS

C2.1/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure, but "[QUERY]" only suggests a read-style operation. It does not disclose authentication needs, required argument behavior, return shape, or any other behavioral traits an agent would need to invoke it confidently.

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

Conciseness2/5

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

The description is short but under-specified rather than appropriately concise. It is a single unhelpful phrase with no structure, no context, and no explanatory value for an agent.

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

Completeness1/5

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

This tool has four parameters, one required field, nested objects, and ambiguous sibling relationships, yet the description provides none of the context needed to select or call it correctly. It is effectively a stub.

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%, and the schema already documents `code`, `__fields`, `bearer_token`, and `custom_headers`. The description adds no parameter meaning, but per the high-coverage baseline, it does not need to compensate.

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

Purpose2/5

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

The description "[QUERY] country" is a tautology that restates the tool name without explaining what querying a country returns, how it is identified, or how it differs from query__countries or execute_graphql. It identifies a resource and a generic operation, but stops short of a usable purpose statement.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool versus siblings like query__countries or execute_graphql. There is no mention of prerequisites, alternative tools, or conditions such as needing a specific country code.

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

query__languageD

[QUERY] language

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes(ID!)
__fieldsNoGraphQL selection set for the return type, e.g. '{ id name description }'. If omitted, only scalar/id fields are returned.
bearer_tokenNoBearer token to authenticate this request (overrides GRAPHQL_TOKEN)
custom_headersNoAdditional request headers as key-value pairs, e.g. {"X-Tenant-ID": "abc"}

TDQS

D1.6/5.0
Behavior1/5

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

There are no annotations, so the description carries full responsibility for behavioral disclosure. It discloses nothing about authentication requirements, error behavior, rate limits, mutation safety, or what the query returns. The bare query prefix gives the agent no meaningful behavioral understanding.

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

Conciseness2/5

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

"[QUERY] language" is extremely short, but this is under-specification rather than effective conciseness. It contains no useful content and earns no structural credit for front-loading meaningful information.

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

Completeness1/5

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

This tool has four parameters, no annotations, no output schema, and a GraphQL-like interface with sibling operations. The description is completely inadequate for an agent to know how to call it correctly, what the response looks like, or how it relates to query__languages and execute_graphql.

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 the schema already documents all four parameters, including the required code and the optional __fields, bearer_token, and custom_headers. The description adds no extra parameter meaning, but the baseline of 3 applies because the structured schema carries the parameter documentation burden adequately.

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

Purpose1/5

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

The description "[QUERY] language" merely restates the tool name and operation prefix without stating what the tool actually does, what a language is in this context, or how it differs from siblings like query__languages. It provides no specific verb and resource description beyond the name itself, making it essentially a tautology.

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

Usage Guidelines2/5

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 query__languages, query__countries, or get_type_details, nor does it mention any exclusions or alternatives. An agent is left to infer usage from the name alone.

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

query__languagesC

[QUERY] languages

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNo(LanguageFilterInput)
__fieldsNoGraphQL selection set for the return type, e.g. '{ id name description }'. If omitted, only scalar/id fields are returned.
bearer_tokenNoBearer token to authenticate this request (overrides GRAPHQL_TOKEN)
custom_headersNoAdditional request headers as key-value pairs, e.g. {"X-Tenant-ID": "abc"}

TDQS

C2.3/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. '[QUERY]' weakly implies a read-only operation, but no traits such as pagination, filtering behavior, authentication requirements, or response format are disclosed.

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

Conciseness2/5

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

The description is extremely short, containing no wasted words, but it is under-specified rather than appropriately concise. It lacks the structure needed to convey meaningful usage.

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

Completeness1/5

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

The description provides almost no context for a tool with optional parameters, no output schema, and no annotations. It fails to explain what languages are returned, how the filter works, or how this tool relates to sibling query__language and execute_graphql.

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%, with each parameter documented including __fields, bearer_token, custom_headers, and filter type. The description adds no extra parameter meaning, but the schema already covers this dimension, so baseline 3 is appropriate.

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

Purpose3/5

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

The description '[QUERY] languages' identifies a query operation on a language resource, which is more than a pure restatement but still vague. It gives no detail on what is returned or how it differs from the sibling query__language beyond plurality.

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

Usage Guidelines2/5

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. Sibling query__language and query__languages are listed nearby, but the description makes no attempt to distinguish them or explain 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. Dates show when Glama detected each change.

  1. 8 tool updatesv2.2.0
    • First observedexecute_graphql
    • First observedget_type_details
    • First observedquery__continent
    • First observedquery__continents
    • First observedquery__countries
    • First observedquery__country
    • First observedquery__language
    • First observedquery__languages

TDQS

C2.8/5.0
Disambiguation4/5

The query__* tools are clearly separated by resource and singular/plural variant, and get_type_details serves a distinct introspection role. execute_graphql overlaps with the specific query tools by design, but its fallback purpose is clearly stated, so misselection is unlikely.

Naming Consistency4/5

The six query tools follow a consistent query__<resource> pattern, and the singular/plural distinction is predictable. The generic tools get_type_details and execute_graphql use a different verb_noun style, which is a minor deviation but not confusing.

Tool Count5/5

Eight tools is a lean, focused set for a GraphQL bridge: six common resource queries plus two generic utilities for schema inspection and arbitrary operations. Each tool has a clear purpose and the count feels appropriate.

Completeness5/5

The generic execute_graphql tool ensures any query or mutation can be run, covering coverage gaps beyond the named resources. get_type_details supports the workflow of discovering types and fields, so the surface has no obvious dead ends.

Maintenance

ActivityMaintained
ResponsivenessSyncing

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

Related MCP Servers

Latest Blog Posts

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/k-edge/mcp-graphql-core'

If you have feedback or need assistance with the MCP directory API, please join our Discord server