Public Apollo documentation and Connectors spec tools (no auth), plus graph tools that inspect a graph, run schema checks, and publish schemas, contracts, and persisted queries, and that require either a GraphOS sign-in or a GraphOS API key in the x-api-key header.
Public Apollo documentation and Connectors spec tools (no auth), plus graph tools that inspect a graph, run schema checks, and publish schemas, contracts, and persisted queries, and that require either a GraphOS sign-in or a GraphOS API key in the x-api-key header.
This hosted GraphOS MCP server exposes three kinds of tools:
- Public documentation tools (ApolloDocsSearch, ApolloDocsRead,
ApolloConnectorsSpec) that require no authentication. Search the
documentation first, then read full pages via the returned slugs.
- Graph read tools (for example GetVariantDetails, GetCheckResults,
GetSubgraphSchema) that inspect a specific graph and REQUIRE
authentication.
- Graph write tools, whose names start with Run, Publish, or Delete. These
also REQUIRE authentication. The Publish and Delete tools change the schema
registry and can change what the router serves, so confirm the graph, the
variant, and the target with the user before you call one. DeleteGraph
removes a whole graph and every variant on it. DeleteSubgraph accepts
dryRun, which reports the composition result and deletes nothing.
The graph tools accept two credentials. Either sign in to GraphOS
through your MCP client's OAuth flow, or add an `x-api-key` request header
holding a GraphOS API key. Both are forwarded to the Apollo Platform API,
which decides what you are allowed to do. There is no APOLLO_KEY for
clients of this hosted server.
If a graph tool fails auth (for example `API_KEY_MISSING_OR_INVALID`)
or returns null identity or empty data, the server was likely added with
neither credential. Sign in through your client, or re-add it with:
`claude mcp add --transport http <name> <url> --header "x-api-key: <your key>"`.
The documentation tools work with no credential at all.
Protocol
Pass100/10020 / 20 pts
Connection, authentication, and protocol compatibility.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Remove a subgraph from a variant and start composition, the same write that `rover subgraph delete` performs. Returns the composition errors that the removal causes. This deletes the subgraph from the variant and can break the running router. Set dryRun to true first: the response then reports the composition result that the removal would produce, including updatedGateway, and deletes nothing. Provide the graph ID, the variant name, and the subgraph name.
The description explains the capability, when to use it, and what to expect.
Inputs19/100
1 of 4 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
subgraphName
Not provided
Missing description. Explain what this value means and how to supply it.
dryRun
Do not remove the service, but recompose without it and report any errors.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
List past schema checks for a graph: each check's ID, status, timestamps, the subgraph it checked, the variant it ran against, the commit, and the status of each task in the check, plus the total count for the filter. Use this to find a check, then pass its ID to GetCheckResults for failure details. Provide the graph ID. Optionally filter by status (PASSED, FAILED, PENDING), subgraph names, branches, variants, authors, or check IDs, and page with limit and offset.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 9 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
limit
Not provided
Missing description. Explain what this value means and how to supply it.
offset
Not provided
Missing description. Explain what this value means and how to supply it.
status
Not provided
Missing description. Explain what this value means and how to supply it.
subgraphs
Not provided
Missing description. Explain what this value means and how to supply it.
branches
Not provided
Missing description. Explain what this value means and how to supply it.
variants
Not provided
Missing description. Explain what this value means and how to supply it.
authors
Not provided
Missing description. Explain what this value means and how to supply it.
ids
Not provided
Missing description. Explain what this value means and how to supply it.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Check whether a graph variant has a Persisted Query List (PQL), and return its ID, its name, and its current build (revision and operation count). Pass the ID to PublishPersistedQueries. Use to assess PQL configuration — a production variant with no PQL is a security gap. Provide the graph ID and variant name.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 2 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"properties": {
"persistedQueryList": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name",
"currentBuild"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The immutable ID for this Persisted Query List."
},
"name": {
"type": "string",
"description": "The list's name; can be changed and does not need to be unique."
},
"currentBuild": {
"type": "object",
"required": [
"revision",
"totalOperationsInList"
],
"properties": {
"revision": {
"type": "integer",
"description": "The revision of this Persisted Query List. Revision 0 is the initial empty list; each publish increments the revision by 1."
},
"totalOperationsInList": {
"type": "integer",
"description": "The total number of operations in the list after this build. Compare to PersistedQueriesPublish.operationCounts."
}
},
"description": "The current build of this PQL."
}
}
},
{
"type": "null"
}
],
"description": "The Persisted Query List linked to this variant, if any."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
Original tool metadata
{
"name": "GetPersistedQueryListStatus",
"description": "Check whether a graph variant has a Persisted Query List (PQL), and return its ID, its name, and its current build (revision and operation count). Pass the ID to PublishPersistedQueries. Use to assess PQL configuration — a production variant with no PQL is a security gap. Provide the graph ID and variant name.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"variant"
],
"properties": {
"graphId": {
"type": "string"
},
"variant": {
"type": "string"
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"properties": {
"persistedQueryList": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name",
"currentBuild"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The immutable ID for this Persisted Query List."
},
"name": {
"type": "string",
"description": "The list's name; can be changed and does not need to be unique."
},
"currentBuild": {
"type": "object",
"required": [
"revision",
"totalOperationsInList"
],
"properties": {
"revision": {
"type": "integer",
"description": "The revision of this Persisted Query List. Revision 0 is the initial empty list; each publish increments the revision by 1."
},
"totalOperationsInList": {
"type": "integer",
"description": "The total number of operations in the list after this build. Compare to PersistedQueriesPublish.operationCounts."
}
},
"description": "The current build of this PQL."
}
}
},
{
"type": "null"
}
],
"description": "The Persisted Query List linked to this variant, if any."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
},
"annotations": {
"title": "Get persisted query list status",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Read the composed supergraph schema (SDL) for a graph variant, with the composition ID and any composition errors. This is the same read that `rover supergraph fetch` performs. A supergraph schema is the single schema that composition builds from every subgraph, and it carries federation directives that the API schema does not. The response holds the whole document and is not truncated, and a supergraph schema is larger than the API schema it produces. Expect the same order of size: a large federated graph exceeds 800,000 characters, roughly 200,000 tokens. A variant that is not federated has no composition result, and the tool returns null for it rather than an empty document. Provide the graph ID and the variant name.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 2 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"properties": {
"latestPublication": {
"anyOf": [
{
"type": "object",
"required": [
"publishedAt"
],
"properties": {
"publishedAt": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
"compositionResult": {
"anyOf": [
{
"type": "object",
"required": [
"graphCompositionID",
"errors"
],
"properties": {
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A machine-readable error code."
},
"message": {
"type": "string",
"description": "A human-readable message describing the error."
}
}
},
"description": "A list of errors that occurred during composition. Errors mean that Apollo was unable to compose the graph variant's subgraphs into a supergraph schema. If any errors are present, gateways / routers are not updated."
},
"supergraphSdl": {
"anyOf": [
{
"type": "string",
"description": "A GraphQL document, such as a schema in SDL syntax."
},
{
"type": "null"
}
],
"description": "Supergraph SDL generated by composition."
},
"graphCompositionID": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The unique ID for this instance of composition."
}
}
},
{
"type": "null"
}
],
"description": "The result of federated composition executed for this publication. This result includes either a supergraph schema or error details, depending on whether composition succeeded. This value is null when the publication is for a non-federated graph."
}
}
},
{
"type": "null"
}
],
"description": "The details of the variant's most recent publication."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
Original tool metadata
{
"name": "GetSupergraphSchema",
"description": "Read the composed supergraph schema (SDL) for a graph variant, with the composition ID and any composition errors. This is the same read that `rover supergraph fetch` performs. A supergraph schema is the single schema that composition builds from every subgraph, and it carries federation directives that the API schema does not. The response holds the whole document and is not truncated, and a supergraph schema is larger than the API schema it produces. Expect the same order of size: a large federated graph exceeds 800,000 characters, roughly 200,000 tokens. A variant that is not federated has no composition result, and the tool returns null for it rather than an empty document. Provide the graph ID and the variant name.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"variant"
],
"properties": {
"graphId": {
"type": "string"
},
"variant": {
"type": "string"
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"properties": {
"latestPublication": {
"anyOf": [
{
"type": "object",
"required": [
"publishedAt"
],
"properties": {
"publishedAt": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
"compositionResult": {
"anyOf": [
{
"type": "object",
"required": [
"graphCompositionID",
"errors"
],
"properties": {
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A machine-readable error code."
},
"message": {
"type": "string",
"description": "A human-readable message describing the error."
}
}
},
"description": "A list of errors that occurred during composition. Errors mean that Apollo was unable to compose the graph variant's subgraphs into a supergraph schema. If any errors are present, gateways / routers are not updated."
},
"supergraphSdl": {
"anyOf": [
{
"type": "string",
"description": "A GraphQL document, such as a schema in SDL syntax."
},
{
"type": "null"
}
],
"description": "Supergraph SDL generated by composition."
},
"graphCompositionID": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The unique ID for this instance of composition."
}
}
},
{
"type": "null"
}
],
"description": "The result of federated composition executed for this publication. This result includes either a supergraph schema or error details, depending on whether composition succeeded. This value is null when the publication is for a non-federated graph."
}
}
},
{
"type": "null"
}
],
"description": "The details of the variant's most recent publication."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
},
"annotations": {
"title": "Get a supergraph schema",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Read the outcome of one schema check run: the overall status, and for each task in the run the composition errors, lint diagnostics, schema changes with the client operations they affect, downstream variant results, and custom check violations. Use this after GetSchemaChecks gives you a check ID. Provide the graph ID and the check ID. The affected operations are paged with affectedOperationsLimit and affectedOperationsOffset; the change list is capped by the server, and areChangesTruncated reports when that happened.
The description explains the capability, when to use it, and what to expect.
Inputs38/100
2 of 4 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
checkId
Not provided
Missing description. Explain what this value means and how to supply it.
affectedOperationsLimit
The maximum number of affected queries to return. Must be 50 or fewer.#The maximum number of affected queries to return. Must be 50 or fewer.#The maximum number of affected queries to return. Must be 50 or fewer.#The maximum number of affected queries to return. Must be 50 or fewer.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
affectedOperationsOffset
How many items to skip before starting to return results.
For example, with `limit: 10` and `offset: 10`, you get items 11–20.#How many items to skip before starting to return results.
For example, with `limit: 10` and `offset: 10`, you get items 11–20.#How many items to skip before starting to return results.
For example, with `limit: 10` and `offset: 10`, you get items 11–20.#How many items to skip before starting to return results.
For example, with `limit: 10` and `offset: 10`, you get items 11–20.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"checkWorkflow": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"status",
"createdAt",
"tasks"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"tasks": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"status"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"status": {
"$ref": "#/definitions/CheckWorkflowTaskStatus",
"description": "The status of this task. All tasks start with the PENDING status while initializing. If any\n prerequisite task fails, then the task status becomes BLOCKED. Otherwise, if all prerequisite\n tasks pass, then this task runs (still having the PENDING status). Once the task completes, the\n task status will become either PASSED or FAILED."
},
"results": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"blocking",
"downstreamGraphID",
"downstreamVariantName"
],
"properties": {
"blocking": {
"type": "boolean",
"description": "Whether the downstream check workflow blocks the upstream check workflow from completing."
},
"downstreamGraphID": {
"type": "string",
"description": "The ID of the graph that the downstream variant belongs to."
},
"downstreamVariantName": {
"type": "string",
"description": "The name of the downstream variant."
},
"failsUpstreamWorkflow": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the downstream check workflow is causing the upstream check workflow to fail. This occurs\nwhen the downstream check workflow is both blocking and failing. This may be null while the\ndownstream check workflow is pending."
}
}
}
},
{
"type": "null"
}
],
"description": "A list of results for all downstream checks triggered as part of the source variant's checks workflow.\nThis value is null if the task hasn't been initialized yet, or if the build task fails (the build task is a\nprerequisite to this task). This value is _not_ null _while_ the task is running. The returned list is empty\nif the source variant has no downstream variants."
},
"targetURL": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A studio UI url to view the details of this check workflow task"
},
"__typename": {
"type": "string",
"description": "The typename of this object"
},
"lintResult": {
"anyOf": [
{
"type": "object",
"required": [
"diagnostics",
"stats"
],
"properties": {
"stats": {
"type": "object",
"required": [
"errorsCount",
"warningsCount",
"totalCount",
"ignoredCount"
],
"properties": {
"totalCount": {
"type": "integer",
"description": "Total number of lint rules violated."
},
"errorsCount": {
"type": "integer",
"description": "Total number of lint errors."
},
"ignoredCount": {
"type": "integer",
"description": "Total number of lint rules ignored."
},
"warningsCount": {
"type": "integer",
"description": "Total number of lint warnings."
}
},
"description": "Stats generated from the resulting diagnostics."
},
"diagnostics": {
"type": "array",
"items": {
"type": "object",
"required": [
"coordinate",
"level",
"message",
"rule",
"sourceLocations"
],
"properties": {
"rule": {
"$ref": "#/definitions/LintRule",
"description": "The lint rule being violated."
},
"level": {
"$ref": "#/definitions/LintDiagnosticLevel",
"description": "The graph's configured level for the rule."
},
"message": {
"type": "string",
"description": "The message describing the rule violation."
},
"coordinate": {
"type": "string",
"description": "The schema coordinate of this diagnostic."
},
"sourceLocations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"end": {
"anyOf": [
{
"type": "object",
"required": [
"line",
"column"
],
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
},
{
"type": "null"
}
]
},
"start": {
"anyOf": [
{
"type": "object",
"required": [
"line",
"column"
],
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
},
{
"type": "null"
}
]
},
"subgraphName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
}
},
"description": "The human readable position in the file of the rule violation."
}
}
},
"description": "The set of lint rule violations found in the schema."
}
}
},
{
"type": "null"
}
]
},
"hasWarnings": {
"type": "boolean",
"description": "True if this Proposal check passed with warnings, otherwise false."
},
"customResult": {
"anyOf": [
{
"type": "object",
"required": [
"violations"
],
"properties": {
"violations": {
"type": "array",
"items": {
"type": "object",
"required": [
"level",
"message",
"rule"
],
"properties": {
"rule": {
"type": "string",
"description": "The rule being violated. This is used to group multiple violations together in Studio. Max character length is 128."
},
"level": {
"$ref": "#/definitions/ViolationLevel",
"description": "The violation level for the rule."
},
"message": {
"type": "string",
"description": "A human-readable message describing the rule violation, rendered as markdown in Apollo Studio. Maximum length: 512 characters."
},
"coordinate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The schema coordinate of this rule violation as defined by RFC:\n\t\thttps://github.com/graphql/graphql-wg/blob/main/rfcs/SchemaCoordinates.md\n\t\tOptional for violations that aren't specific to a single schema element"
}
}
}
}
}
},
{
"type": "null"
}
]
},
"severityLevel": {
"$ref": "#/definitions/ProposalChangeMismatchSeverity",
"description": "The configured severity at the time the check was run. If the check failed, this is the severity that should be shown. While this Check is PENDING defaults to Service's severityLevel."
},
"operationsResult": {
"anyOf": [
{
"type": "object",
"required": [
"checkSeverity",
"numberOfCheckedOperations",
"totalNumberOfChanges",
"areChangesTruncated",
"numberOfAffectedOperations",
"totalNumberOfAffectedOperations",
"changeSummary",
"changes"
],
"properties": {
"changes": {
"type": "array",
"items": {
"type": "object",
"required": [
"severity",
"code",
"category",
"description"
],
"properties": {
"code": {
"type": "string",
"description": "Indicates the type of change that was made, and to what (e.g., 'TYPE_REMOVED')."
},
"category": {
"$ref": "#/definitions/ChangeCategory",
"description": "Indication of the category of the change (e.g. addition, removal, edit)."
},
"severity": {
"$ref": "#/definitions/ChangeSeverity",
"description": "The severity of the change (e.g., `FAILURE` or `NOTICE`)"
},
"description": {
"type": "string",
"description": "A human-readable description of the change."
}
}
},
"description": "List of schema changes with associated affected clients and operations"
},
"changeSummary": {
"type": "object",
"required": [
"total"
],
"properties": {
"total": {
"type": "object",
"required": [
"additions",
"removals",
"edits",
"deprecations"
],
"properties": {
"edits": {
"type": "integer",
"description": "Number of changes that are edits. This includes types changing kind, fields and arguments\nchanging type, arguments changing default value, and any description changes. This also includes\nedits to @deprecated reason strings."
},
"removals": {
"type": "integer",
"description": "Number of changes that are removals. This includes removing types, removing fields from object,\ninput object, and interface types, removing values from enums, removing members from interfaces\nand unions, and removing arguments. This also includes removing @deprecated usages."
},
"additions": {
"type": "integer",
"description": "Number of changes that are additions. This includes adding types, adding fields to object, input\nobject, and interface types, adding values to enums, adding members to interfaces and unions, and\nadding arguments."
},
"deprecations": {
"type": "integer",
"description": "Number of changes that are new usages of the @deprecated directive."
}
},
"description": "Counts for all changes."
}
},
"description": "Summary/counts for all changes in diff"
},
"checkSeverity": {
"$ref": "#/definitions/ChangeSeverity",
"description": "Indication of the success of the change, either failure, warning, or notice."
},
"affectedQueries": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Name provided for the operation, which can be empty string if it is an anonymous operation"
},
"isValid": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Determines if this query validates against the proposed schema"
},
"displayName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Name to display to the user for the operation"
},
"markedAsSafe": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the changes were marked as safe and its severity was downgraded for that reason"
},
"markedAsIgnored": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether this operation was ignored and its severity was downgraded for that reason"
}
}
}
},
{
"type": "null"
}
],
"description": "Operations affected by all changes in diff"
},
"areChangesTruncated": {
"type": "boolean",
"description": "Indicates whether the changes for this operation check were truncated due to their large quantity."
},
"totalNumberOfChanges": {
"type": "integer",
"description": "Total number of schema changes, excluding any truncation."
},
"numberOfCheckedOperations": {
"type": "integer",
"description": "Number of operations that were validated during schema diff"
},
"numberOfAffectedOperations": {
"type": "integer",
"description": "Number of affected operations that are neither marked as SAFE or IGNORED."
},
"totalNumberOfAffectedOperations": {
"type": "integer",
"description": "Total number of affected operations including ones marked SAFE or IGNORED."
}
}
},
{
"type": "null"
}
],
"description": "The result of the operations check. This will be null when the task is initializing or running,\nor when the build task fails (which is a prerequisite task to this one)."
},
"proposalCoverage": {
"$ref": "#/definitions/ProposalCoverage",
"description": "Indicates the level of coverage a check's changeset is in approved Proposals. PENDING while Check is still running."
},
"compositionResult": {
"anyOf": [
{
"type": "object",
"required": [
"graphCompositionID",
"errors"
],
"properties": {
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message",
"locations"
],
"properties": {
"code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A machine-readable error code."
},
"message": {
"type": "string",
"description": "A human-readable message describing the error."
},
"locations": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"line",
"column"
],
"properties": {
"line": {
"type": "integer",
"description": "Line number."
},
"column": {
"type": "integer",
"description": "Column number."
}
}
},
{
"type": "null"
}
]
},
"description": "Source locations related to the error."
}
}
},
"description": "A list of errors that occurred during composition. Errors mean that Apollo was unable to compose the graph variant's subgraphs into a supergraph schema. If any errors are present, gateways / routers are not updated."
},
"graphCompositionID": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The unique ID for this instance of composition."
}
}
},
{
"type": "null"
}
],
"description": "An old version of buildResult that returns a very old GraphQL type that generally should be\navoided. This field will soon be deprecated."
},
"coreSchemaModified": {
"type": "boolean",
"description": "Whether the build's output supergraph core schema differs from that of the active publish for\nthe workflow's variant at the time this field executed (NOT at the time the check workflow\nstarted)."
}
}
},
"description": "The set of check tasks associated with this workflow, e.g. composition, operations, etc."
},
"status": {
"$ref": "#/definitions/CheckWorkflowStatus",
"description": "Overall status of the workflow, based on the underlying task statuses."
},
"createdAt": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
"startedAt": {
"anyOf": [
{
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
{
"type": "null"
}
],
"description": "The timestamp when the check workflow started."
},
"gitContext": {
"anyOf": [
{
"type": "object",
"properties": {
"commit": {
"anyOf": [
{
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
{
"type": "null"
}
]
}
}
},
{
"type": "null"
}
],
"description": "Contextual parameters supplied by the runtime environment where the check was run."
},
"baseVariant": {
"anyOf": [
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The variant's name (e.g., `staging`)."
}
}
},
{
"type": "null"
}
],
"description": "The variant provided as a base to check against. Only the differences from the\nbase schema will be tested in operations checks."
},
"completedAt": {
"anyOf": [
{
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
{
"type": "null"
}
],
"description": "The timestamp when the check workflow completed."
},
"implementingServiceName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The name of the implementing service that was responsible for triggering the validation."
}
}
},
{
"type": "null"
}
],
"description": "Get a check workflow for this graph by its ID"
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
},
"definitions": {
"LintRule": {
"enum": [
"ALL_ELEMENTS_REQUIRE_DESCRIPTION",
"CONTACT_DIRECTIVE_MISSING",
"DEFINED_TYPES_ARE_UNUSED",
"DEPRECATED_DIRECTIVE_MISSING_REASON",
"DIRECTIVE_COMPOSITION",
"DIRECTIVE_NAMES_SHOULD_BE_CAMEL_CASE",
"DOES_NOT_PARSE",
"ENUM_PREFIX",
"ENUM_SUFFIX",
"ENUM_USED_AS_INPUT_WITHOUT_SUFFIX",
"ENUM_USED_AS_OUTPUT_DESPITE_SUFFIX",
"ENUM_VALUES_SHOULD_BE_SCREAMING_SNAKE_CASE",
"FIELD_NAMES_SHOULD_BE_CAMEL_CASE",
"FROM_SUBGRAPH_DOES_NOT_EXIST",
"INCONSISTENT_ARGUMENT_PRESENCE",
"INCONSISTENT_BUT_COMPATIBLE_ARGUMENT_TYPE",
"INCONSISTENT_BUT_COMPATIBLE_FIELD_TYPE",
"INCONSISTENT_DEFAULT_VALUE_PRESENCE",
"INCONSISTENT_DESCRIPTION",
"INCONSISTENT_ENTITY",
"INCONSISTENT_ENUM_VALUE_FOR_INPUT_ENUM",
"INCONSISTENT_ENUM_VALUE_FOR_OUTPUT_ENUM",
"INCONSISTENT_EXECUTABLE_DIRECTIVE_LOCATIONS",
"INCONSISTENT_EXECUTABLE_DIRECTIVE_PRESENCE",
"INCONSISTENT_EXECUTABLE_DIRECTIVE_REPEATABLE",
"INCONSISTENT_INPUT_OBJECT_FIELD",
"INCONSISTENT_INTERFACE_VALUE_TYPE_FIELD",
"INCONSISTENT_NON_REPEATABLE_DIRECTIVE_ARGUMENTS",
"INCONSISTENT_OBJECT_VALUE_TYPE_FIELD",
"INCONSISTENT_RUNTIME_TYPES_FOR_SHAREABLE_RETURN",
"INCONSISTENT_TYPE_SYSTEM_DIRECTIVE_LOCATIONS",
"INCONSISTENT_TYPE_SYSTEM_DIRECTIVE_REPEATABLE",
"INCONSISTENT_UNION_MEMBER",
"INPUT_ARGUMENT_NAMES_SHOULD_BE_CAMEL_CASE",
"INPUT_TYPE_SUFFIX",
"INTERFACE_PREFIX",
"INTERFACE_SUFFIX",
"MERGED_NON_REPEATABLE_DIRECTIVE_ARGUMENTS",
"NO_EXECUTABLE_DIRECTIVE_INTERSECTION",
"NULLABLE_PATH_VARIABLE",
"OBJECT_PREFIX",
"OBJECT_SUFFIX",
"OVERRIDDEN_FIELD_CAN_BE_REMOVED",
"OVERRIDE_DIRECTIVE_CAN_BE_REMOVED",
"OVERRIDE_MIGRATION_IN_PROGRESS",
"QUERY_DOCUMENT_DECLARATION",
"RESTY_FIELD_NAMES",
"TAG_DIRECTIVE_USES_UNKNOWN_NAME",
"TYPE_NAMES_SHOULD_BE_PASCAL_CASE",
"TYPE_PREFIX",
"TYPE_SUFFIX",
"UNUSED_ENUM_TYPE"
],
"type": "string"
},
"ChangeCategory": {
"enum": [
"ADDITION",
"EDIT",
"REMOVAL",
"DEPRECATION"
],
"type": "string",
"description": "Defines a set of categories that a schema change\ncan be grouped by."
},
"ChangeSeverity": {
"enum": [
"FAILURE",
"NOTICE"
],
"type": "string"
},
"ViolationLevel": {
"enum": [
"ERROR",
"INFO",
"WARNING"
],
"type": "string"
},
"ProposalCoverage": {
"enum": [
"FULL",
"NONE",
"OVERRIDDEN",
"PARTIAL",
"PENDING"
],
"type": "string"
},
"CheckWorkflowStatus": {
"enum": [
"FAILED",
"PASSED",
"PENDING"
],
"type": "string"
},
"LintDiagnosticLevel": {
"enum": [
"ERROR",
"IGNORED",
"WARNING"
],
"type": "string",
"description": "The severity level of an lint result."
},
"CheckWorkflowTaskStatus": {
"enum": [
"BLOCKED",
"FAILED",
"PASSED",
"PENDING"
],
"type": "string"
},
"ProposalChangeMismatchSeverity": {
"enum": [
"ERROR",
"OFF",
"WARN"
],
"type": "string"
}
}
}
Original tool metadata
{
"name": "GetCheckResults",
"description": "Read the outcome of one schema check run: the overall status, and for each task in the run the composition errors, lint diagnostics, schema changes with the client operations they affect, downstream variant results, and custom check violations. Use this after GetSchemaChecks gives you a check ID. Provide the graph ID and the check ID. The affected operations are paged with affectedOperationsLimit and affectedOperationsOffset; the change list is capped by the server, and areChangesTruncated reports when that happened.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"checkId"
],
"properties": {
"checkId": {
"type": "string"
},
"graphId": {
"type": "string"
},
"affectedOperationsLimit": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": 20,
"description": "The maximum number of affected queries to return. Must be 50 or fewer.#The maximum number of affected queries to return. Must be 50 or fewer.#The maximum number of affected queries to return. Must be 50 or fewer.#The maximum number of affected queries to return. Must be 50 or fewer."
},
"affectedOperationsOffset": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": 0,
"description": "How many items to skip before starting to return results.\nFor example, with `limit: 10` and `offset: 10`, you get items 11–20.#How many items to skip before starting to return results.\nFor example, with `limit: 10` and `offset: 10`, you get items 11–20.#How many items to skip before starting to return results.\nFor example, with `limit: 10` and `offset: 10`, you get items 11–20.#How many items to skip before starting to return results.\nFor example, with `limit: 10` and `offset: 10`, you get items 11–20."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"checkWorkflow": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"status",
"createdAt",
"tasks"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"tasks": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"status"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"status": {
"$ref": "#/definitions/CheckWorkflowTaskStatus",
"description": "The status of this task. All tasks start with the PENDING status while initializing. If any\n prerequisite task fails, then the task status becomes BLOCKED. Otherwise, if all prerequisite\n tasks pass, then this task runs (still having the PENDING status). Once the task completes, the\n task status will become either PASSED or FAILED."
},
"results": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"blocking",
"downstreamGraphID",
"downstreamVariantName"
],
"properties": {
"blocking": {
"type": "boolean",
"description": "Whether the downstream check workflow blocks the upstream check workflow from completing."
},
"downstreamGraphID": {
"type": "string",
"description": "The ID of the graph that the downstream variant belongs to."
},
"downstreamVariantName": {
"type": "string",
"description": "The name of the downstream variant."
},
"failsUpstreamWorkflow": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the downstream check workflow is causing the upstream check workflow to fail. This occurs\nwhen the downstream check workflow is both blocking and failing. This may be null while the\ndownstream check workflow is pending."
}
}
}
},
{
"type": "null"
}
],
"description": "A list of results for all downstream checks triggered as part of the source variant's checks workflow.\nThis value is null if the task hasn't been initialized yet, or if the build task fails (the build task is a\nprerequisite to this task). This value is _not_ null _while_ the task is running. The returned list is empty\nif the source variant has no downstream variants."
},
"targetURL": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A studio UI url to view the details of this check workflow task"
},
"__typename": {
"type": "string",
"description": "The typename of this object"
},
"lintResult": {
"anyOf": [
{
"type": "object",
"required": [
"diagnostics",
"stats"
],
"properties": {
"stats": {
"type": "object",
"required": [
"errorsCount",
"warningsCount",
"totalCount",
"ignoredCount"
],
"properties": {
"totalCount": {
"type": "integer",
"description": "Total number of lint rules violated."
},
"errorsCount": {
"type": "integer",
"description": "Total number of lint errors."
},
"ignoredCount": {
"type": "integer",
"description": "Total number of lint rules ignored."
},
"warningsCount": {
"type": "integer",
"description": "Total number of lint warnings."
}
},
"description": "Stats generated from the resulting diagnostics."
},
"diagnostics": {
"type": "array",
"items": {
"type": "object",
"required": [
"coordinate",
"level",
"message",
"rule",
"sourceLocations"
],
"properties": {
"rule": {
"$ref": "#/definitions/LintRule",
"description": "The lint rule being violated."
},
"level": {
"$ref": "#/definitions/LintDiagnosticLevel",
"description": "The graph's configured level for the rule."
},
"message": {
"type": "string",
"description": "The message describing the rule violation."
},
"coordinate": {
"type": "string",
"description": "The schema coordinate of this diagnostic."
},
"sourceLocations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"end": {
"anyOf": [
{
"type": "object",
"required": [
"line",
"column"
],
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
},
{
"type": "null"
}
]
},
"start": {
"anyOf": [
{
"type": "object",
"required": [
"line",
"column"
],
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
},
{
"type": "null"
}
]
},
"subgraphName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
}
},
"description": "The human readable position in the file of the rule violation."
}
}
},
"description": "The set of lint rule violations found in the schema."
}
}
},
{
"type": "null"
}
]
},
"hasWarnings": {
"type": "boolean",
"description": "True if this Proposal check passed with warnings, otherwise false."
},
"customResult": {
"anyOf": [
{
"type": "object",
"required": [
"violations"
],
"properties": {
"violations": {
"type": "array",
"items": {
"type": "object",
"required": [
"level",
"message",
"rule"
],
"properties": {
"rule": {
"type": "string",
"description": "The rule being violated. This is used to group multiple violations together in Studio. Max character length is 128."
},
"level": {
"$ref": "#/definitions/ViolationLevel",
"description": "The violation level for the rule."
},
"message": {
"type": "string",
"description": "A human-readable message describing the rule violation, rendered as markdown in Apollo Studio. Maximum length: 512 characters."
},
"coordinate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The schema coordinate of this rule violation as defined by RFC:\n\t\thttps://github.com/graphql/graphql-wg/blob/main/rfcs/SchemaCoordinates.md\n\t\tOptional for violations that aren't specific to a single schema element"
}
}
}
}
}
},
{
"type": "null"
}
]
},
"severityLevel": {
"$ref": "#/definitions/ProposalChangeMismatchSeverity",
"description": "The configured severity at the time the check was run. If the check failed, this is the severity that should be shown. While this Check is PENDING defaults to Service's severityLevel."
},
"operationsResult": {
"anyOf": [
{
"type": "object",
"required": [
"checkSeverity",
"numberOfCheckedOperations",
"totalNumberOfChanges",
"areChangesTruncated",
"numberOfAffectedOperations",
"totalNumberOfAffectedOperations",
"changeSummary",
"changes"
],
"properties": {
"changes": {
"type": "array",
"items": {
"type": "object",
"required": [
"severity",
"code",
"category",
"description"
],
"properties": {
"code": {
"type": "string",
"description": "Indicates the type of change that was made, and to what (e.g., 'TYPE_REMOVED')."
},
"category": {
"$ref": "#/definitions/ChangeCategory",
"description": "Indication of the category of the change (e.g. addition, removal, edit)."
},
"severity": {
"$ref": "#/definitions/ChangeSeverity",
"description": "The severity of the change (e.g., `FAILURE` or `NOTICE`)"
},
"description": {
"type": "string",
"description": "A human-readable description of the change."
}
}
},
"description": "List of schema changes with associated affected clients and operations"
},
"changeSummary": {
"type": "object",
"required": [
"total"
],
"properties": {
"total": {
"type": "object",
"required": [
"additions",
"removals",
"edits",
"deprecations"
],
"properties": {
"edits": {
"type": "integer",
"description": "Number of changes that are edits. This includes types changing kind, fields and arguments\nchanging type, arguments changing default value, and any description changes. This also includes\nedits to @deprecated reason strings."
},
"removals": {
"type": "integer",
"description": "Number of changes that are removals. This includes removing types, removing fields from object,\ninput object, and interface types, removing values from enums, removing members from interfaces\nand unions, and removing arguments. This also includes removing @deprecated usages."
},
"additions": {
"type": "integer",
"description": "Number of changes that are additions. This includes adding types, adding fields to object, input\nobject, and interface types, adding values to enums, adding members to interfaces and unions, and\nadding arguments."
},
"deprecations": {
"type": "integer",
"description": "Number of changes that are new usages of the @deprecated directive."
}
},
"description": "Counts for all changes."
}
},
"description": "Summary/counts for all changes in diff"
},
"checkSeverity": {
"$ref": "#/definitions/ChangeSeverity",
"description": "Indication of the success of the change, either failure, warning, or notice."
},
"affectedQueries": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Name provided for the operation, which can be empty string if it is an anonymous operation"
},
"isValid": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Determines if this query validates against the proposed schema"
},
"displayName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Name to display to the user for the operation"
},
"markedAsSafe": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the changes were marked as safe and its severity was downgraded for that reason"
},
"markedAsIgnored": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether this operation was ignored and its severity was downgraded for that reason"
}
}
}
},
{
"type": "null"
}
],
"description": "Operations affected by all changes in diff"
},
"areChangesTruncated": {
"type": "boolean",
"description": "Indicates whether the changes for this operation check were truncated due to their large quantity."
},
"totalNumberOfChanges": {
"type": "integer",
"description": "Total number of schema changes, excluding any truncation."
},
"numberOfCheckedOperations": {
"type": "integer",
"description": "Number of operations that were validated during schema diff"
},
"numberOfAffectedOperations": {
"type": "integer",
"description": "Number of affected operations that are neither marked as SAFE or IGNORED."
},
"totalNumberOfAffectedOperations": {
"type": "integer",
"description": "Total number of affected operations including ones marked SAFE or IGNORED."
}
}
},
{
"type": "null"
}
],
"description": "The result of the operations check. This will be null when the task is initializing or running,\nor when the build task fails (which is a prerequisite task to this one)."
},
"proposalCoverage": {
"$ref": "#/definitions/ProposalCoverage",
"description": "Indicates the level of coverage a check's changeset is in approved Proposals. PENDING while Check is still running."
},
"compositionResult": {
"anyOf": [
{
"type": "object",
"required": [
"graphCompositionID",
"errors"
],
"properties": {
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message",
"locations"
],
"properties": {
"code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A machine-readable error code."
},
"message": {
"type": "string",
"description": "A human-readable message describing the error."
},
"locations": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"line",
"column"
],
"properties": {
"line": {
"type": "integer",
"description": "Line number."
},
"column": {
"type": "integer",
"description": "Column number."
}
}
},
{
"type": "null"
}
]
},
"description": "Source locations related to the error."
}
}
},
"description": "A list of errors that occurred during composition. Errors mean that Apollo was unable to compose the graph variant's subgraphs into a supergraph schema. If any errors are present, gateways / routers are not updated."
},
"graphCompositionID": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The unique ID for this instance of composition."
}
}
},
{
"type": "null"
}
],
"description": "An old version of buildResult that returns a very old GraphQL type that generally should be\navoided. This field will soon be deprecated."
},
"coreSchemaModified": {
"type": "boolean",
"description": "Whether the build's output supergraph core schema differs from that of the active publish for\nthe workflow's variant at the time this field executed (NOT at the time the check workflow\nstarted)."
}
}
},
"description": "The set of check tasks associated with this workflow, e.g. composition, operations, etc."
},
"status": {
"$ref": "#/definitions/CheckWorkflowStatus",
"description": "Overall status of the workflow, based on the underlying task statuses."
},
"createdAt": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
"startedAt": {
"anyOf": [
{
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
{
"type": "null"
}
],
"description": "The timestamp when the check workflow started."
},
"gitContext": {
"anyOf": [
{
"type": "object",
"properties": {
"commit": {
"anyOf": [
{
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
{
"type": "null"
}
]
}
}
},
{
"type": "null"
}
],
"description": "Contextual parameters supplied by the runtime environment where the check was run."
},
"baseVariant": {
"anyOf": [
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The variant's name (e.g., `staging`)."
}
}
},
{
"type": "null"
}
],
"description": "The variant provided as a base to check against. Only the differences from the\nbase schema will be tested in operations checks."
},
"completedAt": {
"anyOf": [
{
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
{
"type": "null"
}
],
"description": "The timestamp when the check workflow completed."
},
"implementingServiceName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The name of the implementing service that was responsible for triggering the validation."
}
}
},
{
"type": "null"
}
],
"description": "Get a check workflow for this graph by its ID"
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
},
"definitions": {
"LintRule": {
"enum": [
"ALL_ELEMENTS_REQUIRE_DESCRIPTION",
"CONTACT_DIRECTIVE_MISSING",
"DEFINED_TYPES_ARE_UNUSED",
"DEPRECATED_DIRECTIVE_MISSING_REASON",
"DIRECTIVE_COMPOSITION",
"DIRECTIVE_NAMES_SHOULD_BE_CAMEL_CASE",
"DOES_NOT_PARSE",
"ENUM_PREFIX",
"ENUM_SUFFIX",
"ENUM_USED_AS_INPUT_WITHOUT_SUFFIX",
"ENUM_USED_AS_OUTPUT_DESPITE_SUFFIX",
"ENUM_VALUES_SHOULD_BE_SCREAMING_SNAKE_CASE",
"FIELD_NAMES_SHOULD_BE_CAMEL_CASE",
"FROM_SUBGRAPH_DOES_NOT_EXIST",
"INCONSISTENT_ARGUMENT_PRESENCE",
"INCONSISTENT_BUT_COMPATIBLE_ARGUMENT_TYPE",
"INCONSISTENT_BUT_COMPATIBLE_FIELD_TYPE",
"INCONSISTENT_DEFAULT_VALUE_PRESENCE",
"INCONSISTENT_DESCRIPTION",
"INCONSISTENT_ENTITY",
"INCONSISTENT_ENUM_VALUE_FOR_INPUT_ENUM",
"INCONSISTENT_ENUM_VALUE_FOR_OUTPUT_ENUM",
"INCONSISTENT_EXECUTABLE_DIRECTIVE_LOCATIONS",
"INCONSISTENT_EXECUTABLE_DIRECTIVE_PRESENCE",
"INCONSISTENT_EXECUTABLE_DIRECTIVE_REPEATABLE",
"INCONSISTENT_INPUT_OBJECT_FIELD",
"INCONSISTENT_INTERFACE_VALUE_TYPE_FIELD",
"INCONSISTENT_NON_REPEATABLE_DIRECTIVE_ARGUMENTS",
"INCONSISTENT_OBJECT_VALUE_TYPE_FIELD",
"INCONSISTENT_RUNTIME_TYPES_FOR_SHAREABLE_RETURN",
"INCONSISTENT_TYPE_SYSTEM_DIRECTIVE_LOCATIONS",
"INCONSISTENT_TYPE_SYSTEM_DIRECTIVE_REPEATABLE",
"INCONSISTENT_UNION_MEMBER",
"INPUT_ARGUMENT_NAMES_SHOULD_BE_CAMEL_CASE",
"INPUT_TYPE_SUFFIX",
"INTERFACE_PREFIX",
"INTERFACE_SUFFIX",
"MERGED_NON_REPEATABLE_DIRECTIVE_ARGUMENTS",
"NO_EXECUTABLE_DIRECTIVE_INTERSECTION",
"NULLABLE_PATH_VARIABLE",
"OBJECT_PREFIX",
"OBJECT_SUFFIX",
"OVERRIDDEN_FIELD_CAN_BE_REMOVED",
"OVERRIDE_DIRECTIVE_CAN_BE_REMOVED",
"OVERRIDE_MIGRATION_IN_PROGRESS",
"QUERY_DOCUMENT_DECLARATION",
"RESTY_FIELD_NAMES",
"TAG_DIRECTIVE_USES_UNKNOWN_NAME",
"TYPE_NAMES_SHOULD_BE_PASCAL_CASE",
"TYPE_PREFIX",
"TYPE_SUFFIX",
"UNUSED_ENUM_TYPE"
],
"type": "string"
},
"ChangeCategory": {
"enum": [
"ADDITION",
"EDIT",
"REMOVAL",
"DEPRECATION"
],
"type": "string",
"description": "Defines a set of categories that a schema change\ncan be grouped by."
},
"ChangeSeverity": {
"enum": [
"FAILURE",
"NOTICE"
],
"type": "string"
},
"ViolationLevel": {
"enum": [
"ERROR",
"INFO",
"WARNING"
],
"type": "string"
},
"ProposalCoverage": {
"enum": [
"FULL",
"NONE",
"OVERRIDDEN",
"PARTIAL",
"PENDING"
],
"type": "string"
},
"CheckWorkflowStatus": {
"enum": [
"FAILED",
"PASSED",
"PENDING"
],
"type": "string"
},
"LintDiagnosticLevel": {
"enum": [
"ERROR",
"IGNORED",
"WARNING"
],
"type": "string",
"description": "The severity level of an lint result."
},
"CheckWorkflowTaskStatus": {
"enum": [
"BLOCKED",
"FAILED",
"PASSED",
"PENDING"
],
"type": "string"
},
"ProposalChangeMismatchSeverity": {
"enum": [
"ERROR",
"OFF",
"WARN"
],
"type": "string"
}
}
},
"annotations": {
"title": "Get schema check results",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
Searches official Apollo documentation for GraphQL, GraphOS, Apollo Router, Apollo Client, MCP Server, schema design, deployment, and Connectors. Returns URLs, slugs, and excerpts.
Describe the returned information so the agent knows whether it will answer the request.
Inputs62/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Use terms that would lead to broad result with a maximum of 2 keywords.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Validate client GraphQL operations against a variant's published schema and return each problem's type (FAILURE, WARNING, INVALID), code, description, and the name of the operation it came from. This is the same check that `rover client check` runs. Nothing is published and no state changes. Provide the graph ID and the operations, each one a body and an optional name. Optionally name the variant to validate against; the default is "current".
The description explains the capability, when to use it, and what to expect.
Inputs25/100
2 of 4 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
definitions › OperationDocumentInput › body
Operation document body
Explain the meaning of this value, not just its name.
definitions › OperationDocumentInput › name
Operation name
Explain the meaning of this value, not just its name.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Create or update a contract variant and start a launch for it, the same write that `rover contract publish` performs. A contract variant is a filtered view of another variant's schema, built by including and excluding schema elements by tag. The filter configuration replaces the previous one in full, so send the complete include and exclude lists rather than only the tags you want to change. The same applies to hideUnreachableTypes, which has no default: when you update a contract, pass the value it has now. GetContractConfig states that value in its description. Returns the contract variant and a link to the launch, or the error messages that stopped it. Provide the graph ID, the contract variant name, the source variant, the include and exclude tag lists, and whether to hide unreachable types.
The description explains the capability, when to use it, and what to expect.
Inputs39/100
3 of 7 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
contractVariant
The name of the contract variant, e.g. `public-api`. Once set, this value cannot be changed.
Clear enough to supply this argument.
sourceVariant
The graphRef of the variant the contract will be derived from, e.g. `my-graph@production`. Once set, this value cannot be changed.
Explain what happens when this optional value is omitted.
include
Not provided
Missing description. Explain what this value means and how to supply it.
exclude
Not provided
Missing description. Explain what this value means and how to supply it.
hideUnreachableTypes
Not provided
Missing description. Explain what this value means and how to supply it.
initiateLaunch
Whether a launch and schema publish should be initiated after updating configuration. Defaults to `true`.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"required": [
"upsertContractVariant"
],
"properties": {
"upsertContractVariant": {
"anyOf": [
{
"type": "object",
"required": [
"contractVariant"
],
"properties": {
"launchUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The URL of the Studio page for this update's associated launch, if available."
},
"contractVariant": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The variant's name (e.g., `staging`)."
}
},
"description": "The updated contract variant"
}
}
},
{
"type": "object",
"required": [
"errorMessages"
],
"properties": {
"errorMessages": {
"type": "array",
"items": {
"type": "string"
},
"description": "A list of all errors that occurred when attempting to create or update a contract variant."
}
}
}
],
"description": "Creates a contract schema from a source variant and a set of filter configurations"
}
}
},
{
"type": "null"
}
],
"description": "Provides access to mutation fields for modifying a Studio graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
Original tool metadata
{
"name": "PublishContract",
"description": "Create or update a contract variant and start a launch for it, the same write that `rover contract publish` performs. A contract variant is a filtered view of another variant's schema, built by including and excluding schema elements by tag. The filter configuration replaces the previous one in full, so send the complete include and exclude lists rather than only the tags you want to change. The same applies to hideUnreachableTypes, which has no default: when you update a contract, pass the value it has now. GetContractConfig states that value in its description. Returns the contract variant and a link to the launch, or the error messages that stopped it. Provide the graph ID, the contract variant name, the source variant, the include and exclude tag lists, and whether to hide unreachable types.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"contractVariant",
"include",
"exclude",
"hideUnreachableTypes"
],
"properties": {
"exclude": {
"type": "array",
"items": {
"type": "string"
}
},
"graphId": {
"type": "string"
},
"include": {
"type": "array",
"items": {
"type": "string"
}
},
"sourceVariant": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The graphRef of the variant the contract will be derived from, e.g. `my-graph@production`. Once set, this value cannot be changed."
},
"initiateLaunch": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": true,
"description": "Whether a launch and schema publish should be initiated after updating configuration. Defaults to `true`."
},
"contractVariant": {
"type": "string",
"description": "The name of the contract variant, e.g. `public-api`. Once set, this value cannot be changed."
},
"hideUnreachableTypes": {
"type": "boolean"
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"required": [
"upsertContractVariant"
],
"properties": {
"upsertContractVariant": {
"anyOf": [
{
"type": "object",
"required": [
"contractVariant"
],
"properties": {
"launchUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The URL of the Studio page for this update's associated launch, if available."
},
"contractVariant": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The variant's name (e.g., `staging`)."
}
},
"description": "The updated contract variant"
}
}
},
{
"type": "object",
"required": [
"errorMessages"
],
"properties": {
"errorMessages": {
"type": "array",
"items": {
"type": "string"
},
"description": "A list of all errors that occurred when attempting to create or update a contract variant."
}
}
}
],
"description": "Creates a contract schema from a source variant and a set of filter configurations"
}
}
},
{
"type": "null"
}
],
"description": "Provides access to mutation fields for modifying a Studio graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
},
"annotations": {
"title": "Publish a contract",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Replace the README of a graph variant, the same write that `rover readme publish` performs. The README is the Markdown document shown on the variant's page in GraphOS Studio. The new text replaces the whole README, so read the current one with GetReadme first if you intend to keep any of it. Provide the graph ID, the variant name, and the full README text.
The description explains the capability, when to use it, and what to expect.
Inputs33/100
1 of 3 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
readme
The full new text of the README, as a Markdown-formatted string.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Inspect the most recent launch for a graph variant: status, completion time, subgraph changes, composition errors, and a schema diff summary vs the previous launch (additions/removals/edits/deprecations plus affected operations). Use to assess schema composition health and the impact of recent schema changes. Also returns the latest approved launch for comparison. Provide the graph ID and variant name.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 2 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"properties": {
"latestLaunch": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"status"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The unique identifier for this launch."
},
"status": {
"$ref": "#/definitions/LaunchStatus",
"description": "The launch's status. If a launch is superseded, its status remains `LAUNCH_INITIATED`. To check for a superseded launch, use `supersededAt`."
},
"completedAt": {
"anyOf": [
{
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
{
"type": "null"
}
],
"description": "The timestamp when the launch completed. This value is null until the launch completes."
},
"publication": {
"anyOf": [
{
"type": "object",
"properties": {
"diffToPrevious": {
"anyOf": [
{
"type": "object",
"required": [
"changeSummary"
],
"properties": {
"changeSummary": {
"type": "object",
"required": [
"total",
"field"
],
"properties": {
"field": {
"type": "object",
"required": [
"additions",
"removals",
"edits"
],
"properties": {
"edits": {
"type": "integer",
"description": "Number of changes that are field edits. This includes fields changing type and any field\ndeprecation and description changes, but also includes any argument changes and any input object\nfield changes."
},
"removals": {
"type": "integer",
"description": "Number of changes that are removals of fields from object, interface, and input types."
},
"additions": {
"type": "integer",
"description": "Number of changes that are additions of fields to object, interface, and input types."
}
},
"description": "Counts for changes to fields of objects, input objects, and interfaces."
},
"total": {
"type": "object",
"required": [
"additions",
"removals",
"edits",
"deprecations"
],
"properties": {
"edits": {
"type": "integer",
"description": "Number of changes that are edits. This includes types changing kind, fields and arguments\nchanging type, arguments changing default value, and any description changes. This also includes\nedits to @deprecated reason strings."
},
"removals": {
"type": "integer",
"description": "Number of changes that are removals. This includes removing types, removing fields from object,\ninput object, and interface types, removing values from enums, removing members from interfaces\nand unions, and removing arguments. This also includes removing @deprecated usages."
},
"additions": {
"type": "integer",
"description": "Number of changes that are additions. This includes adding types, adding fields to object, input\nobject, and interface types, adding values to enums, adding members to interfaces and unions, and\nadding arguments."
},
"deprecations": {
"type": "integer",
"description": "Number of changes that are new usages of the @deprecated directive."
}
},
"description": "Counts for all changes."
}
},
"description": "Numeric summaries for each type of change in the diff."
},
"affectedQueries": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Name provided for the operation, which can be empty string if it is an anonymous operation"
},
"isValid": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Determines if this query validates against the proposed schema"
},
"markedAsSafe": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the changes were marked as safe and its severity was downgraded for that reason"
},
"markedAsIgnored": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether this operation was ignored and its severity was downgraded for that reason"
}
}
}
},
{
"type": "null"
}
],
"description": "Operations affected by all changes in the diff."
}
}
},
{
"type": "null"
}
],
"description": "A schema diff comparing against the schema from the most recent previous successful publication."
},
"compositionResult": {
"anyOf": [
{
"type": "object",
"required": [
"errors"
],
"properties": {
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message",
"locations"
],
"properties": {
"code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A machine-readable error code."
},
"message": {
"type": "string",
"description": "A human-readable message describing the error."
},
"locations": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"line",
"column"
],
"properties": {
"line": {
"type": "integer",
"description": "Line number."
},
"column": {
"type": "integer",
"description": "Column number."
}
}
},
{
"type": "null"
}
]
},
"description": "Source locations related to the error."
}
}
},
"description": "A list of errors that occurred during composition. Errors mean that Apollo was unable to compose the graph variant's subgraphs into a supergraph schema. If any errors are present, gateways / routers are not updated."
}
}
},
{
"type": "null"
}
],
"description": "The result of federated composition executed for this publication. This result includes either a supergraph schema or error details, depending on whether composition succeeded. This value is null when the publication is for a non-federated graph."
}
}
},
{
"type": "null"
}
],
"description": "A specific publication of a graph variant pertaining to this launch."
},
"subgraphChanges": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The subgraph's name."
}
}
}
},
{
"type": "null"
}
],
"description": "A list of subgraph changes that are included in this launch."
}
}
},
{
"type": "null"
}
],
"description": "Latest launch for the variant, whether successful or not."
},
"latestApprovedLaunch": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"status"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The unique identifier for this launch."
},
"status": {
"$ref": "#/definitions/LaunchStatus",
"description": "The launch's status. If a launch is superseded, its status remains `LAUNCH_INITIATED`. To check for a superseded launch, use `supersededAt`."
},
"completedAt": {
"anyOf": [
{
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
{
"type": "null"
}
],
"description": "The timestamp when the launch completed. This value is null until the launch completes."
}
}
},
{
"type": "null"
}
],
"description": "Latest approved launch for the variant, and what is served through Uplink."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
},
"definitions": {
"LaunchStatus": {
"enum": [
"LAUNCH_COMPLETED",
"LAUNCH_FAILED",
"LAUNCH_INITIATED"
],
"type": "string"
}
}
}
Original tool metadata
{
"name": "GetLatestLaunch",
"description": "Inspect the most recent launch for a graph variant: status, completion time, subgraph changes, composition errors, and a schema diff summary vs the previous launch (additions/removals/edits/deprecations plus affected operations). Use to assess schema composition health and the impact of recent schema changes. Also returns the latest approved launch for comparison. Provide the graph ID and variant name.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"variant"
],
"properties": {
"graphId": {
"type": "string"
},
"variant": {
"type": "string"
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"properties": {
"latestLaunch": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"status"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The unique identifier for this launch."
},
"status": {
"$ref": "#/definitions/LaunchStatus",
"description": "The launch's status. If a launch is superseded, its status remains `LAUNCH_INITIATED`. To check for a superseded launch, use `supersededAt`."
},
"completedAt": {
"anyOf": [
{
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
{
"type": "null"
}
],
"description": "The timestamp when the launch completed. This value is null until the launch completes."
},
"publication": {
"anyOf": [
{
"type": "object",
"properties": {
"diffToPrevious": {
"anyOf": [
{
"type": "object",
"required": [
"changeSummary"
],
"properties": {
"changeSummary": {
"type": "object",
"required": [
"total",
"field"
],
"properties": {
"field": {
"type": "object",
"required": [
"additions",
"removals",
"edits"
],
"properties": {
"edits": {
"type": "integer",
"description": "Number of changes that are field edits. This includes fields changing type and any field\ndeprecation and description changes, but also includes any argument changes and any input object\nfield changes."
},
"removals": {
"type": "integer",
"description": "Number of changes that are removals of fields from object, interface, and input types."
},
"additions": {
"type": "integer",
"description": "Number of changes that are additions of fields to object, interface, and input types."
}
},
"description": "Counts for changes to fields of objects, input objects, and interfaces."
},
"total": {
"type": "object",
"required": [
"additions",
"removals",
"edits",
"deprecations"
],
"properties": {
"edits": {
"type": "integer",
"description": "Number of changes that are edits. This includes types changing kind, fields and arguments\nchanging type, arguments changing default value, and any description changes. This also includes\nedits to @deprecated reason strings."
},
"removals": {
"type": "integer",
"description": "Number of changes that are removals. This includes removing types, removing fields from object,\ninput object, and interface types, removing values from enums, removing members from interfaces\nand unions, and removing arguments. This also includes removing @deprecated usages."
},
"additions": {
"type": "integer",
"description": "Number of changes that are additions. This includes adding types, adding fields to object, input\nobject, and interface types, adding values to enums, adding members to interfaces and unions, and\nadding arguments."
},
"deprecations": {
"type": "integer",
"description": "Number of changes that are new usages of the @deprecated directive."
}
},
"description": "Counts for all changes."
}
},
"description": "Numeric summaries for each type of change in the diff."
},
"affectedQueries": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Name provided for the operation, which can be empty string if it is an anonymous operation"
},
"isValid": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Determines if this query validates against the proposed schema"
},
"markedAsSafe": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the changes were marked as safe and its severity was downgraded for that reason"
},
"markedAsIgnored": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether this operation was ignored and its severity was downgraded for that reason"
}
}
}
},
{
"type": "null"
}
],
"description": "Operations affected by all changes in the diff."
}
}
},
{
"type": "null"
}
],
"description": "A schema diff comparing against the schema from the most recent previous successful publication."
},
"compositionResult": {
"anyOf": [
{
"type": "object",
"required": [
"errors"
],
"properties": {
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message",
"locations"
],
"properties": {
"code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A machine-readable error code."
},
"message": {
"type": "string",
"description": "A human-readable message describing the error."
},
"locations": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"line",
"column"
],
"properties": {
"line": {
"type": "integer",
"description": "Line number."
},
"column": {
"type": "integer",
"description": "Column number."
}
}
},
{
"type": "null"
}
]
},
"description": "Source locations related to the error."
}
}
},
"description": "A list of errors that occurred during composition. Errors mean that Apollo was unable to compose the graph variant's subgraphs into a supergraph schema. If any errors are present, gateways / routers are not updated."
}
}
},
{
"type": "null"
}
],
"description": "The result of federated composition executed for this publication. This result includes either a supergraph schema or error details, depending on whether composition succeeded. This value is null when the publication is for a non-federated graph."
}
}
},
{
"type": "null"
}
],
"description": "A specific publication of a graph variant pertaining to this launch."
},
"subgraphChanges": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The subgraph's name."
}
}
}
},
{
"type": "null"
}
],
"description": "A list of subgraph changes that are included in this launch."
}
}
},
{
"type": "null"
}
],
"description": "Latest launch for the variant, whether successful or not."
},
"latestApprovedLaunch": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"status"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The unique identifier for this launch."
},
"status": {
"$ref": "#/definitions/LaunchStatus",
"description": "The launch's status. If a launch is superseded, its status remains `LAUNCH_INITIATED`. To check for a superseded launch, use `supersededAt`."
},
"completedAt": {
"anyOf": [
{
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
{
"type": "null"
}
],
"description": "The timestamp when the launch completed. This value is null until the launch completes."
}
}
},
{
"type": "null"
}
],
"description": "Latest approved launch for the variant, and what is served through Uplink."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
},
"definitions": {
"LaunchStatus": {
"enum": [
"LAUNCH_COMPLETED",
"LAUNCH_FAILED",
"LAUNCH_INITIATED"
],
"type": "string"
}
}
},
"annotations": {
"title": "Get latest launch",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Inspect a single launch by ID for full detail: status, timestamps, which subgraphs changed, composition errors, and the schema diff summary. Use to drill into a specific launch — e.g. a failed or superseded one found via GetLaunchHistory (pass its id here). Provide the graph ID, variant name, and launch ID.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 3 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
launchId
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations100/100
All four behavior hints are declared.
{
"title": "Get a specific launch",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
Output schema57/100
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"properties": {
"launch": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"status",
"createdAt"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The unique identifier for this launch."
},
"status": {
"$ref": "#/definitions/LaunchStatus",
"description": "The launch's status. If a launch is superseded, its status remains `LAUNCH_INITIATED`. To check for a superseded launch, use `supersededAt`."
},
"createdAt": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
"completedAt": {
"anyOf": [
{
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
{
"type": "null"
}
],
"description": "The timestamp when the launch completed. This value is null until the launch completes."
},
"publication": {
"anyOf": [
{
"type": "object",
"properties": {
"diffToPrevious": {
"anyOf": [
{
"type": "object",
"required": [
"changeSummary"
],
"properties": {
"changeSummary": {
"type": "object",
"required": [
"total"
],
"properties": {
"total": {
"type": "object",
"required": [
"additions",
"removals",
"edits",
"deprecations"
],
"properties": {
"edits": {
"type": "integer",
"description": "Number of changes that are edits. This includes types changing kind, fields and arguments\nchanging type, arguments changing default value, and any description changes. This also includes\nedits to @deprecated reason strings."
},
"removals": {
"type": "integer",
"description": "Number of changes that are removals. This includes removing types, removing fields from object,\ninput object, and interface types, removing values from enums, removing members from interfaces\nand unions, and removing arguments. This also includes removing @deprecated usages."
},
"additions": {
"type": "integer",
"description": "Number of changes that are additions. This includes adding types, adding fields to object, input\nobject, and interface types, adding values to enums, adding members to interfaces and unions, and\nadding arguments."
},
"deprecations": {
"type": "integer",
"description": "Number of changes that are new usages of the @deprecated directive."
}
},
"description": "Counts for all changes."
}
},
"description": "Numeric summaries for each type of change in the diff."
}
}
},
{
"type": "null"
}
],
"description": "A schema diff comparing against the schema from the most recent previous successful publication."
},
"compositionResult": {
"anyOf": [
{
"type": "object",
"required": [
"errors"
],
"properties": {
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message",
"locations"
],
"properties": {
"code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A machine-readable error code."
},
"message": {
"type": "string",
"description": "A human-readable message describing the error."
},
"locations": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"line",
"column"
],
"properties": {
"line": {
"type": "integer",
"description": "Line number."
},
"column": {
"type": "integer",
"description": "Column number."
}
}
},
{
"type": "null"
}
]
},
"description": "Source locations related to the error."
}
}
},
"description": "A list of errors that occurred during composition. Errors mean that Apollo was unable to compose the graph variant's subgraphs into a supergraph schema. If any errors are present, gateways / routers are not updated."
}
}
},
{
"type": "null"
}
],
"description": "The result of federated composition executed for this publication. This result includes either a supergraph schema or error details, depending on whether composition succeeded. This value is null when the publication is for a non-federated graph."
}
}
},
{
"type": "null"
}
],
"description": "A specific publication of a graph variant pertaining to this launch."
},
"subgraphChanges": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The subgraph's name."
}
}
}
},
{
"type": "null"
}
],
"description": "A list of subgraph changes that are included in this launch."
}
}
},
{
"type": "null"
}
],
"description": "Retrieve a launch for this variant by ID."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
},
"definitions": {
"LaunchStatus": {
"enum": [
"LAUNCH_COMPLETED",
"LAUNCH_FAILED",
"LAUNCH_INITIATED"
],
"type": "string"
}
}
}
Original tool metadata
{
"name": "GetLaunch",
"description": "Inspect a single launch by ID for full detail: status, timestamps, which subgraphs changed, composition errors, and the schema diff summary. Use to drill into a specific launch — e.g. a failed or superseded one found via GetLaunchHistory (pass its id here). Provide the graph ID, variant name, and launch ID.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"variant",
"launchId"
],
"properties": {
"graphId": {
"type": "string"
},
"variant": {
"type": "string"
},
"launchId": {
"type": "string"
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"properties": {
"launch": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"status",
"createdAt"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The unique identifier for this launch."
},
"status": {
"$ref": "#/definitions/LaunchStatus",
"description": "The launch's status. If a launch is superseded, its status remains `LAUNCH_INITIATED`. To check for a superseded launch, use `supersededAt`."
},
"createdAt": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
"completedAt": {
"anyOf": [
{
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
{
"type": "null"
}
],
"description": "The timestamp when the launch completed. This value is null until the launch completes."
},
"publication": {
"anyOf": [
{
"type": "object",
"properties": {
"diffToPrevious": {
"anyOf": [
{
"type": "object",
"required": [
"changeSummary"
],
"properties": {
"changeSummary": {
"type": "object",
"required": [
"total"
],
"properties": {
"total": {
"type": "object",
"required": [
"additions",
"removals",
"edits",
"deprecations"
],
"properties": {
"edits": {
"type": "integer",
"description": "Number of changes that are edits. This includes types changing kind, fields and arguments\nchanging type, arguments changing default value, and any description changes. This also includes\nedits to @deprecated reason strings."
},
"removals": {
"type": "integer",
"description": "Number of changes that are removals. This includes removing types, removing fields from object,\ninput object, and interface types, removing values from enums, removing members from interfaces\nand unions, and removing arguments. This also includes removing @deprecated usages."
},
"additions": {
"type": "integer",
"description": "Number of changes that are additions. This includes adding types, adding fields to object, input\nobject, and interface types, adding values to enums, adding members to interfaces and unions, and\nadding arguments."
},
"deprecations": {
"type": "integer",
"description": "Number of changes that are new usages of the @deprecated directive."
}
},
"description": "Counts for all changes."
}
},
"description": "Numeric summaries for each type of change in the diff."
}
}
},
{
"type": "null"
}
],
"description": "A schema diff comparing against the schema from the most recent previous successful publication."
},
"compositionResult": {
"anyOf": [
{
"type": "object",
"required": [
"errors"
],
"properties": {
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message",
"locations"
],
"properties": {
"code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A machine-readable error code."
},
"message": {
"type": "string",
"description": "A human-readable message describing the error."
},
"locations": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"line",
"column"
],
"properties": {
"line": {
"type": "integer",
"description": "Line number."
},
"column": {
"type": "integer",
"description": "Column number."
}
}
},
{
"type": "null"
}
]
},
"description": "Source locations related to the error."
}
}
},
"description": "A list of errors that occurred during composition. Errors mean that Apollo was unable to compose the graph variant's subgraphs into a supergraph schema. If any errors are present, gateways / routers are not updated."
}
}
},
{
"type": "null"
}
],
"description": "The result of federated composition executed for this publication. This result includes either a supergraph schema or error details, depending on whether composition succeeded. This value is null when the publication is for a non-federated graph."
}
}
},
{
"type": "null"
}
],
"description": "A specific publication of a graph variant pertaining to this launch."
},
"subgraphChanges": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The subgraph's name."
}
}
}
},
{
"type": "null"
}
],
"description": "A list of subgraph changes that are included in this launch."
}
}
},
{
"type": "null"
}
],
"description": "Retrieve a launch for this variant by ID."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
},
"definitions": {
"LaunchStatus": {
"enum": [
"LAUNCH_COMPLETED",
"LAUNCH_FAILED",
"LAUNCH_INITIATED"
],
"type": "string"
}
}
},
"annotations": {
"title": "Get a specific launch",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Lint a GraphQL schema document against the graph's lint rules and return each diagnostic's coordinate, severity level, message, rule, and source location, plus the error, warning, total, and ignored counts. This is the same check that `rover graph lint` and `rover subgraph lint` run. Nothing is published and no state changes. Provide the graph ID and the schema as SDL. Optionally provide baseSdl to report only the diagnostics that the new schema introduces against that base.
The description explains the capability, when to use it, and what to expect.
Inputs65/100
2 of 3 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
sdl
The schema to lint.
Clear enough to supply this argument.
baseSdl
The schema to diff rule violations against, if not provided the full set of rule violations will be returned for the proposed sdl.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Retrieve schema lint violations from a graph's most recent schema checks: each diagnostic's coordinate, severity level, message, rule, and source location, plus error/warning/total/ignored counts. Use to assess schema quality and naming/best-practice violations. Provide the graph ID and optionally a limit (default 5 most recent schema checks).
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 2 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
limit
Not provided
Missing description. Explain what this value means and how to supply it.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Read the filter configuration of a contract variant: the tags it includes, the tags it excludes, the source variant it is built from, and a human-readable description of the configuration. This is the same read that `rover contract describe` performs. A contract variant is a filtered view of another variant's schema, built by including and excluding schema elements by tag. The filter configuration does not include whether unreachable types are hidden. The description states it, so read it there before you update a contract with PublishContract. A variant that is not a contract returns null for the filter configuration. Provide the graph ID and the contract variant name.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 2 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The variant's name (e.g., `staging`)."
},
"sourceVariant": {
"anyOf": [
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The variant's name (e.g., `staging`)."
}
}
},
{
"type": "null"
}
],
"description": "The variant this variant is derived from. This property currently only exists on contract variants."
},
"contractFilterConfig": {
"anyOf": [
{
"type": "object",
"required": [
"include",
"exclude"
],
"properties": {
"exclude": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tags of schema elements to exclude from the contract schema."
},
"include": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tags of schema elements to include in the contract schema."
}
}
},
{
"type": "null"
}
],
"description": "The filter configuration used to build a contract schema. The configuration consists of lists of tags for schema elements to include or exclude in the resulting schema."
},
"contractFilterConfigDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A human-readable description of the filter configuration of this contract variant, or null if this isn't a contract\nvariant."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
Original tool metadata
{
"name": "GetContractConfig",
"description": "Read the filter configuration of a contract variant: the tags it includes, the tags it excludes, the source variant it is built from, and a human-readable description of the configuration. This is the same read that `rover contract describe` performs. A contract variant is a filtered view of another variant's schema, built by including and excluding schema elements by tag. The filter configuration does not include whether unreachable types are hidden. The description states it, so read it there before you update a contract with PublishContract. A variant that is not a contract returns null for the filter configuration. Provide the graph ID and the contract variant name.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"variant"
],
"properties": {
"graphId": {
"type": "string"
},
"variant": {
"type": "string"
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The variant's name (e.g., `staging`)."
},
"sourceVariant": {
"anyOf": [
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The variant's name (e.g., `staging`)."
}
}
},
{
"type": "null"
}
],
"description": "The variant this variant is derived from. This property currently only exists on contract variants."
},
"contractFilterConfig": {
"anyOf": [
{
"type": "object",
"required": [
"include",
"exclude"
],
"properties": {
"exclude": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tags of schema elements to exclude from the contract schema."
},
"include": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tags of schema elements to include in the contract schema."
}
}
},
{
"type": "null"
}
],
"description": "The filter configuration used to build a contract schema. The configuration consists of lists of tags for schema elements to include or exclude in the resulting schema."
},
"contractFilterConfigDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A human-readable description of the filter configuration of this contract variant, or null if this isn't a contract\nvariant."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
},
"annotations": {
"title": "Get a contract configuration",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Traffic broken down by client for a graph over a time window, as compact CSV. Columns: start timestamp, end exclusive timestamp, client name, client version, operation name, request count, request latency p50 ms, request latency p99 ms, request with error count. Answers which clients call a graph, which client versions are still on the wire, and which client drives errors or latency. Clients that do not report `apollographql-client-name`/`-version` come back with empty name and version columns. Ranked by `orderBy` descending: default REQUEST_COUNT (busiest); REQUEST_WITH_ERROR_COUNT for most error-prone, REQUEST_LATENCY_P99_MS for slowest. `variantName` and `operationName` scope to one or more variants or operations by exact name (omit for all). Rows are one per client + version + operation, so a busy graph has far more groups than the other metrics tools: scope by `operationName` or raise `limit` when a breakdown looks truncated. Keep the default `resolution` of ENTIRE_RANGE for totals and top-N, which gives one row per group ranked over the whole window. DAY/HOUR/MINUTE give one row per group per bucket ranked within each bucket, so a window total then needs a per-group sum plus a `limit` big enough to cover every bucket; too small a `limit` silently undercounts. Only HOUR and MINUTE accept a `to` of now, so use them for bursts in the last 24 hours. Avoid MONTH: it labels buckets by calendar month, not by the requested window.
The description explains the capability, when to use it, and what to expect.
Inputs38/100
4 of 8 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
from
The starting timestamp for the report. Must be in the format: 2025-01-01T00:00:00Z (ISO 8601).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
to
The ending timestamp for the report. Must be in the format: 2025-01-01T08:00:00Z (ISO 8601).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resolution
The resolution of the time groups for the report. This resolution will affect the range of times that can be used for the 'from' and
'to' timestamps:
- For the MINUTE resolution, the total time between 'from' and 'to' must be no more than 1 day, and the 'from' time must be no earlier than 30 days ago.
- For the HOUR resolution, the total time between 'from' and 'to' must be no more than 7 days, and the 'from' time must be no earlier than 90 days ago.
- For the DAY, MONTH, and ENTIRE_RANGE resolutions, the 'from' time must be no earlier than 549 days ago (approx 18 months), and the 'to' time must be no later than 1 day ago.
If these criteria are not met, this will return a REQUEST_INVALID error.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy
Not provided
Missing description. Explain what this value means and how to supply it.
variantName
Not provided
Missing description. Explain what this value means and how to supply it.
operationName
Not provided
Missing description. Explain what this value means and how to supply it.
limit
Maximum number of records to return (default: 100, max 10000).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"required": [
"operationInsightsTimeseriesReport"
],
"properties": {
"operationInsightsTimeseriesReport": {
"type": "object",
"properties": {
"csv": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A CSV representation of the results. This includes a header and rows that have a column for start and end timestamp and all requested dimensions and metrics."
}
},
"description": " Returns a timeseries of operation metrics across a specified time range for this graph. This will return specified metrics (request count,\n avg latency, etc) grouped by time and the specified dimensions (query ID, query name, client name, etc). This API is rate limited and only\n allows a small number of requests per minute, and will return a RATE_LIMIT_EXCEEDED error if too many requests are made for a graph. If a\nrequest to this field times out, we recommend that you try a shorter time range or fewer dimensions."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
Original tool metadata
{
"name": "GetClientMetrics",
"description": "Traffic broken down by client for a graph over a time window, as compact CSV. Columns: start timestamp, end exclusive timestamp, client name, client version, operation name, request count, request latency p50 ms, request latency p99 ms, request with error count. Answers which clients call a graph, which client versions are still on the wire, and which client drives errors or latency. Clients that do not report `apollographql-client-name`/`-version` come back with empty name and version columns. Ranked by `orderBy` descending: default REQUEST_COUNT (busiest); REQUEST_WITH_ERROR_COUNT for most error-prone, REQUEST_LATENCY_P99_MS for slowest. `variantName` and `operationName` scope to one or more variants or operations by exact name (omit for all). Rows are one per client + version + operation, so a busy graph has far more groups than the other metrics tools: scope by `operationName` or raise `limit` when a breakdown looks truncated. Keep the default `resolution` of ENTIRE_RANGE for totals and top-N, which gives one row per group ranked over the whole window. DAY/HOUR/MINUTE give one row per group per bucket ranked within each bucket, so a window total then needs a per-group sum plus a `limit` big enough to cover every bucket; too small a `limit` silently undercounts. Only HOUR and MINUTE accept a `to` of now, so use them for bursts in the last 24 hours. Avoid MONTH: it labels buckets by calendar month, not by the requested window.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"from",
"to"
],
"properties": {
"to": {
"$ref": "#/definitions/Timestamp",
"description": "The ending timestamp for the report. Must be in the format: 2025-01-01T08:00:00Z (ISO 8601)."
},
"from": {
"$ref": "#/definitions/Timestamp",
"description": "The starting timestamp for the report. Must be in the format: 2025-01-01T00:00:00Z (ISO 8601)."
},
"limit": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": 50,
"description": "Maximum number of records to return (default: 100, max 10000)."
},
"graphId": {
"type": "string"
},
"orderBy": {
"anyOf": [
{
"$ref": "#/definitions/OperationInsightsTimeseriesReportMetric"
},
{
"type": "null"
}
],
"default": "REQUEST_COUNT"
},
"resolution": {
"anyOf": [
{
"$ref": "#/definitions/TimeseriesReportResolution"
},
{
"type": "null"
}
],
"default": "ENTIRE_RANGE",
"description": "The resolution of the time groups for the report. This resolution will affect the range of times that can be used for the 'from' and\n'to' timestamps:\n- For the MINUTE resolution, the total time between 'from' and 'to' must be no more than 1 day, and the 'from' time must be no earlier than 30 days ago.\n- For the HOUR resolution, the total time between 'from' and 'to' must be no more than 7 days, and the 'from' time must be no earlier than 90 days ago.\n- For the DAY, MONTH, and ENTIRE_RANGE resolutions, the 'from' time must be no earlier than 549 days ago (approx 18 months), and the 'to' time must be no later than 1 day ago.\nIf these criteria are not met, this will return a REQUEST_INVALID error."
},
"variantName": {
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
{
"type": "null"
}
]
},
"operationName": {
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
{
"type": "null"
}
]
}
},
"definitions": {
"Timestamp": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
"TimeseriesReportResolution": {
"enum": [
"DAY",
"ENTIRE_RANGE",
"HOUR",
"MINUTE",
"MONTH"
],
"type": "string",
"description": "The size of each time bucket in a timeseries report.\n\nValues:\nDAY: One-day buckets.\nENTIRE_RANGE: Single bucket containing the entire time range.\nHOUR: One-hour buckets.\nMINUTE: One-minute buckets.\nMONTH: One-month buckets."
},
"OperationInsightsTimeseriesReportMetric": {
"enum": [
"REQUEST_COUNT",
"REQUEST_LATENCY_P50_MS",
"REQUEST_LATENCY_P90_MS",
"REQUEST_LATENCY_P99_MS",
"REQUEST_WITH_ERROR_COUNT"
],
"type": "string",
"description": "\n\nValues:\nREQUEST_COUNT: \nREQUEST_LATENCY_P50_MS: \nREQUEST_LATENCY_P90_MS: \nREQUEST_LATENCY_P99_MS: \nREQUEST_WITH_ERROR_COUNT: "
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"required": [
"operationInsightsTimeseriesReport"
],
"properties": {
"operationInsightsTimeseriesReport": {
"type": "object",
"properties": {
"csv": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A CSV representation of the results. This includes a header and rows that have a column for start and end timestamp and all requested dimensions and metrics."
}
},
"description": " Returns a timeseries of operation metrics across a specified time range for this graph. This will return specified metrics (request count,\n avg latency, etc) grouped by time and the specified dimensions (query ID, query name, client name, etc). This API is rate limited and only\n allows a small number of requests per minute, and will return a RATE_LIMIT_EXCEEDED error if too many requests are made for a graph. If a\nrequest to this field times out, we recommend that you try a shorter time range or fewer dimensions."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
},
"annotations": {
"title": "Get client metrics",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Start a schema check of a proposed schema against a variant, the same check that `rover graph check` starts. Use this for a monograph or for a whole supergraph schema; use RunSubgraphCheck for one subgraph. The check runs in the background, so this returns a workflow ID and a Studio URL, not a result. Pass the returned workflowID to GetCheckResults to read the outcome. Provide the graph ID, the variant name, and the proposed schema as SDL. Optionally provide the git branch and commit to label the run in Studio.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
proposedSchema
Not provided
Missing description. Explain what this value means and how to supply it.
branch
Not provided
Missing description. Explain what this value means and how to supply it.
commit
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Publish a schema to a graph variant, the same write that `rover graph publish` performs. Use this for a monograph; use PublishSubgraph for one subgraph of a federated graph. Returns a result code, whether the publish succeeded, a human-readable message, and the hash of the published schema. This changes the schema registry and can change what clients see. Run RunSchemaCheck first to see the effect on client operations. Provide the graph ID, the variant name, and the schema as SDL. Optionally provide the git branch and commit to label the publication.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
schemaDocument
Not provided
Missing description. Explain what this value means and how to supply it.
branch
Not provided
Missing description. Explain what this value means and how to supply it.
commit
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Publish a subgraph schema to a variant and start composition, the same write that `rover subgraph publish` performs. Returns whether the subgraph was created or updated, any composition errors, and the launch that started. This changes the schema registry and can change what the router serves. Run RunSubgraphCheck first to see the effect on client operations. Provide the graph ID, the variant name, the subgraph name, and the schema as SDL. Provide the routing URL when you add a subgraph or move its endpoint. Optionally provide a revision label and the git branch and commit.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 8 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
subgraphName
Not provided
Missing description. Explain what this value means and how to supply it.
sdl
Not provided
Missing description. Explain what this value means and how to supply it.
url
Not provided
Missing description. Explain what this value means and how to supply it.
revision
Not provided
Missing description. Explain what this value means and how to supply it.
branch
Not provided
Missing description. Explain what this value means and how to supply it.
commit
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"publishSubgraph": {
"anyOf": [
{
"type": "object",
"required": [
"wasCreated",
"wasUpdated",
"updatedGateway",
"subgraphsCreated",
"subgraphsUpdated",
"errors"
],
"properties": {
"errors": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"message",
"locations"
],
"properties": {
"code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A machine-readable error code."
},
"message": {
"type": "string",
"description": "A human-readable message describing the error."
},
"locations": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"line",
"column"
],
"properties": {
"line": {
"type": "integer",
"description": "Line number."
},
"column": {
"type": "integer",
"description": "Column number."
}
}
},
{
"type": "null"
}
]
},
"description": "Source locations related to the error."
}
}
},
{
"type": "null"
}
]
},
"description": "A list of errors that occurred during composition. Errors mean that Apollo was unable to compose the graph variant's subgraphs into a supergraph schema. If any errors are present, gateways / routers are not updated."
},
"launch": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"status"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The unique identifier for this launch."
},
"status": {
"$ref": "#/definitions/LaunchStatus",
"description": "The launch's status. If a launch is superseded, its status remains `LAUNCH_INITIATED`. To check for a superseded launch, use `supersededAt`."
}
}
},
{
"type": "null"
}
],
"description": "The Launch result part of this subgraph publish."
},
"launchUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The URL of the Studio page for this update's associated launch, if available."
},
"wasCreated": {
"type": "boolean",
"description": "Whether a new subgraph was created as part of this publish."
},
"wasUpdated": {
"type": "boolean",
"description": "Whether an implementingService was updated as part of this mutation"
},
"updatedGateway": {
"type": "boolean",
"description": "Whether this composition result resulted in a new supergraph schema passed to Uplink (`true`), or the build failed for any reason (`false`). For dry runs, this value is `true` if Uplink _would have_ been updated with the result."
},
"subgraphsCreated": {
"type": "array",
"items": {
"type": "string"
},
"description": "All subgraphs that were created from this mutation"
},
"subgraphsUpdated": {
"type": "array",
"items": {
"type": "string"
},
"description": "All subgraphs that were updated from this mutation"
}
}
},
{
"type": "null"
}
],
"description": "Publish to a subgraph. If composition is successful, this will update running routers."
}
}
},
{
"type": "null"
}
],
"description": "Provides access to mutation fields for modifying a Studio graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
},
"definitions": {
"LaunchStatus": {
"enum": [
"LAUNCH_COMPLETED",
"LAUNCH_FAILED",
"LAUNCH_INITIATED"
],
"type": "string"
}
}
}
Original tool metadata
{
"name": "PublishSubgraph",
"description": "Publish a subgraph schema to a variant and start composition, the same write that `rover subgraph publish` performs. Returns whether the subgraph was created or updated, any composition errors, and the launch that started. This changes the schema registry and can change what the router serves. Run RunSubgraphCheck first to see the effect on client operations. Provide the graph ID, the variant name, the subgraph name, and the schema as SDL. Provide the routing URL when you add a subgraph or move its endpoint. Optionally provide a revision label and the git branch and commit.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"variant",
"subgraphName",
"sdl"
],
"properties": {
"sdl": {
"type": "string"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"branch": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"commit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"graphId": {
"type": "string"
},
"variant": {
"type": "string"
},
"revision": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": ""
},
"subgraphName": {
"type": "string"
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"publishSubgraph": {
"anyOf": [
{
"type": "object",
"required": [
"wasCreated",
"wasUpdated",
"updatedGateway",
"subgraphsCreated",
"subgraphsUpdated",
"errors"
],
"properties": {
"errors": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"message",
"locations"
],
"properties": {
"code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A machine-readable error code."
},
"message": {
"type": "string",
"description": "A human-readable message describing the error."
},
"locations": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"line",
"column"
],
"properties": {
"line": {
"type": "integer",
"description": "Line number."
},
"column": {
"type": "integer",
"description": "Column number."
}
}
},
{
"type": "null"
}
]
},
"description": "Source locations related to the error."
}
}
},
{
"type": "null"
}
]
},
"description": "A list of errors that occurred during composition. Errors mean that Apollo was unable to compose the graph variant's subgraphs into a supergraph schema. If any errors are present, gateways / routers are not updated."
},
"launch": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"status"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The unique identifier for this launch."
},
"status": {
"$ref": "#/definitions/LaunchStatus",
"description": "The launch's status. If a launch is superseded, its status remains `LAUNCH_INITIATED`. To check for a superseded launch, use `supersededAt`."
}
}
},
{
"type": "null"
}
],
"description": "The Launch result part of this subgraph publish."
},
"launchUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The URL of the Studio page for this update's associated launch, if available."
},
"wasCreated": {
"type": "boolean",
"description": "Whether a new subgraph was created as part of this publish."
},
"wasUpdated": {
"type": "boolean",
"description": "Whether an implementingService was updated as part of this mutation"
},
"updatedGateway": {
"type": "boolean",
"description": "Whether this composition result resulted in a new supergraph schema passed to Uplink (`true`), or the build failed for any reason (`false`). For dry runs, this value is `true` if Uplink _would have_ been updated with the result."
},
"subgraphsCreated": {
"type": "array",
"items": {
"type": "string"
},
"description": "All subgraphs that were created from this mutation"
},
"subgraphsUpdated": {
"type": "array",
"items": {
"type": "string"
},
"description": "All subgraphs that were updated from this mutation"
}
}
},
{
"type": "null"
}
],
"description": "Publish to a subgraph. If composition is successful, this will update running routers."
}
}
},
{
"type": "null"
}
],
"description": "Provides access to mutation fields for modifying a Studio graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
},
"definitions": {
"LaunchStatus": {
"enum": [
"LAUNCH_COMPLETED",
"LAUNCH_FAILED",
"LAUNCH_INITIATED"
],
"type": "string"
}
}
},
"annotations": {
"title": "Publish a subgraph schema",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Delete a graph, the same write that `rover graph delete` performs. This is a soft delete: the data is not removed permanently and Apollo support can restore the graph. Every variant of the graph stops serving, so confirm the graph ID with the user before you call this. Returns null on success. Provide the graph ID.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 1 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Read one subgraph's published schema (SDL) from a variant, with its routing URL, revision, and last update time. This is the same read that `rover subgraph fetch` performs. Read one subgraph at a time: a whole supergraph document is much larger and can pass the token limit of the model. Provide the graph ID, the variant name, and the subgraph name. Use GetVariantDetails first if you do not know the subgraph names.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 3 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
subgraphName
Not provided
Missing description. Explain what this value means and how to supply it.
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"properties": {
"subgraph": {
"anyOf": [
{
"type": "object",
"required": [
"name",
"revision",
"updatedAt",
"activePartialSchema"
],
"properties": {
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The URL of the subgraph's GraphQL endpoint."
},
"name": {
"type": "string",
"description": "The subgraph's name."
},
"revision": {
"type": "string",
"description": "The current user-provided version/edition of the subgraph. Typically a Git SHA or docker image ID."
},
"updatedAt": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
"activePartialSchema": {
"type": "object",
"required": [
"sdl"
],
"properties": {
"sdl": {
"type": "string",
"description": "The subgraph schema document as SDL."
}
},
"description": "The subgraph's current active schema, used in supergraph composition for the the associated variant."
}
}
},
{
"type": "null"
}
],
"description": "Returns the details of the subgraph with the provided `name`, or null if this variant doesn't include a subgraph with that name."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
Original tool metadata
{
"name": "GetSubgraphSchema",
"description": "Read one subgraph's published schema (SDL) from a variant, with its routing URL, revision, and last update time. This is the same read that `rover subgraph fetch` performs. Read one subgraph at a time: a whole supergraph document is much larger and can pass the token limit of the model. Provide the graph ID, the variant name, and the subgraph name. Use GetVariantDetails first if you do not know the subgraph names.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"variant",
"subgraphName"
],
"properties": {
"graphId": {
"type": "string"
},
"variant": {
"type": "string"
},
"subgraphName": {
"type": "string"
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"properties": {
"subgraph": {
"anyOf": [
{
"type": "object",
"required": [
"name",
"revision",
"updatedAt",
"activePartialSchema"
],
"properties": {
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The URL of the subgraph's GraphQL endpoint."
},
"name": {
"type": "string",
"description": "The subgraph's name."
},
"revision": {
"type": "string",
"description": "The current user-provided version/edition of the subgraph. Typically a Git SHA or docker image ID."
},
"updatedAt": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
"activePartialSchema": {
"type": "object",
"required": [
"sdl"
],
"properties": {
"sdl": {
"type": "string",
"description": "The subgraph schema document as SDL."
}
},
"description": "The subgraph's current active schema, used in supergraph composition for the the associated variant."
}
}
},
{
"type": "null"
}
],
"description": "Returns the details of the subgraph with the provided `name`, or null if this variant doesn't include a subgraph with that name."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
},
"annotations": {
"title": "Get a subgraph schema",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Top subgraphs/connectors by traffic/health for a graph over a time window, as compact CSV. Columns: start timestamp, end exclusive timestamp, fetch service name, fetch count, fetch latency p50 ms, fetch latency p99 ms, fetch with errors count. Ranked by `orderBy` descending: default FETCH_COUNT (busiest); FETCH_WITH_ERRORS_COUNT for most error-prone, FETCH_LATENCY_P99_MS for slowest. `variantName` scopes to one or more variants (omit for all). `subgraphName` scopes to one or more subgraphs by exact name (omit for all); pattern/substring matching is not supported. `clients` scopes to the fetches driven by one or more clients; omit `clientVersion` to match every version of that client, and use GetClientMetrics to discover the names a graph sees. Keep the default `resolution` of ENTIRE_RANGE for totals and top-N, which gives one row per subgraph ranked over the whole window. DAY/HOUR/MINUTE give one row per subgraph per bucket ranked within each bucket, so a window total then needs a per-subgraph sum plus a `limit` big enough to cover every bucket; too small a `limit` silently undercounts. Only HOUR and MINUTE accept a `to` of now, so use them for bursts in the last 24 hours. Avoid MONTH: it labels buckets by calendar month, not by the requested window.
The description explains the capability, when to use it, and what to expect.
Inputs28/100
6 of 10 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
from
The starting timestamp for the report. Must be in the format: 2025-01-01T00:00:00Z (ISO 8601).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
to
The ending timestamp for the report. Must be in the format: 2025-01-01T08:00:00Z (ISO 8601).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resolution
The resolution of the time groups for the report. This resolution will affect the range of times that can be used for the 'from' and
'to' timestamps:
- For the MINUTE resolution, the total time between 'from' and 'to' must be no more than 1 day, and the 'from' time must be no earlier than 30 days ago.
- For the HOUR resolution, the total time between 'from' and 'to' must be no more than 7 days, and the 'from' time must be no earlier than 90 days ago.
- For the DAY, MONTH, and ENTIRE_RANGE resolutions, the 'from' time must be no earlier than 549 days ago (approx 18 months), and the 'to' time must be no later than 1 day ago.
If these criteria are not met, this will return a REQUEST_INVALID error.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy
Not provided
Missing description. Explain what this value means and how to supply it.
variantName
Not provided
Missing description. Explain what this value means and how to supply it.
subgraphName
Not provided
Missing description. Explain what this value means and how to supply it.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"required": [
"subgraphInsightsTimeseriesReport"
],
"properties": {
"subgraphInsightsTimeseriesReport": {
"type": "object",
"properties": {
"csv": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A CSV representation of the results. This includes a header and rows that have a column for start and end timestamp and all requested dimensions and metrics."
}
},
"description": " Returns a timeseries of subgraph and connector fetch metrics across a specified time range for this graph. Each\nrequest from the router to a subgraph or connector service is counted as a fetch. A single GraphQL operation can\nresult in multiple fetches, depending on the operation shape and query plan. This will return specified metrics (fetch\ncount, avg latency, etc.) grouped by time and the specified dimensions (fetch service ID, fetch service name, client\nname, etc.). This API is rate limited and only allows a small number of requests per minute, and will return a\nRATE_LIMIT_EXCEEDED error if too many requests are made for a graph. If a request to this field times out, we\nrecommend that you try a shorter time range or fewer dimensions."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
Original tool metadata
{
"name": "GetSubgraphMetrics",
"description": "Top subgraphs/connectors by traffic/health for a graph over a time window, as compact CSV. Columns: start timestamp, end exclusive timestamp, fetch service name, fetch count, fetch latency p50 ms, fetch latency p99 ms, fetch with errors count. Ranked by `orderBy` descending: default FETCH_COUNT (busiest); FETCH_WITH_ERRORS_COUNT for most error-prone, FETCH_LATENCY_P99_MS for slowest. `variantName` scopes to one or more variants (omit for all). `subgraphName` scopes to one or more subgraphs by exact name (omit for all); pattern/substring matching is not supported. `clients` scopes to the fetches driven by one or more clients; omit `clientVersion` to match every version of that client, and use GetClientMetrics to discover the names a graph sees. Keep the default `resolution` of ENTIRE_RANGE for totals and top-N, which gives one row per subgraph ranked over the whole window. DAY/HOUR/MINUTE give one row per subgraph per bucket ranked within each bucket, so a window total then needs a per-subgraph sum plus a `limit` big enough to cover every bucket; too small a `limit` silently undercounts. Only HOUR and MINUTE accept a `to` of now, so use them for bursts in the last 24 hours. Avoid MONTH: it labels buckets by calendar month, not by the requested window.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"from",
"to"
],
"properties": {
"to": {
"$ref": "#/definitions/Timestamp",
"description": "The ending timestamp for the report. Must be in the format: 2025-01-01T08:00:00Z (ISO 8601)."
},
"from": {
"$ref": "#/definitions/Timestamp",
"description": "The starting timestamp for the report. Must be in the format: 2025-01-01T00:00:00Z (ISO 8601)."
},
"limit": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": 50,
"description": "Maximum number of records to return (default: 100, max 10000)."
},
"clients": {
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/SubgraphInsightsTimeseriesReportClientFilterInInput"
},
{
"type": "null"
}
]
}
},
{
"type": "null"
}
]
},
"graphId": {
"type": "string"
},
"orderBy": {
"anyOf": [
{
"$ref": "#/definitions/SubgraphInsightsTimeseriesReportMetric"
},
{
"type": "null"
}
],
"default": "FETCH_COUNT"
},
"resolution": {
"anyOf": [
{
"$ref": "#/definitions/TimeseriesReportResolution"
},
{
"type": "null"
}
],
"default": "ENTIRE_RANGE",
"description": "The resolution of the time groups for the report. This resolution will affect the range of times that can be used for the 'from' and\n'to' timestamps:\n- For the MINUTE resolution, the total time between 'from' and 'to' must be no more than 1 day, and the 'from' time must be no earlier than 30 days ago.\n- For the HOUR resolution, the total time between 'from' and 'to' must be no more than 7 days, and the 'from' time must be no earlier than 90 days ago.\n- For the DAY, MONTH, and ENTIRE_RANGE resolutions, the 'from' time must be no earlier than 549 days ago (approx 18 months), and the 'to' time must be no later than 1 day ago.\nIf these criteria are not met, this will return a REQUEST_INVALID error."
},
"variantName": {
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
{
"type": "null"
}
]
},
"subgraphName": {
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
{
"type": "null"
}
]
}
},
"definitions": {
"Timestamp": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
"TimeseriesReportResolution": {
"enum": [
"DAY",
"ENTIRE_RANGE",
"HOUR",
"MINUTE",
"MONTH"
],
"type": "string",
"description": "The size of each time bucket in a timeseries report.\n\nValues:\nDAY: One-day buckets.\nENTIRE_RANGE: Single bucket containing the entire time range.\nHOUR: One-hour buckets.\nMINUTE: One-minute buckets.\nMONTH: One-month buckets."
},
"SubgraphInsightsTimeseriesReportMetric": {
"enum": [
"FETCH_COUNT",
"FETCH_LATENCY_P50_MS",
"FETCH_LATENCY_P90_MS",
"FETCH_LATENCY_P99_MS",
"FETCH_WITH_ERRORS_COUNT"
],
"type": "string",
"description": "Metrics available for subgraph and connector timeseries fetches, representing aggregated data\ncollected over the given time window for the selected dimensions. Each request from the router to a downstream subgraph\nor connector service is counted as a fetch.\n\nValues:\nFETCH_COUNT: The total number of fetch requests sent from the router to the downstream subgraph or connector service as part of its query plan execution.\nFETCH_LATENCY_P50_MS: The 50th percentile (median) latency of fetches (in milliseconds).\nFETCH_LATENCY_P90_MS: The 90th percentile latency of fetch requests (in milliseconds).\nFETCH_LATENCY_P99_MS: The 99th percentile latency of fetch requests (in milliseconds).\nFETCH_WITH_ERRORS_COUNT: The number of fetch requests that resulted in error responses from the downstream service."
},
"SubgraphInsightsTimeseriesReportClientFilterInInput": {
"type": "object",
"properties": {
"clientName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The client name."
},
"clientVersion": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The client version."
}
},
"description": "The named type and version of the clients to include or exclude in the subgraph and connector timeseries report."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"required": [
"subgraphInsightsTimeseriesReport"
],
"properties": {
"subgraphInsightsTimeseriesReport": {
"type": "object",
"properties": {
"csv": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A CSV representation of the results. This includes a header and rows that have a column for start and end timestamp and all requested dimensions and metrics."
}
},
"description": " Returns a timeseries of subgraph and connector fetch metrics across a specified time range for this graph. Each\nrequest from the router to a subgraph or connector service is counted as a fetch. A single GraphQL operation can\nresult in multiple fetches, depending on the operation shape and query plan. This will return specified metrics (fetch\ncount, avg latency, etc.) grouped by time and the specified dimensions (fetch service ID, fetch service name, client\nname, etc.). This API is rate limited and only allows a small number of requests per minute, and will return a\nRATE_LIMIT_EXCEEDED error if too many requests are made for a graph. If a request to this field times out, we\nrecommend that you try a shorter time range or fewer dimensions."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
},
"annotations": {
"title": "Get subgraph metrics",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Retrieve metadata for a graph variant: its identifier, federation version, the URL of its GraphQL endpoint, and its subgraph inventory (names only). Use this to assess a variant's composition setup, such as subgraph inventory and federation version compliance. Provide the graph ID and variant name (e.g., "production").
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 2 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Top operations by usage/health for a graph over a time window, as compact CSV. Columns: start timestamp, end exclusive timestamp, operation name, request count, request latency p50 ms, request latency p99 ms, request with error count. Ranked by `orderBy` descending: default REQUEST_COUNT (busiest); REQUEST_WITH_ERROR_COUNT for most error-prone, REQUEST_LATENCY_P99_MS for slowest. `variantName` scopes to one or more variants (omit for all). `clients` scopes to one or more clients; omit `clientVersion` to match every version of that client, and use GetClientMetrics to discover the names a graph sees. Keep the default `resolution` of ENTIRE_RANGE for totals and top-N, which gives one row per operation ranked over the whole window. DAY/HOUR/MINUTE give one row per operation per bucket ranked within each bucket, so a window total then needs a per-operation sum plus a `limit` big enough to cover every bucket; too small a `limit` silently undercounts. Only HOUR and MINUTE accept a `to` of now, so use them for bursts in the last 24 hours. Avoid MONTH: it labels buckets by calendar month, not by the requested window.
The description explains the capability, when to use it, and what to expect.
Inputs31/100
6 of 9 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
from
The starting timestamp for the report. Must be in the format: 2025-01-01T00:00:00Z (ISO 8601).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
to
The ending timestamp for the report. Must be in the format: 2025-01-01T08:00:00Z (ISO 8601).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resolution
The resolution of the time groups for the report. This resolution will affect the range of times that can be used for the 'from' and
'to' timestamps:
- For the MINUTE resolution, the total time between 'from' and 'to' must be no more than 1 day, and the 'from' time must be no earlier than 30 days ago.
- For the HOUR resolution, the total time between 'from' and 'to' must be no more than 7 days, and the 'from' time must be no earlier than 90 days ago.
- For the DAY, MONTH, and ENTIRE_RANGE resolutions, the 'from' time must be no earlier than 549 days ago (approx 18 months), and the 'to' time must be no later than 1 day ago.
If these criteria are not met, this will return a REQUEST_INVALID error.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orderBy
Not provided
Missing description. Explain what this value means and how to supply it.
variantName
Not provided
Missing description. Explain what this value means and how to supply it.
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"required": [
"operationInsightsTimeseriesReport"
],
"properties": {
"operationInsightsTimeseriesReport": {
"type": "object",
"properties": {
"csv": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A CSV representation of the results. This includes a header and rows that have a column for start and end timestamp and all requested dimensions and metrics."
}
},
"description": " Returns a timeseries of operation metrics across a specified time range for this graph. This will return specified metrics (request count,\n avg latency, etc) grouped by time and the specified dimensions (query ID, query name, client name, etc). This API is rate limited and only\n allows a small number of requests per minute, and will return a RATE_LIMIT_EXCEEDED error if too many requests are made for a graph. If a\nrequest to this field times out, we recommend that you try a shorter time range or fewer dimensions."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
Original tool metadata
{
"name": "GetOperationMetrics",
"description": "Top operations by usage/health for a graph over a time window, as compact CSV. Columns: start timestamp, end exclusive timestamp, operation name, request count, request latency p50 ms, request latency p99 ms, request with error count. Ranked by `orderBy` descending: default REQUEST_COUNT (busiest); REQUEST_WITH_ERROR_COUNT for most error-prone, REQUEST_LATENCY_P99_MS for slowest. `variantName` scopes to one or more variants (omit for all). `clients` scopes to one or more clients; omit `clientVersion` to match every version of that client, and use GetClientMetrics to discover the names a graph sees. Keep the default `resolution` of ENTIRE_RANGE for totals and top-N, which gives one row per operation ranked over the whole window. DAY/HOUR/MINUTE give one row per operation per bucket ranked within each bucket, so a window total then needs a per-operation sum plus a `limit` big enough to cover every bucket; too small a `limit` silently undercounts. Only HOUR and MINUTE accept a `to` of now, so use them for bursts in the last 24 hours. Avoid MONTH: it labels buckets by calendar month, not by the requested window.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"from",
"to"
],
"properties": {
"to": {
"$ref": "#/definitions/Timestamp",
"description": "The ending timestamp for the report. Must be in the format: 2025-01-01T08:00:00Z (ISO 8601)."
},
"from": {
"$ref": "#/definitions/Timestamp",
"description": "The starting timestamp for the report. Must be in the format: 2025-01-01T00:00:00Z (ISO 8601)."
},
"limit": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": 50,
"description": "Maximum number of records to return (default: 100, max 10000)."
},
"clients": {
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/OperationInsightsTimeseriesReportClientFilterInInput"
},
{
"type": "null"
}
]
}
},
{
"type": "null"
}
]
},
"graphId": {
"type": "string"
},
"orderBy": {
"anyOf": [
{
"$ref": "#/definitions/OperationInsightsTimeseriesReportMetric"
},
{
"type": "null"
}
],
"default": "REQUEST_COUNT"
},
"resolution": {
"anyOf": [
{
"$ref": "#/definitions/TimeseriesReportResolution"
},
{
"type": "null"
}
],
"default": "ENTIRE_RANGE",
"description": "The resolution of the time groups for the report. This resolution will affect the range of times that can be used for the 'from' and\n'to' timestamps:\n- For the MINUTE resolution, the total time between 'from' and 'to' must be no more than 1 day, and the 'from' time must be no earlier than 30 days ago.\n- For the HOUR resolution, the total time between 'from' and 'to' must be no more than 7 days, and the 'from' time must be no earlier than 90 days ago.\n- For the DAY, MONTH, and ENTIRE_RANGE resolutions, the 'from' time must be no earlier than 549 days ago (approx 18 months), and the 'to' time must be no later than 1 day ago.\nIf these criteria are not met, this will return a REQUEST_INVALID error."
},
"variantName": {
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
{
"type": "null"
}
]
}
},
"definitions": {
"Timestamp": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
"TimeseriesReportResolution": {
"enum": [
"DAY",
"ENTIRE_RANGE",
"HOUR",
"MINUTE",
"MONTH"
],
"type": "string",
"description": "The size of each time bucket in a timeseries report.\n\nValues:\nDAY: One-day buckets.\nENTIRE_RANGE: Single bucket containing the entire time range.\nHOUR: One-hour buckets.\nMINUTE: One-minute buckets.\nMONTH: One-month buckets."
},
"OperationInsightsTimeseriesReportMetric": {
"enum": [
"REQUEST_COUNT",
"REQUEST_LATENCY_P50_MS",
"REQUEST_LATENCY_P90_MS",
"REQUEST_LATENCY_P99_MS",
"REQUEST_WITH_ERROR_COUNT"
],
"type": "string",
"description": "\n\nValues:\nREQUEST_COUNT: \nREQUEST_LATENCY_P50_MS: \nREQUEST_LATENCY_P90_MS: \nREQUEST_LATENCY_P99_MS: \nREQUEST_WITH_ERROR_COUNT: "
},
"OperationInsightsTimeseriesReportClientFilterInInput": {
"type": "object",
"properties": {
"clientName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The client name."
},
"clientVersion": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The client version."
}
},
"description": "The named type and version of the clients to include or exclude in the operation timeseries report."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"required": [
"operationInsightsTimeseriesReport"
],
"properties": {
"operationInsightsTimeseriesReport": {
"type": "object",
"properties": {
"csv": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A CSV representation of the results. This includes a header and rows that have a column for start and end timestamp and all requested dimensions and metrics."
}
},
"description": " Returns a timeseries of operation metrics across a specified time range for this graph. This will return specified metrics (request count,\n avg latency, etc) grouped by time and the specified dimensions (query ID, query name, client name, etc). This API is rate limited and only\n allows a small number of requests per minute, and will return a RATE_LIMIT_EXCEEDED error if too many requests are made for a graph. If a\nrequest to this field times out, we recommend that you try a shorter time range or fewer dimensions."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
},
"annotations": {
"title": "Get operation metrics",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Start a schema check of one proposed subgraph schema against a variant, the same check that `rover subgraph check` starts. The check runs in the background, so this returns a workflow ID and a Studio URL, not a result. Pass the returned workflowID to GetCheckResults to read the outcome. Provide the graph ID, the variant name, the subgraph name, and the proposed subgraph schema as SDL. Optionally provide the git branch and commit to label the run in Studio.
The description explains the capability, when to use it, and what to expect.
Inputs17/100
1 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
subgraphName
Not provided
Missing description. Explain what this value means and how to supply it.
proposedSchema
A GraphQL document, such as a schema in SDL syntax.
Clear enough to supply this argument.
branch
Not provided
Missing description. Explain what this value means and how to supply it.
commit
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
Read the README of a graph variant, with the time it was last updated and who updated it. This is the same read that `rover readme fetch` performs. The README is the Markdown document shown on the variant's page in GraphOS Studio. Provide the graph ID and the variant name.
Describe the returned information so the agent knows whether it will answer the request.
Inputs0/100
0 of 2 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"required": [
"readme"
],
"properties": {
"readme": {
"type": "object",
"required": [
"id",
"content"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The README's unique ID. `a15177c0-b003-4837-952a-dbfe76062eb1` for the default README"
},
"content": {
"type": "string",
"description": "The contents of the README in plaintext."
},
"lastUpdatedBy": {
"anyOf": [
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The identity's human-readable name."
}
}
},
{
"type": "null"
}
],
"description": "The actor that most recently updated the README (usually a `User`). `null` for the default README, or if the `User` was deleted."
},
"lastUpdatedTime": {
"anyOf": [
{
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
{
"type": "null"
}
],
"description": "The timestamp when the README was most recently updated. `null` for the default README"
}
}
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
Original tool metadata
{
"name": "GetReadme",
"description": "Read the README of a graph variant, with the time it was last updated and who updated it. This is the same read that `rover readme fetch` performs. The README is the Markdown document shown on the variant's page in GraphOS Studio. Provide the graph ID and the variant name.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"variant"
],
"properties": {
"graphId": {
"type": "string"
},
"variant": {
"type": "string"
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"required": [
"readme"
],
"properties": {
"readme": {
"type": "object",
"required": [
"id",
"content"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The README's unique ID. `a15177c0-b003-4837-952a-dbfe76062eb1` for the default README"
},
"content": {
"type": "string",
"description": "The contents of the README in plaintext."
},
"lastUpdatedBy": {
"anyOf": [
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The identity's human-readable name."
}
}
},
{
"type": "null"
}
],
"description": "The actor that most recently updated the README (usually a `User`). `null` for the default README, or if the `User` was deleted."
},
"lastUpdatedTime": {
"anyOf": [
{
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
{
"type": "null"
}
],
"description": "The timestamp when the README was most recently updated. `null` for the default README"
}
}
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
},
"annotations": {
"title": "Get a variant README",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Retrieve recent launches for a graph variant (most recent first) to detect deployment instability such as repeated failures or frequent superseded launches. Each entry includes the launch id, status, and timestamps, so you can identify a specific launch and drill into it with GetLaunch. Use to assess deployment stability. Provide the graph ID, variant name, and optionally a limit (default 20 most recent launches, max 100 per page) and an offset to page further back.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 4 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
limit
Not provided
Missing description. Explain what this value means and how to supply it.
offset
Not provided
Missing description. Explain what this value means and how to supply it.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"properties": {
"launchSummaries": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"status",
"createdAt"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The unique identifier for this launch."
},
"status": {
"$ref": "#/definitions/LaunchStatus",
"description": "The launch's status. If a launch is superseded, its status remains `LAUNCH_INITIATED`. To check for a superseded launch, use `supersededAt`."
},
"createdAt": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
"completedAt": {
"anyOf": [
{
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
{
"type": "null"
}
],
"description": "The timestamp when the launch completed. This value is null until the launch completes."
}
}
}
},
{
"type": "null"
}
],
"description": "A list of launches metadata ordered by date, asc or desc depending on orderBy. The maximum limit is 100."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
},
"definitions": {
"LaunchStatus": {
"enum": [
"LAUNCH_COMPLETED",
"LAUNCH_FAILED",
"LAUNCH_INITIATED"
],
"type": "string"
}
}
}
Original tool metadata
{
"name": "GetLaunchHistory",
"description": "Retrieve recent launches for a graph variant (most recent first) to detect deployment instability such as repeated failures or frequent superseded launches. Each entry includes the launch id, status, and timestamps, so you can identify a specific launch and drill into it with GetLaunch. Use to assess deployment stability. Provide the graph ID, variant name, and optionally a limit (default 20 most recent launches, max 100 per page) and an offset to page further back.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"variant"
],
"properties": {
"limit": {
"type": "integer",
"default": 20
},
"offset": {
"type": "integer",
"default": 0
},
"graphId": {
"type": "string"
},
"variant": {
"type": "string"
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"properties": {
"launchSummaries": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"status",
"createdAt"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The unique identifier for this launch."
},
"status": {
"$ref": "#/definitions/LaunchStatus",
"description": "The launch's status. If a launch is superseded, its status remains `LAUNCH_INITIATED`. To check for a superseded launch, use `supersededAt`."
},
"createdAt": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
"completedAt": {
"anyOf": [
{
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
},
{
"type": "null"
}
],
"description": "The timestamp when the launch completed. This value is null until the launch completes."
}
}
}
},
{
"type": "null"
}
],
"description": "A list of launches metadata ordered by date, asc or desc depending on orderBy. The maximum limit is 100."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
},
"definitions": {
"LaunchStatus": {
"enum": [
"LAUNCH_COMPLETED",
"LAUNCH_FAILED",
"LAUNCH_INITIATED"
],
"type": "string"
}
}
},
"annotations": {
"title": "Get launch history",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Resolve the caller's identity from their API key or OAuth token. Call this FIRST when the user asks about "my graph" but has not provided a graph ID. For a graph/service key, `me` resolves to a Graph: use `id` as the graphId and `variants[].name` as the variant for the graph-scoped health-check tools, so the user does not have to supply either. For a user (personal key or OAuth), `me` resolves to a User instead: there's no single graph, so each org membership's `graphs[].id` / `graphs[].variants[].name` lists the graphId/variant options the graph-scoped tools need, across every org the user belongs to. Also handles service-account keys.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"me": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The identity's identifier, which is unique among objects of its type."
},
"name": {
"type": "string",
"description": "The identity's human-readable name."
},
"account": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "Globally unique identifier, which isn't guaranteed stable (can be changed by administrators)."
},
"name": {
"type": "string",
"description": "Name of the organization, which can change over time and isn't unique. If the organization has no company\nname set, this falls back to the organization's ID."
}
}
},
{
"type": "null"
}
],
"description": "The organization that this graph belongs to."
},
"variants": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The variant's name (e.g., `staging`)."
}
}
},
"description": "A list of the variants for this graph."
},
"__typename": {
"type": "string",
"description": "The typename of this object"
},
"memberships": {
"type": "array",
"items": {
"type": "object",
"required": [
"account"
],
"properties": {
"account": {
"type": "object",
"required": [
"id",
"name",
"graphs"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "Globally unique identifier, which isn't guaranteed stable (can be changed by administrators)."
},
"name": {
"type": "string",
"description": "Name of the organization, which can change over time and isn't unique. If the organization has no company\nname set, this falls back to the organization's ID."
},
"graphs": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"variants"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The graph's globally unique identifier."
},
"name": {
"type": "string"
},
"variants": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The variant's name (e.g., `staging`)."
}
}
},
"description": "A list of the variants for this graph."
}
}
},
"description": "Graphs belonging to this organization."
}
},
"description": "The organization that the user belongs to."
}
}
},
"description": "A list of the user's memberships in Apollo Studio organizations."
},
"organization": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "Globally unique identifier, which isn't guaranteed stable (can be changed by administrators)."
},
"name": {
"type": "string",
"description": "Name of the organization, which can change over time and isn't unique. If the organization has no company\nname set, this falls back to the organization's ID."
}
}
},
{
"type": "null"
}
],
"description": "The organization this service account belongs to."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the authenticated `User` or `Graph` executing this query. If this is an unauthenticated query (i.e., no API key is provided), this field returns null."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
Original tool metadata
{
"name": "GetMyIdentity",
"description": "Resolve the caller's identity from their API key or OAuth token. Call this FIRST when the user asks about \"my graph\" but has not provided a graph ID. For a graph/service key, `me` resolves to a Graph: use `id` as the graphId and `variants[].name` as the variant for the graph-scoped health-check tools, so the user does not have to supply either. For a user (personal key or OAuth), `me` resolves to a User instead: there's no single graph, so each org membership's `graphs[].id` / `graphs[].variants[].name` lists the graphId/variant options the graph-scoped tools need, across every org the user belongs to. Also handles service-account keys.",
"inputSchema": {
"type": "object",
"properties": {}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"me": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The identity's identifier, which is unique among objects of its type."
},
"name": {
"type": "string",
"description": "The identity's human-readable name."
},
"account": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "Globally unique identifier, which isn't guaranteed stable (can be changed by administrators)."
},
"name": {
"type": "string",
"description": "Name of the organization, which can change over time and isn't unique. If the organization has no company\nname set, this falls back to the organization's ID."
}
}
},
{
"type": "null"
}
],
"description": "The organization that this graph belongs to."
},
"variants": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The variant's name (e.g., `staging`)."
}
}
},
"description": "A list of the variants for this graph."
},
"__typename": {
"type": "string",
"description": "The typename of this object"
},
"memberships": {
"type": "array",
"items": {
"type": "object",
"required": [
"account"
],
"properties": {
"account": {
"type": "object",
"required": [
"id",
"name",
"graphs"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "Globally unique identifier, which isn't guaranteed stable (can be changed by administrators)."
},
"name": {
"type": "string",
"description": "Name of the organization, which can change over time and isn't unique. If the organization has no company\nname set, this falls back to the organization's ID."
},
"graphs": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"variants"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The graph's globally unique identifier."
},
"name": {
"type": "string"
},
"variants": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The variant's name (e.g., `staging`)."
}
}
},
"description": "A list of the variants for this graph."
}
}
},
"description": "Graphs belonging to this organization."
}
},
"description": "The organization that the user belongs to."
}
}
},
"description": "A list of the user's memberships in Apollo Studio organizations."
},
"organization": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "Globally unique identifier, which isn't guaranteed stable (can be changed by administrators)."
},
"name": {
"type": "string",
"description": "Name of the organization, which can change over time and isn't unique. If the organization has no company\nname set, this falls back to the organization's ID."
}
}
},
{
"type": "null"
}
],
"description": "The organization this service account belongs to."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the authenticated `User` or `Graph` executing this query. If this is an unauthenticated query (i.e., no API key is provided), this field returns null."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
},
"annotations": {
"title": "Get my GraphOS identity",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Read the schema (SDL) that is currently published to a graph variant, with its hash and publication time. This is the same read that `rover graph fetch` performs. The response holds the whole document and is not truncated. A large federated graph measured over 800,000 characters, roughly 200,000 tokens, which exceeds the context window of most models. Prefer GetSubgraphSchema, which reads one subgraph at a time, and use this tool only when you need the whole API schema. Provide the graph ID and the variant name.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 2 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"properties": {
"latestPublication": {
"anyOf": [
{
"type": "object",
"required": [
"publishedAt",
"schema"
],
"properties": {
"schema": {
"type": "object",
"required": [
"hash",
"document"
],
"properties": {
"hash": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The GraphQL schema document's SHA256 hash, represented as a hexadecimal string."
},
"document": {
"type": "string",
"description": "A GraphQL document, such as a schema in SDL syntax."
}
},
"description": "The schema that was published to the variant."
},
"publishedAt": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
}
}
},
{
"type": "null"
}
],
"description": "The details of the variant's most recent publication."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
Original tool metadata
{
"name": "GetGraphSchema",
"description": "Read the schema (SDL) that is currently published to a graph variant, with its hash and publication time. This is the same read that `rover graph fetch` performs. The response holds the whole document and is not truncated. A large federated graph measured over 800,000 characters, roughly 200,000 tokens, which exceeds the context window of most models. Prefer GetSubgraphSchema, which reads one subgraph at a time, and use this tool only when you need the whole API schema. Provide the graph ID and the variant name.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"variant"
],
"properties": {
"graphId": {
"type": "string"
},
"variant": {
"type": "string"
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"properties": {
"latestPublication": {
"anyOf": [
{
"type": "object",
"required": [
"publishedAt",
"schema"
],
"properties": {
"schema": {
"type": "object",
"required": [
"hash",
"document"
],
"properties": {
"hash": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The GraphQL schema document's SHA256 hash, represented as a hexadecimal string."
},
"document": {
"type": "string",
"description": "A GraphQL document, such as a schema in SDL syntax."
}
},
"description": "The schema that was published to the variant."
},
"publishedAt": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
}
}
},
{
"type": "null"
}
],
"description": "The details of the variant's most recent publication."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
},
"annotations": {
"title": "Get a graph schema",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Publish operations to a persisted query list, the same write that `rover persisted-queries publish` performs. A persisted query list is the set of operations a router accepts when it is configured to reject anything else. Operations you do not mention stay in the list unchanged: pass operations to add or replace entries, and remove to drop them. Returns the new revision and the total operation count, or reports that nothing changed. Use GetPersistedQueryListStatus to find the list ID and its current revision. Provide the graph ID and the persisted query list ID.
The description explains the capability, when to use it, and what to expect.
Inputs65/100
7 of 10 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
listId
Not provided
Missing description. Explain what this value means and how to supply it.
definitions › PersistedQueryInput › body
The GraphQL document for this operation, including all necessary fragment definitions.
Clear enough to supply this argument.
definitions › PersistedQueryInput › clientName
An optional client name to associate with the operation. Two operations with the same ID but different client names are treated as distinct operations.
Clear enough to supply this argument.
definitions › PersistedQueryInput › id
An opaque identifier for this operation. This should map uniquely to an operation body; editing the body should generally result in a new ID. Apollo's tools generally use the lowercase hex SHA256 of the operation body.
Explain the meaning of this value, not just its name.
definitions › PersistedQueryInput › name
A name for the operation. Typically this is the name of the actual GraphQL operation in the body. This does not need to be unique within a Persisted Query List; as a client project evolves and its operations change, multiple operations with the same name (but different body and id) can be published.
Clear enough to supply this argument.
definitions › PersistedQueryInput › type
The operation's type.
Clear enough to supply this argument.
definitions › PersistedQueryIdInput › clientName
An optional client name to associate with the operation. Two operations with the same ID but different client names are treated as distinct operations. An operation with the same ID and a null client name is treated as a distinct operation as well.
Clear enough to supply this argument.
definitions › PersistedQueryIdInput › id
An opaque identifier for this operation. For a given client name, this should map uniquely to an operation body; editing the body should generally result in a new ID. Apollo's tools generally use the lowercase hex SHA256 of the operation body.
Clear enough to supply this argument.
allowOverwrittenOperations
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"required": [
"persistedQueryList"
],
"properties": {
"persistedQueryList": {
"type": "object",
"required": [
"publishOperations"
],
"properties": {
"publishOperations": {
"anyOf": [
{
"type": "object",
"required": [
"unchanged",
"build"
],
"properties": {
"build": {
"type": "object",
"required": [
"revision",
"totalOperationsInList"
],
"properties": {
"revision": {
"type": "integer",
"description": "The revision of this Persisted Query List. Revision 0 is the initial empty list; each publish increments the revision by 1."
},
"totalOperationsInList": {
"type": "integer",
"description": "The total number of operations in the list after this build. Compare to PersistedQueriesPublish.operationCounts."
}
},
"description": "The build created by this publish operation."
},
"unchanged": {
"type": "boolean",
"description": "Returns `true` if no changes were made by this publish (and no new revision was created). Otherwise, returns `false`."
}
}
},
{
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "The error message."
}
}
},
{
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string"
}
}
}
],
"description": "Updates this Persisted Query List by publishing a set of operations and removing other operations. Operations not mentioned remain in the list unchanged."
}
},
"description": "Provides access to mutation fields for modifying a Persisted Query List with the provided ID."
}
}
},
{
"type": "null"
}
],
"description": "Provides access to mutation fields for modifying a Studio graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
Original tool metadata
{
"name": "PublishPersistedQueries",
"description": "Publish operations to a persisted query list, the same write that `rover persisted-queries publish` performs. A persisted query list is the set of operations a router accepts when it is configured to reject anything else. Operations you do not mention stay in the list unchanged: pass operations to add or replace entries, and remove to drop them. Returns the new revision and the total operation count, or reports that nothing changed. Use GetPersistedQueryListStatus to find the list ID and its current revision. Provide the graph ID and the persisted query list ID.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"listId"
],
"properties": {
"listId": {
"type": "string"
},
"remove": {
"anyOf": [
{
"type": "array",
"items": {
"$ref": "#/definitions/PersistedQueryIdInput"
}
},
{
"type": "null"
}
]
},
"graphId": {
"type": "string"
},
"operations": {
"anyOf": [
{
"type": "array",
"items": {
"$ref": "#/definitions/PersistedQueryInput"
}
},
{
"type": "null"
}
]
},
"allowOverwrittenOperations": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
}
},
"definitions": {
"OperationType": {
"enum": [
"MUTATION",
"QUERY",
"SUBSCRIPTION"
],
"type": "string",
"description": "\n\nValues:\nMUTATION: \nQUERY: \nSUBSCRIPTION: "
},
"GraphQLDocument": {
"type": "string",
"description": "A GraphQL document, such as a schema in SDL syntax."
},
"PersistedQueryInput": {
"type": "object",
"required": [
"body",
"id",
"name",
"type"
],
"properties": {
"id": {
"type": "string",
"description": "An opaque identifier for this operation. This should map uniquely to an operation body; editing the body should generally result in a new ID. Apollo's tools generally use the lowercase hex SHA256 of the operation body."
},
"body": {
"$ref": "#/definitions/GraphQLDocument",
"description": "The GraphQL document for this operation, including all necessary fragment definitions."
},
"name": {
"type": "string",
"description": "A name for the operation. Typically this is the name of the actual GraphQL operation in the body. This does not need to be unique within a Persisted Query List; as a client project evolves and its operations change, multiple operations with the same name (but different body and id) can be published."
},
"type": {
"$ref": "#/definitions/OperationType",
"description": "The operation's type."
},
"clientName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "An optional client name to associate with the operation. Two operations with the same ID but different client names are treated as distinct operations."
}
},
"description": "Operations to be published to the Persisted Query List."
},
"PersistedQueryIdInput": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "An opaque identifier for this operation. For a given client name, this should map uniquely to an operation body; editing the body should generally result in a new ID. Apollo's tools generally use the lowercase hex SHA256 of the operation body."
},
"clientName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "An optional client name to associate with the operation. Two operations with the same ID but different client names are treated as distinct operations. An operation with the same ID and a null client name is treated as a distinct operation as well."
}
},
"description": "Full identifier for an operation in a Persisted Query List."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"required": [
"persistedQueryList"
],
"properties": {
"persistedQueryList": {
"type": "object",
"required": [
"publishOperations"
],
"properties": {
"publishOperations": {
"anyOf": [
{
"type": "object",
"required": [
"unchanged",
"build"
],
"properties": {
"build": {
"type": "object",
"required": [
"revision",
"totalOperationsInList"
],
"properties": {
"revision": {
"type": "integer",
"description": "The revision of this Persisted Query List. Revision 0 is the initial empty list; each publish increments the revision by 1."
},
"totalOperationsInList": {
"type": "integer",
"description": "The total number of operations in the list after this build. Compare to PersistedQueriesPublish.operationCounts."
}
},
"description": "The build created by this publish operation."
},
"unchanged": {
"type": "boolean",
"description": "Returns `true` if no changes were made by this publish (and no new revision was created). Otherwise, returns `false`."
}
}
},
{
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "The error message."
}
}
},
{
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string"
}
}
}
],
"description": "Updates this Persisted Query List by publishing a set of operations and removing other operations. Operations not mentioned remain in the list unchanged."
}
},
"description": "Provides access to mutation fields for modifying a Persisted Query List with the provided ID."
}
}
},
{
"type": "null"
}
],
"description": "Provides access to mutation fields for modifying a Studio graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
}
},
"annotations": {
"title": "Publish persisted queries",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Identify the most-used operations on a graph variant for a time range, with request counts, types, and signatures. Use to find high-traffic operations, detect unused operations, and prioritize findings by traffic impact. Provide graph ID, variant, and a from/to time range (ISO 8601 timestamps; `to` must be at least 6 hours before now), plus an optional limit (default 50). This report is rate limited.
Resolve contradictions between the description, input schema, and annotations.
Inputs0/100
3 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
graphId
Not provided
Missing description. Explain what this value means and how to supply it.
variant
Not provided
Missing description. Explain what this value means and how to supply it.
from
The starting timestamp for the report.
- Must be in the format: 2025-01-01T00:00:00Z (ISO 8601).
- Must be within the last 549 days.
- The duration between 'from' and 'to' must not exceed 31 days.
Resolve the mismatch between this description and its schema constraints.
to
The ending timestamp for the report.
- Must be in the format: 2025-01-01T08:00:00Z (ISO 8601).
- Must be at least 6 hours from the current time.
- The duration between 'from' and 'to' must not exceed 31 days.
Resolve the mismatch between this description and its schema constraints.
limit
Maximum number of records to return (default: 10)
Resolve the mismatch between this description and its schema constraints.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"required": [
"topOperationsReport"
],
"properties": {
"topOperationsReport": {
"type": "array",
"items": {
"type": "object",
"required": [
"operationId",
"requestCount"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The operation name or null if the operation is unnamed."
},
"type": {
"anyOf": [
{
"$ref": "#/definitions/OperationType"
},
{
"type": "null"
}
],
"description": "The operation type or null if the operation type could not be determined from the signature."
},
"signature": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The operation's signature body or null if the signature is unavailable due to parse errors."
},
"operationId": {
"type": "string",
"description": "The unique id for this operation."
},
"requestCount": {
"description": "Long type"
}
}
},
"description": "Returns a list of the top operations reported for this variant within a given time range. This API is rate limited,\nand will return an error if too many requests are made for a graph."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
},
"definitions": {
"OperationType": {
"enum": [
"MUTATION",
"QUERY",
"SUBSCRIPTION"
],
"type": "string"
}
}
}
Original tool metadata
{
"name": "GetTopOperations",
"description": "Identify the most-used operations on a graph variant for a time range, with request counts, types, and signatures. Use to find high-traffic operations, detect unused operations, and prioritize findings by traffic impact. Provide graph ID, variant, and a from/to time range (ISO 8601 timestamps; `to` must be at least 6 hours before now), plus an optional limit (default 50). This report is rate limited.",
"inputSchema": {
"type": "object",
"required": [
"graphId",
"variant",
"from",
"to"
],
"properties": {
"to": {
"$ref": "#/definitions/Timestamp",
"description": "The ending timestamp for the report.\n\n- Must be in the format: 2025-01-01T08:00:00Z (ISO 8601).\n- Must be at least 6 hours from the current time.\n - The duration between 'from' and 'to' must not exceed 31 days."
},
"from": {
"$ref": "#/definitions/Timestamp",
"description": "The starting timestamp for the report.\n\n- Must be in the format: 2025-01-01T00:00:00Z (ISO 8601).\n - Must be within the last 549 days.\n - The duration between 'from' and 'to' must not exceed 31 days."
},
"limit": {
"type": "integer",
"default": 50,
"description": "Maximum number of records to return (default: 10)"
},
"graphId": {
"type": "string"
},
"variant": {
"type": "string"
}
},
"definitions": {
"Timestamp": {
"description": "ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"graph": {
"anyOf": [
{
"type": "object",
"properties": {
"variant": {
"anyOf": [
{
"type": "object",
"required": [
"topOperationsReport"
],
"properties": {
"topOperationsReport": {
"type": "array",
"items": {
"type": "object",
"required": [
"operationId",
"requestCount"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The operation name or null if the operation is unnamed."
},
"type": {
"anyOf": [
{
"$ref": "#/definitions/OperationType"
},
{
"type": "null"
}
],
"description": "The operation type or null if the operation type could not be determined from the signature."
},
"signature": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The operation's signature body or null if the signature is unavailable due to parse errors."
},
"operationId": {
"type": "string",
"description": "The unique id for this operation."
},
"requestCount": {
"description": "Long type"
}
}
},
"description": "Returns a list of the top operations reported for this variant within a given time range. This API is rate limited,\nand will return an error if too many requests are made for a graph."
}
}
},
{
"type": "null"
}
],
"description": "Provides details of the graph variant with the provided `name`, if a variant\nwith that name exists for this graph. Otherwise, returns null.\n\n For a list of _all_ variants associated with a graph, use `Graph.variants` instead."
}
}
},
{
"type": "null"
}
],
"description": "Returns details of the graph with the provided ID."
}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [
"message"
],
"properties": {
"path": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
}
},
"message": {
"type": "string"
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"line": {
"type": "integer"
},
"column": {
"type": "integer"
}
}
}
},
"extensions": {
"type": "object"
}
}
}
},
"extensions": {
"type": "object"
}
},
"definitions": {
"OperationType": {
"enum": [
"MUTATION",
"QUERY",
"SUBSCRIPTION"
],
"type": "string"
}
}
},
"annotations": {
"title": "Get top operations",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01Search Apollo documentationSearches official Apollo documentation for GraphQL, GraphOS, Apollo Router, Apollo Client, MCP Server, schema design, deployment, and Connectors.
02Get my GraphOS identityResolve the caller's identity from their API key or OAuth token.
03Read the Apollo Connectors specificationReturns the Apollo Connectors specification for guidance on creating or modifying GraphQL schemas that use @connect or @source.
04Get graph variant detailsRetrieve metadata for a graph variant: its identifier, federation version, the URL of its GraphQL endpoint, and its subgraph inventory (names only).
05Read Apollo documentationReads an Apollo documentation page by slug in chunks.
Want to run these tasks against your MCP server with us?
GraphOS MCP Server setup, tools, quality score, publishing readiness, and alternatives.
How do I add GraphOS MCP Server to Claude, ChatGPT, or Cursor?
Add GraphOS MCP Server to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://mcp.apollographql.com/.
Is GraphOS MCP Server MCP ready for ChatGPT and Claude?
As of October 6, 2026, GraphOS MCP Server scores 100/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is GraphOS MCP Server's MCP tool documentation?
As of October 6, 2026, GraphOS MCP Server scores 73/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 32 of 32 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What tools does the GraphOS MCP Server MCP server provide?
GraphOS MCP Server provides these MCP tools: ApolloDocsSearch, ApolloDocsRead, and ApolloConnectorsSpec.
What are the best alternatives to GraphOS MCP Server?
As of October 20, 2026, alternatives to GraphOS MCP Server in developer-tools on the Manufact MCP leaderboard include Held at the Gate, Speko, turva.dev, AgentMail, and AgentPhone.
Does GraphOS MCP Server MCP require authentication?
GraphOS MCP Server does not require authentication. It is a public MCP endpoint you can connect without logging in.
How can GraphOS MCP Server improve its MCP documentation?
GetTopOperations is the lowest-scoring reviewed tool at 65/100. 3 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Who develops GraphOS MCP Server?
GraphOS MCP Server is developed by Apollo GraphQL. It is listed as partner on the Claude connector directory.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.