Gadget MCP Server
This is a read-only MCP server that lets an agent explore and query any Gadget app's data through GraphQL introspection.
Explore the schema: list all models (
list_models), get every model and field at once (get_schema_overview), or inspect one model's fields and types (introspect_model).Discover filters and actions: see valid filter fields/shapes (
introspect_filters) and list available actions/mutations with their arguments (introspect_actions).Query data: fetch records from any model with filtering, sorting, pagination cursors, and field selection (
query_records), or count records with an optional filter (count_records).Fetch a single record: retrieve one record by model, ID, and field selection (
get_record).Run raw GraphQL: execute arbitrary read-only queries with variables for nested relations or complex filtering (
run_graphql); mutations are blocked.No write, update, or delete operations are exposed in this schema — it is read-only.
Provides tools to interact with Gadget applications via GraphQL, enabling users to list models, perform introspection, and execute read-only queries against application data.
Enables read-only access to Shopify-related data stored in Gadget apps, allowing users to query records such as Shopify orders and inspect Shopify-specific data models.
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., "@Gadget MCP Servershow me the fields on the shopifyOrder model"
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.
@stronger-ecommerce/gadget-mcp
Generic MCP server for any Gadget app — read-only by default, with optional write and delete tools. Query any model via GraphQL introspection — no generated client required.
Built by Stronger eCommerce.
Install as a Claude Code plugin
/plugin install gadget-mcp --marketplace Stronger-eCommerce/gadget-mcp@releaseOn older Claude Code versions, run /plugin marketplace add Stronger-eCommerce/gadget-mcp@release and then /plugin install gadget-mcp@stronger-ecommerce. The plugin lives in plugin/, and its README lists exactly what it runs, sends and stores. See also the privacy policy.
Claude Code asks for your app slug and API key when you enable the plugin. The key is stored in your OS keychain. It also asks whether to allow writes and deletes, which models writes may touch, and what to redact. The plugin includes a skill that teaches Claude a safe workflow for these tools. Use /plugin to change the settings later.
Related MCP server: mcp-graphql-bridge
Quick setup (recommended)
Run the interactive setup wizard from inside your Gadget project directory.
It auto-detects your app slug from .gadget/sync.json and writes your config automatically.
npx @stronger-ecommerce/gadget-mcp setupThe wizard will:
Detect your app slug from
.gadget/sync.json(if present)Prompt for your API key and environment
Output the ready-to-run
claude mcp addcommand for Claude CodeAutomatically write your
~/.cursor/mcp.jsonfor Cursor
Manual setup
1. Get a production API key
Go to https://<your-app>.gadget.app/edit/settings/api-keys and create a key with read access.
2. Register in Claude Code
claude mcp add my-app-gadget \
-e GADGET_APP=my-app \
-e GADGET_API_KEY=your_key_here \
-- npx @stronger-ecommerce/gadget-mcp@latestRegister multiple apps under different names:
claude mcp add app-one-gadget \
-e GADGET_APP=my-first-app \
-e GADGET_API_KEY=key1 \
-- npx @stronger-ecommerce/gadget-mcp@latest
claude mcp add app-two-gadget \
-e GADGET_APP=my-second-app \
-e GADGET_API_KEY=key2 \
-- npx @stronger-ecommerce/gadget-mcp@latest3. Register in Cursor
Add to ~/.cursor/mcp.json:
{
"mcpServers": {
"app-one-gadget": {
"command": "npx",
"args": ["@stronger-ecommerce/gadget-mcp@latest"],
"env": {
"GADGET_APP": "my-first-app",
"GADGET_API_KEY": "key1"
}
},
"app-two-gadget": {
"command": "npx",
"args": ["@stronger-ecommerce/gadget-mcp@latest"],
"env": {
"GADGET_APP": "my-second-app",
"GADGET_API_KEY": "key2"
}
}
}
}Environment variables
Variable | Required | Default | Description |
| Yes | — | App slug, e.g. |
| Yes | — | Production API key |
| No |
|
|
| No | off |
|
| No | off |
|
| No | — | Path to a JSONL file; every executed write is appended to it |
| No | all | Comma-separated models (or global action names) writes are limited to, e.g. |
| No |
| Where |
| No | off |
|
| No | — | Set to disable the daily npm update check |
Tools
Tool | Description |
| List all models available in the app |
| Show fields and types for a model |
| Query any model with filters and field selection |
| Fetch a single record by ID |
| Count records, optionally filtered |
| Show filter fields for a model |
| List actions (mutations) and their arguments |
| All models and fields in one call |
| Run a raw read-only GraphQL query (mutations are blocked) |
| Export many records (up to 100k) to a CSV or JSON file |
| Count records grouped by a field, e.g. orders by status |
| Read recent app logs (via |
| Build a pre-filled GitHub bug report link (nothing is posted) |
Optional write tools
Off by default. Tools are only listed to the client when their flag is set, and the server refuses them otherwise.
Tool | Flag | Description |
|
| Run a model's |
|
| Run a model's |
|
| Run any model or global action by name (e.g. |
|
| Update every record matching a filter (dry run first, capped at |
|
| Run a model's |
Every write tool takes dry_run: true, which checks the action and arguments against the schema and returns the exact mutation and variables without changing anything — handy for asking the agent to "show me what you'd do first".
Set GADGET_WRITE_MODELS=label,blogPost to limit changes to those models; every other model is refused, even with writes on. Global actions are matched by name, e.g. GADGET_WRITE_MODELS=label,syncProducts. The tool descriptions tell the agent which models are allowed.
Set GADGET_AUDIT_LOG=~/gadget-mcp-audit.jsonl to keep a local record of every write (timestamp, app, environment, action, variables, success/errors).
Writes go through your Gadget actions, so validations and action code run as normal. The API key's role also needs the matching action permissions — the setup wizard asks whether to enable writes/deletes and can create a gadget-mcp-write role with them.
claude mcp add my-app-gadget \
-e GADGET_APP=my-app \
-e GADGET_API_KEY=your_key_here \
-e GADGET_ALLOW_WRITES=true \
-e GADGET_ALLOW_DELETES=true \
-- npx @stronger-ecommerce/gadget-mcp@latestField selection
query_records and get_record return every scalar field when fields is left out. Use * to mix all scalars with relations:
fields: "* customer { email } lineItems { edges { node { title quantity } } }"Working with lots of records
export_recordspages through a model and saves a CSV or JSON file inGADGET_EXPORT_DIR(default~/gadget-mcp-exports). Nested fields become dot-named columns, e.g.customer.email. It returns the path, row count and a preview, and stops atmax_records(default 10,000, max 100,000).group_countanswers questions like "orders by financial status" in one call. Enum and boolean fields get exact counts per value. Other fields are counted by scanning up tomax_records, and the result says whether it was exact.bulk_update(writes on) applies the same change to every record matching a filter, running the model'supdateaction on each. Usedry_run: trueto see how many records match. It refuses when more thanmax_recordsmatch (default 100, max 1,000), andGADGET_WRITE_MODELSis checked before anything changes.
Logs
read_logs fetches recent logs through Gadget's ggt CLI. It defaults to the last 15 minutes at info level, and you can filter by since (2h, 1d or an ISO time), level, search text, and my_logs to show only your own code's logs. ggt uses its own login, so run npx ggt login once on the machine. Set GADGET_GGT_COMMAND=ggt to use a globally installed ggt instead of npx ggt@latest. Redaction applies to log output too.
Prompts
The server ships ready-made prompts that appear in your client's prompt picker (slash commands in Claude Code):
Prompt | What it does |
| Plain-English overview of the models, how they relate and how much data each holds |
| Investigates one record: fields, related logs and a likely cause |
| Groups recent errors from the logs, with counts and likely causes |
| Checks a model for missing values and odd statuses |
Remote / HTTP mode
Run the server over HTTP so clients can connect by URL instead of launching it locally:
GADGET_APP=my-app GADGET_API_KEY=... GADGET_MCP_HTTP_TOKEN=$(openssl rand -hex 24) \
npx @stronger-ecommerce/gadget-mcp@latest serveVariable | Default | |
|
| Port |
|
| Interface to bind. Anything but localhost requires a token |
| — | Shared secret: send |
The endpoint is /mcp, and /health answers without auth. Connect from Claude Code with claude mcp add --transport http my-app-gadget https://host/mcp --header "Authorization: Bearer <token>". Put it behind HTTPS (a reverse proxy or tunnel) before exposing it beyond your machine. Anyone with the token can use your Gadget API key with whatever write settings you've enabled.
Hiding personal data
Set GADGET_REDACT_FIELDS=pii to replace customer emails, phones, names, addresses, coordinates and IPs with [REDACTED] in every result. That includes nested objects and run_graphql. You can also list your own patterns, where * is a wildcard: GADGET_REDACT_FIELDS=email,*phone*,taxId.
You can still filter by a redacted field ("find the order for jane@example.com"). The value just never comes back to the agent. While redaction is on, field aliases (e: email) are refused so they can't be used to rename a field around it. Treat it as a strong guardrail rather than a security boundary: the API key itself can still read everything.
Rate limits
When Gadget throttles a request (HTTP 429) or is briefly unavailable (502/503/504), the server retries up to 3 times. It honours Retry-After when present and otherwise uses exponential backoff.
Staying up to date
The server checks npm at most once a day. When a new version is out it prints an update box in your terminal and adds a one-time note to the agent's next tool result, so the agent can let you know too. To upgrade:
npx @stronger-ecommerce/gadget-mcp@latest upgradeupgrade shows what changed, updates a global npm install if you have one, and switches editor configs from a cached npx @stronger-ecommerce/gadget-mcp to @latest so they always start the newest version. New installs from setup use @latest already.
Example usage
Once connected, ask Claude:
"List the models in my Gadget app"
"Show me the fields on the shopifyOrder model"
"Find orders where email is customer@example.com"
"Get all records with errors"
Future features
Planned ideas and research notes (including logs / ggt integration for agents) live in FUTURE_FEATURES.md.
Reporting bugs
The quickest way is:
npx @stronger-ecommerce/gadget-mcp@latest bugIt asks for a title and a short description, then opens a bug report with your version, Node, OS, environment and enabled flags already filled in. You can also ask your agent to "report a bug with the Gadget MCP": the report_bug tool hands you the same pre-filled link. API keys and your app slug are never included, and nothing is posted until you submit the issue yourself.
Contributing
Bug reports and pull requests are welcome!
Found a bug? Open an issue
Have a fix or feature? Fork the repo, make your changes, and open a PR against
mainFor significant changes, open an issue first so we can align on the approach
Running locally
git clone https://github.com/Stronger-eCommerce/gadget-mcp
cd gadget-mcp
npm install
npm run build
npm testReleasing (maintainers)
Go to Actions → Release → Run workflow, pick patch, minor or major, and run it. This works from the GitHub mobile app too. The workflow tests, bumps the version, tags, publishes to npm with provenance, and creates the GitHub Release with generated notes. Pick none to publish the version already in package.json. Because main only accepts pull requests, the version bump is committed on the release tag rather than on main. Each release bumps from the newest published version, so package.json on main can trail behind without causing problems. The workflow also locks the plugin (plugin/package.json and package-lock.json) to the new version once it's on npm, and moves the release branch to that commit. Install the marketplace from that branch (…/gadget-mcp@release) to get each release. The Anthropic directory listing should track the same branch (plugin path plugin, branch release).
Publishing uses npm Trusted Publishing, so there's no npm token to rotate. On npmjs.com the package's trusted publisher is GitHub Actions, Stronger-eCommerce/gadget-mcp, workflow release.yml.
About
Made with ♥ by Stronger eCommerce — Shopify development and eCommerce operations.
Available Tools
13 toolscount_recordsA
Return the total number of records for a Gadget model, with optional filtering.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | Model name in singular camelCase, e.g. shopifyOrder, label | |
| filter | No | Optional filter to count only matching records. Use introspect_filters to discover valid filter shapes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Only states it returns a count; does not disclose return format (e.g., integer), side effects, permissions, or limitations like maximum count.
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?
Single sentence that is front-loaded and to the point. No wasted words.
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?
Lacks output schema and annotations; does not clarify return format or possible constraints. Adequate for a simple count but could be more complete.
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 covers both parameters with descriptions (100% coverage). Description adds cross-reference to introspect_filters for filter shape, which is helpful beyond schema.
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?
Describes exactly what the tool does: returns total number of records for a model, with optional filtering. Clearly distinct from sibling tools like get_record (single record) or query_records (list).
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 explicit guidance on when to use this tool versus alternatives (e.g., query_records for full records, get_record for single record). Agent must infer usage from description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_recordsA
Export many records (beyond query_records' 50) to a CSV or JSON file on this machine for analysis or sharing. Pages through automatically. Returns the file path, row count, columns and a short preview. Redaction settings apply.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort value, e.g. [{ createdAt: { sortOrder: "Descending" } }] | |
| model | Yes | Model name in singular camelCase, e.g. shopifyOrder | |
| fields | No | Field selection (default: all scalar fields). Nested fields become dot-named CSV columns, e.g. "* customer { email }" → customer.email | |
| filter | No | Filter value — use introspect_filters for valid shapes | |
| format | No | File format (default csv) | |
| filename | No | Optional file name (no directories); saved in the export folder (GADGET_EXPORT_DIR or ~/gadget-mcp-exports) | |
| max_records | No | Maximum records to export (default 10000, max 100000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden and does substantial work: it reveals the side effect (writes a file to the local filesystem), that pagination is handled automatically, that redaction settings affect output, and what the result contains (path, row count, columns, preview). It omits permission requirements and overwrite/error behavior, so it is strong but not complete.
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?
Four tight sentences with the primary purpose and the sibling comparison front-loaded, then behavior, then return shape. Nothing is redundant, though 'Redaction settings apply.' is terse to the point of being slightly cryptic about what is being redacted.
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 7-parameter bulk-export tool with no output schema and no annotations, the description covers purpose, pagination, side effects and return contents, which is most of what an agent needs. Remaining gaps, such as overwrite behavior and auth requirements, are secondary but not trivial for a tool that writes files.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents model, fields, filter, format, filename, max_records and sort with examples. The description adds no parameter-level detail beyond the format options (already an enum) and a vague note that redaction settings apply. Baseline 3 is appropriate when the schema does the heavy lifting.
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?
States a specific verb (export) and resource (records) plus the output form (CSV/JSON file on this machine), which is concrete and actionable. It also differentiates itself from the sibling query_records by citing the 50-record threshold, so an agent can route between them without opening a schema.
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?
Gives clear use context (bulk export for analysis or sharing) and explicitly names the alternative, query_records, with the condition that selects this tool (result sets beyond 50). It does not state any explicit when-not-to-use case (e.g. single-record lookups belong in get_record), so it falls just short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recordC
Get a single Gadget record by ID. Specify the model name, record ID, and fields to return.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Record ID | |
| model | Yes | Model name in camelCase, e.g. shopifyOrder, label | |
| fields | No | GraphQL field selection. Omit or use "*" for every scalar field; mix with relations like "* lineItems { edges { node { title } } }". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. 'Get' implies a read, but nothing is said about permissions/auth requirements, error behavior for a missing or invalid ID, or whether the returned shape depends on the fields selection. This is thin for an unannotated tool.
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?
Two short sentences with the purpose front-loaded and no filler. The second sentence is largely redundant with the schema, which keeps it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-parameter read tool with full schema coverage and no output schema, the description is minimally adequate. It omits error/not-found behavior and any hint that the fields selection governs the response shape, which would matter for an agent calling it cold.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already documents 'model' (camelCase example) and 'fields' (GraphQL selection syntax) thoroughly. The description only restates that these three inputs exist and adds no syntax or format detail beyond the schema.
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 states a specific verb and resource with scope ('Get a single Gadget record by ID'), which clearly separates it from list-style siblings. However, it never names or contrasts with the obvious alternatives (query_records, run_graphql), so the agent must infer the boundary itself.
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 second sentence ('Specify the model name, record ID, and fields to return') is a restatement of the input parameters, not usage guidance. There is no statement of when to prefer this over query_records or run_graphql, nor any prerequisite or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_schema_overviewA
Return all models with their fields and types in a single call. Use this for a broad understanding of the app schema before diving into specific models.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, but description transparently reveals the tool's output (all models with fields/types) and scope (single call). A simple read operation, well explained.
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?
Two concise sentences, front-loaded with purpose followed by usage guidance. No extraneous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool returning schema overview, description fully covers purpose and usage. No missing details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so description adds no param info. Baseline 4 per guidelines for zero-param tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Return all models with their fields and types in a single call', specifying verb, resource, and scope. It distinguishes from siblings like 'introspect_model' (specific model) and 'list_models' (names only).
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?
Text advises using this for 'broad understanding before diving into specific models', providing context and implying alternatives. Explicit when-not or named alternatives would push to 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
group_countA
Count records grouped by a field's value, e.g. orders by financialStatus or products by vendor. Exact for enum and boolean fields; other fields are counted by scanning (up to max_records) and say whether the result is exact.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | For non-enum fields: how many groups to return, largest first (default 50) | |
| field | Yes | Scalar or enum field to group by, e.g. financialStatus | |
| model | Yes | Model name in singular camelCase, e.g. shopifyOrder | |
| filter | No | Optional filter applied before grouping | |
| max_records | No | For non-enum fields: records to scan (default 10000, max 20000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose a genuinely non-obvious behavioral trait: accuracy is field-type dependent, non-enum fields are computed by scanning up to max_records, and the result self-reports whether it is exact. It still omits permissions, cost/latency implications of scanning, and truncation behavior, but the key semantic caveat is surfaced.
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?
Two sentences, front-loaded with purpose followed by the accuracy caveat; no filler. Dense but efficient, and each clause carries information the schema does not.
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 5-parameter read tool with no output schema and no annotations, the description covers the essential correctness caveat (exact vs. scanned) and ties it to the scan limit. It is not fully complete, since the shape of the returned grouped counts and behavior under filters are unstated, but nothing critical to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning by linking max_records to the non-enum scanning path and framing field as an enum/boolean vs. scalar distinction. It also implies top is only relevant for non-enum fields, consistent with the schema notes.
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 states a specific verb (count), resource (records), and a precise grouping semantic ('grouped by a field's value') with concrete examples (orders by financialStatus, products by vendor). It does not, however, distinguish itself from the sibling count_records, leaving the agent to infer the boundary.
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?
Usage is implied through the exactness note: enum/boolean fields are exact, other fields are scan-based, which tells the agent which field types to prefer. But there is no explicit when-to-use guidance and no mention of count_records as the alternative for ungrouped totals, so tool selection against the closest sibling is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
introspect_actionsA
List all actions (mutations) available in this Gadget app, including their arguments. Use this to find action names and argument shapes for run_action, create_record, and update_record.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It implies a safe, read-only listing and discloses that arguments are included, but says nothing about auth requirements, rate limits, or whether results are paginated/complete. Adequate but thin for a tool with zero annotation coverage.
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?
Two sentences, zero waste. The purpose is front-loaded and the consumer tools are named second, so the agent gets the what before the why.
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?
There is no output schema, so the description must convey return content; 'including their arguments' tells the agent it will get action names plus argument shapes, which is the key information for a discovery tool. It does not describe the response structure in any detail, leaving a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no input parameters and the schema is a bare empty object, so the baseline is 4. There is no input semantics to clarify; the description's param-adjacent statement about returned arguments belongs to output, not input.
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?
States a specific verb+resource ('List all actions (mutations) available in this Gadget app') and adds the scope 'including their arguments', which separates it from model-listing siblings like list_models and introspect_model. It never names those siblings directly, so differentiation is implied rather than explicit, which keeps it just short of a 5.
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?
Gives clear usage context: 'Use this to find action names and argument shapes for run_action, create_record, and update_record.' It routes the agent toward the write tools that consume this output. It does not state when NOT to use it (e.g., versus introspect_model for field discovery), so it stops at 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
introspect_filtersA
Show all available filter fields and their types for a Gadget model. Use this to construct valid filter arguments for query_records and count_records.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | Model name in singular camelCase, e.g. shopifyOrder, label |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It accurately describes a read-only introspection tool without side effects, but could be improved by noting any authentication requirements or potential performance impact.
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?
Two sentences, no filler. Every sentence provides essential information: what it does and how to use it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple single-parameter input and no output schema, the description adequately covers purpose and usage. It could briefly mention what the output contains (e.g., list of fields with types), but it's still sufficient for an introspection 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 coverage is 100%, so baseline is 3. The description does not add extra meaning beyond the schema's 'Model name in singular camelCase' example; it simply restates the parameter role.
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 shows all available filter fields and their types for a Gadget model, using specific verb 'show' and resource. It distinguishes from siblings like query_records and count_records by explicitly linking to filter argument construction.
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 explicitly states to use this tool for constructing valid filter arguments for query_records and count_records, providing clear context. However, it does not mention when not to use it or alternatives like introspect_model.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
introspect_modelA
List all fields and their types for a Gadget model. Run this first when you're unsure what fields exist on a model.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | Model name in camelCase, e.g. shopifyOrder, label, shopifyShop |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Only states listing action with no disclosure of read-only nature, error handling, or performance implications. Minimal behavioral context.
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?
Two sentences, front-loaded with purpose and usage. No redundant or missing words. Highly efficient.
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?
Simple tool with one parameter and no output schema. Description covers purpose and usage. Could mention return format but not essential. Adequate for the 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 coverage is 100% with clear parameter description. The tool description adds little beyond stating 'for a Gadget model', which is already implicit. Baseline 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?
Clearly states 'List all fields and their types for a Gadget model' with a specific verb and resource. Distinct from sibling tools like list_models, introspect_actions, etc.
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?
Explicitly recommends running this tool 'first when you're unsure what fields exist on a model.' Provides a usage context but does not name alternatives or exclusions explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_modelsA
List all models (types) available in this Gadget app via GraphQL introspection.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the method (GraphQL introspection) and implies a read-only operation. With no annotations, it provides sufficient behavioral context for a simple list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, well-structured sentence that is front-loaded and contains no unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description is complete. It explains the purpose and method, and there is no missing context given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters, so baseline is 4. The description does not need to add parameter meaning, and schema coverage is 100% (none).
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 lists all models (types) via GraphQL introspection. It uses a specific verb and resource, distinguishing it from sibling tools like introspect_model which focus on a single model.
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 explicit guidance on when to use this tool versus alternatives. Usage is implied from the description, but exclusions or comparisons to siblings like introspect_actions are not provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_recordsA
Query records from any Gadget model. Supports filtering, sorting, pagination cursors, and field selection (all scalar fields by default). Use introspect_filters to see valid filter shapes.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort value — array of sort objects, e.g. [{ createdAt: { sortOrder: "Descending" } }] | |
| after | No | Pagination cursor — pass the endCursor from a previous response to fetch the next page | |
| limit | No | Max records to return (default 10, max 50) | |
| model | Yes | Model name in singular camelCase, e.g. shopifyOrder, label | |
| fields | No | GraphQL field selection, e.g. "id name email createdAt". Omit or use "*" for every scalar field; mix with relations like "* customer { email }". | |
| filter | No | Filter value — use introspect_filters to discover valid filter fields and shapes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses two useful defaults (all scalar fields returned when fields is omitted, cursor-based pagination) but says nothing about read-only safety, authorization requirements, result shape, or rate limits.
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?
Two sentences, no filler, and the capability scope is front-loaded before the cross-tool pointer. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a read/query tool: capabilities, default field behavior, and the filter-discovery path are all covered, and the schema is fully documented. But with no output schema and no annotations, the description could have said more about the returned result shape and when not to use this 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%, so the schema already documents every parameter with examples (sort object shape, endCursor usage, limit default/max, GraphQL field selection syntax). The description only restates the capability list and adds the introspect_filters pointer, so baseline 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?
States a specific verb and resource ("Query records from any Gadget model") and enumerates the supported capabilities: filtering, sorting, pagination cursors, field selection. It does not differentiate itself from siblings like get_record, count_records, or run_graphql, so the agent must infer scope from names alone.
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?
One explicit routing hint is given — "Use introspect_filters to see valid filter shapes" — which is genuinely useful. However, there is no guidance on when to prefer this over get_record (single record), count_records, export_records, or run_graphql, so usage is only partially implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_logsA
Read recent logs from the Gadget app (via the ggt CLI) to debug errors, failed actions or webhooks. Defaults to the last 15 minutes at info level. Needs a one-time npx ggt login on this machine.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Minimum level (default info); use "error" to find failures | |
| limit | No | Max log lines to return, newest last (default 100, max 500) | |
| since | No | How far back: "15m", "2h", "1d", or an ISO timestamp (default 15m) | |
| search | No | Only return log lines containing this text (case-insensitive), e.g. a record ID or action name | |
| my_logs | No | Only logs from the app's own code, hiding platform logs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does meaningful work: it discloses the CLI dependency, a mandatory one-time `npx ggt login` precondition on the machine, and the default window/level. It does not describe output shape, truncation, or failure modes, but the auth prerequisite and defaults are the operationally important facts an agent needs.
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?
Two sentences, front-loaded with what the tool does and its scope, followed by the operational prerequisite. No filler; every clause carries information.
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 parameterless-to-invoke read tool with full schema coverage and a stated auth precondition, the description covers what an agent needs to decide and execute. The one gap is that no output schema exists, so a hint about the returned line format would have added value.
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% and every parameter already has an enum or a detailed description with units/defaults/max ('default 100, max 500', '"15m", "2h", "1d", or an ISO timestamp'). The description only restates the level and window defaults, adding no syntax or semantics beyond the schema, so baseline 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?
States a specific verb+resource ('Read recent logs from the Gadget app'), names the underlying mechanism ('via the ggt CLI'), and gives the intent ('to debug errors, failed actions or webhooks'). This distinguishes it clearly from the record/model/GraphQL siblings in the toolset.
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 supplies a clear context of use (debugging errors, failed actions, webhooks) and the schema reinforces it with 'use "error" to find failures'. It stops short of naming when-not-to-use this tool or pointing to an alternative sibling, so it is clear context rather than explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_bugA
Create a pre-filled GitHub bug report link for this MCP server (gadget-mcp itself, not the user's Gadget app). Use when a gadget-mcp tool misbehaves or the user asks to report a bug. Returns a link for the user to review and submit — nothing is posted automatically. Do not include API keys or customer data.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | No | Steps to reproduce, including the tool called and its arguments | |
| title | Yes | Short summary, e.g. "count_records fails with sort on shopifyOrder" | |
| expected | No | What should have happened | |
| error_output | No | Exact error text or tool output | |
| what_happened | Yes | What went wrong |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the key side-effect fact that 'nothing is posted automatically' and the returned artifact is a link for user review, plus a data-safety caution about API keys and customer data. It does not cover auth/permission requirements, keeping it just short of a 5.
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?
Three tight sentences, front-loaded with the action, then usage, then the behavioral caveats. Every sentence earns its place and there is no repetition of schema content.
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 link-generating tool with no output schema, the description covers the essential facts an agent needs: what it produces, that submission is not automatic, and how to use it. Nothing material is missing given full schema coverage.
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 all five parameters (title, what_happened, steps, expected, error_output) are already documented in the schema. The description adds no further parameter guidance, so the baseline 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?
States a specific verb and resource ('Create a pre-filled GitHub bug report link') and scopes it to gadget-mcp itself rather than the user's Gadget app. This clearly separates it from every sibling, which are all data/query tools.
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?
Gives explicit trigger conditions: 'Use when a gadget-mcp tool misbehaves or the user asks to report a bug.' It also pre-empts a likely mis-use by clarifying that it is not for the user's own Gadget app, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_graphqlA
Run an arbitrary read-only GraphQL query against the Gadget app. Use this for complex queries with nested relations or custom filtering that query_records can't express.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | GraphQL query string | |
| variables | No | GraphQL variables |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It clearly declares read-only behavior. While it doesn't detail error handling or rate limits, the key behavioral trait (read-only) is explicitly stated.
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?
Two concise sentences: first defines purpose, second provides usage guidance. No redundant or extraneous information.
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 and no annotations, the description adequately covers purpose, usage, and parameter context. It doesn't detail return format, but GraphQL responses are self-explanatory. Slight gap: no mention of authentication or scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions. The description adds context beyond schema by explaining the tool is for complex, nested, or custom-filtering queries, which guides parameter use.
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 executes a read-only GraphQL query against the Gadget app. It distinguishes from sibling tool query_records by noting it handles 'complex queries with nested relations or custom filtering that query_records can't express.'
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?
Explicit usage guidance: 'Use this for complex queries...' implies when not to use (simpler queries should use query_records). The description also clarifies it is read-only.
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.
6 tool updates
v1.4.0- Added
export_records - Changed
get_record2 fields changed- changed
Input schema / properties / fields / descriptionPrevious value: -"GraphQL field selection, e.g. \"id name email createdAt\""New value: +"GraphQL field selection. Omit or use \"*\" for every scalar field; mix with relations like \"* lineItems { edges { node { title } } }\"." - changed
Input schema / requiredPrevious value: -[ - "model", - "id", - "fields" -]New value: +[ + "model", + "id" +]
- Added
group_count - Changed
query_records2 fields changed- changed
Input schema / properties / fields / descriptionPrevious value: -"GraphQL field selection, e.g. \"id name email createdAt\""New value: +"GraphQL field selection, e.g. \"id name email createdAt\". Omit or use \"*\" for every scalar field; mix with relations like \"* customer { email }\"." - changed
Input schema / requiredPrevious value: -[ - "model", - "fields" -]New value: +[ + "model" +]
- Added
read_logs - Added
report_bug
5 tool updates
v1.0.1- Added
count_records - Added
get_schema_overview - Added
introspect_actions - Added
introspect_filters - Changed
query_records5 fields changed- added
Input schema / properties / afterAdded value: +{ + "description": "Pagination cursor — pass the endCursor from a previous response to fetch the next page", + "type": "string" +} - changed
Input schema / properties / filter / descriptionPrevious value: -"Gadget filter object, e.g. { \"name\": { \"equals\": \"#59389\" } }"New value: +"Filter value — use introspect_filters to discover valid filter fields and shapes." - removed
Input schema / properties / filter / typeRemoved value: -"object" - changed
Input schema / properties / model / descriptionPrevious value: -"Model name in camelCase, e.g. shopifyOrder, label"New value: +"Model name in singular camelCase, e.g. shopifyOrder, label" - added
Input schema / properties / sortAdded value: +{ + "description": "Sort value — array of sort objects, e.g. [{ createdAt: { sortOrder: \"Descending\" } }]" +}
5 tool updates
v1.0.6- First observed
get_record - First observed
introspect_model - First observed
list_models - First observed
query_records - First observed
run_graphql
TDQS
Scored across 13 tools
Most tools target distinct operations (query_records vs run_graphql vs export_records vs group_count are clearly differentiated), but there is a cluster of five overlapping introspection tools (list_models, get_schema_overview, introspect_model, introspect_filters, introspect_actions) where get_schema_overview largely subsumes list_models and introspect_model. Descriptions do clarify the layering, so misselection is possible but avoidable.
Every tool follows a clean snake_case verb_noun pattern (count_records, introspect_model, list_models, get_record, run_graphql, query_records, export_records, group_count, read_logs, report_bug). No camelCase or style mixing; conventions are fully predictable.
13 tools is well-scoped for a data-access/introspection server, and each tool covers a distinct capability (query, count, group, export, schema introspection, logs, bug reporting). Nothing feels redundant or padded.
The surface covers read, count, group, export, and introspection well, but the introspect_actions description explicitly points users toward run_action, create_record, and update_record — none of which exist in the tool set — creating a dead end for mutations. There is also no delete operation, so the lifecycle is notably incomplete for the referenced domain.
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.
The HubSpot MCP Server acts as a bridge that enables AI assistants and Large Language Models to securely interact with HubSpot CRM data through natural conversation, without requiring users to understand complex API structures. It provides read-only access to standard CRM objects (contacts, companies, deals, tickets, products, invoices, and more) and their associations, secured via OAuth 2.0, allowing AI agents to perform tasks like summarizing deals, fetching company updates, and looking up record changes.
Query 40 databases from Claude, ChatGPT, or Cursor — on any device. Read-only, encrypted, audited.
The Cortex MCP server provides read-only access to real-time engineering context from the Cortex developer portal, allowing AI coding assistants to answer natural language questions about your organization's catalog (microservices, libraries, domains, teams, infrastructure), scorecards (engineering standards and best practices), initiatives (goals and deadlines), and Engineering Intelligence metrics. It includes tools for querying documentation, tracking personal entities, and accessing AI-assisted insights across the entire Cortex ecosystem.
Related MCP Servers
- AlicenseAqualityDmaintenanceGraphQL 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.26 npm3MIT
- AlicenseAqualityAmaintenanceA 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.29 npm1MIT
- AlicenseNot gradedqualityDmaintenanceA generic MCP server that converts .graphql query files into tools for Claude, enabling interaction with any GraphQL API without coding.MIT
- AlicenseAqualityDmaintenanceA read-only MCP server that provides AI coding tools with database schema structure (tables, columns, keys, relationships) without exposing row data.326 PyPIApache 2.0