gqai
graphql → ai
gqai is a lightweight proxy that exposes GraphQL operations as
Model Context Protocol (MCP) tools for AI like
Claude, Cursor, and ChatGPT.
Define tools using regular GraphQL queries/mutations against your GraphQL backend, and gqai automatically
generates an MCP server for you.
🔌 Powered by your GraphQL backend
⚙️ Driven by .graphqlrc.yml
+ plain .graphql
files
.graphqlrc.yml
go install github.com/fotoetienne/gqai@latest
schema: https://graphql.org/graphql/ documents: .
This file tells gqai where to find your GraphQL schema and operations.
Note: The schema
parameter tells gqai where to execute the operations. This must be a live server rather than a static schema file
get_all_films.graphql
:
# Get all Star Wars films query get_all_films { allFilms { films { title episodeID } } }
mcp.json
file: "gqai": {
"command": "gqai",
"args": [
"run",
"--config"
".graphqlrc.yml"
]
}
That's it! Your AI model can now call the get_all_films
tool.
The graphql config
file is a YAML file that defines the GraphQL endpoint and the operations
you want to expose as tools. It should be named .graphqlrc.yml
and placed in the root of your project.
schema: https://graphql.org/graphql/ documents: operations
The schema
field specifies the GraphQL endpoint, and the documents
field specifies the directory where your GraphQL operations are located.
In this example, the operations
directory contains all the GraphQL operations you want to expose as tools.
Operations are defined in .graphql
files, and gqai will automatically discover them.
You can also specify headers to be sent with each request to the GraphQL endpoint. This is useful for authentication or other custom headers.
schema: - https://graphql.org/graphql/: headers: Authorization: Bearer YOUR_TOKEN X-Custom-Header: CustomValue documents: .
To use gqai with Claude Desktop, you need to add the following configuration to your mcp.json
file:
{ "gqai": { "command": "gqai", "args": [ "run", "--config", ".graphqlrc.yml" ] } }
gqai tools/call get_all_films
This will execute the get_all_films
tool and print the result.
{ "data": { "allFilms": { "films": [ { "id": 4, "title": "A New Hope" }, { "id": 5, "title": "The Empire Strikes Back" }, { "id": 6, "title": "Return of the Jedi" }, ... ] } } }
Create a GraphQL operation that takes arguments, and these will be the tool inputs:
get_film_by_id.graphql
:
query get_film_by_id($id: ID!) { film(filmID: $id) { episodeID title director releaseDate } }
Call the tool with arguments:
gqai tools/call get_film_by_id '{"id": "1"}'
This will execute the get_film_by_id
tool with the provided arguments.
{ "data": { "film": { "episodeID": 1, "title": "A New Hope", "director": "George Lucas", "releaseDate": "1977-05-25" } } }
go build -o gqai main.go
go test ./...
go fmt ./...
./gqai run --config .graphqlrc.yml
./gqai tools/call get_all_films
gqai makes it easy to turn your GraphQL backend into a model-ready tool layer — no code, no extra infra. Just define your operations and let AI call them.
MIT — fork it, build on it, all the things.
Made with ❤️ and 🤖vibes by Stephen Spalding && ``
Discover shared experiences
Shared threads will appear here, showcasing real-world applications and insights from the community. Check back soon for updates!