Setup: self-hosted Cloudflare host (apps/host-cloudflare), GraphQL integration for https://api.linear.app/graphql, org-owned API-key connection.
What happened: the integration's auth template had a typo in the header name (Authorisation), so introspection at connection-create ran effectively unauthenticated and the upstream rejected it. resolveTools returned incomplete: true with "GraphQL introspection could not be loaded." — but that reason is swallowed: the connection card in the web UI looked perfectly healthy while holding zero tools, coreTools.connections.refresh returned a bare {"tools":[]}, and the only evidence was a WARN executor tool sync preserved catalog line found via wrangler tail.
Why it hurts: an agent (or human) pointing at the catalog concludes the integration simply has no tools. Debugging required reading resolveTools in packages/plugins/graphql/src/sdk/plugin.ts and tailing the worker.
Suggestion: surface incompleteReason wherever the connection is rendered or returned —
- connection card: "0 tools — introspection failed: <reason / upstream status>"
connections.refresh / connections.list responses: include incomplete + incompleteReason
- ideally include the upstream HTTP status from the failed introspection attempt (the
introspect non-200 path already builds a redacted upstream message; it just never reaches the surface).
Happy to PR this if you point me at the preferred surface.
Setup: self-hosted Cloudflare host (
apps/host-cloudflare), GraphQL integration forhttps://api.linear.app/graphql, org-owned API-key connection.What happened: the integration's auth template had a typo in the header name (
Authorisation), so introspection at connection-create ran effectively unauthenticated and the upstream rejected it.resolveToolsreturnedincomplete: truewith "GraphQL introspection could not be loaded." — but that reason is swallowed: the connection card in the web UI looked perfectly healthy while holding zero tools,coreTools.connections.refreshreturned a bare{"tools":[]}, and the only evidence was aWARN executor tool sync preserved catalogline found viawrangler tail.Why it hurts: an agent (or human) pointing at the catalog concludes the integration simply has no tools. Debugging required reading
resolveToolsinpackages/plugins/graphql/src/sdk/plugin.tsand tailing the worker.Suggestion: surface
incompleteReasonwherever the connection is rendered or returned —connections.refresh/connections.listresponses: includeincomplete+incompleteReasonintrospectnon-200 path already builds a redacted upstream message; it just never reaches the surface).Happy to PR this if you point me at the preferred surface.