{"name":"io.github.apollographql/graphos-mcp-server","slug":"apollographql-graphos-mcp-server","title":"GraphOS MCP Server","description":"Search Apollo docs, specs, and best practices","url":"https://mcp.market/server/apollographql-graphos-mcp-server","rating":null,"grade":"C","score":67,"certified":false,"status":"active","category":"sales","tags":["sales","productivity","search"],"presence":{"score":8,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":null},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-04T05:40:34.994Z","last_ok_at":"2026-11-04T05:40:34.994Z","latency_ms":206},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":null,"website":"https://www.apollographql.com/docs/graphos/platform/graphos-mcp-tools","version":"1.17.0","remotes":[{"type":"streamable-http","url":"https://mcp.apollographql.com"}],"packages":[],"tools":[{"name":"ApolloConnectorsSpec","description":"Returns the Apollo Connectors specification for guidance on creating or modifying GraphQL schemas that use @connect or @source.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"ApolloDocsRead","description":"Reads an Apollo documentation page by slug in chunks. Use slugs returned by ApolloDocsSearch.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"description":"The slug returned from the ApolloDocsSearch tool","type":"string"},"chunkIndex":{"description":"The character index to start reading from, will return up to the next 10000 characters","type":"integer"}},"required":["slug","chunkIndex"]}},{"name":"ApolloDocsSearch","description":"Searches official Apollo documentation for GraphQL, GraphOS, Apollo Router, Apollo Client, MCP Server, schema design, deployment, and Connectors. Returns URLs, slugs, and excerpts.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"description":"Use terms that would lead to broad result with a maximum of 2 keywords.","type":"string"}},"required":["query"]}},{"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"graphId":{"type":"string"},"from":{"description":"The starting timestamp for the report. Must be in the format: 2025-01-01T00:00:00Z (ISO 8601).","$ref":"#/definitions/Timestamp"},"to":{"description":"The ending timestamp for the report. Must be in the format: 2025-01-01T08:00:00Z (ISO 8601).","$ref":"#/definitions/Timestamp"},"resolution":{"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.","anyOf":[{"$ref":"#/definitions/TimeseriesReportResolution"},{"type":"null"}],"default":"ENTIRE_RANGE"},"orderBy":{"anyOf":[{"$ref":"#/definitions/OperationInsightsTimeseriesReportMetric"},{"type":"null"}],"default":"REQUEST_COUNT"},"variantName":{"anyOf":[{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"type":"null"}]},"operationName":{"anyOf":[{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"type":"null"}]},"limit":{"description":"Maximum number of records to return (default: 100, max 10000).","anyOf":[{"type":"integer"},{"type":"null"}],"default":50}},"required":["graphId","from","to"],"definitions":{"Timestamp":{"description":"ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"},"TimeseriesReportResolution":{"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.","type":"string","enum":["DAY","ENTIRE_RANGE","HOUR","MINUTE","MONTH"]},"OperationInsightsTimeseriesReportMetric":{"description":"\n\nValues:\nREQUEST_COUNT: \nREQUEST_LATENCY_P50_MS: \nREQUEST_LATENCY_P90_MS: \nREQUEST_LATENCY_P99_MS: \nREQUEST_WITH_ERROR_COUNT: ","type":"string","enum":["REQUEST_COUNT","REQUEST_LATENCY_P50_MS","REQUEST_LATENCY_P90_MS","REQUEST_LATENCY_P99_MS","REQUEST_WITH_ERROR_COUNT"]}}}},{"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"graphId":{"type":"string"},"variant":{"type":"string"}},"required":["graphId","variant"]}},{"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"graphId":{"type":"string"},"variant":{"type":"string"},"launchId":{"type":"string"}},"required":["graphId","variant","launchId"]}},{"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"graphId":{"type":"string"},"variant":{"type":"string"},"limit":{"type":"integer","default":20},"offset":{"type":"integer","default":0}},"required":["graphId","variant"]}},{"name":"GetLintResults","description":"Retrieve schema lint violations from a graph's most recent check workflows: 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 check workflows).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"graphId":{"type":"string"},"limit":{"type":"integer","default":5}},"required":["graphId"]}},{"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"graphId":{"type":"string"},"from":{"description":"The starting timestamp for the report. Must be in the format: 2025-01-01T00:00:00Z (ISO 8601).","$ref":"#/definitions/Timestamp"},"to":{"description":"The ending timestamp for the report. Must be in the format: 2025-01-01T08:00:00Z (ISO 8601).","$ref":"#/definitions/Timestamp"},"resolution":{"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.","anyOf":[{"$ref":"#/definitions/TimeseriesReportResolution"},{"type":"null"}],"default":"ENTIRE_RANGE"},"orderBy":{"anyOf":[{"$ref":"#/definitions/OperationInsightsTimeseriesReportMetric"},{"type":"null"}],"default":"REQUEST_COUNT"},"variantName":{"anyOf":[{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"type":"null"}]},"clients":{"anyOf":[{"type":"array","items":{"anyOf":[{"$ref":"#/definitions/OperationInsightsTimeseriesReportClientFilterInInput"},{"type":"null"}]}},{"type":"null"}]},"limit":{"description":"Maximum number of records to return (default: 100, max 10000).","anyOf":[{"type":"integer"},{"type":"null"}],"default":50}},"required":["graphId","from","to"],"definitions":{"Timestamp":{"description":"ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"},"TimeseriesReportResolution":{"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.","type":"string","enum":["DAY","ENTIRE_RANGE","HOUR","MINUTE","MONTH"]},"OperationInsightsTimeseriesReportMetric":{"description":"\n\nValues:\nREQUEST_COUNT: \nREQUEST_LATENCY_P50_MS: \nREQUEST_LATENCY_P90_MS: \nREQUEST_LATENCY_P99_MS: \nREQUEST_WITH_ERROR_COUNT: ","type":"string","enum":["REQUEST_COUNT","REQUEST_LATENCY_P50_MS","REQUEST_LATENCY_P90_MS","REQUEST_LATENCY_P99_MS","REQUEST_WITH_ERROR_COUNT"]},"OperationInsightsTimeseriesReportClientFilterInInput":{"description":"The named type and version of the clients to include or exclude in the operation timeseries report.","type":"object","properties":{"clientName":{"description":"The client name.","anyOf":[{"type":"string"},{"type":"null"}]},"clientVersion":{"description":"The client version.","anyOf":[{"type":"string"},{"type":"null"}]}}}}}},{"name":"GetPersistedQueryListStatus","description":"Check whether a graph variant has a Persisted Query List (PQL) and its current build (revision and operation count). Use to assess PQL configuration — a production variant with no PQL is a security gap. Provide the graph ID and variant name.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"graphId":{"type":"string"},"variant":{"type":"string"}},"required":["graphId","variant"]}},{"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"graphId":{"type":"string"},"from":{"description":"The starting timestamp for the report. Must be in the format: 2025-01-01T00:00:00Z (ISO 8601).","$ref":"#/definitions/Timestamp"},"to":{"description":"The ending timestamp for the report. Must be in the format: 2025-01-01T08:00:00Z (ISO 8601).","$ref":"#/definitions/Timestamp"},"resolution":{"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.","anyOf":[{"$ref":"#/definitions/TimeseriesReportResolution"},{"type":"null"}],"default":"ENTIRE_RANGE"},"orderBy":{"anyOf":[{"$ref":"#/definitions/SubgraphInsightsTimeseriesReportMetric"},{"type":"null"}],"default":"FETCH_COUNT"},"variantName":{"anyOf":[{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"type":"null"}]},"subgraphName":{"anyOf":[{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"type":"null"}]},"clients":{"anyOf":[{"type":"array","items":{"anyOf":[{"$ref":"#/definitions/SubgraphInsightsTimeseriesReportClientFilterInInput"},{"type":"null"}]}},{"type":"null"}]},"limit":{"description":"Maximum number of records to return (default: 100, max 10000).","anyOf":[{"type":"integer"},{"type":"null"}],"default":50}},"required":["graphId","from","to"],"definitions":{"Timestamp":{"description":"ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"},"TimeseriesReportResolution":{"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.","type":"string","enum":["DAY","ENTIRE_RANGE","HOUR","MINUTE","MONTH"]},"SubgraphInsightsTimeseriesReportMetric":{"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.","type":"string","enum":["FETCH_COUNT","FETCH_LATENCY_P50_MS","FETCH_LATENCY_P90_MS","FETCH_LATENCY_P99_MS","FETCH_WITH_ERRORS_COUNT"]},"SubgraphInsightsTimeseriesReportClientFilterInInput":{"description":"The named type and version of the clients to include or exclude in the subgraph and connector timeseries report.","type":"object","properties":{"clientName":{"description":"The client name.","anyOf":[{"type":"string"},{"type":"null"}]},"clientVersion":{"description":"The client version.","anyOf":[{"type":"string"},{"type":"null"}]}}}}}},{"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"graphId":{"type":"string"},"variant":{"type":"string"},"from":{"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.","$ref":"#/definitions/Timestamp"},"to":{"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.","$ref":"#/definitions/Timestamp"},"limit":{"description":"Maximum number of records to return (default: 10)","type":"integer","default":50}},"required":["graphId","variant","from","to"],"definitions":{"Timestamp":{"description":"ISO 8601, extended format with nanoseconds, Zulu (or \"[+-]seconds\" as a string or number relative to now)"}}}},{"name":"GetVariantDetails","description":"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\").","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"graphId":{"type":"string"},"variant":{"type":"string"}},"required":["graphId","variant"]}}],"scan":{"score":67,"grade":"C","scanned_at":"2026-09-24T05:08:15.600Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-24T05:08:15.576Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 638ms"]},"poisoning":{"score":15,"max":15,"notes":["14 tool descriptions checked"]},"auth":{"score":10,"max":15,"notes":["open endpoint, read-only tools"]},"maintenance":{"score":3,"max":15,"notes":["no repository listed"]},"identity":{"score":2,"max":10,"notes":["no repository or website to verify"]}},"findings":[{"id":"maint.no-repo","severity":"low","component":"maintenance","title":"No source repository listed"}],"inputs":{"probes":[{"url":"https://mcp.apollographql.com","reachable":true,"authRequired":false,"latencyMs":638,"serverInfo":{"name":"graphos-mcp-server","version":"1.19.0"}}],"packages":[],"repo":{"found":false},"icon":{"url":"https://raw.githubusercontent.com/apollographql/apollo-client-devtools/main/assets/apollo-wordmark.svg","source":"registry"},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":null,"lastPushAt":null,"score":8}}}},"grade_history":[],"reviews":[]}