---
description:
  Maximize your GraphQL API capabilities with GraphQL Mesh! Seamlessly consume various data sources
  like PostgreSQL, MongoDB, Neo4j, and more.
---

import { Callout } from '@theguild/components'

# Query Anything

GraphQL Mesh can consume different data source types inside GraphQL while composing your unified
graph.

The example below loads a GraphQL subgraph. You can see available source handlers on the menu.

```ts filename="mesh-config.ts"
import { defineConfig, loadGraphQLHTTPSubgraph } from '@graphql-mesh/compose-cli'

export const composeConfig = defineConfig({
  subgraphs: [
    {
      sourceHandler: loadGraphQLHTTPSubgraph('Users', {
        endpoint: 'http://localhost:4001/users'
      })
    }
  ]
})
```

## Setting Headers

<Callout emoji="⚠️" type="warning">
  This method is not relevant to all handlers!

Please make sure the handler you are using supports this method: You can do it by checking if
handler's config reference (appearing on it's designated doc) includes the header fields mentioned
in this doc.

</Callout>

### Setting configurations

There are two headers-designated configuration fields under each handler - `schemaHeaders` and
`operationHeaders`:

#### `operationHeaders`

Optional field. Used to set the Headers for _operation execution_. Expects JSON object representing
the Headers.

In this example `operationHeaders` is used to defined the content of the request as Json:

```ts filename="mesh-config.ts" {9-11}
import { defineConfig, loadGraphQLHTTPSubgraph } from '@graphql-mesh/compose-cli'

export const composeConfig = defineConfig({
  subgraphs: [
    {
      sourceHandler: loadGraphQLHTTPSubgraph('Users', {
        endpoint: 'http://localhost:4001/users',

        operationHeaders: {
          'Content-Type': 'application/json'
        }
      })
    }
  ]
})
```

#### `schemaHeaders`

Optional field. Used to set the Headers for _schema introspection_. Expects JSON object representing
the Headers.

### Dynamic Header Values (e.g., for Authorization)

Mesh can take dynamic values from the GraphQL Context or the environmental variables.

The expression inside dynamic values should be as in JS.

#### From Context

```ts filename="mesh-config.ts" {9-15}
import { defineConfig, loadGraphQLHTTPSubgraph } from '@graphql-mesh/compose-cli'

export const composeConfig = defineConfig({
  subgraphs: [
    {
      sourceHandler: loadGraphQLHTTPSubgraph('Users', {
        endpoint: 'http://localhost:4001/users',

        operationHeaders: {
          // Please do not use capital letters while getting the headers
          // Use "{context.headers['x-my-api-token']}" if you want just the value of the header
          Authorization: 'Bearer {context.headers["x-my-api-token"]}'
          // You can also access to the cookies like below;
          // Authorization: Bearer {context.cookies.myApiToken}
        }
      })
    }
  ]
})
```

#### From Environment Variables

Set up the variable on your environment, e.g `VERY_SECRET_TOKEN=12345`. Then you can use it using
`{env.VERY_SECRET_TOKEN}`.

The config wil look something like:

```ts filename="mesh-config.ts" {9-11}
import { defineConfig, loadGraphQLHTTPSubgraph } from '@graphql-mesh/compose-cli'

export const composeConfig = defineConfig({
  subgraphs: [
    {
      sourceHandler: loadGraphQLHTTPSubgraph('Users', {
        // You can also use the environment variables in the endpoint
        endpoint: 'http://{env.MY_HOST_NAME}:4001/users',

        operationHeaders: {
          Authorization: 'Bearer {env.VERY_SECRET_TOKEN}'
        }
      })
    }
  ]
})
```
