Alphabet Capabilities

Naftiko 0.5 capability definitions for Alphabet - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

When a Google Ads campaign exceeds its daily budget threshold, pauses the campaign, sends an alert to the marketing Slack channel via Google Chat, and logs the event to BigQuery.

naftiko: "0.5"
info:
  label: "Ad Campaign Budget Adjustment Pipeline"
  description: "When a Google Ads campaign exceeds its daily budget threshold, pauses the campaign, sends an alert to the marketing Slack channel via Google Chat, and logs the event to BigQuery."
  tags:
    - advertising
    - marketing
    - google-ads
    - bigquery
    - alerting
capability:
  exposes:
    - type: mcp
      namespace: ads-budget-control
      port: 8080
      tools:
        - name: enforce-budget-limit
          description: "Check campaign spend against threshold, pause if exceeded, alert team, and log to BigQuery."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The Google Ads customer ID."
            - name: campaign_id
              in: body
              type: string
              description: "The campaign identifier."
            - name: budget_threshold
              in: body
              type: number
              description: "The daily budget ceiling in micros."
            - name: chat_space
              in: body
              type: string
              description: "The Google Chat space ID for alerts."
          steps:
            - name: get-spend
              type: call
              call: "googleads.query-campaign"
              with:
                customer_id: "{{customer_id}}"
                campaign_id: "{{campaign_id}}"
            - name: pause-campaign
              type: call
              call: "googleads.update-campaign-status"
              with:
                customer_id: "{{customer_id}}"
                campaign_id: "{{campaign_id}}"
                status: "PAUSED"
            - name: alert-team
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Budget alert: Campaign {{campaign_id}} paused. Spend {{get-spend.cost_micros}} exceeded threshold {{budget_threshold}}."
            - name: log-event
              type: call
              call: "bigquery.insert-rows"
              with:
                project_id: "alphabet-ads-ops"
                dataset_id: "budget_events"
                table_id: "campaign_pauses"
                rows: "[{\"campaign_id\": \"{{campaign_id}}\", \"spend\": \"{{get-spend.cost_micros}}\", \"threshold\": \"{{budget_threshold}}\"}]"
  consumes:
    - type: http
      namespace: googleads
      baseUri: "https://googleads.googleapis.com/v16"
      authentication:
        type: bearer
        token: "$secrets.google_ads_token"
      inputParameters:
        - name: developer-token
          in: header
          value: "$secrets.google_ads_developer_token"
      resources:
        - name: campaign-query
          path: "/customers/{{customer_id}}/googleAds:searchStream"
          inputParameters:
            - name: customer_id
              in: path
          operations:
            - name: query-campaign
              method: POST
        - name: campaign-mutate
          path: "/customers/{{customer_id}}/campaigns:mutate"
          inputParameters:
            - name: customer_id
              in: path
          operations:
            - name: update-campaign-status
              method: POST
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: tabledata
          path: "/projects/{{project_id}}/datasets/{{dataset_id}}/tables/{{table_id}}/insertAll"
          inputParameters:
            - name: project_id
              in: path
            - name: dataset_id
              in: path
            - name: table_id
              in: path
          operations:
            - name: insert-rows
              method: POST

Creates a Google Ads conversion action, generates the tracking tag, deploys it via Google Tag Manager, and confirms deployment by checking the GTM container version.

naftiko: "0.5"
info:
  label: "Ads Conversion Tracking Setup"
  description: "Creates a Google Ads conversion action, generates the tracking tag, deploys it via Google Tag Manager, and confirms deployment by checking the GTM container version."
  tags:
    - advertising
    - marketing
    - google-ads
    - google-tag-manager
capability:
  exposes:
    - type: mcp
      namespace: ads-conversion-setup
      port: 8080
      tools:
        - name: setup-conversion-tracking
          description: "Create a conversion action in Google Ads, deploy tracking tag via GTM, and verify."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The Google Ads customer ID."
            - name: conversion_name
              in: body
              type: string
              description: "The name for the conversion action."
            - name: conversion_category
              in: body
              type: string
              description: "The conversion category (e.g. PURCHASE, LEAD)."
            - name: gtm_account_id
              in: body
              type: string
              description: "The GTM account ID."
            - name: gtm_container_id
              in: body
              type: string
              description: "The GTM container ID."
          steps:
            - name: create-conversion
              type: call
              call: "googleads.create-conversion-action"
              with:
                customer_id: "{{customer_id}}"
                name: "{{conversion_name}}"
                category: "{{conversion_category}}"
            - name: create-gtm-tag
              type: call
              call: "gtm.create-tag"
              with:
                account_id: "{{gtm_account_id}}"
                container_id: "{{gtm_container_id}}"
                tag_name: "{{conversion_name}}_tracking"
                conversion_id: "{{create-conversion.results[0].conversionAction.id}}"
            - name: publish-container
              type: call
              call: "gtm.publish-version"
              with:
                account_id: "{{gtm_account_id}}"
                container_id: "{{gtm_container_id}}"
            - name: verify-deployment
              type: call
              call: "gtm.get-latest-version"
              with:
                account_id: "{{gtm_account_id}}"
                container_id: "{{gtm_container_id}}"
  consumes:
    - type: http
      namespace: googleads
      baseUri: "https://googleads.googleapis.com/v16"
      authentication:
        type: bearer
        token: "$secrets.google_ads_token"
      inputParameters:
        - name: developer-token
          in: header
          value: "$secrets.google_ads_developer_token"
      resources:
        - name: conversion-actions
          path: "/customers/{{customer_id}}/conversionActions:mutate"
          inputParameters:
            - name: customer_id
              in: path
          operations:
            - name: create-conversion-action
              method: POST
    - type: http
      namespace: gtm
      baseUri: "https://tagmanager.googleapis.com/tagmanager/v2"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: tags
          path: "/accounts/{{account_id}}/containers/{{container_id}}/workspaces/default/tags"
          inputParameters:
            - name: account_id
              in: path
            - name: container_id
              in: path
          operations:
            - name: create-tag
              method: POST
        - name: versions
          path: "/accounts/{{account_id}}/containers/{{container_id}}/versions"
          inputParameters:
            - name: account_id
              in: path
            - name: container_id
              in: path
          operations:
            - name: publish-version
              method: POST
            - name: get-latest-version
              method: GET

Searches application logs for matching patterns. Used by Alphabet teams.

naftiko: "0.5"
info:
  label: "Alphabet Log Search Query"
  description: "Searches application logs for matching patterns. Used by Alphabet teams."
  tags:
    - cloud
    - kubernetes
capability:
  exposes:
    - type: mcp
      namespace: kubernetes
      port: 8080
      tools:
        - name: get-log_search_query
          description: "Searches application logs for matching patterns. Used by Alphabet teams."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The search_query to look up." 
          call: "kubernetes.get-search_query"
          with:
            search_query: "{{search_query}}"
  consumes:
    - type: http
      namespace: k8s
      baseUri: "https://alphabet-k8s.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.k8s_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: alphabet_log_search_query
              method: GET

Queries metric values from a monitoring dashboard. Used by Alphabet teams.

naftiko: "0.5"
info:
  label: "Alphabet Metric Dashboard Query"
  description: "Queries metric values from a monitoring dashboard. Used by Alphabet teams."
  tags:
    - cloud
    - bigquery
capability:
  exposes:
    - type: mcp
      namespace: bigquery
      port: 8080
      tools:
        - name: get-metric_dashboard_query
          description: "Queries metric values from a monitoring dashboard. Used by Alphabet teams."
          inputParameters:
            - name: metric_name
              in: body
              type: string
              description: "The metric_name to look up." 
          call: "bigquery.get-metric_name"
          with:
            metric_name: "{{metric_name}}"
  consumes:
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: alphabet_metric_dashboard_quer
              method: GET

Checks the current status of a project. Used by Alphabet teams.

naftiko: "0.5"
info:
  label: "Alphabet Project Status Check"
  description: "Checks the current status of a project. Used by Alphabet teams."
  tags:
    - cloud
    - jira
capability:
  exposes:
    - type: mcp
      namespace: jira
      port: 8080
      tools:
        - name: get-project_status_check
          description: "Checks the current status of a project. Used by Alphabet teams."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The project_key to look up." 
          call: "jira.get-project_key"
          with:
            project_key: "{{project_key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://alphabet.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: alphabet_project_status_check
              method: GET

Checks the health status of a monitored service. Used by Alphabet teams.

naftiko: "0.5"
info:
  label: "Alphabet Service Health Check"
  description: "Checks the health status of a monitored service. Used by Alphabet teams."
  tags:
    - cloud
    - gcp
capability:
  exposes:
    - type: mcp
      namespace: gcp
      port: 8080
      tools:
        - name: get-service_health_check
          description: "Checks the health status of a monitored service. Used by Alphabet teams."
          inputParameters:
            - name: health_target
              in: body
              type: string
              description: "The health_target to look up." 
          call: "gcp.get-health_target"
          with:
            health_target: "{{health_target}}"
  consumes:
    - type: http
      namespace: gcp
      baseUri: "https://compute.googleapis.com/compute/v1/projects/alphabet"
      authentication:
        type: bearer
        token: "$secrets.gcp_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: alphabet_service_health_check
              method: GET

Retrieves the details of a support ticket. Used by Alphabet teams.

naftiko: "0.5"
info:
  label: "Alphabet Ticket Details Lookup"
  description: "Retrieves the details of a support ticket. Used by Alphabet teams."
  tags:
    - cloud
    - grafana
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: get-ticket_details_lookup
          description: "Retrieves the details of a support ticket. Used by Alphabet teams."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "The ticket_id to look up." 
          call: "grafana.get-ticket_id"
          with:
            ticket_id: "{{ticket_id}}"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://alphabet-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: alphabet_ticket_details_lookup
              method: GET

Retrieves user account details from the directory. Used by Alphabet teams.

naftiko: "0.5"
info:
  label: "Alphabet User Account Lookup"
  description: "Retrieves user account details from the directory. Used by Alphabet teams."
  tags:
    - cloud
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: salesforce
      port: 8080
      tools:
        - name: get-user_account_lookup
          description: "Retrieves user account details from the directory. Used by Alphabet teams."
          inputParameters:
            - name: user_id
              in: body
              type: string
              description: "The user_id to look up." 
          call: "salesforce.get-user_id"
          with:
            user_id: "{{user_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://alphabet.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: alphabet_user_account_lookup
              method: GET

Uploads an APK to Google Play Developer API, promotes it to the internal test track, triggers Firebase Test Lab tests, and notifies the team on Google Chat.

naftiko: "0.5"
info:
  label: "Android App Release Pipeline"
  description: "Uploads an APK to Google Play Developer API, promotes it to the internal test track, triggers Firebase Test Lab tests, and notifies the team on Google Chat."
  tags:
    - mobile
    - devops
    - google-android
    - firebase
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: android-release
      port: 8080
      tools:
        - name: release-android-app
          description: "Upload APK, promote to test track, run Firebase tests, and notify team."
          inputParameters:
            - name: package_name
              in: body
              type: string
              description: "The Android app package name."
            - name: apk_path
              in: body
              type: string
              description: "GCS path to the APK file."
            - name: track
              in: body
              type: string
              description: "The release track (internal, alpha, beta, production)."
            - name: project_id
              in: body
              type: string
              description: "Firebase project ID for Test Lab."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space for release notifications."
          steps:
            - name: upload-apk
              type: call
              call: "playdev.upload-apk"
              with:
                package_name: "{{package_name}}"
                apk_path: "{{apk_path}}"
            - name: promote-track
              type: call
              call: "playdev.update-track"
              with:
                package_name: "{{package_name}}"
                track: "{{track}}"
                version_code: "{{upload-apk.versionCode}}"
            - name: run-tests
              type: call
              call: "testlab.run-test"
              with:
                project_id: "{{project_id}}"
                apk_gcs_path: "{{apk_path}}"
            - name: notify-team
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Android release: {{package_name}} v{{upload-apk.versionCode}} promoted to {{track}}. Test Lab execution: {{run-tests.testExecutionId}}."
  consumes:
    - type: http
      namespace: playdev
      baseUri: "https://androidpublisher.googleapis.com/androidpublisher/v3"
      authentication:
        type: bearer
        token: "$secrets.google_play_token"
      resources:
        - name: apks
          path: "/applications/{{package_name}}/edits/upload"
          inputParameters:
            - name: package_name
              in: path
          operations:
            - name: upload-apk
              method: POST
        - name: tracks
          path: "/applications/{{package_name}}/edits/tracks/{{track}}"
          inputParameters:
            - name: package_name
              in: path
            - name: track
              in: path
          operations:
            - name: update-track
              method: PUT
    - type: http
      namespace: testlab
      baseUri: "https://testing.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: test-executions
          path: "/projects/{{project_id}}/testMatrices"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: run-test
              method: POST
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Identifies deprecated API consumers, sends migration notices, tracks adoption, and reports progress.

naftiko: "0.5"
info:
  label: "API Deprecation Notice Pipeline"
  description: "Identifies deprecated API consumers, sends migration notices, tracks adoption, and reports progress."
  tags:
    - engineering
    - datadog
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: api_deprecation_notice_pipeline
          description: "Orchestrate api deprecation notice pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-datadog
              type: call
              call: "datadog.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-datadog.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "API Deprecation Notice Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://alphabet.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Profiles API latency, identifies bottlenecks, applies caching rules, and reports improvements.

naftiko: "0.5"
info:
  label: "API Performance Optimization Pipeline"
  description: "Profiles API latency, identifies bottlenecks, applies caching rules, and reports improvements."
  tags:
    - performance
    - datadog
    - grafana
    - slack
capability:
  exposes:
    - type: mcp
      namespace: performance
      port: 8080
      tools:
        - name: api_performance_optimization_pipeline
          description: "Orchestrate api performance optimization pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-datadog
              type: call
              call: "datadog.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-grafana
              type: call
              call: "grafana.process-resource"
              with:
                data: "{{get-datadog.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "API Performance Optimization Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://alphabet-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Extracts API traffic analytics from Apigee, transforms the data, loads into BigQuery, and refreshes a Looker dashboard.

naftiko: "0.5"
info:
  label: "Apigee API Analytics to Looker Pipeline"
  description: "Extracts API traffic analytics from Apigee, transforms the data, loads into BigQuery, and refreshes a Looker dashboard."
  tags:
    - analytics
    - apigee
    - bigquery
    - looker
capability:
  exposes:
    - type: mcp
      namespace: apigee-analytics
      port: 8080
      tools:
        - name: run-apigee-analytics
          description: "Extract Apigee analytics and load into BigQuery with Looker refresh."
          inputParameters:
            - name: org
              in: body
              type: string
              description: "Apigee organization name."
            - name: env
              in: body
              type: string
              description: "Apigee environment."
            - name: project_id
              in: body
              type: string
              description: "GCP project ID."
            - name: dataset
              in: body
              type: string
              description: "BigQuery dataset."
            - name: table
              in: body
              type: string
              description: "BigQuery table."
          steps:
            - name: get-api-stats
              type: call
              call: "apigee.get-stats"
              with:
                org: "{{org}}"
                env: "{{env}}"
            - name: load-to-bq
              type: call
              call: "bigquery.insert-rows"
              with:
                project_id: "{{project_id}}"
                dataset: "{{dataset}}"
                table: "{{table}}"
            - name: refresh-looker
              type: call
              call: "looker.run-look"
              with:
                look_id: "{{look_id}}"
  consumes:
    - type: http
      namespace: apigee
      baseUri: "https://apigee.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: stats
          path: "/organizations/{{org}}/environments/{{env}}/stats/apiproxy"
          inputParameters:
            - name: org
              in: path
            - name: env
              in: path
          operations:
            - name: get-stats
              method: GET
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: tabledata
          path: "/projects/{{project_id}}/datasets/{{dataset}}/tables/{{table}}/insertAll"
          inputParameters:
            - name: project_id
              in: path
            - name: dataset
              in: path
            - name: table
              in: path
          operations:
            - name: insert-rows
              method: POST
    - type: http
      namespace: looker
      baseUri: "https://looker.com/api/4.0"
      authentication:
        type: bearer
        token: "$secrets.looker_api_token"
      resources:
        - name: looks
          path: "/looks/{{look_id}}/run/json"
          inputParameters:
            - name: look_id
              in: path
          operations:
            - name: run-look
              method: GET

Retrieves the latest deployed revision of an Apigee API proxy including deployment status and environment. Used by API platform teams for governance.

naftiko: "0.5"
info:
  label: "Apigee API Proxy Revision"
  description: "Retrieves the latest deployed revision of an Apigee API proxy including deployment status and environment. Used by API platform teams for governance."
  tags:
    - api-management
    - apigee
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: apigee-governance
      port: 8080
      tools:
        - name: get-proxy-deployment
          description: "Look up Apigee proxy deployment details by org, proxy name, and environment."
          inputParameters:
            - name: org_name
              in: body
              type: string
              description: "The Apigee organization name."
            - name: api_proxy
              in: body
              type: string
              description: "The API proxy name."
            - name: environment
              in: body
              type: string
              description: "The deployment environment (e.g. prod, test)."
          call: "apigee.get-deployment"
          with:
            org_name: "{{org_name}}"
            api_proxy: "{{api_proxy}}"
            environment: "{{environment}}"
          outputParameters:
            - name: revision
              type: string
              mapping: "$.deployments[0].revision"
            - name: deploy_state
              type: string
              mapping: "$.deployments[0].state"
  consumes:
    - type: http
      namespace: apigee
      baseUri: "https://apigee.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: deployments
          path: "/organizations/{{org_name}}/environments/{{environment}}/apis/{{api_proxy}}/deployments"
          inputParameters:
            - name: org_name
              in: path
            - name: environment
              in: path
            - name: api_proxy
              in: path
          operations:
            - name: get-deployment
              method: GET

Lists container images stored in a Google Artifact Registry repository.

naftiko: "0.5"
info:
  label: "Artifact Registry Image List"
  description: "Lists container images stored in a Google Artifact Registry repository."
  tags:
    - containers
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: artifactregistry
      port: 8080
      tools:
        - name: list-images
          description: "List Docker images in an Artifact Registry repository."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The Artifact Registry region."
            - name: repo_name
              in: body
              type: string
              description: "The repository name."
          call: "artifactregistry.list-images"
          with:
            project_id: "{{project_id}}"
            region: "{{region}}"
            repo_name: "{{repo_name}}"
  consumes:
    - type: http
      namespace: artifactregistry
      baseUri: "https://artifactregistry.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: images
          path: "/projects/{{project_id}}/locations/{{region}}/repositories/{{repo_name}}/dockerImages"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: repo_name
              in: path
          operations:
            - name: list-images
              method: GET

Runs data quality validation queries on BigQuery tables, logs results to a Looker dashboard, and sends alerts for failures via Gmail.

naftiko: "0.5"
info:
  label: "BigQuery Data Quality Check Pipeline"
  description: "Runs data quality validation queries on BigQuery tables, logs results to a Looker dashboard, and sends alerts for failures via Gmail."
  tags:
    - data
    - bigquery
    - looker
    - gmail
capability:
  exposes:
    - type: mcp
      namespace: bq-quality
      port: 8080
      tools:
        - name: run-data-quality-check
          description: "Validate data quality in BigQuery and report results."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: dataset
              in: body
              type: string
              description: "The BigQuery dataset."
            - name: table
              in: body
              type: string
              description: "The BigQuery table."
            - name: looker_instance
              in: body
              type: string
              description: "Looker instance name."
            - name: dashboard_id
              in: body
              type: string
              description: "Looker dashboard ID."
            - name: alert_email
              in: body
              type: string
              description: "Email for failure alerts."
          steps:
            - name: run-quality-check
              type: call
              call: "bigquery.insert-job"
              with:
                project_id: "{{project_id}}"
                query: "SELECT COUNT(*) as nulls FROM {{dataset}}.{{table}} WHERE key IS NULL"
            - name: get-results
              type: call
              call: "bigquery.get-job"
              with:
                project_id: "{{project_id}}"
                job_id: "{{run-quality-check.jobReference.jobId}}"
            - name: update-dashboard
              type: call
              call: "looker.get-dashboard"
              with:
                dashboard_id: "{{dashboard_id}}"
            - name: send-alert
              type: call
              call: "gmail.send-message"
              with:
                to: "{{alert_email}}"
                subject: "Data quality alert for {{dataset}}.{{table}}"
                body: "Nulls found: {{get-results.statistics.query.totalRows}}"
  consumes:
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: jobs
          path: "/projects/{{project_id}}/jobs"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: insert-job
              method: POST
            - name: get-job
              method: GET
    - type: http
      namespace: looker
      baseUri: "https://{{looker_instance}}.looker.com/api/4.0"
      authentication:
        type: bearer
        token: "$secrets.looker_api_token"
      resources:
        - name: dashboards
          path: "/dashboards/{{dashboard_id}}"
          inputParameters:
            - name: dashboard_id
              in: path
          operations:
            - name: get-dashboard
              method: GET
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.gmail_token"
      resources:
        - name: messages
          path: "/users/me/messages/send"
          operations:
            - name: send-message
              method: POST

Retrieves metadata for a BigQuery dataset including table count, last modified timestamp, and access controls. Used by data engineers to audit dataset health.

naftiko: "0.5"
info:
  label: "BigQuery Dataset Discovery"
  description: "Retrieves metadata for a BigQuery dataset including table count, last modified timestamp, and access controls. Used by data engineers to audit dataset health."
  tags:
    - data
    - analytics
    - bigquery
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: bigquery-discovery
      port: 8080
      tools:
        - name: get-dataset-info
          description: "Look up a BigQuery dataset by project and dataset ID. Returns table count, size, last modified date, and ACLs."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID containing the dataset."
            - name: dataset_id
              in: body
              type: string
              description: "The BigQuery dataset identifier."
          call: "bigquery.get-dataset"
          with:
            project_id: "{{project_id}}"
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: table_count
              type: number
              mapping: "$.tables.totalItems"
            - name: last_modified
              type: string
              mapping: "$.lastModifiedTime"
            - name: location
              type: string
              mapping: "$.location"
  consumes:
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: datasets
          path: "/projects/{{project_id}}/datasets/{{dataset_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: get-dataset
              method: GET

Audits a Cloud Storage bucket for compliance: checks metadata, verifies IAM policies, scans for public access, and logs findings to BigQuery with a Google Chat alert.

naftiko: "0.5"
info:
  label: "Bucket Compliance Check Pipeline"
  description: "Audits a Cloud Storage bucket for compliance: checks metadata, verifies IAM policies, scans for public access, and logs findings to BigQuery with a Google Chat alert."
  tags:
    - storage
    - security
    - compliance
    - gcp-cloud-storage
    - bigquery
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: storage-compliance
      port: 8080
      tools:
        - name: audit-bucket-compliance
          description: "Check bucket metadata, IAM policy, log findings to BigQuery, and alert on non-compliance."
          inputParameters:
            - name: bucket_name
              in: body
              type: string
              description: "The Cloud Storage bucket name."
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID for logging."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space for compliance alerts."
          steps:
            - name: get-bucket-info
              type: call
              call: "cloudstorage.get-bucket"
              with:
                bucket_name: "{{bucket_name}}"
            - name: get-bucket-iam
              type: call
              call: "cloudstorage.get-bucket-iam"
              with:
                bucket_name: "{{bucket_name}}"
            - name: log-findings
              type: call
              call: "bigquery.insert-rows"
              with:
                project_id: "{{project_id}}"
                dataset_id: "compliance_audits"
                table_id: "bucket_findings"
                rows: "[{\"bucket\": \"{{bucket_name}}\", \"storage_class\": \"{{get-bucket-info.storageClass}}\", \"versioning\": \"{{get-bucket-info.versioning.enabled}}\", \"iam_bindings\": \"{{get-bucket-iam.bindings.length}}\"}]"
            - name: alert-team
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Bucket audit for {{bucket_name}}: class={{get-bucket-info.storageClass}}, versioning={{get-bucket-info.versioning.enabled}}, IAM bindings={{get-bucket-iam.bindings.length}}. Full report in compliance_audits.bucket_findings."
  consumes:
    - type: http
      namespace: cloudstorage
      baseUri: "https://storage.googleapis.com/storage/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: buckets
          path: "/b/{{bucket_name}}"
          inputParameters:
            - name: bucket_name
              in: path
          operations:
            - name: get-bucket
              method: GET
        - name: bucket-iam
          path: "/b/{{bucket_name}}/iam"
          inputParameters:
            - name: bucket_name
              in: path
          operations:
            - name: get-bucket-iam
              method: GET
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: tabledata
          path: "/projects/{{project_id}}/datasets/{{dataset_id}}/tables/{{table_id}}/insertAll"
          inputParameters:
            - name: project_id
              in: path
            - name: dataset_id
              in: path
            - name: table_id
              in: path
          operations:
            - name: insert-rows
              method: POST
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Generates a Campaign Manager 360 report, exports results to a Google Sheet, cross-references with Google Ads metrics, and emails a consolidated performance summary.

naftiko: "0.5"
info:
  label: "Campaign Performance Review Pipeline"
  description: "Generates a Campaign Manager 360 report, exports results to a Google Sheet, cross-references with Google Ads metrics, and emails a consolidated performance summary."
  tags:
    - advertising
    - marketing
    - google-campaign-manager
    - google-sheets
    - google-ads
    - gmail
capability:
  exposes:
    - type: mcp
      namespace: campaign-review
      port: 8080
      tools:
        - name: generate-performance-review
          description: "Run CM360 report, export to Sheets, merge with Ads data, and email summary."
          inputParameters:
            - name: profile_id
              in: body
              type: string
              description: "The Campaign Manager user profile ID."
            - name: advertiser_id
              in: body
              type: string
              description: "The advertiser ID."
            - name: customer_id
              in: body
              type: string
              description: "The Google Ads customer ID."
            - name: spreadsheet_id
              in: body
              type: string
              description: "The Google Sheets spreadsheet ID for the report."
            - name: report_email
              in: body
              type: string
              description: "Email for the performance summary."
          steps:
            - name: run-cm360-report
              type: call
              call: "cm360.create-report"
              with:
                profile_id: "{{profile_id}}"
                advertiser_id: "{{advertiser_id}}"
            - name: get-ads-metrics
              type: call
              call: "googleads.query-campaign"
              with:
                customer_id: "{{customer_id}}"
            - name: update-sheet
              type: call
              call: "sheets.update-values"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "PerformanceReview!A1"
                values: "{{run-cm360-report.rows}}"
            - name: email-summary
              type: call
              call: "gmail.send-message"
              with:
                to: "{{report_email}}"
                subject: "Campaign Performance Review"
                body: "CM360 + Google Ads consolidated report ready. View: https://docs.google.com/spreadsheets/d/{{spreadsheet_id}}."
  consumes:
    - type: http
      namespace: cm360
      baseUri: "https://dfareporting.googleapis.com/dfareporting/v4"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: reports
          path: "/userprofiles/{{profile_id}}/reports"
          inputParameters:
            - name: profile_id
              in: path
          operations:
            - name: create-report
              method: POST
    - type: http
      namespace: googleads
      baseUri: "https://googleads.googleapis.com/v16"
      authentication:
        type: bearer
        token: "$secrets.google_ads_token"
      inputParameters:
        - name: developer-token
          in: header
          value: "$secrets.google_ads_developer_token"
      resources:
        - name: campaigns
          path: "/customers/{{customer_id}}/googleAds:searchStream"
          inputParameters:
            - name: customer_id
              in: path
          operations:
            - name: query-campaign
              method: POST
    - type: http
      namespace: sheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: values
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: update-values
              method: PUT
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: messages
          path: "/users/me/messages/send"
          operations:
            - name: send-message
              method: POST

Validates change requests, routes for approval, schedules implementation, and notifies stakeholders.

naftiko: "0.5"
info:
  label: "Change Management Approval Pipeline"
  description: "Validates change requests, routes for approval, schedules implementation, and notifies stakeholders."
  tags:
    - itsm
    - servicenow
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: change_management_approval_pipeline
          description: "Orchestrate change management approval pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-servicenow.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Change Management Approval Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://alphabet.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://alphabet.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves the details of a Google Cloud Armor security policy including rules and targets.

naftiko: "0.5"
info:
  label: "Cloud Armor Security Policy Lookup"
  description: "Retrieves the details of a Google Cloud Armor security policy including rules and targets."
  tags:
    - security
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: cloudarmor
      port: 8080
      tools:
        - name: get-policy
          description: "Retrieve a Cloud Armor security policy by name."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: policy_name
              in: body
              type: string
              description: "The security policy name."
          call: "cloudarmor.get-policy"
          with:
            project_id: "{{project_id}}"
            policy_name: "{{policy_name}}"
  consumes:
    - type: http
      namespace: cloudarmor
      baseUri: "https://compute.googleapis.com/compute/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: policies
          path: "/projects/{{project_id}}/global/securityPolicies/{{policy_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: policy_name
              in: path
          operations:
            - name: get-policy
              method: GET

Retrieves the status and configuration of a Cloud Build trigger.

naftiko: "0.5"
info:
  label: "Cloud Build Trigger Status"
  description: "Retrieves the status and configuration of a Cloud Build trigger."
  tags:
    - ci
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: cloudbuild
      port: 8080
      tools:
        - name: get-trigger
          description: "Get the configuration and status of a Cloud Build trigger."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The Cloud Build region."
            - name: trigger_id
              in: body
              type: string
              description: "The build trigger ID."
          call: "cloudbuild.get-trigger"
          with:
            project_id: "{{project_id}}"
            region: "{{region}}"
            trigger_id: "{{trigger_id}}"
  consumes:
    - type: http
      namespace: cloudbuild
      baseUri: "https://cloudbuild.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: triggers
          path: "/projects/{{project_id}}/locations/{{region}}/triggers/{{trigger_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: trigger_id
              in: path
          operations:
            - name: get-trigger
              method: GET

Detects failed Airflow DAGs in Cloud Composer, restarts the tasks, logs to Cloud Logging, and notifies the data engineering team.

naftiko: "0.5"
info:
  label: "Cloud Composer DAG Failure Recovery Pipeline"
  description: "Detects failed Airflow DAGs in Cloud Composer, restarts the tasks, logs to Cloud Logging, and notifies the data engineering team."
  tags:
    - data
    - google-cloud-platform
    - apache-airflow
capability:
  exposes:
    - type: mcp
      namespace: composer-recovery
      port: 8080
      tools:
        - name: run-dag-recovery
          description: "Detect and recover failed DAGs in Cloud Composer."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The Composer region."
            - name: environment
              in: body
              type: string
              description: "Cloud Composer environment name."
            - name: dag_id
              in: body
              type: string
              description: "The Airflow DAG ID."
            - name: airflow_uri
              in: body
              type: string
              description: "The Airflow webserver URI."
          steps:
            - name: check-environment
              type: call
              call: "composer.get-environment"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                environment: "{{environment}}"
            - name: list-failed-runs
              type: call
              call: "airflow.list-runs"
              with:
                dag_id: "{{dag_id}}"
            - name: restart-dag
              type: call
              call: "airflow.trigger-run"
              with:
                dag_id: "{{dag_id}}"
            - name: log-recovery
              type: call
              call: "cloudlogging.write-entry"
              with:
                logName: "projects/{{project_id}}/logs/dag-recovery"
                entry: "Restarted DAG {{dag_id}} after failure."
  consumes:
    - type: http
      namespace: composer
      baseUri: "https://composer.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: environments
          path: "/projects/{{project_id}}/locations/{{region}}/environments/{{environment}}"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: environment
              in: path
          operations:
            - name: get-environment
              method: GET
    - type: http
      namespace: airflow
      baseUri: "https://{{airflow_uri}}"
      authentication:
        type: bearer
        token: "$secrets.airflow_token"
      resources:
        - name: dags
          path: "/api/v1/dags/{{dag_id}}/dagRuns"
          inputParameters:
            - name: dag_id
              in: path
          operations:
            - name: list-runs
              method: GET
            - name: trigger-run
              method: POST
    - type: http
      namespace: cloudlogging
      baseUri: "https://logging.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: entries
          path: "/entries:write"
          operations:
            - name: write-entry
              method: POST

Checks the state and progress of a Google Cloud Dataflow job including current stage, elapsed time, and watermark. Used by data engineers for pipeline monitoring.

naftiko: "0.5"
info:
  label: "Cloud Dataflow Job Status"
  description: "Checks the state and progress of a Google Cloud Dataflow job including current stage, elapsed time, and watermark. Used by data engineers for pipeline monitoring."
  tags:
    - data
    - pipelines
    - google-cloud-dataflow
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: dataflow-ops
      port: 8080
      tools:
        - name: get-job-status
          description: "Retrieve Dataflow job status by project, region, and job ID."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The Dataflow region."
            - name: job_id
              in: body
              type: string
              description: "The Dataflow job identifier."
          call: "dataflow.get-job"
          with:
            project_id: "{{project_id}}"
            region: "{{region}}"
            job_id: "{{job_id}}"
          outputParameters:
            - name: current_state
              type: string
              mapping: "$.currentState"
            - name: create_time
              type: string
              mapping: "$.createTime"
            - name: job_name
              type: string
              mapping: "$.name"
  consumes:
    - type: http
      namespace: dataflow
      baseUri: "https://dataflow.googleapis.com/v1b3"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: jobs
          path: "/projects/{{project_id}}/locations/{{region}}/jobs/{{job_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: job_id
              in: path
          operations:
            - name: get-job
              method: GET

Lists DNS records for a managed zone in Google Cloud DNS.

naftiko: "0.5"
info:
  label: "Cloud DNS Zone Record Lookup"
  description: "Lists DNS records for a managed zone in Google Cloud DNS."
  tags:
    - networking
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: clouddns
      port: 8080
      tools:
        - name: list-records
          description: "List DNS record sets for a managed zone."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: zone_name
              in: body
              type: string
              description: "The managed zone name."
          call: "clouddns.list-records"
          with:
            project_id: "{{project_id}}"
            zone_name: "{{zone_name}}"
  consumes:
    - type: http
      namespace: clouddns
      baseUri: "https://dns.googleapis.com/dns/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: records
          path: "/projects/{{project_id}}/managedZones/{{zone_name}}/rrsets"
          inputParameters:
            - name: project_id
              in: path
            - name: zone_name
              in: path
          operations:
            - name: list-records
              method: GET

Deploys a Cloud Function from a GCS archive, sets IAM invoker permissions, and verifies the function is active by calling its health endpoint.

naftiko: "0.5"
info:
  label: "Cloud Function Deployment Pipeline"
  description: "Deploys a Cloud Function from a GCS archive, sets IAM invoker permissions, and verifies the function is active by calling its health endpoint."
  tags:
    - serverless
    - devops
    - cloud-functions
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: cloudfunc-deploy
      port: 8080
      tools:
        - name: deploy-cloud-function
          description: "Deploy a Cloud Function, set IAM policy, and verify health."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The function region."
            - name: function_name
              in: body
              type: string
              description: "The Cloud Function name."
            - name: source_archive_url
              in: body
              type: string
              description: "GCS URI of the function source archive."
            - name: entry_point
              in: body
              type: string
              description: "The function entry point."
            - name: runtime
              in: body
              type: string
              description: "The runtime (e.g. python311, nodejs20)."
          steps:
            - name: create-function
              type: call
              call: "cloudfunctions.create-function"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                function_name: "{{function_name}}"
                source_archive_url: "{{source_archive_url}}"
                entry_point: "{{entry_point}}"
                runtime: "{{runtime}}"
            - name: set-iam-policy
              type: call
              call: "cloudfunctions.set-iam-policy"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                function_name: "{{function_name}}"
                role: "roles/cloudfunctions.invoker"
                member: "allUsers"
            - name: verify-health
              type: call
              call: "cloudfunctions.get-function"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                function_name: "{{function_name}}"
  consumes:
    - type: http
      namespace: cloudfunctions
      baseUri: "https://cloudfunctions.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: functions
          path: "/projects/{{project_id}}/locations/{{region}}/functions"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
          operations:
            - name: create-function
              method: POST
        - name: function-detail
          path: "/projects/{{project_id}}/locations/{{region}}/functions/{{function_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: function_name
              in: path
          operations:
            - name: get-function
              method: GET
            - name: set-iam-policy
              method: POST

Audits IAM role bindings across a GCP organization, identifies overprivileged accounts, exports findings to BigQuery, and alerts security team.

naftiko: "0.5"
info:
  label: "Cloud IAM Role Audit Pipeline"
  description: "Audits IAM role bindings across a GCP organization, identifies overprivileged accounts, exports findings to BigQuery, and alerts security team."
  tags:
    - security
    - google-cloud-platform
    - bigquery
capability:
  exposes:
    - type: mcp
      namespace: iam-audit
      port: 8080
      tools:
        - name: run-iam-audit
          description: "Audit IAM role bindings and report overprivileged accounts."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: dataset
              in: body
              type: string
              description: "BigQuery dataset for audit results."
            - name: table
              in: body
              type: string
              description: "BigQuery table."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space for security alerts."
          steps:
            - name: get-iam-policy
              type: call
              call: "cloudresourcemanager.get-iam-policy"
              with:
                project_id: "{{project_id}}"
            - name: export-findings
              type: call
              call: "bigquery.insert-rows"
              with:
                project_id: "{{project_id}}"
                dataset: "{{dataset}}"
                table: "{{table}}"
            - name: alert-security
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "IAM audit complete for {{project_id}}."
  consumes:
    - type: http
      namespace: cloudresourcemanager
      baseUri: "https://cloudresourcemanager.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: projects
          path: "/projects/{{project_id}}:getIamPolicy"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-iam-policy
              method: POST
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: tabledata
          path: "/projects/{{project_id}}/datasets/{{dataset}}/tables/{{table}}/insertAll"
          inputParameters:
            - name: project_id
              in: path
            - name: dataset
              in: path
            - name: table
              in: path
          operations:
            - name: insert-rows
              method: POST
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Queries Cloud Logging for error entries in a given service, creates a summary, posts it to Google Chat, and opens a ServiceNow incident.

naftiko: "0.5"
info:
  label: "Cloud Logging Error Alert Pipeline"
  description: "Queries Cloud Logging for error entries in a given service, creates a summary, posts it to Google Chat, and opens a ServiceNow incident."
  tags:
    - operations
    - monitoring
    - cloud-logging
    - servicenow
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: log-alerting
      port: 8080
      tools:
        - name: alert-on-errors
          description: "Query Cloud Logging for errors, alert via Google Chat, and create ServiceNow incident."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: service_name
              in: body
              type: string
              description: "The service name to filter logs."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space for alerts."
            - name: snow_assignment_group
              in: body
              type: string
              description: "ServiceNow assignment group for the incident."
          steps:
            - name: query-errors
              type: call
              call: "logging.list-entries"
              with:
                project_id: "{{project_id}}"
                filter: "resource.labels.service_name={{service_name}} severity=ERROR"
            - name: post-alert
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Error alert for {{service_name}}: {{query-errors.entries.length}} error entries detected in the last hour."
            - name: open-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Elevated errors in {{service_name}}"
                category: "application"
                assigned_group: "{{snow_assignment_group}}"
                description: "{{query-errors.entries.length}} error log entries detected for service {{service_name}} in project {{project_id}}."
  consumes:
    - type: http
      namespace: logging
      baseUri: "https://logging.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: entries
          path: "/entries:list"
          operations:
            - name: list-entries
              method: POST
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://alphabet.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Queries time-series metrics from Google Cloud Monitoring for a specified resource.

naftiko: "0.5"
info:
  label: "Cloud Monitoring Metric Query"
  description: "Queries time-series metrics from Google Cloud Monitoring for a specified resource."
  tags:
    - monitoring
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: cloudmonitoring
      port: 8080
      tools:
        - name: list-timeseries
          description: "Query time-series metrics from Cloud Monitoring."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: filter
              in: body
              type: string
              description: "The monitoring filter expression."
          call: "cloudmonitoring.list-timeseries"
          with:
            project_id: "{{project_id}}"
            filter: "{{filter}}"
  consumes:
    - type: http
      namespace: cloudmonitoring
      baseUri: "https://monitoring.googleapis.com/v3"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: timeseries
          path: "/projects/{{project_id}}/timeSeries"
          inputParameters:
            - name: project_id
              in: path
            - name: filter
              in: query
          operations:
            - name: list-timeseries
              method: GET

Publishes a message to a Google Cloud Pub/Sub topic.

naftiko: "0.5"
info:
  label: "Cloud Pub/Sub Topic Message Publisher"
  description: "Publishes a message to a Google Cloud Pub/Sub topic."
  tags:
    - messaging
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: pubsub
      port: 8080
      tools:
        - name: publish-message
          description: "Publish a message to a Pub/Sub topic."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: topic_name
              in: body
              type: string
              description: "The Pub/Sub topic name."
            - name: message_data
              in: body
              type: string
              description: "The base64-encoded message data."
          call: "pubsub.publish-message"
          with:
            project_id: "{{project_id}}"
            topic_name: "{{topic_name}}"
            data: "{{message_data}}"
  consumes:
    - type: http
      namespace: pubsub
      baseUri: "https://pubsub.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: topics
          path: "/projects/{{project_id}}/topics/{{topic_name}}:publish"
          inputParameters:
            - name: project_id
              in: path
            - name: topic_name
              in: path
          operations:
            - name: publish-message
              method: POST

Audits cloud resources for compliance tags, creates remediation tickets, and reports to leadership.

naftiko: "0.5"
info:
  label: "Cloud Resource Tagging Audit"
  description: "Audits cloud resources for compliance tags, creates remediation tickets, and reports to leadership."
  tags:
    - compliance
    - gcp
    - jira
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: cloud_resource_tagging_audit
          description: "Orchestrate cloud resource tagging audit workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-gcp
              type: call
              call: "gcp.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-gcp.result}}"
            - name: create-confluence
              type: call
              call: "confluence.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Cloud Resource Tagging Audit step 3 complete."

  consumes:
    - type: http
      namespace: gcp
      baseUri: "https://compute.googleapis.com/compute/v1/projects/alphabet"
      authentication:
        type: bearer
        token: "$secrets.gcp_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: gcp-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://alphabet.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://alphabet.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST

Deploys a new Cloud Run revision, splits traffic between old and new versions, monitors error rates, and rolls back if thresholds are exceeded.

naftiko: "0.5"
info:
  label: "Cloud Run Blue-Green Deployment Pipeline"
  description: "Deploys a new Cloud Run revision, splits traffic between old and new versions, monitors error rates, and rolls back if thresholds are exceeded."
  tags:
    - containers
    - google-cloud-platform
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: cloudrun-bg
      port: 8080
      tools:
        - name: run-blue-green-deploy
          description: "Execute a blue-green deployment on Cloud Run with traffic splitting and monitoring."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The Cloud Run region."
            - name: service_name
              in: body
              type: string
              description: "The Cloud Run service."
            - name: new_image
              in: body
              type: string
              description: "Container image URI for new revision."
            - name: traffic_split
              in: body
              type: number
              description: "Percentage of traffic for new revision."
          steps:
            - name: deploy-revision
              type: call
              call: "cloudrun.update-service"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                service_name: "{{service_name}}"
                image: "{{new_image}}"
            - name: split-traffic
              type: call
              call: "cloudrun.update-service"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                service_name: "{{service_name}}"
                trafficSplit: "{{traffic_split}}"
            - name: check-errors
              type: call
              call: "cloudmonitoring.list-timeseries"
              with:
                project_id: "{{project_id}}"
                filter: "resource.type=cloud_run_revision AND metric.type=run.googleapis.com/request_count"
            - name: finalize
              type: call
              call: "cloudrun.update-service"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                service_name: "{{service_name}}"
                trafficSplit: "100"
  consumes:
    - type: http
      namespace: cloudrun
      baseUri: "https://run.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: services
          path: "/projects/{{project_id}}/locations/{{region}}/services/{{service_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: service_name
              in: path
          operations:
            - name: get-service
              method: GET
            - name: update-service
              method: PATCH
    - type: http
      namespace: cloudmonitoring
      baseUri: "https://monitoring.googleapis.com/v3"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: timeseries
          path: "/projects/{{project_id}}/timeSeries"
          inputParameters:
            - name: project_id
              in: path
            - name: filter
              in: query
          operations:
            - name: list-timeseries
              method: GET

Checks the status and revision details of a Cloud Run service including traffic allocation, container image, and readiness conditions.

naftiko: "0.5"
info:
  label: "Cloud Run Service Status"
  description: "Checks the status and revision details of a Cloud Run service including traffic allocation, container image, and readiness conditions."
  tags:
    - cloud
    - infrastructure
    - cloud-run
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: cloudrun-ops
      port: 8080
      tools:
        - name: get-service-status
          description: "Retrieve Cloud Run service details by name and region. Returns latest revision, traffic split, and readiness."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The Cloud Run region (e.g. us-central1)."
            - name: service_name
              in: body
              type: string
              description: "The Cloud Run service name."
          call: "cloudrun.get-service"
          with:
            project_id: "{{project_id}}"
            region: "{{region}}"
            service_name: "{{service_name}}"
          outputParameters:
            - name: latest_revision
              type: string
              mapping: "$.status.latestReadyRevisionName"
            - name: url
              type: string
              mapping: "$.status.url"
            - name: ready
              type: boolean
              mapping: "$.status.conditions[0].status"
  consumes:
    - type: http
      namespace: cloudrun
      baseUri: "https://run.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: services
          path: "/projects/{{project_id}}/locations/{{region}}/services/{{service_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: service_name
              in: path
          operations:
            - name: get-service
              method: GET

Scans cloud infrastructure for misconfigurations, prioritizes findings, and creates remediation tasks.

naftiko: "0.5"
info:
  label: "Cloud Security Posture Assessment"
  description: "Scans cloud infrastructure for misconfigurations, prioritizes findings, and creates remediation tasks."
  tags:
    - security
    - gcp
    - jira
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: cloud_security_posture_assessment
          description: "Orchestrate cloud security posture assessment workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-gcp
              type: call
              call: "gcp.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-gcp.result}}"
            - name: create-servicenow
              type: call
              call: "servicenow.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Cloud Security Posture Assessment step 3 complete."

  consumes:
    - type: http
      namespace: gcp
      baseUri: "https://compute.googleapis.com/compute/v1/projects/alphabet"
      authentication:
        type: bearer
        token: "$secrets.gcp_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: gcp-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://alphabet.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://alphabet.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST

Retrieves the status and configuration of a Cloud Spanner instance.

naftiko: "0.5"
info:
  label: "Cloud Spanner Instance Status"
  description: "Retrieves the status and configuration of a Cloud Spanner instance."
  tags:
    - databases
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: spanner
      port: 8080
      tools:
        - name: get-instance
          description: "Get the status and configuration details of a Cloud Spanner instance."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: instance_id
              in: body
              type: string
              description: "The Spanner instance ID."
          call: "spanner.get-instance"
          with:
            project_id: "{{project_id}}"
            instance_id: "{{instance_id}}"
  consumes:
    - type: http
      namespace: spanner
      baseUri: "https://spanner.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: instances
          path: "/projects/{{project_id}}/instances/{{instance_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: instance_id
              in: path
          operations:
            - name: get-instance
              method: GET

Checks Cloud SQL instance health, triggers an on-demand backup, verifies backup completion, and sends a health report to the DBA team via Gmail.

naftiko: "0.5"
info:
  label: "Cloud SQL Backup and Health Pipeline"
  description: "Checks Cloud SQL instance health, triggers an on-demand backup, verifies backup completion, and sends a health report to the DBA team via Gmail."
  tags:
    - database
    - infrastructure
    - cloud-sql
    - gmail
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: cloudsql-ops
      port: 8080
      tools:
        - name: backup-and-report
          description: "Check Cloud SQL health, trigger backup, verify, and email report to DBA team."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: instance_name
              in: body
              type: string
              description: "The Cloud SQL instance name."
            - name: dba_email
              in: body
              type: string
              description: "DBA team email for health reports."
          steps:
            - name: get-instance-health
              type: call
              call: "cloudsql.get-instance"
              with:
                project_id: "{{project_id}}"
                instance_name: "{{instance_name}}"
            - name: trigger-backup
              type: call
              call: "cloudsql.create-backup"
              with:
                project_id: "{{project_id}}"
                instance_name: "{{instance_name}}"
            - name: send-report
              type: call
              call: "gmail.send-message"
              with:
                to: "{{dba_email}}"
                subject: "Cloud SQL Health: {{instance_name}}"
                body: "Instance {{instance_name}} state: {{get-instance-health.state}}. Version: {{get-instance-health.databaseVersion}}. Backup initiated: {{trigger-backup.id}}."
  consumes:
    - type: http
      namespace: cloudsql
      baseUri: "https://sqladmin.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: instances
          path: "/projects/{{project_id}}/instances/{{instance_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: instance_name
              in: path
          operations:
            - name: get-instance
              method: GET
        - name: backups
          path: "/projects/{{project_id}}/instances/{{instance_name}}/backupRuns"
          inputParameters:
            - name: project_id
              in: path
            - name: instance_name
              in: path
          operations:
            - name: create-backup
              method: POST
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: messages
          path: "/users/me/messages/send"
          operations:
            - name: send-message
              method: POST

Scans Cloud Storage buckets for lifecycle policy compliance, logs violations to BigQuery, and alerts the security team in Slack.

naftiko: "0.5"
info:
  label: "Cloud Storage Lifecycle Audit Pipeline"
  description: "Scans Cloud Storage buckets for lifecycle policy compliance, logs violations to BigQuery, and alerts the security team in Slack."
  tags:
    - security
    - compliance
    - gcp-cloud-storage
    - bigquery
capability:
  exposes:
    - type: mcp
      namespace: storage-audit
      port: 8080
      tools:
        - name: run-lifecycle-audit
          description: "Audit Cloud Storage bucket lifecycle policies and report violations."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: bucket_name
              in: body
              type: string
              description: "The bucket to audit."
            - name: dataset
              in: body
              type: string
              description: "BigQuery dataset for violations."
            - name: table
              in: body
              type: string
              description: "BigQuery table for violations."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for alerts."
          steps:
            - name: get-bucket-config
              type: call
              call: "cloudstorage.get-bucket"
              with:
                bucket_name: "{{bucket_name}}"
            - name: log-violation
              type: call
              call: "bigquery.insert-rows"
              with:
                project_id: "{{project_id}}"
                dataset: "{{dataset}}"
                table: "{{table}}"
                rows: "{{get-bucket-config.lifecycle}}"
            - name: alert-team
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Lifecycle audit for {{bucket_name}}: {{get-bucket-config.lifecycle.rule}}"
  consumes:
    - type: http
      namespace: cloudstorage
      baseUri: "https://storage.googleapis.com/storage/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: buckets
          path: "/b/{{bucket_name}}"
          inputParameters:
            - name: bucket_name
              in: path
          operations:
            - name: get-bucket
              method: GET
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: tabledata
          path: "/projects/{{project_id}}/datasets/{{dataset}}/tables/{{table}}/insertAll"
          inputParameters:
            - name: project_id
              in: path
            - name: dataset
              in: path
            - name: table
              in: path
          operations:
            - name: insert-rows
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: chat
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Collects audit events, validates against policies, generates compliance reports, and notifies auditors.

naftiko: "0.5"
info:
  label: "Compliance Audit Trail Pipeline"
  description: "Collects audit events, validates against policies, generates compliance reports, and notifies auditors."
  tags:
    - compliance
    - elasticsearch
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: compliance_audit_trail_pipeline
          description: "Orchestrate compliance audit trail pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-elasticsearch
              type: call
              call: "elasticsearch.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-elasticsearch.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Compliance Audit Trail Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://alphabet-es.com:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: elasticsearch-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://alphabet.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Runs a Security Command Center scan, exports findings to BigQuery, generates a compliance summary in Google Sheets, and emails the report to the compliance team.

naftiko: "0.5"
info:
  label: "Compliance Scan and Report Pipeline"
  description: "Runs a Security Command Center scan, exports findings to BigQuery, generates a compliance summary in Google Sheets, and emails the report to the compliance team."
  tags:
    - security
    - compliance
    - security-command-center
    - bigquery
    - google-sheets
    - gmail
capability:
  exposes:
    - type: mcp
      namespace: compliance-reporting
      port: 8080
      tools:
        - name: run-compliance-report
          description: "Scan via Security Command Center, store findings in BigQuery, create Sheets report, and email."
          inputParameters:
            - name: org_id
              in: body
              type: string
              description: "The GCP organization ID."
            - name: project_id
              in: body
              type: string
              description: "The GCP project for BigQuery."
            - name: bq_dataset
              in: body
              type: string
              description: "The BigQuery dataset for findings."
            - name: spreadsheet_id
              in: body
              type: string
              description: "The compliance report spreadsheet ID."
            - name: compliance_email
              in: body
              type: string
              description: "The compliance team email address."
          steps:
            - name: list-findings
              type: call
              call: "scc.list-findings"
              with:
                org_id: "{{org_id}}"
            - name: store-findings
              type: call
              call: "bigquery.insert-rows"
              with:
                project_id: "{{project_id}}"
                dataset_id: "{{bq_dataset}}"
                table_id: "scc_findings"
                rows: "{{list-findings.findings}}"
            - name: update-report
              type: call
              call: "sheets.update-values"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "ComplianceReport!A1"
                values: "{{list-findings.findings}}"
            - name: email-report
              type: call
              call: "gmail.send-message"
              with:
                to: "{{compliance_email}}"
                subject: "Compliance Scan Report"
                body: "Security Command Center scan complete. {{list-findings.totalSize}} findings. Report: https://docs.google.com/spreadsheets/d/{{spreadsheet_id}}."
  consumes:
    - type: http
      namespace: scc
      baseUri: "https://securitycenter.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: findings
          path: "/organizations/{{org_id}}/sources/-/findings"
          inputParameters:
            - name: org_id
              in: path
          operations:
            - name: list-findings
              method: GET
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: tabledata
          path: "/projects/{{project_id}}/datasets/{{dataset_id}}/tables/{{table_id}}/insertAll"
          inputParameters:
            - name: project_id
              in: path
            - name: dataset_id
              in: path
            - name: table_id
              in: path
          operations:
            - name: insert-rows
              method: POST
    - type: http
      namespace: sheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: values
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: update-values
              method: PUT
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: messages
          path: "/users/me/messages/send"
          operations:
            - name: send-message
              method: POST

Submits text to the Perspective API for toxicity scoring, checks against threshold, flags the content in a Firestore collection, and notifies moderators via Gmail.

naftiko: "0.5"
info:
  label: "Content Moderation Pipeline"
  description: "Submits text to the Perspective API for toxicity scoring, checks against threshold, flags the content in a Firestore collection, and notifies moderators via Gmail."
  tags:
    - ai
    - content-moderation
    - perspective-api
    - firebase
    - gmail
capability:
  exposes:
    - type: mcp
      namespace: content-moderation
      port: 8080
      tools:
        - name: moderate-content
          description: "Score text for toxicity, flag if above threshold, store in Firestore, and email moderators."
          inputParameters:
            - name: content_text
              in: body
              type: string
              description: "The text content to moderate."
            - name: content_id
              in: body
              type: string
              description: "A unique identifier for the content."
            - name: toxicity_threshold
              in: body
              type: number
              description: "Toxicity score threshold (0.0-1.0)."
            - name: moderator_email
              in: body
              type: string
              description: "Email address of the content moderator."
            - name: project_id
              in: body
              type: string
              description: "The Firebase project ID."
          steps:
            - name: score-toxicity
              type: call
              call: "perspective.analyze-comment"
              with:
                text: "{{content_text}}"
            - name: flag-content
              type: call
              call: "firestore.create-document"
              with:
                project_id: "{{project_id}}"
                collection: "flagged_content"
                document_id: "{{content_id}}"
                fields: "{\"text\": \"{{content_text}}\", \"toxicity\": \"{{score-toxicity.attributeScores.TOXICITY.summaryScore.value}}\"}"
            - name: notify-moderator
              type: call
              call: "gmail.send-message"
              with:
                to: "{{moderator_email}}"
                subject: "Content flagged: {{content_id}}"
                body: "Content ID {{content_id}} scored {{score-toxicity.attributeScores.TOXICITY.summaryScore.value}} toxicity. Review at dashboard."
  consumes:
    - type: http
      namespace: perspective
      baseUri: "https://commentanalyzer.googleapis.com/v1alpha1"
      authentication:
        type: apiKey
        key: "$secrets.perspective_api_key"
        in: query
        name: key
      resources:
        - name: comments
          path: "/comments:analyze"
          operations:
            - name: analyze-comment
              method: POST
    - type: http
      namespace: firestore
      baseUri: "https://firestore.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.firebase_token"
      resources:
        - name: documents
          path: "/projects/{{project_id}}/databases/(default)/documents/{{collection}}/{{document_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: collection
              in: path
            - name: document_id
              in: path
          operations:
            - name: create-document
              method: PATCH
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: messages
          path: "/users/me/messages/send"
          operations:
            - name: send-message
              method: POST

Tracks spending against budgets, forecasts overruns, creates alerts, and notifies finance leaders.

naftiko: "0.5"
info:
  label: "Cost Center Budget Tracking Pipeline"
  description: "Tracks spending against budgets, forecasts overruns, creates alerts, and notifies finance leaders."
  tags:
    - finance
    - snowflake
    - powerbi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: cost_center_budget_tracking
          description: "Orchestrate cost center budget tracking pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-powerbi
              type: call
              call: "powerbi.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Cost Center Budget Tracking Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://alphabet.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Aggregates customer data from multiple sources, deduplicates, enriches profiles, and syncs to CRM.

naftiko: "0.5"
info:
  label: "Customer 360 Data Sync Pipeline"
  description: "Aggregates customer data from multiple sources, deduplicates, enriches profiles, and syncs to CRM."
  tags:
    - data
    - snowflake
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: data
      port: 8080
      tools:
        - name: customer_360_data_sync_pipeline
          description: "Orchestrate customer 360 data sync pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-salesforce
              type: call
              call: "salesforce.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Customer 360 Data Sync Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://alphabet.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://alphabet.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Audits data lake access patterns, enforces retention policies, and publishes compliance reports.

naftiko: "0.5"
info:
  label: "Data Lake Governance Pipeline"
  description: "Audits data lake access patterns, enforces retention policies, and publishes compliance reports."
  tags:
    - data-governance
    - bigquery
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: data-governance
      port: 8080
      tools:
        - name: data_lake_governance_pipeline
          description: "Orchestrate data lake governance pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-bigquery
              type: call
              call: "bigquery.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-bigquery.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Data Lake Governance Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bigquery-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://alphabet.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Extracts data from Cloud Storage, transforms it via a Dataflow template job, loads results into BigQuery, and notifies the data team in Google Chat.

naftiko: "0.5"
info:
  label: "Data Pipeline ETL Orchestration"
  description: "Extracts data from Cloud Storage, transforms it via a Dataflow template job, loads results into BigQuery, and notifies the data team in Google Chat."
  tags:
    - data
    - etl
    - google-cloud-dataflow
    - bigquery
    - gcp-cloud-storage
capability:
  exposes:
    - type: mcp
      namespace: data-etl
      port: 8080
      tools:
        - name: run-etl-pipeline
          description: "Orchestrate an ETL pipeline: extract from GCS, transform via Dataflow, load to BigQuery, and notify."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The Dataflow region."
            - name: source_bucket
              in: body
              type: string
              description: "The GCS bucket containing source data."
            - name: source_path
              in: body
              type: string
              description: "The object path prefix in the source bucket."
            - name: bq_dataset
              in: body
              type: string
              description: "The target BigQuery dataset."
            - name: bq_table
              in: body
              type: string
              description: "The target BigQuery table."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space for notifications."
          steps:
            - name: list-source-objects
              type: call
              call: "cloudstorage.list-objects"
              with:
                bucket_name: "{{source_bucket}}"
                prefix: "{{source_path}}"
            - name: launch-dataflow
              type: call
              call: "dataflow.create-job-from-template"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                input_path: "gs://{{source_bucket}}/{{source_path}}"
                output_table: "{{project_id}}:{{bq_dataset}}.{{bq_table}}"
            - name: check-job
              type: call
              call: "dataflow.get-job"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                job_id: "{{launch-dataflow.job.id}}"
            - name: notify-team
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "ETL pipeline complete. Job {{launch-dataflow.job.id}} status: {{check-job.currentState}}. Data loaded to {{bq_dataset}}.{{bq_table}}."
  consumes:
    - type: http
      namespace: cloudstorage
      baseUri: "https://storage.googleapis.com/storage/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: objects
          path: "/b/{{bucket_name}}/o"
          inputParameters:
            - name: bucket_name
              in: path
            - name: prefix
              in: query
          operations:
            - name: list-objects
              method: GET
    - type: http
      namespace: dataflow
      baseUri: "https://dataflow.googleapis.com/v1b3"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: templates
          path: "/projects/{{project_id}}/locations/{{region}}/templates:launch"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
          operations:
            - name: create-job-from-template
              method: POST
        - name: jobs
          path: "/projects/{{project_id}}/locations/{{region}}/jobs/{{job_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: job_id
              in: path
          operations:
            - name: get-job
              method: GET
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Runs data quality checks, scores datasets, creates remediation tickets, and publishes scorecards.

naftiko: "0.5"
info:
  label: "Data Quality Monitoring Pipeline"
  description: "Runs data quality checks, scores datasets, creates remediation tickets, and publishes scorecards."
  tags:
    - data-quality
    - snowflake
    - jira
    - grafana
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: data_quality_monitoring_pipeline
          description: "Orchestrate data quality monitoring pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-grafana
              type: call
              call: "grafana.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Data Quality Monitoring Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://alphabet.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://alphabet.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://alphabet-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST

Submits a Spark job to a Dataproc cluster, monitors execution, exports results to Cloud Storage, and notifies the data team via Google Chat.

naftiko: "0.5"
info:
  label: "Dataproc Spark Job Orchestration"
  description: "Submits a Spark job to a Dataproc cluster, monitors execution, exports results to Cloud Storage, and notifies the data team via Google Chat."
  tags:
    - data
    - analytics
    - dataproc
    - apache-spark
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: dataproc-jobs
      port: 8080
      tools:
        - name: run-spark-job
          description: "Submit a Spark job to Dataproc, monitor, export results, and notify team."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The Dataproc region."
            - name: cluster_name
              in: body
              type: string
              description: "The Dataproc cluster name."
            - name: main_jar_uri
              in: body
              type: string
              description: "GCS URI of the Spark job JAR."
            - name: output_bucket
              in: body
              type: string
              description: "GCS bucket for job output."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space for job notifications."
          steps:
            - name: submit-job
              type: call
              call: "dataproc.submit-job"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                cluster_name: "{{cluster_name}}"
                main_jar_uri: "{{main_jar_uri}}"
                output_uri: "gs://{{output_bucket}}/spark-output"
            - name: check-job-status
              type: call
              call: "dataproc.get-job"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                job_id: "{{submit-job.reference.jobId}}"
            - name: notify-team
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Spark job {{submit-job.reference.jobId}} on cluster {{cluster_name}}: status {{check-job-status.status.state}}. Output: gs://{{output_bucket}}/spark-output."
  consumes:
    - type: http
      namespace: dataproc
      baseUri: "https://dataproc.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: jobs
          path: "/projects/{{project_id}}/regions/{{region}}/jobs:submit"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
          operations:
            - name: submit-job
              method: POST
        - name: job-status
          path: "/projects/{{project_id}}/regions/{{region}}/jobs/{{job_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: job_id
              in: path
          operations:
            - name: get-job
              method: GET
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Runs test cases against a Dialogflow CX agent, collects results, logs failures to Jira, and sends a summary to Google Chat.

naftiko: "0.5"
info:
  label: "Dialogflow CX Agent Test Pipeline"
  description: "Runs test cases against a Dialogflow CX agent, collects results, logs failures to Jira, and sends a summary to Google Chat."
  tags:
    - ai
    - google-dialogflow
    - jira
    - google-workspace
capability:
  exposes:
    - type: mcp
      namespace: dfcx-test
      port: 8080
      tools:
        - name: run-agent-tests
          description: "Execute Dialogflow CX test cases and report failures."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "GCP project ID."
            - name: region
              in: body
              type: string
              description: "Dialogflow region."
            - name: agent_id
              in: body
              type: string
              description: "Dialogflow CX agent ID."
            - name: jira_domain
              in: body
              type: string
              description: "Jira domain."
            - name: jira_project
              in: body
              type: string
              description: "Jira project key."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space."
          steps:
            - name: run-tests
              type: call
              call: "dialogflowcx.batch-run-tests"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                agent_id: "{{agent_id}}"
            - name: log-failures
              type: call
              call: "jira.create-issue"
              with:
                project: "{{jira_project}}"
                summary: "Dialogflow CX test failures"
                description: "{{run-tests.results}}"
            - name: notify
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Dialogflow CX test run complete. Failures logged to Jira."
  consumes:
    - type: http
      namespace: dialogflowcx
      baseUri: "https://dialogflow.googleapis.com/v3"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: testCases
          path: "/projects/{{project_id}}/locations/{{region}}/agents/{{agent_id}}/testCases:batchRun"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: agent_id
              in: path
          operations:
            - name: batch-run-tests
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://{{jira_domain}}.atlassian.net/rest/api/3"
      authentication:
        type: basic
        token: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Sends a user utterance to a Dialogflow CX agent and returns the matched intent, confidence score, and fulfillment text. Used for chatbot testing.

naftiko: "0.5"
info:
  label: "Dialogflow Intent Resolution"
  description: "Sends a user utterance to a Dialogflow CX agent and returns the matched intent, confidence score, and fulfillment text. Used for chatbot testing."
  tags:
    - ai
    - conversational-ai
    - google-dialogflow
capability:
  exposes:
    - type: mcp
      namespace: dialogflow-testing
      port: 8080
      tools:
        - name: detect-intent
          description: "Send a text query to Dialogflow CX and return the matched intent and response."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: agent_id
              in: body
              type: string
              description: "The Dialogflow CX agent ID."
            - name: session_id
              in: body
              type: string
              description: "A unique session identifier."
            - name: query_text
              in: body
              type: string
              description: "The user utterance to classify."
          call: "dialogflow.detect-intent"
          with:
            project_id: "{{project_id}}"
            agent_id: "{{agent_id}}"
            session_id: "{{session_id}}"
            query_text: "{{query_text}}"
          outputParameters:
            - name: matched_intent
              type: string
              mapping: "$.queryResult.intent.displayName"
            - name: confidence
              type: number
              mapping: "$.queryResult.intentDetectionConfidence"
            - name: fulfillment_text
              type: string
              mapping: "$.queryResult.responseMessages[0].text.text[0]"
  consumes:
    - type: http
      namespace: dialogflow
      baseUri: "https://dialogflow.googleapis.com/v3"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: sessions
          path: "/projects/{{project_id}}/locations/global/agents/{{agent_id}}/sessions/{{session_id}}:detectIntent"
          inputParameters:
            - name: project_id
              in: path
            - name: agent_id
              in: path
            - name: session_id
              in: path
          operations:
            - name: detect-intent
              method: POST

Provisions new employee accounts, assigns training, creates IT tickets, and notifies managers.

naftiko: "0.5"
info:
  label: "Employee Onboarding Automation Pipeline"
  description: "Provisions new employee accounts, assigns training, creates IT tickets, and notifies managers."
  tags:
    - hr
    - workday
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: employee_onboarding_automation
          description: "Orchestrate employee onboarding automation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-gcp
              type: call
              call: "gcp.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-gcp.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Employee Onboarding Automation Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: gcp
      baseUri: "https://compute.googleapis.com/compute/v1/projects/alphabet"
      authentication:
        type: bearer
        token: "$secrets.gcp_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: gcp-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://alphabet.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Publishes an event to a Pub/Sub topic, triggers a Cloud Function subscriber, logs the event to BigQuery, and confirms delivery via Google Chat.

naftiko: "0.5"
info:
  label: "Event-Driven Notification Pipeline"
  description: "Publishes an event to a Pub/Sub topic, triggers a Cloud Function subscriber, logs the event to BigQuery, and confirms delivery via Google Chat."
  tags:
    - messaging
    - infrastructure
    - pubsub
    - cloud-functions
    - bigquery
capability:
  exposes:
    - type: mcp
      namespace: event-notifications
      port: 8080
      tools:
        - name: publish-and-track-event
          description: "Publish to Pub/Sub, verify Cloud Function processing, log to BigQuery, and confirm via Chat."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: topic_id
              in: body
              type: string
              description: "The Pub/Sub topic ID."
            - name: message_data
              in: body
              type: string
              description: "The base64-encoded message data."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space for delivery confirmations."
          steps:
            - name: publish-event
              type: call
              call: "pubsub.publish"
              with:
                project_id: "{{project_id}}"
                topic_id: "{{topic_id}}"
                message_data: "{{message_data}}"
            - name: log-event
              type: call
              call: "bigquery.insert-rows"
              with:
                project_id: "{{project_id}}"
                dataset_id: "event_logs"
                table_id: "pubsub_events"
                rows: "[{\"topic\": \"{{topic_id}}\", \"message_id\": \"{{publish-event.messageIds[0]}}\"}]"
            - name: confirm-delivery
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Event published to {{topic_id}}. Message ID: {{publish-event.messageIds[0]}}. Logged to event_logs.pubsub_events."
  consumes:
    - type: http
      namespace: pubsub
      baseUri: "https://pubsub.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: topics
          path: "/projects/{{project_id}}/topics/{{topic_id}}:publish"
          inputParameters:
            - name: project_id
              in: path
            - name: topic_id
              in: path
          operations:
            - name: publish
              method: POST
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: tabledata
          path: "/projects/{{project_id}}/datasets/{{dataset_id}}/tables/{{table_id}}/insertAll"
          inputParameters:
            - name: project_id
              in: path
            - name: dataset_id
              in: path
            - name: table_id
              in: path
          operations:
            - name: insert-rows
              method: POST
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Updates a Firebase Remote Config parameter for a feature flag, publishes a Pub/Sub event to notify downstream services, and posts the rollout status to Google Chat.

naftiko: "0.5"
info:
  label: "Feature Flag Rollout Pipeline"
  description: "Updates a Firebase Remote Config parameter for a feature flag, publishes a Pub/Sub event to notify downstream services, and posts the rollout status to Google Chat."
  tags:
    - mobile
    - firebase
    - feature-flags
    - pubsub
capability:
  exposes:
    - type: mcp
      namespace: feature-rollout
      port: 8080
      tools:
        - name: rollout-feature-flag
          description: "Update a Firebase Remote Config flag, publish event to Pub/Sub, and notify via Chat."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The Firebase project ID."
            - name: parameter_key
              in: body
              type: string
              description: "The Remote Config parameter key to update."
            - name: parameter_value
              in: body
              type: string
              description: "The new value for the parameter."
            - name: topic_id
              in: body
              type: string
              description: "Pub/Sub topic for feature flag events."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space for rollout notifications."
          steps:
            - name: get-current-config
              type: call
              call: "firebase.get-remote-config"
              with:
                project_id: "{{project_id}}"
            - name: update-config
              type: call
              call: "firebase.update-remote-config"
              with:
                project_id: "{{project_id}}"
                parameter_key: "{{parameter_key}}"
                parameter_value: "{{parameter_value}}"
            - name: publish-event
              type: call
              call: "pubsub.publish"
              with:
                project_id: "{{project_id}}"
                topic_id: "{{topic_id}}"
                message_data: "{\"flag\": \"{{parameter_key}}\", \"value\": \"{{parameter_value}}\"}"
            - name: notify-team
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Feature flag {{parameter_key}} updated to {{parameter_value}}. Config version: {{update-config.version.versionNumber}}."
  consumes:
    - type: http
      namespace: firebase
      baseUri: "https://firebaseremoteconfig.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.firebase_token"
      resources:
        - name: remote-config
          path: "/projects/{{project_id}}/remoteConfig"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-remote-config
              method: GET
            - name: update-remote-config
              method: PUT
    - type: http
      namespace: pubsub
      baseUri: "https://pubsub.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: topics
          path: "/projects/{{project_id}}/topics/{{topic_id}}:publish"
          inputParameters:
            - name: project_id
              in: path
            - name: topic_id
              in: path
          operations:
            - name: publish
              method: POST
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Fetches the current Firebase Remote Config template for a project.

naftiko: "0.5"
info:
  label: "Firebase Remote Config Fetch"
  description: "Fetches the current Firebase Remote Config template for a project."
  tags:
    - mobile
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: firebase
      port: 8080
      tools:
        - name: get-config
          description: "Fetch the current Remote Config template for a Firebase project."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The Firebase project ID."
          call: "firebase.get-config"
          with:
            project_id: "{{project_id}}"
  consumes:
    - type: http
      namespace: firebase
      baseUri: "https://firebaseremoteconfig.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: remoteConfig
          path: "/projects/{{project_id}}/remoteConfig"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-config
              method: GET

Sends a prompt to the Gemini generative model and returns the generated text response. Used for content generation, summarization, and Q&A.

naftiko: "0.5"
info:
  label: "Gemini Text Generation"
  description: "Sends a prompt to the Gemini generative model and returns the generated text response. Used for content generation, summarization, and Q&A."
  tags:
    - ai
    - machine-learning
    - gemini
    - generative-ai
capability:
  exposes:
    - type: mcp
      namespace: gemini-gen
      port: 8080
      tools:
        - name: generate-text
          description: "Generate text via Gemini model given a prompt and optional temperature setting."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: prompt
              in: body
              type: string
              description: "The text prompt for generation."
            - name: temperature
              in: body
              type: number
              description: "Sampling temperature between 0.0 and 1.0."
          call: "gemini.generate-content"
          with:
            project_id: "{{project_id}}"
            prompt: "{{prompt}}"
            temperature: "{{temperature}}"
  consumes:
    - type: http
      namespace: gemini
      baseUri: "https://generativelanguage.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: models
          path: "/projects/{{project_id}}/locations/us-central1/publishers/google/models/gemini-pro:generateContent"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: generate-content
              method: POST

On a GitHub pull request merge, triggers a Cloud Build, deploys the built image to GKE, runs Prometheus health checks, and updates the GitHub commit status.

naftiko: "0.5"
info:
  label: "GitHub PR to Cloud Build to GKE Pipeline"
  description: "On a GitHub pull request merge, triggers a Cloud Build, deploys the built image to GKE, runs Prometheus health checks, and updates the GitHub commit status."
  tags:
    - devops
    - ci-cd
    - github
    - cloud-build
    - gke
    - prometheus
capability:
  exposes:
    - type: mcp
      namespace: github-deploy-pipeline
      port: 8080
      tools:
        - name: deploy-on-merge
          description: "Build via Cloud Build, deploy to GKE, verify with Prometheus, update GitHub status."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: github_repo
              in: body
              type: string
              description: "The GitHub repository (owner/repo)."
            - name: commit_sha
              in: body
              type: string
              description: "The merged commit SHA."
            - name: image_name
              in: body
              type: string
              description: "The container image name."
            - name: cluster_name
              in: body
              type: string
              description: "The GKE cluster name."
            - name: zone
              in: body
              type: string
              description: "The GKE cluster zone."
            - name: deployment_name
              in: body
              type: string
              description: "The Kubernetes deployment name."
            - name: prometheus_endpoint
              in: body
              type: string
              description: "The Prometheus query endpoint URL."
          steps:
            - name: trigger-build
              type: call
              call: "cloudbuild.create-build"
              with:
                project_id: "{{project_id}}"
                commit_sha: "{{commit_sha}}"
                image_name: "{{image_name}}"
            - name: deploy-to-gke
              type: call
              call: "gke.update-deployment-image"
              with:
                project_id: "{{project_id}}"
                zone: "{{zone}}"
                cluster_name: "{{cluster_name}}"
                deployment_name: "{{deployment_name}}"
                image: "{{trigger-build.results.images[0].name}}"
            - name: health-check
              type: call
              call: "prometheus.query"
              with:
                endpoint: "{{prometheus_endpoint}}"
                query: "up{job=\"{{deployment_name}}\"}"
            - name: update-github-status
              type: call
              call: "github.create-commit-status"
              with:
                repo: "{{github_repo}}"
                sha: "{{commit_sha}}"
                state: "success"
                description: "Deployed to {{cluster_name}}. Health: {{health_check.data.result[0].value[1]}}"
  consumes:
    - type: http
      namespace: cloudbuild
      baseUri: "https://cloudbuild.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: builds
          path: "/projects/{{project_id}}/builds"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: create-build
              method: POST
    - type: http
      namespace: gke
      baseUri: "https://container.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: deployments
          path: "/projects/{{project_id}}/zones/{{zone}}/clusters/{{cluster_name}}/deployments/{{deployment_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: zone
              in: path
            - name: cluster_name
              in: path
            - name: deployment_name
              in: path
          operations:
            - name: update-deployment-image
              method: PATCH
    - type: http
      namespace: prometheus
      baseUri: "{{prometheus_endpoint}}"
      authentication:
        type: bearer
        token: "$secrets.prometheus_token"
      resources:
        - name: query
          path: "/api/v1/query"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: query
              method: GET
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: statuses
          path: "/repos/{{repo}}/statuses/{{sha}}"
          inputParameters:
            - name: repo
              in: path
            - name: sha
              in: path
          operations:
            - name: create-commit-status
              method: POST

Retrieves the node pool configuration and status for a GKE cluster including node count, machine type, and autoscaling settings.

naftiko: "0.5"
info:
  label: "GKE Cluster Node Pool Status"
  description: "Retrieves the node pool configuration and status for a GKE cluster including node count, machine type, and autoscaling settings."
  tags:
    - infrastructure
    - kubernetes
    - gke
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: gke-ops
      port: 8080
      tools:
        - name: get-nodepool-status
          description: "Fetch GKE node pool details by cluster name, zone, and node pool name."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: zone
              in: body
              type: string
              description: "The GKE cluster zone."
            - name: cluster_name
              in: body
              type: string
              description: "The GKE cluster name."
            - name: nodepool_name
              in: body
              type: string
              description: "The node pool name."
          call: "gke.get-nodepool"
          with:
            project_id: "{{project_id}}"
            zone: "{{zone}}"
            cluster_name: "{{cluster_name}}"
            nodepool_name: "{{nodepool_name}}"
          outputParameters:
            - name: node_count
              type: number
              mapping: "$.initialNodeCount"
            - name: machine_type
              type: string
              mapping: "$.config.machineType"
            - name: autoscaling_enabled
              type: boolean
              mapping: "$.autoscaling.enabled"
  consumes:
    - type: http
      namespace: gke
      baseUri: "https://container.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: nodepools
          path: "/projects/{{project_id}}/zones/{{zone}}/clusters/{{cluster_name}}/nodePools/{{nodepool_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: zone
              in: path
            - name: cluster_name
              in: path
            - name: nodepool_name
              in: path
          operations:
            - name: get-nodepool
              method: GET

Builds a container image via Cloud Build, pushes to Artifact Registry, updates a GKE deployment manifest, and triggers a rolling update with Slack notification.

naftiko: "0.5"
info:
  label: "GKE Deployment Rollout Pipeline"
  description: "Builds a container image via Cloud Build, pushes to Artifact Registry, updates a GKE deployment manifest, and triggers a rolling update with Slack notification."
  tags:
    - devops
    - ci-cd
    - gke
    - cloud-build
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: gke-deployment
      port: 8080
      tools:
        - name: deploy-to-gke
          description: "Build, push, and deploy a container to GKE with Cloud Build and Artifact Registry."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: repo_source
              in: body
              type: string
              description: "The Cloud Source Repository name."
            - name: branch
              in: body
              type: string
              description: "The branch to build from."
            - name: image_name
              in: body
              type: string
              description: "The container image name."
            - name: cluster_name
              in: body
              type: string
              description: "The GKE cluster name."
            - name: zone
              in: body
              type: string
              description: "The GKE cluster zone."
            - name: deployment_name
              in: body
              type: string
              description: "The Kubernetes deployment name."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space for deploy notifications."
          steps:
            - name: trigger-build
              type: call
              call: "cloudbuild.create-build"
              with:
                project_id: "{{project_id}}"
                repo_source: "{{repo_source}}"
                branch: "{{branch}}"
                image_name: "{{image_name}}"
            - name: check-build
              type: call
              call: "cloudbuild.get-build"
              with:
                project_id: "{{project_id}}"
                build_id: "{{trigger-build.metadata.build.id}}"
            - name: update-deployment
              type: call
              call: "gke.update-deployment-image"
              with:
                project_id: "{{project_id}}"
                zone: "{{zone}}"
                cluster_name: "{{cluster_name}}"
                deployment_name: "{{deployment_name}}"
                image: "{{check-build.results.images[0].name}}"
            - name: notify-deploy
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Deployed {{image_name}} to {{cluster_name}}/{{deployment_name}}. Build: {{trigger-build.metadata.build.id}}. Image: {{check-build.results.images[0].name}}."
  consumes:
    - type: http
      namespace: cloudbuild
      baseUri: "https://cloudbuild.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: builds
          path: "/projects/{{project_id}}/builds"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: create-build
              method: POST
        - name: build-status
          path: "/projects/{{project_id}}/builds/{{build_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: build_id
              in: path
          operations:
            - name: get-build
              method: GET
    - type: http
      namespace: gke
      baseUri: "https://container.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: deployments
          path: "/projects/{{project_id}}/zones/{{zone}}/clusters/{{cluster_name}}/deployments/{{deployment_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: zone
              in: path
            - name: cluster_name
              in: path
            - name: deployment_name
              in: path
          operations:
            - name: update-deployment-image
              method: PATCH
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Collects resource utilization from Cloud Monitoring, adjusts HPA thresholds on GKE, validates the change, and posts results to Microsoft Teams.

naftiko: "0.5"
info:
  label: "GKE Pod Autoscaler Tuning Pipeline"
  description: "Collects resource utilization from Cloud Monitoring, adjusts HPA thresholds on GKE, validates the change, and posts results to Microsoft Teams."
  tags:
    - containers
    - monitoring
    - google-cloud-platform
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: gke-autoscale
      port: 8080
      tools:
        - name: run-autoscaler-tuning
          description: "Tune GKE pod autoscaler based on monitoring metrics and notify via Teams."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: zone
              in: body
              type: string
              description: "The cluster zone."
            - name: cluster_name
              in: body
              type: string
              description: "The GKE cluster name."
            - name: team_id
              in: body
              type: string
              description: "Microsoft Teams team ID."
            - name: channel_id
              in: body
              type: string
              description: "Teams channel ID."
          steps:
            - name: get-metrics
              type: call
              call: "cloudmonitoring.list-timeseries"
              with:
                project_id: "{{project_id}}"
                filter: "resource.type=k8s_container"
            - name: get-cluster-info
              type: call
              call: "gke.get-cluster"
              with:
                project_id: "{{project_id}}"
                zone: "{{zone}}"
                cluster_name: "{{cluster_name}}"
            - name: update-hpa
              type: call
              call: "gke.update-cluster"
              with:
                project_id: "{{project_id}}"
                zone: "{{zone}}"
                cluster_name: "{{cluster_name}}"
                metrics: "{{get-metrics}}"
            - name: notify-team
              type: call
              call: "teams.send-message"
              with:
                team_id: "{{team_id}}"
                channel_id: "{{channel_id}}"
                text: "HPA tuning for {{cluster_name}}: updated based on utilization metrics."
  consumes:
    - type: http
      namespace: cloudmonitoring
      baseUri: "https://monitoring.googleapis.com/v3"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: timeseries
          path: "/projects/{{project_id}}/timeSeries"
          inputParameters:
            - name: project_id
              in: path
            - name: filter
              in: query
          operations:
            - name: list-timeseries
              method: GET
    - type: http
      namespace: gke
      baseUri: "https://container.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: clusters
          path: "/projects/{{project_id}}/locations/{{zone}}/clusters/{{cluster_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: zone
              in: path
            - name: cluster_name
              in: path
          operations:
            - name: get-cluster
              method: GET
            - name: update-cluster
              method: PUT
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates a Gmail label and associates a filter rule to automatically categorize incoming messages matching a specified query.

naftiko: "0.5"
info:
  label: "Gmail Label and Filter Management"
  description: "Creates a Gmail label and associates a filter rule to automatically categorize incoming messages matching a specified query."
  tags:
    - productivity
    - gmail
    - automation
capability:
  exposes:
    - type: mcp
      namespace: gmail-automation
      port: 8080
      tools:
        - name: create-label-and-filter
          description: "Create a Gmail label and a matching filter to auto-categorize emails."
          inputParameters:
            - name: label_name
              in: body
              type: string
              description: "The new label name."
            - name: filter_query
              in: body
              type: string
              description: "The Gmail search query for the filter (e.g. from:noreply@example.com)."
          steps:
            - name: create-label
              type: call
              call: "gmail.create-label"
              with:
                name: "{{label_name}}"
            - name: create-filter
              type: call
              call: "gmail.create-filter"
              with:
                query: "{{filter_query}}"
                add_label_id: "{{create-label.id}}"
  consumes:
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: labels
          path: "/users/me/labels"
          operations:
            - name: create-label
              method: POST
        - name: filters
          path: "/users/me/settings/filters"
          operations:
            - name: create-filter
              method: POST

Pulls campaign performance from Google Ads, calculates optimal budget distribution, updates campaigns, and logs changes to Google Sheets.

naftiko: "0.5"
info:
  label: "Google Ads Budget Reallocation Pipeline"
  description: "Pulls campaign performance from Google Ads, calculates optimal budget distribution, updates campaigns, and logs changes to Google Sheets."
  tags:
    - marketing
    - google-ads
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: ads-budget-realloc
      port: 8080
      tools:
        - name: run-budget-reallocation
          description: "Optimize Google Ads campaign budgets based on performance data."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "Google Ads customer ID."
            - name: spreadsheet_id
              in: body
              type: string
              description: "Google Sheets spreadsheet ID."
            - name: range
              in: body
              type: string
              description: "Cell range."
          steps:
            - name: get-performance
              type: call
              call: "googleads.search-stream"
              with:
                customer_id: "{{customer_id}}"
                query: "SELECT campaign.id, metrics.cost_micros FROM campaign"
            - name: update-budgets
              type: call
              call: "googleads.search-stream"
              with:
                customer_id: "{{customer_id}}"
                query: "UPDATE campaign SET budget={{get-performance.optimal_budget}}"
            - name: log-changes
              type: call
              call: "googlesheets.append-values"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "{{range}}"
  consumes:
    - type: http
      namespace: googleads
      baseUri: "https://googleads.googleapis.com/v14"
      authentication:
        type: bearer
        token: "$secrets.google_ads_token"
      resources:
        - name: customers
          path: "/customers/{{customer_id}}/googleAds:searchStream"
          inputParameters:
            - name: customer_id
              in: path
          operations:
            - name: search-stream
              method: POST
    - type: http
      namespace: googlesheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: append-values
              method: POST

Fetches performance metrics for a Google Ads campaign including impressions, clicks, conversions, and cost. Used by marketing teams for daily reporting.

naftiko: "0.5"
info:
  label: "Google Ads Campaign Performance"
  description: "Fetches performance metrics for a Google Ads campaign including impressions, clicks, conversions, and cost. Used by marketing teams for daily reporting."
  tags:
    - advertising
    - marketing
    - google-ads
capability:
  exposes:
    - type: mcp
      namespace: ads-reporting
      port: 8080
      tools:
        - name: get-campaign-metrics
          description: "Retrieve Google Ads campaign performance by customer ID and campaign ID. Returns impressions, clicks, conversions, and spend."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The Google Ads customer ID (10-digit, no dashes)."
            - name: campaign_id
              in: body
              type: string
              description: "The campaign identifier."
          call: "googleads.query-campaign"
          with:
            customer_id: "{{customer_id}}"
            campaign_id: "{{campaign_id}}"
          outputParameters:
            - name: impressions
              type: number
              mapping: "$.results[0].metrics.impressions"
            - name: clicks
              type: number
              mapping: "$.results[0].metrics.clicks"
            - name: conversions
              type: number
              mapping: "$.results[0].metrics.conversions"
            - name: cost_micros
              type: number
              mapping: "$.results[0].metrics.costMicros"
  consumes:
    - type: http
      namespace: googleads
      baseUri: "https://googleads.googleapis.com/v16"
      authentication:
        type: bearer
        token: "$secrets.google_ads_token"
      inputParameters:
        - name: developer-token
          in: header
          value: "$secrets.google_ads_developer_token"
      resources:
        - name: campaigns
          path: "/customers/{{customer_id}}/googleAds:searchStream"
          inputParameters:
            - name: customer_id
              in: path
          operations:
            - name: query-campaign
              method: POST

Runs a Google Analytics Data API report for page views and sessions by page path over a date range. Used for content performance analysis.

naftiko: "0.5"
info:
  label: "Google Analytics Page Report"
  description: "Runs a Google Analytics Data API report for page views and sessions by page path over a date range. Used for content performance analysis."
  tags:
    - analytics
    - marketing
    - google-analytics
capability:
  exposes:
    - type: mcp
      namespace: ga-reporting
      port: 8080
      tools:
        - name: get-page-report
          description: "Run a GA4 report for page views and sessions grouped by page path."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "The GA4 property ID (numeric)."
            - name: start_date
              in: body
              type: string
              description: "Report start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Report end date in YYYY-MM-DD format."
          call: "ga4.run-report"
          with:
            property_id: "{{property_id}}"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
  consumes:
    - type: http
      namespace: ga4
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST

Retrieves details of a specific event from a Google Calendar.

naftiko: "0.5"
info:
  label: "Google Calendar Event Retrieval"
  description: "Retrieves details of a specific event from a Google Calendar."
  tags:
    - collaboration
    - google-workspace
capability:
  exposes:
    - type: mcp
      namespace: googlecalendar
      port: 8080
      tools:
        - name: get-event
          description: "Retrieve a specific calendar event by ID."
          inputParameters:
            - name: calendar_id
              in: body
              type: string
              description: "The Google Calendar ID."
            - name: event_id
              in: body
              type: string
              description: "The calendar event ID."
          call: "googlecalendar.get-event"
          with:
            calendar_id: "{{calendar_id}}"
            event_id: "{{event_id}}"
  consumes:
    - type: http
      namespace: googlecalendar
      baseUri: "https://www.googleapis.com/calendar/v3"
      authentication:
        type: bearer
        token: "$secrets.google_calendar_token"
      resources:
        - name: events
          path: "/calendars/{{calendar_id}}/events/{{event_id}}"
          inputParameters:
            - name: calendar_id
              in: path
            - name: event_id
              in: path
          operations:
            - name: get-event
              method: GET

Creates a Google Calendar event with attendees, generates a Google Meet link, and sends a custom invitation email via Gmail.

naftiko: "0.5"
info:
  label: "Google Calendar Meeting Scheduler"
  description: "Creates a Google Calendar event with attendees, generates a Google Meet link, and sends a custom invitation email via Gmail."
  tags:
    - productivity
    - google-workspace
    - google-calendar
    - gmail
capability:
  exposes:
    - type: mcp
      namespace: calendar-scheduling
      port: 8080
      tools:
        - name: schedule-meeting
          description: "Create a Calendar event with Meet link and send custom email invitation."
          inputParameters:
            - name: summary
              in: body
              type: string
              description: "The meeting title."
            - name: start_time
              in: body
              type: string
              description: "The start time in RFC 3339 format."
            - name: end_time
              in: body
              type: string
              description: "The end time in RFC 3339 format."
            - name: attendees
              in: body
              type: string
              description: "Comma-separated list of attendee email addresses."
            - name: custom_message
              in: body
              type: string
              description: "Custom message body for the invitation email."
          steps:
            - name: create-event
              type: call
              call: "calendar.create-event"
              with:
                summary: "{{summary}}"
                start_time: "{{start_time}}"
                end_time: "{{end_time}}"
                attendees: "{{attendees}}"
                conference_data: "hangoutsMeet"
            - name: send-invite
              type: call
              call: "gmail.send-message"
              with:
                to: "{{attendees}}"
                subject: "Meeting: {{summary}}"
                body: "{{custom_message}}\n\nJoin: {{create-event.hangoutLink}}\nWhen: {{start_time}} - {{end_time}}"
  consumes:
    - type: http
      namespace: calendar
      baseUri: "https://www.googleapis.com/calendar/v3"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: events
          path: "/calendars/primary/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: messages
          path: "/users/me/messages/send"
          operations:
            - name: send-message
              method: POST

Lists all members of a Google Chat space.

naftiko: "0.5"
info:
  label: "Google Chat Space Membership List"
  description: "Lists all members of a Google Chat space."
  tags:
    - communications
    - google-workspace
capability:
  exposes:
    - type: mcp
      namespace: googlechat
      port: 8080
      tools:
        - name: list-members
          description: "List all members in a Google Chat space."
          inputParameters:
            - name: space
              in: body
              type: string
              description: "The Google Chat space name."
          call: "googlechat.list-members"
          with:
            space: "{{space}}"
  consumes:
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: memberships
          path: "/spaces/{{space}}/members"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: list-members
              method: GET

Extracts structured data from a Google Doc, parses key-value pairs, appends them to a Google Sheet, and sends a confirmation via Gmail.

naftiko: "0.5"
info:
  label: "Google Docs to Sheets Data Sync"
  description: "Extracts structured data from a Google Doc, parses key-value pairs, appends them to a Google Sheet, and sends a confirmation via Gmail."
  tags:
    - productivity
    - google-docs
    - google-sheets
    - gmail
capability:
  exposes:
    - type: mcp
      namespace: docs-to-sheets
      port: 8080
      tools:
        - name: sync-doc-to-sheet
          description: "Extract data from a Google Doc and append to a Google Sheet with email confirmation."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "The Google Docs document ID."
            - name: spreadsheet_id
              in: body
              type: string
              description: "The Google Sheets spreadsheet ID."
            - name: sheet_range
              in: body
              type: string
              description: "The target sheet range (e.g. Sheet1!A1)."
            - name: notify_email
              in: body
              type: string
              description: "Email address for sync confirmation."
          steps:
            - name: get-doc-content
              type: call
              call: "docs.get-document"
              with:
                document_id: "{{document_id}}"
            - name: append-to-sheet
              type: call
              call: "sheets.append-values"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "{{sheet_range}}"
                values: "{{get-doc-content.body.content}}"
            - name: send-confirmation
              type: call
              call: "gmail.send-message"
              with:
                to: "{{notify_email}}"
                subject: "Doc-to-Sheet sync complete"
                body: "Data from document {{document_id}} has been synced to spreadsheet {{spreadsheet_id}} at range {{sheet_range}}. Rows appended: {{append-to-sheet.updates.updatedRows}}."
  consumes:
    - type: http
      namespace: docs
      baseUri: "https://docs.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: documents
          path: "/documents/{{document_id}}"
          inputParameters:
            - name: document_id
              in: path
          operations:
            - name: get-document
              method: GET
    - type: http
      namespace: sheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: values
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: append-values
              method: POST
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: messages
          path: "/users/me/messages/send"
          operations:
            - name: send-message
              method: POST

Retrieves metadata for a file stored in Google Drive including permissions and sharing status.

naftiko: "0.5"
info:
  label: "Google Drive File Metadata Lookup"
  description: "Retrieves metadata for a file stored in Google Drive including permissions and sharing status."
  tags:
    - collaboration
    - google-drive
capability:
  exposes:
    - type: mcp
      namespace: googledrive
      port: 8080
      tools:
        - name: get-file
          description: "Retrieve metadata for a Google Drive file."
          inputParameters:
            - name: file_id
              in: body
              type: string
              description: "The Google Drive file ID."
          call: "googledrive.get-file"
          with:
            file_id: "{{file_id}}"
  consumes:
    - type: http
      namespace: googledrive
      baseUri: "https://www.googleapis.com/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_drive_token"
      resources:
        - name: files
          path: "/files/{{file_id}}"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: get-file
              method: GET

Fetches responses from a Google Form, aggregates summary statistics, writes them to a Google Sheet, and sends the report via Gmail.

naftiko: "0.5"
info:
  label: "Google Forms Response Aggregator"
  description: "Fetches responses from a Google Form, aggregates summary statistics, writes them to a Google Sheet, and sends the report via Gmail."
  tags:
    - productivity
    - google-forms
    - google-sheets
    - gmail
capability:
  exposes:
    - type: mcp
      namespace: forms-aggregation
      port: 8080
      tools:
        - name: aggregate-form-responses
          description: "Collect Google Forms responses, summarize, push to Sheets, and email report."
          inputParameters:
            - name: form_id
              in: body
              type: string
              description: "The Google Form ID."
            - name: spreadsheet_id
              in: body
              type: string
              description: "The target Google Sheets spreadsheet ID."
            - name: sheet_range
              in: body
              type: string
              description: "The target range in the spreadsheet."
            - name: report_email
              in: body
              type: string
              description: "Email to send the aggregated report."
          steps:
            - name: get-responses
              type: call
              call: "forms.list-responses"
              with:
                form_id: "{{form_id}}"
            - name: write-to-sheet
              type: call
              call: "sheets.update-values"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "{{sheet_range}}"
                values: "{{get-responses.responses}}"
            - name: send-report
              type: call
              call: "gmail.send-message"
              with:
                to: "{{report_email}}"
                subject: "Form Responses Report for {{form_id}}"
                body: "Total responses: {{get-responses.responses.length}}. Data written to spreadsheet {{spreadsheet_id}}."
  consumes:
    - type: http
      namespace: forms
      baseUri: "https://forms.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: responses
          path: "/forms/{{form_id}}/responses"
          inputParameters:
            - name: form_id
              in: path
          operations:
            - name: list-responses
              method: GET
    - type: http
      namespace: sheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: values
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: update-values
              method: PUT
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: messages
          path: "/users/me/messages/send"
          operations:
            - name: send-message
              method: POST

Tracks fleet vehicle positions via Google Maps Routes API, updates a Cloud Firestore collection, and sends delay alerts to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Google Maps Fleet Tracking Pipeline"
  description: "Tracks fleet vehicle positions via Google Maps Routes API, updates a Cloud Firestore collection, and sends delay alerts to Microsoft Teams."
  tags:
    - logistics
    - google-maps
    - google-cloud-platform
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: fleet-tracking
      port: 8080
      tools:
        - name: run-fleet-tracking
          description: "Track fleet positions and notify on delays."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "GCP project ID."
            - name: collection
              in: body
              type: string
              description: "Firestore collection."
            - name: origins
              in: body
              type: string
              description: "Origin addresses."
            - name: destinations
              in: body
              type: string
              description: "Destination addresses."
            - name: team_id
              in: body
              type: string
              description: "Teams team ID."
            - name: channel_id
              in: body
              type: string
              description: "Teams channel ID."
          steps:
            - name: compute-distances
              type: call
              call: "routes.compute-matrix"
              with:
                origins: "{{origins}}"
                destinations: "{{destinations}}"
            - name: update-firestore
              type: call
              call: "firestore.create-document"
              with:
                project_id: "{{project_id}}"
                collection: "{{collection}}"
            - name: alert-delays
              type: call
              call: "teams.send-message"
              with:
                team_id: "{{team_id}}"
                channel_id: "{{channel_id}}"
                text: "Fleet tracking update complete."
  consumes:
    - type: http
      namespace: routes
      baseUri: "https://routes.googleapis.com/distanceMatrix/v2"
      authentication:
        type: bearer
        token: "$secrets.google_maps_key"
      resources:
        - name: distanceMatrix
          path: "/distanceMatrix:compute"
          operations:
            - name: compute-matrix
              method: POST
    - type: http
      namespace: firestore
      baseUri: "https://firestore.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: documents
          path: "/projects/{{project_id}}/databases/(default)/documents/{{collection}}"
          inputParameters:
            - name: project_id
              in: path
            - name: collection
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Resolves a street address to geographic coordinates using the Google Maps Geocoding API. Returns latitude, longitude, and formatted address.

naftiko: "0.5"
info:
  label: "Google Maps Geocoding"
  description: "Resolves a street address to geographic coordinates using the Google Maps Geocoding API. Returns latitude, longitude, and formatted address."
  tags:
    - maps
    - geocoding
    - google-maps
capability:
  exposes:
    - type: mcp
      namespace: maps-geocoding
      port: 8080
      tools:
        - name: geocode-address
          description: "Convert a street address to lat/lng coordinates via Google Maps Geocoding."
          inputParameters:
            - name: address
              in: body
              type: string
              description: "The street address to geocode."
          call: "maps.geocode"
          with:
            address: "{{address}}"
          outputParameters:
            - name: latitude
              type: number
              mapping: "$.results[0].geometry.location.lat"
            - name: longitude
              type: number
              mapping: "$.results[0].geometry.location.lng"
            - name: formatted_address
              type: string
              mapping: "$.results[0].formatted_address"
  consumes:
    - type: http
      namespace: maps
      baseUri: "https://maps.googleapis.com/maps/api"
      authentication:
        type: apiKey
        key: "$secrets.google_maps_api_key"
        in: query
        name: key
      resources:
        - name: geocode
          path: "/geocode/json"
          inputParameters:
            - name: address
              in: query
          operations:
            - name: geocode
              method: GET

Retrieves organic search performance data from Search Console including clicks, impressions, CTR, and average position for a given site.

naftiko: "0.5"
info:
  label: "Google Search Console Performance"
  description: "Retrieves organic search performance data from Search Console including clicks, impressions, CTR, and average position for a given site."
  tags:
    - seo
    - analytics
    - google-search-console
capability:
  exposes:
    - type: mcp
      namespace: search-console
      port: 8080
      tools:
        - name: get-search-performance
          description: "Query Search Console search analytics for a verified property. Returns clicks, impressions, CTR, and position."
          inputParameters:
            - name: site_url
              in: body
              type: string
              description: "The verified site URL (e.g. https://example.com)."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          call: "searchconsole.query-analytics"
          with:
            site_url: "{{site_url}}"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
  consumes:
    - type: http
      namespace: searchconsole
      baseUri: "https://searchconsole.googleapis.com/webmasters/v3"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: search-analytics
          path: "/sites/{{site_url}}/searchAnalytics/query"
          inputParameters:
            - name: site_url
              in: path
          operations:
            - name: query-analytics
              method: POST

Reads a range of cells from a Google Sheets spreadsheet.

naftiko: "0.5"
info:
  label: "Google Sheets Cell Range Reader"
  description: "Reads a range of cells from a Google Sheets spreadsheet."
  tags:
    - data
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: googlesheets
      port: 8080
      tools:
        - name: get-values
          description: "Read cell values from a specified range in Google Sheets."
          inputParameters:
            - name: spreadsheet_id
              in: body
              type: string
              description: "The Google Sheets spreadsheet ID."
            - name: range
              in: body
              type: string
              description: "The A1 notation range to read."
          call: "googlesheets.get-values"
          with:
            spreadsheet_id: "{{spreadsheet_id}}"
            range: "{{range}}"
  consumes:
    - type: http
      namespace: googlesheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: get-values
              method: GET

Creates a new Google Slides presentation from a template, populates it with data from a Google Sheet, and shares it via Google Drive with email notification.

naftiko: "0.5"
info:
  label: "Google Slides Presentation Generator"
  description: "Creates a new Google Slides presentation from a template, populates it with data from a Google Sheet, and shares it via Google Drive with email notification."
  tags:
    - productivity
    - google-slides
    - google-sheets
    - google-drive
    - gmail
capability:
  exposes:
    - type: mcp
      namespace: slides-generator
      port: 8080
      tools:
        - name: generate-presentation
          description: "Create a Slides deck from a template, fill with Sheets data, share via Drive, and notify."
          inputParameters:
            - name: template_presentation_id
              in: body
              type: string
              description: "The Slides template presentation ID."
            - name: spreadsheet_id
              in: body
              type: string
              description: "The source Google Sheets spreadsheet ID."
            - name: sheet_range
              in: body
              type: string
              description: "The data range to pull from the spreadsheet."
            - name: share_email
              in: body
              type: string
              description: "Email address to share the generated presentation with."
          steps:
            - name: copy-template
              type: call
              call: "drive.copy-file"
              with:
                file_id: "{{template_presentation_id}}"
                name: "Generated Report"
            - name: get-sheet-data
              type: call
              call: "sheets.get-values"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "{{sheet_range}}"
            - name: update-slides
              type: call
              call: "slides.batch-update"
              with:
                presentation_id: "{{copy-template.id}}"
                data: "{{get-sheet-data.values}}"
            - name: share-presentation
              type: call
              call: "drive.share-file"
              with:
                file_id: "{{copy-template.id}}"
                email: "{{share_email}}"
                role: "reader"
            - name: notify-recipient
              type: call
              call: "gmail.send-message"
              with:
                to: "{{share_email}}"
                subject: "New presentation ready"
                body: "Your generated presentation is ready: https://docs.google.com/presentation/d/{{copy-template.id}}"
  consumes:
    - type: http
      namespace: drive
      baseUri: "https://www.googleapis.com/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: files
          path: "/files/{{file_id}}/copy"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: copy-file
              method: POST
        - name: permissions
          path: "/files/{{file_id}}/permissions"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: share-file
              method: POST
    - type: http
      namespace: sheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: values
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: get-values
              method: GET
    - type: http
      namespace: slides
      baseUri: "https://slides.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: presentations
          path: "/presentations/{{presentation_id}}:batchUpdate"
          inputParameters:
            - name: presentation_id
              in: path
          operations:
            - name: batch-update
              method: POST
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: messages
          path: "/users/me/messages/send"
          operations:
            - name: send-message
              method: POST

Retrieves the latest published container version from Google Tag Manager including tag count, trigger count, and publish timestamp.

naftiko: "0.5"
info:
  label: "Google Tag Manager Container Version"
  description: "Retrieves the latest published container version from Google Tag Manager including tag count, trigger count, and publish timestamp."
  tags:
    - marketing
    - analytics
    - google-tag-manager
capability:
  exposes:
    - type: mcp
      namespace: gtm-governance
      port: 8080
      tools:
        - name: get-container-version
          description: "Look up the latest GTM container version by account and container ID."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The GTM account ID."
            - name: container_id
              in: body
              type: string
              description: "The GTM container ID."
          call: "gtm.get-latest-version"
          with:
            account_id: "{{account_id}}"
            container_id: "{{container_id}}"
          outputParameters:
            - name: version_id
              type: string
              mapping: "$.containerVersionId"
            - name: tag_count
              type: number
              mapping: "$.tag.length"
            - name: trigger_count
              type: number
              mapping: "$.trigger.length"
  consumes:
    - type: http
      namespace: gtm
      baseUri: "https://tagmanager.googleapis.com/tagmanager/v2"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: versions
          path: "/accounts/{{account_id}}/containers/{{container_id}}/versions/latest"
          inputParameters:
            - name: account_id
              in: path
            - name: container_id
              in: path
          operations:
            - name: get-latest-version
              method: GET

Audits Google Workspace license usage, identifies inactive users, generates a report in Google Sheets, and sends a summary to the IT admin.

naftiko: "0.5"
info:
  label: "Google Workspace License Optimization Pipeline"
  description: "Audits Google Workspace license usage, identifies inactive users, generates a report in Google Sheets, and sends a summary to the IT admin."
  tags:
    - management
    - google-workspace
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: ws-license-opt
      port: 8080
      tools:
        - name: run-license-optimization
          description: "Audit Workspace license usage and generate an optimization report."
          inputParameters:
            - name: domain
              in: body
              type: string
              description: "The Google Workspace domain."
            - name: product_id
              in: body
              type: string
              description: "The licensing product ID."
            - name: sku_id
              in: body
              type: string
              description: "The SKU ID."
            - name: spreadsheet_id
              in: body
              type: string
              description: "Google Sheets spreadsheet ID."
            - name: range
              in: body
              type: string
              description: "Cell range to append data."
          steps:
            - name: list-users
              type: call
              call: "admindir.list-users"
              with:
                domain: "{{domain}}"
                maxResults: "500"
            - name: list-licenses
              type: call
              call: "licensing.list-assignments"
              with:
                product_id: "{{product_id}}"
                sku_id: "{{sku_id}}"
            - name: write-report
              type: call
              call: "googlesheets.append-values"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "{{range}}"
                values: "{{list-licenses.items}}"
            - name: notify-admin
              type: call
              call: "admindir.list-users"
              with:
                domain: "{{domain}}"
                maxResults: "1"
  consumes:
    - type: http
      namespace: admindir
      baseUri: "https://admin.googleapis.com/admin/directory/v1"
      authentication:
        type: bearer
        token: "$secrets.google_admin_token"
      resources:
        - name: users
          path: "/users"
          inputParameters:
            - name: domain
              in: query
            - name: maxResults
              in: query
          operations:
            - name: list-users
              method: GET
    - type: http
      namespace: licensing
      baseUri: "https://licensing.googleapis.com/apps/licensing/v1"
      authentication:
        type: bearer
        token: "$secrets.google_admin_token"
      resources:
        - name: licenseAssignments
          path: "/product/{{product_id}}/sku/{{sku_id}}/users"
          inputParameters:
            - name: product_id
              in: path
            - name: sku_id
              in: path
          operations:
            - name: list-assignments
              method: GET
    - type: http
      namespace: googlesheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: append-values
              method: POST

Retrieves a Google Workspace user profile by email including org unit, last login, and admin status. Used by IT admins for identity audits.

naftiko: "0.5"
info:
  label: "Google Workspace User Lookup"
  description: "Retrieves a Google Workspace user profile by email including org unit, last login, and admin status. Used by IT admins for identity audits."
  tags:
    - identity
    - google-workspace
    - admin
capability:
  exposes:
    - type: mcp
      namespace: workspace-admin
      port: 8080
      tools:
        - name: get-workspace-user
          description: "Look up a Google Workspace user by primary email address."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The user's primary email address."
          call: "workspace.get-user"
          with:
            user_email: "{{user_email}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.name.fullName"
            - name: org_unit
              type: string
              mapping: "$.orgUnitPath"
            - name: last_login
              type: string
              mapping: "$.lastLoginTime"
            - name: is_admin
              type: boolean
              mapping: "$.isAdmin"
  consumes:
    - type: http
      namespace: workspace
      baseUri: "https://admin.googleapis.com/admin/directory/v1"
      authentication:
        type: bearer
        token: "$secrets.workspace_admin_token"
      resources:
        - name: users
          path: "/users/{{user_email}}"
          inputParameters:
            - name: user_email
              in: path
          operations:
            - name: get-user
              method: GET

On a Cloud Monitoring alert, creates a PagerDuty incident, opens a Google Chat war room, queries recent Cloud Logging entries, and posts a summary to the war room.

naftiko: "0.5"
info:
  label: "Incident Response Orchestrator"
  description: "On a Cloud Monitoring alert, creates a PagerDuty incident, opens a Google Chat war room, queries recent Cloud Logging entries, and posts a summary to the war room."
  tags:
    - operations
    - incident-management
    - cloud-monitoring
    - google-cloud-platform
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: incident-response
      port: 8080
      tools:
        - name: trigger-incident-response
          description: "Orchestrate incident response across monitoring, logging, PagerDuty, and Google Chat."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project with the alert."
            - name: alert_policy_name
              in: body
              type: string
              description: "The Cloud Monitoring alert policy resource name."
            - name: service_name
              in: body
              type: string
              description: "The affected service name for context."
            - name: pagerduty_service_id
              in: body
              type: string
              description: "The PagerDuty service ID to create the incident in."
            - name: chat_space
              in: body
              type: string
              description: "The Google Chat space for the war room."
          steps:
            - name: get-alert
              type: call
              call: "monitoring.get-alert-policy"
              with:
                alert_policy_name: "{{alert_policy_name}}"
            - name: create-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "{{pagerduty_service_id}}"
                title: "Alert fired: {{get-alert.displayName}} on {{service_name}}"
                urgency: "high"
            - name: fetch-logs
              type: call
              call: "logging.list-entries"
              with:
                project_id: "{{project_id}}"
                filter: "resource.labels.service_name={{service_name}} severity>=ERROR"
            - name: post-summary
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Incident {{create-incident.incident.id}}: {{get-alert.displayName}}. PagerDuty: {{create-incident.incident.html_url}}. Recent errors: {{fetch-logs.entries.length}} entries."
  consumes:
    - type: http
      namespace: monitoring
      baseUri: "https://monitoring.googleapis.com/v3"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: alert-policies
          path: "/{{alert_policy_name}}"
          inputParameters:
            - name: alert_policy_name
              in: path
          operations:
            - name: get-alert-policy
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: logging
      baseUri: "https://logging.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: entries
          path: "/entries:list"
          operations:
            - name: list-entries
              method: POST
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Compares deployed state against desired config, identifies drift, creates remediation tickets, and alerts ops.

naftiko: "0.5"
info:
  label: "Infrastructure Drift Detection Pipeline"
  description: "Compares deployed state against desired config, identifies drift, creates remediation tickets, and alerts ops."
  tags:
    - devops
    - github
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: infrastructure_drift_detection
          description: "Orchestrate infrastructure drift detection pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-github
              type: call
              call: "github.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-github.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Infrastructure Drift Detection Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: github-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://alphabet.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Executes a saved Looker look by ID and returns the result set. Used by analytics teams to pull report data programmatically.

naftiko: "0.5"
info:
  label: "Looker Dashboard Query"
  description: "Executes a saved Looker look by ID and returns the result set. Used by analytics teams to pull report data programmatically."
  tags:
    - analytics
    - bi
    - looker
capability:
  exposes:
    - type: mcp
      namespace: looker-analytics
      port: 8080
      tools:
        - name: run-look
          description: "Execute a saved Looker look by look ID and return the result data."
          inputParameters:
            - name: look_id
              in: body
              type: string
              description: "The Looker look identifier."
            - name: result_format
              in: body
              type: string
              description: "Output format: json, csv, or txt."
          call: "looker.run-look"
          with:
            look_id: "{{look_id}}"
            result_format: "{{result_format}}"
  consumes:
    - type: http
      namespace: looker
      baseUri: "https://alphabet.cloud.looker.com/api/4.0"
      authentication:
        type: bearer
        token: "$secrets.looker_api_token"
      resources:
        - name: looks
          path: "/looks/{{look_id}}/run/{{result_format}}"
          inputParameters:
            - name: look_id
              in: path
            - name: result_format
              in: path
          operations:
            - name: run-look
              method: GET

Runs a Looker dashboard query, exports the results to a BigQuery table, and posts a completion notification to Google Chat.

naftiko: "0.5"
info:
  label: "Looker to BigQuery Scheduled Export"
  description: "Runs a Looker dashboard query, exports the results to a BigQuery table, and posts a completion notification to Google Chat."
  tags:
    - analytics
    - bi
    - looker
    - bigquery
capability:
  exposes:
    - type: mcp
      namespace: looker-export
      port: 8080
      tools:
        - name: export-looker-to-bq
          description: "Run a Looker query, export results to BigQuery, and notify via Google Chat."
          inputParameters:
            - name: look_id
              in: body
              type: string
              description: "The Looker look ID to execute."
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID for BigQuery."
            - name: bq_dataset
              in: body
              type: string
              description: "The target BigQuery dataset."
            - name: bq_table
              in: body
              type: string
              description: "The target BigQuery table."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space for notifications."
          steps:
            - name: run-looker-query
              type: call
              call: "looker.run-look"
              with:
                look_id: "{{look_id}}"
                result_format: "json"
            - name: load-to-bq
              type: call
              call: "bigquery.insert-rows"
              with:
                project_id: "{{project_id}}"
                dataset_id: "{{bq_dataset}}"
                table_id: "{{bq_table}}"
                rows: "{{run-looker-query}}"
            - name: notify-completion
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Looker export complete. Look {{look_id}} data loaded to {{bq_dataset}}.{{bq_table}}."
  consumes:
    - type: http
      namespace: looker
      baseUri: "https://alphabet.cloud.looker.com/api/4.0"
      authentication:
        type: bearer
        token: "$secrets.looker_api_token"
      resources:
        - name: looks
          path: "/looks/{{look_id}}/run/{{result_format}}"
          inputParameters:
            - name: look_id
              in: path
            - name: result_format
              in: path
          operations:
            - name: run-look
              method: GET
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: tabledata
          path: "/projects/{{project_id}}/datasets/{{dataset_id}}/tables/{{table_id}}/insertAll"
          inputParameters:
            - name: project_id
              in: path
            - name: dataset_id
              in: path
            - name: table_id
              in: path
          operations:
            - name: insert-rows
              method: POST
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a Vertex AI custom training job, waits for completion, uploads the trained model to the Model Registry, and deploys it to an existing endpoint with traffic split.

naftiko: "0.5"
info:
  label: "ML Model Training to Deployment Pipeline"
  description: "Triggers a Vertex AI custom training job, waits for completion, uploads the trained model to the Model Registry, and deploys it to an existing endpoint with traffic split."
  tags:
    - ai
    - machine-learning
    - vertex-ai
    - mlops
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: vertex-mlops
      port: 8080
      tools:
        - name: train-and-deploy-model
          description: "Run end-to-end ML workflow: launch training, register model, deploy to endpoint."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The Vertex AI region."
            - name: training_pipeline_id
              in: body
              type: string
              description: "The training pipeline configuration ID."
            - name: endpoint_id
              in: body
              type: string
              description: "The target endpoint for deployment."
            - name: traffic_percentage
              in: body
              type: number
              description: "Traffic percentage to route to the new model (0-100)."
          steps:
            - name: launch-training
              type: call
              call: "vertexai.create-training-pipeline"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                pipeline_id: "{{training_pipeline_id}}"
            - name: get-training-status
              type: call
              call: "vertexai.get-training-pipeline"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                pipeline_name: "{{launch-training.name}}"
            - name: upload-model
              type: call
              call: "vertexai.upload-model"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                artifact_uri: "{{get-training-status.modelToUpload.artifactUri}}"
            - name: deploy-model
              type: call
              call: "vertexai.deploy-model"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                endpoint_id: "{{endpoint_id}}"
                model_id: "{{upload-model.model}}"
                traffic_percentage: "{{traffic_percentage}}"
  consumes:
    - type: http
      namespace: vertexai
      baseUri: "https://us-central1-aiplatform.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: training-pipelines
          path: "/projects/{{project_id}}/locations/{{region}}/trainingPipelines"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
          operations:
            - name: create-training-pipeline
              method: POST
            - name: get-training-pipeline
              method: GET
        - name: models
          path: "/projects/{{project_id}}/locations/{{region}}/models:upload"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
          operations:
            - name: upload-model
              method: POST
        - name: endpoint-deployments
          path: "/projects/{{project_id}}/locations/{{region}}/endpoints/{{endpoint_id}}:deployModel"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: endpoint_id
              in: path
          operations:
            - name: deploy-model
              method: POST

Exports GCP billing data from BigQuery, fetches comparable data from the Cloud Billing API, generates a cost summary, and posts it to a Google Sheets dashboard with Gmail notification.

naftiko: "0.5"
info:
  label: "Multi-Cloud Cost Reporting Pipeline"
  description: "Exports GCP billing data from BigQuery, fetches comparable data from the Cloud Billing API, generates a cost summary, and posts it to a Google Sheets dashboard with Gmail notification."
  tags:
    - finops
    - billing
    - bigquery
    - google-sheets
    - gmail
capability:
  exposes:
    - type: mcp
      namespace: cost-reporting
      port: 8080
      tools:
        - name: generate-cost-report
          description: "Build a cost report from BigQuery billing exports and publish to Sheets with email alert."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: billing_dataset
              in: body
              type: string
              description: "The BigQuery dataset containing billing exports."
            - name: billing_table
              in: body
              type: string
              description: "The billing export table name."
            - name: spreadsheet_id
              in: body
              type: string
              description: "The Google Sheets spreadsheet ID for the dashboard."
            - name: notify_email
              in: body
              type: string
              description: "Finance team email for report notifications."
          steps:
            - name: query-billing
              type: call
              call: "bigquery.run-query"
              with:
                project_id: "{{project_id}}"
                query: "SELECT service.description, SUM(cost) as total_cost FROM `{{project_id}}.{{billing_dataset}}.{{billing_table}}` GROUP BY service.description ORDER BY total_cost DESC"
            - name: update-sheet
              type: call
              call: "sheets.update-values"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "CostReport!A1"
                values: "{{query-billing.rows}}"
            - name: email-report
              type: call
              call: "gmail.send-message"
              with:
                to: "{{notify_email}}"
                subject: "GCP Cost Report Updated"
                body: "The cost dashboard has been refreshed. View at https://docs.google.com/spreadsheets/d/{{spreadsheet_id}}. Total services: {{query-billing.totalRows}}."
  consumes:
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: jobs
          path: "/projects/{{project_id}}/queries"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: values
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: update-values
              method: PUT
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: messages
          path: "/users/me/messages/send"
          operations:
            - name: send-message
              method: POST

Initiates failover to secondary region, validates services, runs health checks, and reports results.

naftiko: "0.5"
info:
  label: "Multi-Region Failover Test Pipeline"
  description: "Initiates failover to secondary region, validates services, runs health checks, and reports results."
  tags:
    - disaster-recovery
    - kubernetes
    - datadog
    - slack
capability:
  exposes:
    - type: mcp
      namespace: disaster-recovery
      port: 8080
      tools:
        - name: multi_region_failover_test_pipeline
          description: "Orchestrate multi-region failover test pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-k8s
              type: call
              call: "k8s.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-datadog
              type: call
              call: "datadog.process-resource"
              with:
                data: "{{get-k8s.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Multi-Region Failover Test Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: k8s
      baseUri: "https://alphabet-k8s.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.k8s_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: kubernetes-op
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves a Google Pay transaction, cross-references with Salesforce order data, logs the reconciliation to BigQuery, and alerts finance via Gmail on discrepancies.

naftiko: "0.5"
info:
  label: "Payment Reconciliation Pipeline"
  description: "Retrieves a Google Pay transaction, cross-references with Salesforce order data, logs the reconciliation to BigQuery, and alerts finance via Gmail on discrepancies."
  tags:
    - payments
    - google-pay
    - finance
    - salesforce
    - bigquery
    - gmail
capability:
  exposes:
    - type: mcp
      namespace: payment-reconciliation
      port: 8080
      tools:
        - name: reconcile-payment
          description: "Reconcile Google Pay transaction with Salesforce order, log to BigQuery, alert on mismatch."
          inputParameters:
            - name: order_id
              in: body
              type: string
              description: "The Google Pay order identifier."
            - name: sfdc_order_id
              in: body
              type: string
              description: "The corresponding Salesforce order ID."
            - name: project_id
              in: body
              type: string
              description: "GCP project for BigQuery logging."
            - name: finance_email
              in: body
              type: string
              description: "Finance team email for discrepancy alerts."
          steps:
            - name: get-gpay-transaction
              type: call
              call: "googlepay.get-order"
              with:
                order_id: "{{order_id}}"
            - name: get-sfdc-order
              type: call
              call: "salesforce.get-order"
              with:
                order_id: "{{sfdc_order_id}}"
            - name: log-reconciliation
              type: call
              call: "bigquery.insert-rows"
              with:
                project_id: "{{project_id}}"
                dataset_id: "finance_ops"
                table_id: "payment_reconciliation"
                rows: "[{\"gpay_order\": \"{{order_id}}\", \"gpay_amount\": \"{{get-gpay-transaction.totalPrice}}\", \"sfdc_amount\": \"{{get-sfdc-order.TotalAmount}}\"}]"
            - name: alert-discrepancy
              type: call
              call: "gmail.send-message"
              with:
                to: "{{finance_email}}"
                subject: "Payment Reconciliation: {{order_id}}"
                body: "GPay amount: {{get-gpay-transaction.totalPrice}} {{get-gpay-transaction.currencyCode}}. SFDC amount: {{get-sfdc-order.TotalAmount}}. Status: {{get-gpay-transaction.orderStatus}}."
  consumes:
    - type: http
      namespace: googlepay
      baseUri: "https://payments.googleapis.com/pay/v1"
      authentication:
        type: bearer
        token: "$secrets.google_pay_token"
      resources:
        - name: orders
          path: "/orders/{{order_id}}"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-order
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://alphabet.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: orders
          path: "/sobjects/Order/{{order_id}}"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-order
              method: GET
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: tabledata
          path: "/projects/{{project_id}}/datasets/{{dataset_id}}/tables/{{table_id}}/insertAll"
          inputParameters:
            - name: project_id
              in: path
            - name: dataset_id
              in: path
            - name: table_id
              in: path
          operations:
            - name: insert-rows
              method: POST
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: messages
          path: "/users/me/messages/send"
          operations:
            - name: send-message
              method: POST

Initiates review cycles, collects feedback, aggregates scores, and distributes to managers.

naftiko: "0.5"
info:
  label: "Performance Review Cycle Pipeline"
  description: "Initiates review cycles, collects feedback, aggregates scores, and distributes to managers."
  tags:
    - hr
    - workday
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: performance_review_cycle_pipeline
          description: "Orchestrate performance review cycle pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-gcp
              type: call
              call: "gcp.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-gcp.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Performance Review Cycle Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: gcp
      baseUri: "https://compute.googleapis.com/compute/v1/projects/alphabet"
      authentication:
        type: bearer
        token: "$secrets.gcp_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: gcp-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://alphabet.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Queries Salesforce for new leads, transforms the data, loads into a BigQuery table, and triggers a Looker dashboard refresh.

naftiko: "0.5"
info:
  label: "Salesforce to BigQuery Lead Sync"
  description: "Queries Salesforce for new leads, transforms the data, loads into a BigQuery table, and triggers a Looker dashboard refresh."
  tags:
    - crm
    - data
    - salesforce
    - bigquery
    - looker
capability:
  exposes:
    - type: mcp
      namespace: sfdc-bq-sync
      port: 8080
      tools:
        - name: sync-leads-to-bigquery
          description: "Fetch Salesforce leads, load to BigQuery, and refresh Looker dashboard."
          inputParameters:
            - name: sfdc_query
              in: body
              type: string
              description: "SOQL query to fetch leads from Salesforce."
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: bq_dataset
              in: body
              type: string
              description: "The BigQuery dataset."
            - name: bq_table
              in: body
              type: string
              description: "The BigQuery table."
            - name: looker_dashboard_id
              in: body
              type: string
              description: "The Looker dashboard ID to refresh."
          steps:
            - name: query-salesforce
              type: call
              call: "salesforce.query"
              with:
                q: "{{sfdc_query}}"
            - name: load-to-bq
              type: call
              call: "bigquery.insert-rows"
              with:
                project_id: "{{project_id}}"
                dataset_id: "{{bq_dataset}}"
                table_id: "{{bq_table}}"
                rows: "{{query-salesforce.records}}"
            - name: refresh-looker
              type: call
              call: "looker.run-dashboard"
              with:
                dashboard_id: "{{looker_dashboard_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://alphabet.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: query
              method: GET
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: tabledata
          path: "/projects/{{project_id}}/datasets/{{dataset_id}}/tables/{{table_id}}/insertAll"
          inputParameters:
            - name: project_id
              in: path
            - name: dataset_id
              in: path
            - name: table_id
              in: path
          operations:
            - name: insert-rows
              method: POST
    - type: http
      namespace: looker
      baseUri: "https://alphabet.cloud.looker.com/api/4.0"
      authentication:
        type: bearer
        token: "$secrets.looker_api_token"
      resources:
        - name: dashboards
          path: "/dashboards/{{dashboard_id}}/run"
          inputParameters:
            - name: dashboard_id
              in: path
          operations:
            - name: run-dashboard
              method: POST

Accesses a secret version from Google Cloud Secret Manager.

naftiko: "0.5"
info:
  label: "Secret Manager Secret Retrieval"
  description: "Accesses a secret version from Google Cloud Secret Manager."
  tags:
    - security
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: secretmanager
      port: 8080
      tools:
        - name: access-secret
          description: "Access a specific version of a secret from Secret Manager."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: secret_id
              in: body
              type: string
              description: "The secret identifier."
            - name: version
              in: body
              type: string
              description: "The secret version number or latest."
          call: "secretmanager.access-secret"
          with:
            project_id: "{{project_id}}"
            secret_id: "{{secret_id}}"
            version: "{{version}}"
  consumes:
    - type: http
      namespace: secretmanager
      baseUri: "https://secretmanager.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: secrets
          path: "/projects/{{project_id}}/secrets/{{secret_id}}/versions/{{version}}:access"
          inputParameters:
            - name: project_id
              in: path
            - name: secret_id
              in: path
            - name: version
              in: path
          operations:
            - name: access-secret
              method: GET

Detects security incidents, enriches with context, creates response tickets, and notifies the SOC.

naftiko: "0.5"
info:
  label: "Security Incident Response Pipeline"
  description: "Detects security incidents, enriches with context, creates response tickets, and notifies the SOC."
  tags:
    - security
    - splunk
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: security_incident_response_pipeline
          description: "Orchestrate security incident response pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-splunk
              type: call
              call: "splunk.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-splunk.result}}"
            - name: create-bigquery
              type: call
              call: "bigquery.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Security Incident Response Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://alphabet-splunk.com/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: splunk-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://alphabet.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bigquery-op
              method: POST

Runs a Container Analysis scan on an Artifact Registry image, checks for critical CVEs, creates a Jira ticket if vulnerabilities found, and posts findings to Google Chat.

naftiko: "0.5"
info:
  label: "Security Vulnerability Scan Pipeline"
  description: "Runs a Container Analysis scan on an Artifact Registry image, checks for critical CVEs, creates a Jira ticket if vulnerabilities found, and posts findings to Google Chat."
  tags:
    - security
    - devops
    - artifact-registry
    - jira
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: security-scanning
      port: 8080
      tools:
        - name: scan-and-report-vulnerabilities
          description: "Scan a container image for vulnerabilities, report criticals to Jira and Google Chat."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: image_uri
              in: body
              type: string
              description: "The full Artifact Registry image URI."
            - name: jira_project_key
              in: body
              type: string
              description: "The Jira project key for security tickets."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space for security alerts."
          steps:
            - name: get-vulnerabilities
              type: call
              call: "containeranalysis.list-occurrences"
              with:
                project_id: "{{project_id}}"
                image_uri: "{{image_uri}}"
            - name: create-jira-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                summary: "Critical CVEs found in {{image_uri}}"
                description: "Vulnerabilities detected: {{get-vulnerabilities.occurrences.length}} findings. Image: {{image_uri}}"
                issue_type: "Bug"
                priority: "Critical"
            - name: alert-security-team
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Security scan for {{image_uri}}: {{get-vulnerabilities.occurrences.length}} vulnerabilities found. Jira: {{create-jira-ticket.key}}."
  consumes:
    - type: http
      namespace: containeranalysis
      baseUri: "https://containeranalysis.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: occurrences
          path: "/projects/{{project_id}}/occurrences"
          inputParameters:
            - name: project_id
              in: path
            - name: filter
              in: query
          operations:
            - name: list-occurrences
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://alphabet.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Exports data from Snowflake to a staging GCS bucket, loads it into BigQuery via a load job, and sends a migration report to Google Chat.

naftiko: "0.5"
info:
  label: "Snowflake to BigQuery Data Migration"
  description: "Exports data from Snowflake to a staging GCS bucket, loads it into BigQuery via a load job, and sends a migration report to Google Chat."
  tags:
    - data
    - migration
    - snowflake
    - bigquery
    - gcp-cloud-storage
capability:
  exposes:
    - type: mcp
      namespace: data-migration
      port: 8080
      tools:
        - name: migrate-snowflake-to-bq
          description: "Export Snowflake data to GCS, load to BigQuery, and notify via Chat."
          inputParameters:
            - name: snowflake_query
              in: body
              type: string
              description: "The Snowflake SQL query to export."
            - name: stage_bucket
              in: body
              type: string
              description: "The GCS staging bucket."
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: bq_dataset
              in: body
              type: string
              description: "The target BigQuery dataset."
            - name: bq_table
              in: body
              type: string
              description: "The target BigQuery table."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space for notifications."
          steps:
            - name: export-from-snowflake
              type: call
              call: "snowflake.execute-query"
              with:
                query: "{{snowflake_query}}"
                stage: "@gcs_stage/{{stage_bucket}}"
            - name: load-to-bq
              type: call
              call: "bigquery.create-load-job"
              with:
                project_id: "{{project_id}}"
                dataset_id: "{{bq_dataset}}"
                table_id: "{{bq_table}}"
                source_uri: "gs://{{stage_bucket}}/export/*"
            - name: notify-migration
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Migration complete. Data loaded from Snowflake to {{bq_dataset}}.{{bq_table}}. Job status: {{load-to-bq.status.state}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://alphabet.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: jobs
          path: "/projects/{{project_id}}/jobs"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: create-load-job
              method: POST
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Audits license usage, identifies underutilized licenses, recommends optimization, and notifies IT.

naftiko: "0.5"
info:
  label: "Software License Optimization Pipeline"
  description: "Audits license usage, identifies underutilized licenses, recommends optimization, and notifies IT."
  tags:
    - operations
    - servicenow
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: operations
      port: 8080
      tools:
        - name: software_license_optimization
          description: "Orchestrate software license optimization pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                data: "{{get-servicenow.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Software License Optimization Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://alphabet.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://alphabet.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Checks Cloud Spanner instance metrics, queries CPU utilization from Cloud Monitoring, and posts a capacity summary with scaling recommendations to Google Chat.

naftiko: "0.5"
info:
  label: "Spanner Capacity Planning Pipeline"
  description: "Checks Cloud Spanner instance metrics, queries CPU utilization from Cloud Monitoring, and posts a capacity summary with scaling recommendations to Google Chat."
  tags:
    - database
    - infrastructure
    - cloud-spanner
    - cloud-monitoring
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: spanner-capacity
      port: 8080
      tools:
        - name: assess-spanner-capacity
          description: "Check Spanner instance, query CPU metrics, and post capacity recommendations."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: instance_id
              in: body
              type: string
              description: "The Spanner instance identifier."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space for capacity alerts."
          steps:
            - name: get-instance
              type: call
              call: "spanner.get-instance"
              with:
                project_id: "{{project_id}}"
                instance_id: "{{instance_id}}"
            - name: get-cpu-metrics
              type: call
              call: "monitoring.query-timeseries"
              with:
                project_id: "{{project_id}}"
                filter: "metric.type=\"spanner.googleapis.com/instance/cpu/utilization\" AND resource.labels.instance_id=\"{{instance_id}}\""
            - name: post-summary
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Spanner capacity report for {{instance_id}}: {{get-instance.nodeCount}} nodes, state: {{get-instance.state}}. Avg CPU: {{get-cpu-metrics.timeSeries[0].points[0].value.doubleValue}}."
  consumes:
    - type: http
      namespace: spanner
      baseUri: "https://spanner.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: instances
          path: "/projects/{{project_id}}/instances/{{instance_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: instance_id
              in: path
          operations:
            - name: get-instance
              method: GET
    - type: http
      namespace: monitoring
      baseUri: "https://monitoring.googleapis.com/v3"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: timeseries
          path: "/projects/{{project_id}}/timeSeries"
          inputParameters:
            - name: project_id
              in: path
            - name: filter
              in: query
          operations:
            - name: query-timeseries
              method: GET
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Fetches Terraform Cloud workspace state, compares it against Cloud Asset Inventory, identifies drift, and creates a GitHub issue for remediation.

naftiko: "0.5"
info:
  label: "Terraform GCP Infrastructure Audit"
  description: "Fetches Terraform Cloud workspace state, compares it against Cloud Asset Inventory, identifies drift, and creates a GitHub issue for remediation."
  tags:
    - infrastructure
    - devops
    - terraform
    - github
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: infra-audit
      port: 8080
      tools:
        - name: audit-infrastructure-drift
          description: "Compare Terraform state with GCP Cloud Asset Inventory and report drift to GitHub."
          inputParameters:
            - name: terraform_workspace
              in: body
              type: string
              description: "The Terraform Cloud workspace ID."
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID to audit."
            - name: github_repo
              in: body
              type: string
              description: "The GitHub repository (owner/repo) for drift issues."
          steps:
            - name: get-tf-state
              type: call
              call: "terraform.get-workspace-state"
              with:
                workspace_id: "{{terraform_workspace}}"
            - name: get-asset-inventory
              type: call
              call: "cloudasset.search-resources"
              with:
                project_id: "{{project_id}}"
            - name: create-drift-issue
              type: call
              call: "github.create-issue"
              with:
                repo: "{{github_repo}}"
                title: "Infrastructure drift detected in {{project_id}}"
                body: "Terraform state resources: {{get-tf-state.resources.length}}. GCP asset inventory resources: {{get-asset-inventory.results.length}}. Review and reconcile."
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_cloud_token"
      resources:
        - name: workspaces
          path: "/workspaces/{{workspace_id}}/current-state-version"
          inputParameters:
            - name: workspace_id
              in: path
          operations:
            - name: get-workspace-state
              method: GET
    - type: http
      namespace: cloudasset
      baseUri: "https://cloudasset.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: resources
          path: "/projects/{{project_id}}/assets"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: search-resources
              method: GET
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: issues
          path: "/repos/{{repo}}/issues"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: create-issue
              method: POST

Evaluates vendor security posture, scores risk, creates assessment records, and notifies procurement.

naftiko: "0.5"
info:
  label: "Vendor Risk Assessment Pipeline"
  description: "Evaluates vendor security posture, scores risk, creates assessment records, and notifies procurement."
  tags:
    - procurement
    - servicenow
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: vendor_risk_assessment_pipeline
          description: "Orchestrate vendor risk assessment pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-servicenow.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Vendor Risk Assessment Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://alphabet.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://alphabet.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Submits a batch prediction job to Vertex AI, monitors completion, stores results in BigQuery, and notifies via Google Chat.

naftiko: "0.5"
info:
  label: "Vertex AI Batch Prediction Pipeline"
  description: "Submits a batch prediction job to Vertex AI, monitors completion, stores results in BigQuery, and notifies via Google Chat."
  tags:
    - ai
    - machine-learning
    - google-cloud-platform
    - bigquery
    - google-workspace
capability:
  exposes:
    - type: mcp
      namespace: vertex-batch
      port: 8080
      tools:
        - name: run-batch-prediction
          description: "Orchestrate a batch prediction pipeline across Vertex AI, BigQuery, and Google Chat."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The compute region."
            - name: model_id
              in: body
              type: string
              description: "The Vertex AI model resource ID."
            - name: input_uri
              in: body
              type: string
              description: "GCS URI for input data."
            - name: output_dataset
              in: body
              type: string
              description: "BigQuery dataset for results."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space for notifications."
          steps:
            - name: submit-prediction
              type: call
              call: "vertexai.create-batch-job"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                model: "{{model_id}}"
                inputConfig: "{{input_uri}}"
            - name: check-job
              type: call
              call: "vertexai.get-batch-job"
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                job_id: "{{submit-prediction.name}}"
            - name: load-results
              type: call
              call: "bigquery.insert-job"
              with:
                project_id: "{{project_id}}"
                dataset: "{{output_dataset}}"
            - name: notify
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Batch prediction complete. Job: {{submit-prediction.name}}, loaded to {{output_dataset}}."
  consumes:
    - type: http
      namespace: vertexai
      baseUri: "https://aiplatform.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: batchPredictionJobs
          path: "/projects/{{project_id}}/locations/{{region}}/batchPredictionJobs"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
          operations:
            - name: create-batch-job
              method: POST
            - name: get-batch-job
              method: GET
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: jobs
          path: "/projects/{{project_id}}/jobs"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: insert-job
              method: POST
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves feature values from a Vertex AI Feature Store for online serving.

naftiko: "0.5"
info:
  label: "Vertex AI Feature Store Lookup"
  description: "Retrieves feature values from a Vertex AI Feature Store for online serving."
  tags:
    - ai
    - machine-learning
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: vertexfeaturestore
      port: 8080
      tools:
        - name: get-featurestore
          description: "Retrieve a Vertex AI Feature Store instance and its configuration."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The feature store region."
            - name: featurestore_id
              in: body
              type: string
              description: "The feature store ID."
          call: "vertexfeaturestore.get-featurestore"
          with:
            project_id: "{{project_id}}"
            region: "{{region}}"
            featurestore_id: "{{featurestore_id}}"
  consumes:
    - type: http
      namespace: vertexfeaturestore
      baseUri: "https://aiplatform.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: featurestores
          path: "/projects/{{project_id}}/locations/{{region}}/featurestores/{{featurestore_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: featurestore_id
              in: path
          operations:
            - name: get-featurestore
              method: GET

Checks a Vertex AI endpoint's deployment status, model version, and traffic split. Used by ML engineers to verify model serving readiness.

naftiko: "0.5"
info:
  label: "Vertex AI Model Endpoint Health"
  description: "Checks a Vertex AI endpoint's deployment status, model version, and traffic split. Used by ML engineers to verify model serving readiness."
  tags:
    - ai
    - machine-learning
    - vertex-ai
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: vertex-ml
      port: 8080
      tools:
        - name: get-endpoint-health
          description: "Retrieve Vertex AI endpoint deployment info by project, region, and endpoint ID."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The Vertex AI region."
            - name: endpoint_id
              in: body
              type: string
              description: "The Vertex AI endpoint identifier."
          call: "vertexai.get-endpoint"
          with:
            project_id: "{{project_id}}"
            region: "{{region}}"
            endpoint_id: "{{endpoint_id}}"
          outputParameters:
            - name: display_name
              type: string
              mapping: "$.displayName"
            - name: deployed_models
              type: number
              mapping: "$.deployedModels.length"
            - name: traffic_split
              type: string
              mapping: "$.trafficSplit"
  consumes:
    - type: http
      namespace: vertexai
      baseUri: "https://us-central1-aiplatform.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: endpoints
          path: "/projects/{{project_id}}/locations/{{region}}/endpoints/{{endpoint_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: endpoint_id
              in: path
          operations:
            - name: get-endpoint
              method: GET

Scans VPC firewall rules for overly permissive entries, logs findings to BigQuery, and alerts the security team via Google Chat with a summary of non-compliant rules.

naftiko: "0.5"
info:
  label: "VPC Firewall Audit Pipeline"
  description: "Scans VPC firewall rules for overly permissive entries, logs findings to BigQuery, and alerts the security team via Google Chat with a summary of non-compliant rules."
  tags:
    - networking
    - security
    - vpc
    - bigquery
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: vpc-firewall-audit
      port: 8080
      tools:
        - name: audit-firewall-rules
          description: "Scan VPC firewall rules, log findings to BigQuery, and alert security team."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: network_name
              in: body
              type: string
              description: "The VPC network name to audit."
            - name: chat_space
              in: body
              type: string
              description: "Google Chat space for security alerts."
          steps:
            - name: list-rules
              type: call
              call: "compute.list-firewalls"
              with:
                project_id: "{{project_id}}"
                network_name: "{{network_name}}"
            - name: log-findings
              type: call
              call: "bigquery.insert-rows"
              with:
                project_id: "{{project_id}}"
                dataset_id: "security_audits"
                table_id: "firewall_findings"
                rows: "{{list-rules.items}}"
            - name: alert-team
              type: call
              call: "googlechat.send-message"
              with:
                space: "{{chat_space}}"
                text: "Firewall audit for {{network_name}}: {{list-rules.items.length}} rules found. Review findings in BigQuery security_audits.firewall_findings."
  consumes:
    - type: http
      namespace: compute
      baseUri: "https://compute.googleapis.com/compute/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: firewalls
          path: "/projects/{{project_id}}/global/firewalls"
          inputParameters:
            - name: project_id
              in: path
            - name: filter
              in: query
          operations:
            - name: list-firewalls
              method: GET
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: tabledata
          path: "/projects/{{project_id}}/datasets/{{dataset_id}}/tables/{{table_id}}/insertAll"
          inputParameters:
            - name: project_id
              in: path
            - name: dataset_id
              in: path
            - name: table_id
              in: path
          operations:
            - name: insert-rows
              method: POST
    - type: http
      namespace: googlechat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space}}/messages"
          inputParameters:
            - name: space
              in: path
          operations:
            - name: send-message
              method: POST

Fetches group membership from Google Workspace Directory, compares with an HR source in Google Sheets, adds missing members, and logs changes to BigQuery.

naftiko: "0.5"
info:
  label: "Workspace Group Membership Sync"
  description: "Fetches group membership from Google Workspace Directory, compares with an HR source in Google Sheets, adds missing members, and logs changes to BigQuery."
  tags:
    - identity
    - hr
    - google-workspace
    - google-sheets
    - bigquery
capability:
  exposes:
    - type: mcp
      namespace: workspace-sync
      port: 8080
      tools:
        - name: sync-group-membership
          description: "Sync Workspace group members against HR source in Sheets, add missing, log to BigQuery."
          inputParameters:
            - name: group_email
              in: body
              type: string
              description: "The Google Workspace group email."
            - name: spreadsheet_id
              in: body
              type: string
              description: "The HR roster spreadsheet ID."
            - name: sheet_range
              in: body
              type: string
              description: "The range containing employee emails."
            - name: project_id
              in: body
              type: string
              description: "GCP project for audit logging."
          steps:
            - name: get-current-members
              type: call
              call: "workspace.list-group-members"
              with:
                group_email: "{{group_email}}"
            - name: get-hr-roster
              type: call
              call: "sheets.get-values"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "{{sheet_range}}"
            - name: add-missing-members
              type: call
              call: "workspace.add-group-member"
              with:
                group_email: "{{group_email}}"
                members: "{{get-hr-roster.values}}"
            - name: log-sync
              type: call
              call: "bigquery.insert-rows"
              with:
                project_id: "{{project_id}}"
                dataset_id: "identity_ops"
                table_id: "group_sync_log"
                rows: "[{\"group\": \"{{group_email}}\", \"action\": \"membership_sync\", \"source_count\": \"{{get-hr-roster.values.length}}\"}]"
  consumes:
    - type: http
      namespace: workspace
      baseUri: "https://admin.googleapis.com/admin/directory/v1"
      authentication:
        type: bearer
        token: "$secrets.workspace_admin_token"
      resources:
        - name: group-members
          path: "/groups/{{group_email}}/members"
          inputParameters:
            - name: group_email
              in: path
          operations:
            - name: list-group-members
              method: GET
            - name: add-group-member
              method: POST
    - type: http
      namespace: sheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: values
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: get-values
              method: GET
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: tabledata
          path: "/projects/{{project_id}}/datasets/{{dataset_id}}/tables/{{table_id}}/insertAll"
          inputParameters:
            - name: project_id
              in: path
            - name: dataset_id
              in: path
            - name: table_id
              in: path
          operations:
            - name: insert-rows
              method: POST

On employee termination, suspends the Google Workspace account, transfers Drive files to the manager, revokes OAuth tokens, and logs the offboarding event to BigQuery.

naftiko: "0.5"
info:
  label: "Workspace User Offboarding Pipeline"
  description: "On employee termination, suspends the Google Workspace account, transfers Drive files to the manager, revokes OAuth tokens, and logs the offboarding event to BigQuery."
  tags:
    - identity
    - hr
    - google-workspace
    - google-drive
    - bigquery
capability:
  exposes:
    - type: mcp
      namespace: workspace-offboarding
      port: 8080
      tools:
        - name: offboard-user
          description: "Orchestrate user offboarding: suspend account, transfer files, revoke tokens, and audit log."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The departing user's email address."
            - name: manager_email
              in: body
              type: string
              description: "The manager's email to receive file transfer."
            - name: project_id
              in: body
              type: string
              description: "GCP project for audit logging."
          steps:
            - name: suspend-user
              type: call
              call: "workspace.update-user"
              with:
                user_email: "{{user_email}}"
                suspended: true
            - name: transfer-drive
              type: call
              call: "drive.transfer-ownership"
              with:
                from_user: "{{user_email}}"
                to_user: "{{manager_email}}"
            - name: revoke-tokens
              type: call
              call: "workspace.revoke-tokens"
              with:
                user_email: "{{user_email}}"
            - name: log-offboarding
              type: call
              call: "bigquery.insert-rows"
              with:
                project_id: "{{project_id}}"
                dataset_id: "hr_events"
                table_id: "offboarding_log"
                rows: "[{\"user\": \"{{user_email}}\", \"manager\": \"{{manager_email}}\", \"action\": \"offboarded\"}]"
  consumes:
    - type: http
      namespace: workspace
      baseUri: "https://admin.googleapis.com/admin/directory/v1"
      authentication:
        type: bearer
        token: "$secrets.workspace_admin_token"
      resources:
        - name: users
          path: "/users/{{user_email}}"
          inputParameters:
            - name: user_email
              in: path
          operations:
            - name: update-user
              method: PUT
            - name: revoke-tokens
              method: DELETE
    - type: http
      namespace: drive
      baseUri: "https://www.googleapis.com/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.workspace_admin_token"
      resources:
        - name: transfers
          path: "/files/transfer"
          operations:
            - name: transfer-ownership
              method: POST
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_access_token"
      resources:
        - name: tabledata
          path: "/projects/{{project_id}}/datasets/{{dataset_id}}/tables/{{table_id}}/insertAll"
          inputParameters:
            - name: project_id
              in: path
            - name: dataset_id
              in: path
            - name: table_id
              in: path
          operations:
            - name: insert-rows
              method: POST

Retrieves analytics data for a YouTube channel including views, subscribers, and engagement metrics.

naftiko: "0.5"
info:
  label: "YouTube Channel Analytics"
  description: "Retrieves analytics data for a YouTube channel including views, subscribers, and engagement metrics."
  tags:
    - analytics
    - youtube
capability:
  exposes:
    - type: mcp
      namespace: youtubeanalytics
      port: 8080
      tools:
        - name: query-report
          description: "Query YouTube Analytics reports for channel metrics."
          inputParameters:
            - name: ids
              in: body
              type: string
              description: "The channel identifier."
            - name: start_date
              in: body
              type: string
              description: "The report start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "The report end date in YYYY-MM-DD format."
            - name: metrics
              in: body
              type: string
              description: "Comma-separated list of metrics."
          call: "youtubeanalytics.query-report"
          with:
            ids: "{{ids}}"
            startDate: "{{start_date}}"
            endDate: "{{end_date}}"
            metrics: "{{metrics}}"
  consumes:
    - type: http
      namespace: youtubeanalytics
      baseUri: "https://youtubeanalytics.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.youtube_token"
      resources:
        - name: reports
          path: "/reports"
          inputParameters:
            - name: ids
              in: query
            - name: startDate
              in: query
            - name: endDate
              in: query
            - name: metrics
              in: query
          operations:
            - name: query-report
              method: GET

Pulls YouTube channel stats and recent video analytics, exports the data to a Google Sheet dashboard, and sends a weekly content digest via Gmail.

naftiko: "0.5"
info:
  label: "YouTube Content Performance Pipeline"
  description: "Pulls YouTube channel stats and recent video analytics, exports the data to a Google Sheet dashboard, and sends a weekly content digest via Gmail."
  tags:
    - media
    - analytics
    - youtube
    - google-sheets
    - gmail
capability:
  exposes:
    - type: mcp
      namespace: youtube-performance
      port: 8080
      tools:
        - name: generate-content-report
          description: "Fetch YouTube channel and video stats, export to Sheets, and email digest."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "The YouTube channel ID."
            - name: spreadsheet_id
              in: body
              type: string
              description: "The Google Sheets spreadsheet ID for the dashboard."
            - name: report_email
              in: body
              type: string
              description: "Email for the content performance digest."
          steps:
            - name: get-channel-stats
              type: call
              call: "youtube.get-channel"
              with:
                channel_id: "{{channel_id}}"
            - name: get-recent-videos
              type: call
              call: "youtube.list-videos"
              with:
                channel_id: "{{channel_id}}"
            - name: update-dashboard
              type: call
              call: "sheets.update-values"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "YouTubeReport!A1"
                values: "{{get-recent-videos.items}}"
            - name: send-digest
              type: call
              call: "gmail.send-message"
              with:
                to: "{{report_email}}"
                subject: "YouTube Content Digest"
                body: "Channel subscribers: {{get-channel-stats.items[0].statistics.subscriberCount}}. Total views: {{get-channel-stats.items[0].statistics.viewCount}}. Dashboard: https://docs.google.com/spreadsheets/d/{{spreadsheet_id}}."
  consumes:
    - type: http
      namespace: youtube
      baseUri: "https://www.googleapis.com/youtube/v3"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: channels
          path: "/channels"
          inputParameters:
            - name: id
              in: query
            - name: part
              in: query
              value: "statistics"
          operations:
            - name: get-channel
              method: GET
        - name: search
          path: "/search"
          inputParameters:
            - name: channelId
              in: query
            - name: order
              in: query
              value: "date"
            - name: type
              in: query
              value: "video"
          operations:
            - name: list-videos
              method: GET
    - type: http
      namespace: sheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: values
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: update-values
              method: PUT
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: messages
          path: "/users/me/messages/send"
          operations:
            - name: send-message
              method: POST