Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Perl 6 GraphQL

Build Status

A Perl 6 implementation of the GraphQL standard. GraphQL is a query language for APIs originally created by Facebook.


Before we get into all the details, here's the Perl 6 GraphQL "Hello World"

use GraphQL;
use GraphQL::Server;

class Query
    method hello(--> Str) { 'Hello World' }

my $schema =;


You can run this with a GraphQL query on the command line:

$ perl6 --help
Usage: <query> [--filename=<Str>] [--port=<Int>]

$ perl6 '{hello}'
  "data": {
    "hello": "Hello World"

You can even ask for information about the schema and types:

$ perl6 '{ __schema { queryType { name } } }'
  "data": {
    "__schema": {
      "queryType": {
        "name": "Query"

$ perl6 '{ __type(name: "Query") { fields { name type { name }}}}'
  "data": {
    "__type": {
      "fields": [
          "name": "hello",
          "type": {
            "name": "String"

Running as a server

That's fine for the command line, but you can also easily wrap GraphQL into a web server to expose that API to external clients. GraphQL::Server uses the Perl 6 web framework Bailador to do that:

$ ./
Entering the development dance floor:
[2016-12-21T13:02:38Z] Started HTTP server.

The server takes any GraphQL query sent with HTTP POST to /graphql, executes it against the GraphQL Schema, and returns the result in JSON.

There is one additional feature. If it receives a GET request to "/graphql", it sends back the GraphiQL graphical interactive in-browser GraphQL IDE.

You can use that to explore the schema (though the Hello World schema is very simple, that won't take long), and interactively construct and execute GraphQL queries.

Embedding in a Cro server

As an alternative to Bailador, you can use Cro::HTTP::Router::GraphQL to embed GraphQL into Cro HTTP routes:

use GraphQL;
use Cro::HTTP::Router::GraphQL;
use Cro::HTTP::Router;
use Cro::HTTP::Server;

class Query
    method hello(--> Str) { 'Hello World' }

my $schema =;

my Cro::Service $hello =
    :host<localhost>, :port<10000>,
    application => route
        get -> { redirect '/graphql' }

        get -> 'graphql' { graphiql }

        post -> 'graphql' { graphql($schema) }


react whenever signal(SIGINT) { $hello.stop; exit; }

You can mix/match with other routes you want your server to handle.

There is also a CroX::HTTP::Transform::GraphQL you can easily delegate to from Cro routes:

route {
    delegate graphql =>$schema, :graphiql);

Pass in your GraphQL schema, and optional :graphiql to enable GraphiQL support on an http GET.

CroX::HTTP::Transform::GraphQL is a Cro::HTTP::Transform that consumes Cro::HTTP::Requests and produces Cro::HTTP::Responses. It is still pretty basic. A planned enhancement is caching parsed GraphQL query documents. (Patches or advice welcome!)

More documentation

See eg/ for a more complicated example.

See slides from a presentation about Perl 6 GraphQL at the Philadelphia Perl Mongers.

GraphQL Documentation

Copyright © 2017 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. No copyright is claimed in the United States under Title 17, U.S.Code. All Other Rights Reserved.