# GraphQL Built-ins

| Function | Description | Meta |
| --- | --- | --- |
| `graphql.is_valid` | `output := graphql.is_valid(query, schema)`  Checks that a GraphQL query is valid against a given schema. The query and/or schema can be either GraphQL strings or AST objects from the other GraphQL builtin functions.  **Arguments:**  `query` (any<string, object\[any: any\]>)  the GraphQL query  `schema` (any<string, object\[any: any\]>)  the GraphQL schema  **Returns:**  `output` (boolean)  `true` if the query is valid under the given schema. `false` otherwise. | [v0.41.0](https://github.com/open-policy-agent/opa/releases/v0.41.0) SDK-dependent |
| `graphql.parse` | `output := graphql.parse(query, schema)`  Returns AST objects for a given GraphQL query and schema after validating the query against the schema. Returns undefined if errors were encountered during parsing or validation. The query and/or schema can be either GraphQL strings or AST objects from the other GraphQL builtin functions.  **Arguments:**  `query` (any<string, object\[any: any\]>)  the GraphQL query  `schema` (any<string, object\[any: any\]>)  the GraphQL schema  **Returns:**  `output` (array<object\[any: any\], object\[any: any\]>)  `output` is of the form `[query_ast, schema_ast]`. If the GraphQL query is valid given the provided schema, then `query_ast` and `schema_ast` are objects describing the ASTs for the query and schema. | [v0.41.0](https://github.com/open-policy-agent/opa/releases/v0.41.0) SDK-dependent |
| `graphql.parse_and_verify` | `output := graphql.parse_and_verify(query, schema)`  Returns a boolean indicating success or failure alongside the parsed ASTs for a given GraphQL query and schema after validating the query against the schema. The query and/or schema can be either GraphQL strings or AST objects from the other GraphQL builtin functions.  **Arguments:**  `query` (any<string, object\[any: any\]>)  the GraphQL query  `schema` (any<string, object\[any: any\]>)  the GraphQL schema  **Returns:**  `output` (array<boolean, object\[any: any\], object\[any: any\]>)  `output` is of the form `[valid, query_ast, schema_ast]`. If the query is valid given the provided schema, then `valid` is `true`, and `query_ast` and `schema_ast` are objects describing the ASTs for the GraphQL query and schema. Otherwise, `valid` is `false` and `query_ast` and `schema_ast` are `{}`. | [v0.41.0](https://github.com/open-policy-agent/opa/releases/v0.41.0) SDK-dependent |
| `graphql.parse_query` | `output := graphql.parse_query(query)`  Returns an AST object for a GraphQL query.  **Arguments:**  `query` (string)  GraphQL query string  **Returns:**  `output` (object\[any: any\])  AST object for the GraphQL query. | [v0.41.0](https://github.com/open-policy-agent/opa/releases/v0.41.0) SDK-dependent |
| `graphql.parse_schema` | `output := graphql.parse_schema(schema)`  Returns an AST object for a GraphQL schema.  **Arguments:**  `schema` (string)  GraphQL schema string  **Returns:**  `output` (object\[any: any\])  AST object for the GraphQL schema. | [v0.41.0](https://github.com/open-policy-agent/opa/releases/v0.41.0) SDK-dependent |
| `graphql.schema_is_valid` | `output := graphql.schema_is_valid(schema)`  Checks that the input is a valid GraphQL schema. The schema can be either a GraphQL string or an AST object from the other GraphQL builtin functions.  **Arguments:**  `schema` (any<string, object\[any: any\]>)  the schema to verify  **Returns:**  `output` (boolean)  `true` if the schema is a valid GraphQL schema. `false` otherwise. | [v0.46.0](https://github.com/open-policy-agent/opa/releases/v0.46.0) SDK-dependent |

info

Custom [GraphQL `@directive`](http://spec.graphql.org/October2021/#sec-Language.Directives) definitions defined by your GraphQL framework will need to be included manually as part of your GraphQL schema string in order for validation to work correctly on GraphQL queries using those directives.

Directives defined as part of the GraphQL specification (`@skip`, `@include`, `@deprecated`, and `@specifiedBy`) are supported by default, and do not need to be added to your schema manually.

GraphQL Custom `@directive` Example

New `@directive` definitions can be defined separately from your schema, so long as you `concat` them onto the schema definition before attempting to validate a query/schema using those custom directives. In the following example, a custom directive is defined, and then used in the schema to annotate an argument on one of the allowed query types.

```
package graphql_custom_directive_examplecustom_directives := `directive @customDeprecatedArgs(  reason: String) on ARGUMENT_DEFINITION`schema := `type Query {    foo(name: String! @customDeprecatedArgs(reason: "example reason")): String,    bar: String!}`query := `query { foo(name: "example") }`p {    graphql.is_valid(query,  concat("", [custom_directives, schema]))}
```