Hogyan segített a Cloudflare MCP GraphQL lekérdezések írásában

Fedezze fel, hogyan tette lehetővé a Cloudflare MCP a Cloudflare GraphQL dokumentációjának navigálását és érvényes lekérdezések generálását webhelystatisztikák lekéréséhez.

Bevezetés és kontextus

A munkám során egy Laravel eszközt kellett létrehoznom, amely lehetővé teszi webhelyeink Cloudflare-en tárolt statisztikáinak lekérését. Először a Cloudflare webhelyén kerestem az API dokumentációt, valamint a PHP-kompatibilis könyvtárakat.

A Cloudflare hivatalos PHP SDK-jának tesztelése során gyorsan két dologra jöttem rá: a Cloudflare nem tűnik elkötelezettnek ennek az SDK-nak a hosszú távú fenntartása mellett, és a régi REST végpontok egy részét GraphQL végpontok váltották fel.

Miért blokkolt a GraphQL

Mivel korábban soha nem használtam GraphQL API-t, a dokumentációban kezdtem el keresni a végpontokat, ahogy egy REST API esetében tenném.

Itt kezdtem elveszteni. A jól strukturált REST dokumentációval ellentétben nehéz volt megérteni a mezőneveket, argumentumokat, időszakokat, és különösen az egyes csomagokhoz tartozó engedélyeket és korlátokat.

Telepítettem egy GraphQL klienst (Altair) a lekérdezések közvetlen teszteléséhez.

Ekkor fedeztem fel egy érdekes funkciót: az introspekciót.

Egyszerűsítve, ez lehetővé teszi a kliens számára, hogy lekérje a GraphQL sémát a szerverről, hogy felfedezze az elérhető lekérdezéseket, típusokat, mezőket, argumentumokat és mutációkat.

Az elméletben tökéletes volt. A gyakorlatban félrevezető volt: az introspekció nem ismeri az egyes zónák tényleges engedélyeit, sem az ingyenes, pro, business vagy vállalati csomagokra vonatkozó korlátokat. Az Altair tehát látszólag "érvényes" lekérdezéseket generált, de gyakran túl sok argumentummal vagy olyan mezőkkel, amelyekhez nem volt hozzáférésem.

A jó REST dokumentációval ellentétben a GraphQL gyakran megköveteli, hogy önállóan kiderítsd:

  • a szükséges engedély szintet
  • a ténylegesen elérhető adatokat
  • az elfogadott időszakokat
  • az adott csomag szerint használható szűrőket

Génération des champs dans Altair

Ez generálja a következő GraphQL lekérdezést:

query ASingleDatasetExample($zoneTag: string, $start: Time, $end: Time) {
  viewer {
    zones(filter: { zoneTag: $zoneTag }) {
      firewallEventsAdaptiveByTimeGroups {
        avg {
          sampleInterval
        }
        confidence(level: "_____") {
          count {
            estimate
            isValid
            lower
            sampleSize
            upper
          }
          level
        }
        count
        dimensions {
          apiGatewayMatchedEndpoint
          apiGatewayMatchedHost
          attackSignatureCategories
          attackSignatureRefs
          botDetectionIds
          botDetectionTags
          botScore
          botScoreSrcName
          date
          datetime
          datetimeFifteenMinutes
          datetimeFiveMinutes
          datetimeHour
          datetimeMinute
          description
          firewallForAiAnyPiiCategory
          firewallForAiCustomTopicCategoriesScoresMin
          firewallForAiInjectionScore
          firewallForAiPiiCategories
          firewallForAiUnsafeTopicCategories
          fraudAttack
          fraudDetectionIds
          fraudDetectionTags
          fraudEmailRisk
          fraudEventType
          fraudUserId
          httpApplicationVersion
          ja3Hash
          ja4
          jsDetectionPassed
          verifiedBotCategory
          wafAttackScore
          wafAttackScoreClass
          wafMlAttackScore
          wafMlSqliAttackScore
          wafMlXssAttackScore
          wafPathTraversalAttackScore
          wafRceAttackScore
          wafSqliAttackScore
          wafXssAttackScore
          zoneVersion
        }
        sum {
          botDetectionIdArray
          botDetectionIdCountArray
          botDetectionTagArray
          botDetectionTagCountArray
          fraudDetectionIdArray
          fraudDetectionIdCountArray
          fraudDetectionTagArray
          fraudDetectionTagCountArray
        }
      }
    }
  }
}

Amiből háromnegyede vállalati adat!

Tesztelhetjük és lépésről lépésre eltávolíthatjuk azokat a mezőket és dimenziókat, amelyekhez nincs hozzáférésünk, hogy egy működő lekérdezést kapjunk.

query ASingleDatasetExample($zoneTag: string, $start: Time, $end: Time) {
  viewer {
    zones(filter: { zoneTag: $zoneTag }) {
      firewallEventsAdaptiveByTimeGroups(
        filter: { datetime_gt: $start, datetime_lt: $end }
        limit: 2
        orderBy: [datetime_DESC]
      ) {
        avg {
          sampleInterval
        }
        count
        dimensions {
          date
          datetime
          datetimeFifteenMinutes
          datetimeFiveMinutes
          datetimeHour
          datetimeMinute
          description
          firewallForAiAnyPiiCategory
          firewallForAiCustomTopicCategoriesScoresMin
          firewallForAiInjectionScore
          firewallForAiPiiCategories
          firewallForAiUnsafeTopicCategories
          httpApplicationVersion
          verifiedBotCategory
          zoneVersion
        }
      }
    }
  }
}

A Cloudflare MCP felfedezése

Ahogyan a dokumentációban kerestem a korlátokat és kényszereket, rábukkantam a Cloudflare MCP GraphQL oldalára. A README-ben nagyon hasznos példa promtok voltak, például:

  • Show me HTTP traffic for the last 7 days for example.com
  • Show me which GraphQL datatype I need to use to query firewall events

Azonnal megtetszett az ötlet: ahelyett, hogy órákat töltenék a megfelelő mezők és kombinációk kitalálásával, egy AI eszköz felfedezhette a sémát, és ténylegesen a kontextusommal kompatibilis lekérdezéseket javasolhatott.

Kísérlet a Playgrounddel

Az MCP felfedezésekor láttam, hogy a Cloudflare egy Playgroundot is kínál chat formában. Csatlakoztattam a GraphQL MCP-t, és elkezdetem írni a README-ből származó promtokat.

De katasztrófa következett: a Playground túl instabil volt az esetemben. Amikor megpróbáltam statisztikákat lekérni az egyik tartományomhoz, néha biztonsági hibákat vagy használhatatlan válaszokat kaptam.

Még amikor kifejezetten kértém, hogy használja a Cloudflare MCP-t, az eredmény gyakran körbe-körbe ment: kísérlet HTTP-n keresztül, rossz kontextum értelmezés, vagy lekérdezések, amelyek nem fejeződtek be.

Gyorsan elhagytam ezt az irányt, és áttértem a Claude Code-ra.

Áttérés a Claude Code-ra

A GraphQL MCP hozzáadásához a Claude Code-ban a következővel csatlakoztathatod:

claude mcp add --transport sse cloudflare-graphql https://graphql.mcp.cloudflare.com/sse

Ezután authenticate az MCP beállításaiban.

:::info Ha több napon keresztül használja, rendszeresen ellenőrizze, hogy a kapcsolat továbbra is érvényes-e.

:::

Miután csatlakozott, újra megpróbáltam lekérni az eredetileg keresett adatokat.

És ezúttal működött: megkaptam a megfelelő lekérdezéseket, tesztelve az én csomagommal, a megfelelő mezőkkel és paraméterekkel. A leghasznosabb az volt, hogy végre voltak olyan lekérdezéseim, amelyeket beépíthettem az alkalmazásomba.

Mit tanultam

Az MCP valódi előnye nem csupán a "lekérdezés generálása". Az előny különösen a túl absztrakt GraphQL dokumentáció értelmezésével elvesztegetett idő csökkentése.

Az esetemben segített:

  • azonosítani a megfelelő mezőket
  • megérteni az én csomagomhoz kapcsolódó kényszereket
  • tesztelni a paramétereket az integráció előtt
  • elkerülni a túl ambiciózus vagy érvénytelen lekérdezéseket

Tippek a Cloudflare GraphQL API-hoz

Ha megvalósítja ezt az API-t, tartsa szem előtt a korlátait. A Cloudflare dokumentációja szerint a GraphQL Analytics API aggregált adatokhoz készült, és az alapértelmezett korlátok közé tartozik különösen 300 kérés 5 perces ablakban, és maximum 10 zóna egy zóna-hatóságú lekérdezéshez.

Ha több zóna adatait kell lekérnie, a legtisztább megközelítés 10 zóna kötegekben való munka. Ez nagymértékben csökkenti a kérések teljes számát, és elkerüli a korlátok felesleges érintését.

Lekérdezés példa

Miután a logika megértetett, az érdekes rész a kódba integrálás válik. Íme egy példa a GraphQL lekérdezés szerkezetre, amelyet stabilizálni tudtam az MCP-vel végzett tesztek után:

query FirewallByTimeBatch(
  $zoneTags: [string!]
  $start: Time
  $end: Time
) {
  viewer {
    zones(filter: { zoneTag_in: $zoneTags }) {
      zoneTag
      firewallEventsAdaptiveByTimeGroups(
        filter: {
          datetime_geq: $start
          datetime_lt: $end
          action: "block"
        }
        limit: 1000
        orderBy: [datetimeHour_ASC]
      ) {
        dimensions {
          datetimeHour
        }
        count
      }
    }
  }
}

# variables
{
  "zoneTags": [
    "abc123",
    "abc456"
  ],
  "start": "2026-05-11T02:07:05Z",
  "end": "2026-05-11T17:07:05Z"
}

A cél nem a legelegánsabb lekérdezés volt, hanem a megfelelő lekérdezés a tényleges szükségemhez.

Gyakorlati következtetés

A Cloudflare GraphQL API továbbra is hatékony, de a dokumentációja clearly több erőfeszítést igényel, mint egy jól megjelölt REST API. Ha nem biztos a GraphQL-ben, tanácsolom, hogy ne töltson túl sok időt a mezők és kényszerek manuális kitalálásával.

Helyette használja a Cloudflare MCP-t a fejlesztői környezetében. Hagyja az AI-t felfedezni a sémát, tesztelni az engedélyeket az előfizetése szerint, majd generálni a lekérdezéseket, amelyeket beépíthet a projektjébe.

Véleményem szerint ez a leggyorsabb módja annak, hogy a zavaros dokumentációból a ténylegesen használható lekérdezésekhez jusson.